টেনসরফ্লো 2 টেনসরফ্লো 1 এর চেয়ে অনেক ধীর গতিতে কেন?


137

এটি বহু ব্যবহারকারীর দ্বারা পাইটোর্চে স্যুইচ করার কারণ হিসাবে উদ্ধৃত করা হয়েছে, তবে আমি এখনও সর্বাধিক গুরুত্বপূর্ণ ব্যবহারিক গুণ, গতি, উত্সাহের জন্য কার্যকর করার জন্য যুক্তিযুক্ত ব্যাখ্যা / ব্যাখ্যা খুঁজে পাইনি।

নীচে কোড বেঞ্চমার্কিং পারফরম্যান্স, টিএফ 1 বনাম টিএফ 2 - টিএফ 1 এর সাথে 47% থেকে 276% দ্রুততর চলমান রয়েছে ।

আমার প্রশ্ন: গ্রাফ বা হার্ডওয়্যার পর্যায়ে এটি কী, এটি এত তাৎপর্যপূর্ণ মন্দা দেয়?


বিস্তারিত উত্তর খুঁজছেন - বিস্তৃত ধারণাগুলির সাথে ইতিমধ্যে পরিচিত। প্রাসঙ্গিক গিট

স্পেস : CUDA 10.0.130, cuDNN 7.4.2, পাইথন 3.7.4, উইন্ডোজ 10, জিটিএক্স 1070


বেঞ্চমার্ক ফলাফল :


আপডেট : নীচে কোড প্রতি ইজিার এক্সিকিউশন অক্ষম করা সাহায্য করে না । আচরণটি যদিও বেমানান: কখনও কখনও গ্রাফ মোডে চলমান যথেষ্ট সহায়তা করে, অন্য সময় এটি এগ্রারের তুলনায় ধীর হয়ে যায়

টিএফ ডেভেলস কোথাও উপস্থিত না হওয়ার কারণে আমি নিজেই এই বিষয়টি তদন্ত করব - লিঙ্কযুক্ত গিথুব ইস্যুতে অগ্রগতি অনুসরণ করতে পারি follow

হালনাগাদ 2 : ব্যাখ্যার সাথে ভাগ করে নেওয়ার জন্য পরীক্ষামূলক ফলাফলের টন; আজ করা উচিত।


বেঞ্চমার্ক কোড :

# use tensorflow.keras... to benchmark tf.keras; used GPU for all above benchmarks
from keras.layers import Input, Dense, LSTM, Bidirectional, Conv1D
from keras.layers import Flatten, Dropout
from keras.models import Model
from keras.optimizers import Adam
import keras.backend as K
import numpy as np
from time import time

batch_shape = (32, 400, 16)
X, y = make_data(batch_shape)

model_small = make_small_model(batch_shape)
model_small.train_on_batch(X, y)  # skip first iteration which builds graph
timeit(model_small.train_on_batch, 200, X, y)

K.clear_session()  # in my testing, kernel was restarted instead

model_medium = make_medium_model(batch_shape)
model_medium.train_on_batch(X, y)  # skip first iteration which builds graph
timeit(model_medium.train_on_batch, 10, X, y)

ব্যবহৃত কার্যাদি :

def timeit(func, iterations, *args):
    t0 = time()
    for _ in range(iterations):
        func(*args)
    print("Time/iter: %.4f sec" % ((time() - t0) / iterations))

def make_small_model(batch_shape):
    ipt   = Input(batch_shape=batch_shape)
    x     = Conv1D(128, 400, strides=4, padding='same')(ipt)
    x     = Flatten()(x)
    x     = Dropout(0.5)(x)
    x     = Dense(64, activation='relu')(x)
    out   = Dense(1,  activation='sigmoid')(x)
    model = Model(ipt, out)
    model.compile(Adam(lr=1e-4), 'binary_crossentropy')
    return model

def make_medium_model(batch_shape):
    ipt   = Input(batch_shape=batch_shape)
    x     = Bidirectional(LSTM(512, activation='relu', return_sequences=True))(ipt)
    x     = LSTM(512, activation='relu', return_sequences=True)(x)
    x     = Conv1D(128, 400, strides=4, padding='same')(x)
    x     = Flatten()(x)
    x     = Dense(256, activation='relu')(x)
    x     = Dropout(0.5)(x)
    x     = Dense(128, activation='relu')(x)
    x     = Dense(64,  activation='relu')(x)
    out   = Dense(1,   activation='sigmoid')(x)
    model = Model(ipt, out)
    model.compile(Adam(lr=1e-4), 'binary_crossentropy')
    return model

def make_data(batch_shape):
    return np.random.randn(*batch_shape), np.random.randint(0, 2, (batch_shape[0], 1))

কোন অংশটি এটিকে এত আলাদা করে তোলে তা বিশ্লেষণ করার জন্য আপনি কি কখনও সিপ্রোফাইল জাতীয় ধরণের সরঞ্জাম ব্যবহার করেছেন?
zihaozhihao

@zihaozhihao আমার কাছে আছে , যদিও এটির জন্য বিশেষভাবে নয়; পূর্ববর্তী লিঙ্কটি এবং কাস্টম অপ্টিমাইজার লেখার জন্য, আমি কলগুলির মধ্যে পার্থক্যের সাথে ইতিমধ্যে পরিচিত, তবে কেন অন্যটির তুলনায় একজনের মন্থর - তা বুঝতে পারছি না এবং কোনও নন-টিএফ বিশেষজ্ঞও উত্স থেকে বুঝতে পারবেন না, যা শীর্ষস্থানীয় একটি জটলা জগাখিচুড়ি, আপেক্ষিক পারফরম্যান্স নথি করে না। গ্রাফ / হার্ডওয়্যার-স্তরের ইন্টেল প্রয়োজনীয়, যা প্রোফাইলারগুলি সরবরাহ করবে না (যতক্ষণ না আমি সেগুলি ব্যবহার করতে সক্ষম হয়েছি)
ওভারলর্ডগোলড্রাগন

দু'টি পরীক্ষায় কি নমির সংস্করণ একই?
চবির

ওচ .... যদি পুরানো কেরাস একাই পাইটর্চের তুলনায় ইতিমধ্যে উল্লেখযোগ্যভাবে ধীর হয়ে পড়েছিল, এখনই কল্পনা করুন।
ড্যানিয়েল মুলার

মডেল আকার সঙ্গে সমস্যা স্কেল না? আপনি কি অন্য ওএসে একই মানদণ্ড চালানোর চেষ্টা করেছেন?
ওকাও

উত্তর:


76

আপডেট 2/18/2020 : আমি 2.1 এবং 2.1-রাত্রি বেঞ্চ করেছি; ফলাফল মিশ্রিত হয়। একটি কনফিগার (মডেল এবং ডেটার আকার) ব্যতীত সমস্ত টিএফ 2 এবং টিএফ 1 এর চেয়ে দ্রুত বা তত দ্রুত। ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে চলে যেতে হয়। গ্রাফের প্রয়োগে ( 1.6x থেকে 2.5x ধীর )

তদ্ব্যতীত, আছে চরম এক যদৃচ্ছতা / কম্পিউট-উপমা মাধ্যমে ব্যাখ্যাযোগ্য না - একটি বৃহৎ মডেল আমি পরীক্ষিত জন্য গ্রাফ এবং আগ্রহী মধ্যে reproducibility পার্থক্য। আমি বর্তমানে সময় প্রতিবন্ধকতাগুলির জন্য এই দাবির জন্য প্রজননযোগ্য কোড উপস্থাপন করতে পারছি না, সুতরাং পরিবর্তে আমি দৃ strongly়ভাবে আপনার নিজের মডেলগুলির জন্য এটি পরীক্ষা করার পরামর্শ দিচ্ছি।

এগুলি সম্পর্কে এখনও একটি গিট ইস্যু খোলা হয়নি, তবে আমি আসল বিষয়ে মন্তব্য করেছি - এখনও কোনও প্রতিক্রিয়া নেই। অগ্রগতি হয়ে যাওয়ার পরে আমি উত্তর (গুলি) আপডেট করব।


ভারডিক্ট : এটি নয় , যদি আপনি জানেন যে আপনি কী করছেন। তবে আপনি যদি তা না করেন তবে আপনার ব্যয় হতে পারে প্রচুর - গড় কয়েকটি জিপিইউ আপগ্রেড দ্বারা এবং একাধিক জিপিইউ সবচেয়ে খারাপ ক্ষেত্রে।


এই জবাব : ইস্যুটির একটি উচ্চ-স্তরের বর্ণনা প্রদানের পাশাপাশি আপনার প্রয়োজনীয়তার সাথে নির্দিষ্ট প্রশিক্ষণ কনফিগারেশন সম্পর্কে কীভাবে সিদ্ধান্ত নেওয়ার গাইডলাইন রয়েছে তার লক্ষ্য। বিশদ, নিম্ন-স্তরের বর্ণনার জন্য, এতে সমস্ত বেঞ্চমার্কিং ফলাফল + কোড অন্তর্ভুক্ত রয়েছে, আমার অন্য উত্তরটি দেখুন।

আমি আমার উত্তর (গুলি) ডাব্লু / আরও তথ্য আপডেট করব যদি আমি কোন কিছু শিখি - তবে এই প্রশ্নটি রেফারেন্সের জন্য বুকমার্ক / "স্টার" করতে পারে।


সংক্ষিপ্তসার : একটি টেনসরফ্লো বিকাশকারী, কি। স্কট ঘু দ্বারা নিশ্চিত করেছেন, টিএফ 2 ইজিার এক্সিকিউশন এবং টাইট ইন্টিগ্রেশন ডব্লু / কেরাসের উপর ফোকাসড বিকাশ, যার মধ্যে টিএফ উত্সে ব্যাপক পরিবর্তনগুলি জড়িত ছিল - গ্রাফ-স্তর সহ। উপকারিতা: প্রসেসিং, বিতরণ, ডিবাগ এবং স্থাপনার ক্ষমতা ব্যাপকভাবে প্রসারিত। এর মধ্যে কয়েকটির দাম তবে গতি।

বিষয়টি অবশ্য মোটামুটি জটিল। এটি কেবল টিএফ 1 বনাম টিএফ 2 নয় - ট্রেনের গতিতে উল্লেখযোগ্য পার্থক্য আনার কারণগুলির মধ্যে রয়েছে:

  1. টিএফ 2 বনাম টিএফ 1
  2. আগ্রহী বনাম গ্রাফ মোড
  3. keras বনাম tf.keras
  4. numpyবনাম tf.data.Datasetবনাম ...
  5. train_on_batch() বনাম fit()
  6. জিপিইউ বনাম সিপিইউ
  7. model(x)বনাম model.predict(x)বনাম ...

দুর্ভাগ্যক্রমে, উপরোক্ত প্রায় কোনওটিই অপরটির থেকে স্বতন্ত্র নয় এবং প্রতিটি একে অপরের তুলনায় কমপক্ষে দ্বিগুণ কার্যকর করতে পারে। ভাগ্যক্রমে, আপনি নির্ধারণ করতে পারবেন কী পদ্ধতিগতভাবে সবচেয়ে ভাল কাজ করবে এবং কয়েকটি শর্টকাট দিয়ে - যেমন আমি প্রদর্শিত হব।


আমার কি করা উচিৎ? বর্তমানে, একমাত্র উপায় হ'ল - আপনার নির্দিষ্ট মডেল, ডেটা এবং হার্ডওয়ারের জন্য পরীক্ষা করা। কোন একক কনফিগারেশন সবসময় ভাল কাজ করবে - কিন্তু সেখানে হয় এর কি এবং আপনার অনুসন্ধান প্রক্রিয়া সহজ করার জন্য এর একটি করুন:

>> করুন:

  • train_on_batch()+ numpy+ tf.keras+ টিএফ 1 + ইজিার / গ্রাফ
  • train_on_batch()+ numpy+ tf.keras+ টিএফ 2 + গ্রাফ
  • fit()+ numpy+ tf.keras+ টিএফ 1 / টিএফ 2 + গ্রাফ + বড় মডেল এবং ডেটা

>> না:

  • fit()+ + numpy+ + kerasস্মল এন্ড মিডিয়াম মডেল এবং ডেটার জন্য
  • fit()+ numpy+ tf.keras+ টিএফ 1 / টিএফ 2 + আগ্রহী
  • train_on_batch()+ numpy+ keras+ টিএফ 1 + উত্সাহী

  • [মেজর] tf.python.keras ; এটি 10-100x ধীর গতিতে চলতে পারে এবং ডাব্লু / প্রচুর বাগগুলি; অধিক তথ্য

    • এর মধ্যে রয়েছে layers, models, optimizers, & সম্পর্কিত "আউট-অফ-বাক্স" ব্যবহার আমদানির; অপস, ব্যবহারসমূহ এবং সম্পর্কিত 'ব্যক্তিগত' আমদানিগুলি ভাল - তবে নিশ্চিত হওয়ার জন্য, অল্টগুলির জন্য পরীক্ষা করুন, এবং সেগুলি ব্যবহৃত হচ্ছে কিনাtf.keras

উদাহরণস্বরূপ বেঞ্চমার্কিং সেটআপের জন্য আমার অন্যান্য উত্তরের নীচে কোডটি দেখুন। উপরের তালিকাটি মূলত অন্যান্য উত্তরের "বেঞ্চমার্কস" টেবিলের উপর ভিত্তি করে।


উপরোক্ত করণীয়করণীয়গুলির সীমাবদ্ধতা :

  • এই প্রশ্নের শিরোনাম "কেন টিএফ 2 টি টিএফ 1 এর চেয়ে অনেক ধীর?" এবং এর শরীর যখন স্পষ্টভাবে প্রশিক্ষণের বিষয়ে উদ্বেগ প্রকাশ করেছে, তখন বিষয়টি কেবল সীমাবদ্ধ নয়; অনুমানগুলিও , একই টিএফ সংস্করণ, আমদানি, ডেটা ফর্ম্যাট ইত্যাদির মধ্যে এমনকি বড় গতির পার্থক্যের সাথে সম্পর্কিত - এই উত্তরটি দেখুন
  • আরএনএনগুলি সম্ভবত উত্তরটিতে ডেটা গ্রিডটি উল্লেখযোগ্যভাবে পরিবর্তন করতে পারে, কারণ তাদের টিএফ 2-তে উন্নতি করা হয়েছে
  • মডেলগুলি প্রাথমিকভাবে ব্যবহৃত হয় Conv1DএবংDense - কোনও আরএনএন, স্পার্স ডেটা / লক্ষ্যমাত্রা, 4 / 5D ইনপুট এবং অন্যান্য কনফিগার নেই
  • ইনপুট ডেটা numpyএবং সীমাবদ্ধtf.data.Dataset , অন্য অনেকগুলি ফর্ম্যাট উপস্থিত রয়েছে; অন্য উত্তর দেখুন
  • জিপিইউ ব্যবহৃত হয়েছিল; সিপিইউতে ফলাফল পৃথক হবে । আসলে, যখন আমি প্রশ্নটি জিজ্ঞাসা করেছি, আমার সিডিডিএ সঠিকভাবে কনফিগার করা হয়নি, এবং এর কিছু ফলাফল সিপিইউ ভিত্তিক ছিল।

কেন টিএফ 2 অধীর আগ্রহে কার্যকর করার জন্য সবচেয়ে ব্যবহারিক গুণ, গতি, ত্যাগ করেছিল? এটি পরিষ্কারভাবে নেই - গ্রাফটি এখনও উপলব্ধ। তবে যদি প্রশ্নটি হয় "কেন সবার কাছে আগ্রহী":

  • সুপিরিয়র ডিবাগিং : আপনি সম্ভবত "আমি কীভাবে মধ্যবর্তী স্তর আউটপুট পেতে পারি" বা "আমি কীভাবে ওজন পরিদর্শন করব" জিজ্ঞাসা করে বহুসংখ্যক প্রশ্ন পেয়েছি; আগ্রহী, এটি (প্রায়) হিসাবে সহজ .__dict__। বিপরীতে গ্রাফের জন্য বিশেষ ব্যাকএন্ড ফাংশনগুলির সাথে পরিচিতি প্রয়োজন - ডিবাগিং এবং অন্তঃসংশোধনের পুরো প্রক্রিয়াটি ব্যাপকভাবে জটিল করে তোলে।
  • দ্রুত প্রোটোটাইপিং : উপরে মত অনুরূপ ধারণা; দ্রুত বোঝাপড়া = প্রকৃত ডিএল-এর জন্য আরও সময় বাকি।

কীভাবে ইগ্রারকে অক্ষম / অক্ষম করা যায়?

tf.enable_eager_execution()  # TF1; must be done before any model/tensor creation
tf.compat.v1.disable_eager_execution() # TF2; above holds

অতিরিক্ত তথ্য :

  • টিএফ 2 এর _on_batch()পদ্ধতিগুলির সাথে যত্নশীল ; টিএফ দেব অনুযায়ী, তারা এখনও একটি ধীর প্রয়োগ বাস্তবায়ন ব্যবহার করে, তবে ইচ্ছাকৃতভাবে নয় - অর্থাৎ এটি ঠিক করতে হবে। বিশদ জন্য অন্যান্য উত্তর দেখুন।

দেবতাদের প্রতিরোধের অনুরোধ :

  1. দয়া করে ঠিক করুন train_on_batch(), এবং fit()পুনরাবৃত্তভাবে কল করার পারফরম্যান্স দিকটি ; কাস্টম ট্রেনের লুপগুলি অনেকের কাছে, বিশেষত আমার কাছে গুরুত্বপূর্ণ।
  2. ব্যবহারকারীদের জ্ঞানের জন্য এই পারফরম্যান্স পার্থক্যের জন্য ডকুমেন্টেশন / ডক্ট্রিং উল্লেখ যুক্ত করুন।
  3. পাইপর্চে আশ্রয় নেওয়া থেকে ঝাঁকুনি রাখতে সাধারণ সম্পাদনের গতি উন্নত করুন।

জ্ঞান বিজ্ঞপ্তি : ধন্যবাদ


আপডেটগুলি :

  • 11/14/19 - এমন একটি মডেল (আমার আসল অ্যাপ্লিকেশনটিতে) পাওয়া গেছে যা টিএফ 2 তে সমস্ত * কনফিগারেশন ডাব্লু / নম্পি ইনপুট ডেটার জন্য ধীর গতিতে চলে । পার্থক্যগুলি 13-19%, গড় 17% ran মধ্যে পার্থক্য kerasএবং tf.keras: কিন্তু, বেশি নাটকীয় ছিল 18-40% , রোজকার গড়। 32% (উভয়ই টিএফ 1 এবং 2)। (* - ইজিগার ব্যতীত, যার জন্য টিএফ 2 ওওএমডি করবে)

  • ১১ /১ //১৯ - সাম্প্রতিক প্রতিশ্রুতিতে আপডেট হওয়া on_batch()পদ্ধতিগুলি বিকাশ করে , গতির উন্নতি হয়েছে - টিএফ ২.১ এ প্রকাশিত হবে বা এখন হিসাবে পাওয়া যাবে । যেহেতু আমি উত্তরোত্তর দৌড়াতে অক্ষম হচ্ছি, তাই বেঞ্চে 2.1 অবধি বিলম্ব হবে।tf-nightly

  • 2/20/20 - পূর্বাভাস কর্মক্ষমতা এছাড়াও বেঞ্চিং মূল্য; TF2 এ, উদাহরণস্বরূপ, সিপিইউ পূর্বাভাস সময়গুলি পর্যায়ক্রমিক স্পাইকগুলিকে অন্তর্ভুক্ত করতে পারে

3
কি হবে fit_generator? ... আমি কার্যত কখনই চাই না train_on_batchএবং ব্যাচগুলিতে নিজের প্রশিক্ষণ লুপটি পরিচালনা করা একটি বিশাল, বিশাল অ্যান্টি-প্যাটার্ন এমনকি দুর্দান্ত ব্যয় এড়ানোও।
ely

@ ইলি এটি আমার পরীক্ষার উত্তর হিসাবে উল্লিখিত হিসাবে পরীক্ষা করা বাকি - তবে আমি যদি কিছু মনে করি তবে এটি ডাব্লু fit/ ছোট অতিরিক্ত ডেটা প্রসেসিং ওভারহেড হবে। ট্রেনের লুপগুলি হিসাবে, আমি আমার নিজস্ব কাস্টমটি লিখেছিলাম যা শেষ পর্যন্ত একটি ধরণের এপিআইতে পরিণত হয়েছিল; fit_generatorআত্মপরিচয়, কাস্টমাইজিবিলিটি, এবং সংরক্ষণ / লোডের অভাব রয়েছে - তাই আমার কাছে একেবারে নিখুঁত কোনও সুযোগ নেই। আমি আমার প্রশিক্ষণের লুপটি শেষ পর্যন্ত গিতুব-এ প্রকাশ করব।
ওভারলর্ডগোল্ডড্রাগন

আত্মপরিচয় এবং কাস্টমাইজিবিলিটির অভাব আমার জন্য একটি ত্রুটি নয়, বৈশিষ্ট্য। আইডি কে সেভ / লোড মন্তব্যটি উল্লেখ করছে? একটি লুপ চলাকালীন মধ্যবর্তী সঞ্চয় / লোডিং ডেটা জেনারেটর দ্বারা নিয়ন্ত্রিত হয় না? (আমি কেবল সেই জন্য কলব্যাকের উপর নির্ভর করে ব্যক্তিগতভাবেও খুশি এবং আমার প্রশিক্ষণের লুপটি ভুলভাবে ডিজাইন করা হয়েছে এমন কোড গন্ধ হিসাবে আরও কোনও স্বনির্ধারণের প্রয়োজন হবে)।
ely

@ ইলি এটি সহজ নয়, তবে ডাব্লু / কমপ্লেট ইনপুট ডেটা পাইপলাইন, উদ্দেশ্যমূলক ফাংশন এবং নন-এপিআই মডেল কনফিগারেশনগুলি (যেমন এনসেম্বেলস) প্রশিক্ষণের জন্য এটি প্রয়োজনীয়। অনেকগুলি ডিবাগিং এবং বৈশিষ্ট্য ইঞ্জিনিয়ারিংয়ের জন্য আত্মপরিচয়ের আবশ্যক। একটি বাহ্যিক সেভ / লোড, এবং ট্রেন লুপ বিরতি এবং গণনামূলকভাবে ব্যয়বহুল মডেলগুলির জন্য পুনরায় জীবনযাত্রার অভাব - একটি দুঃস্বপ্ন। নির্বিশেষে, শেষ পর্যন্ত আপনার নির্দিষ্ট প্রয়োজনের উপর নির্ভর করে, এবং অফ-টপিকটি পাওয়া; fit_generatorআপনার অ্যাপ্লিকেশনটির জন্য পারফরম্যান্স পরীক্ষা করার সবচেয়ে সঠিক উপায় হ'ল এটি ভালভাবে পরীক্ষা করা।
ওভারলর্ডগোলড্রাগন

47

এই জবাব : টিএফ 2 বনাম টিএফ 1 ট্রেন লুপস, ইনপুট ডেটা প্রসেসর এবং ইজিয়ার বনাম গ্রাফ মোড মৃত্যুদন্ড সহ ইস্যুটির একটি বিশদ, গ্রাফ / হার্ডওয়্যার-স্তরের বর্ণনা সরবরাহ করার লক্ষ্য। ইস্যুটির সংক্ষিপ্তসার এবং সমাধানের দিকনির্দেশগুলির জন্য, আমার অন্যান্য উত্তর দেখুন।


পারফরম্যান্স ভারডিক্ট : কনফিগারেশনের উপর নির্ভর করে কখনও কখনও একটি দ্রুত হয়, কখনও কখনও অন্যটি। টিএফ 2 বনাম টিএফ 1 যতদূর যায়, তারা গড়ে প্রায় সমান, তবে উল্লেখযোগ্য কনফিগারেশন ভিত্তিক পার্থক্য রয়েছে এবং টিএফ 1 টিএফ 2 এর বিপরীতে প্রায়শই ট্রাম্প করে। নীচে "বেনমার্কিং" দেখুন।


ইগর ভি.এস. গ্রাফ : কারওর জন্য এই পুরো উত্তরের মাংস: আমার পরীক্ষার অনুসারে টিএফ 2 এর উত্সাহ টিএফ 1 এর চেয়ে ধীর । আরও নিচে বিশদ।

উভয়ের মধ্যে মৌলিক পার্থক্য হ'ল গ্রাফ একটি গণনামূলক নেটওয়ার্ককে সক্রিয়ভাবে সেট আপ করে, এবং 'যখন' বলা হয় তখন কার্যকর করে - যেখানে অ্যাজিয়ার সমস্ত কিছু তৈরির পরে চালায়। তবে গল্পটি এখানেই শুরু হয়:

  • আগ্রহী গ্রাফ থেকে বঞ্চিত নয় এবং বাস্তবে প্রত্যাশার বিপরীতে বেশিরভাগ গ্রাফ হতে পারে । এটি মূলত যা হয়, তা কার্যকর করা হয় গ্রাফ - এর মধ্যে গ্রাফের একটি দুর্দান্ত অংশ সমন্বিত মডেল এবং অপ্টিমাইজার ওজন অন্তর্ভুক্ত।

  • উত্সাহী কার্যকর করার সময় নিজস্ব গ্রাফের কিছু অংশ পুনর্নির্মাণ করে ; গ্রাফ সম্পূর্ণরূপে নির্মিত না হওয়ার প্রত্যক্ষ পরিণতি - প্রোফাইলার ফলাফল দেখুন। এটি একটি গণনামূলক ওভারহেড আছে

  • আগ্রহী ধীর ডাব্লু / নম্পি ইনপুট ; প্রতি এই গীত মন্তব্য & কোড, উৎসুক মধ্যে Numpy ইনপুট CPU- র থেকে GPU এ tensors অনুলিপি ওভারহেড খরচ অন্তর্ভুক্ত। উত্স কোডের মাধ্যমে পদক্ষেপ, ডেটা হ্যান্ডলিংয়ের পার্থক্য পরিষ্কার; আগ্রহী সরাসরি নম্পিকে পাস করেন, যখন গ্রাফ টেনারগুলি পাস করেন যা নম্পিকে মূল্যায়ন করে; সঠিক প্রক্রিয়া সম্পর্কে অনিশ্চিত, তবে পরে জিপিইউ-স্তরীয় অপ্টিমাইজেশান জড়িত করা উচিত

  • TF2 আগ্রহী ধীর TF1 উৎসুক চেয়ে - এই অপ্রত্যাশিত হয় ...। নীচে বেঞ্চমার্কিং ফলাফল দেখুন। পার্থক্যগুলি নগন্য থেকে তাৎপর্যপূর্ণ পর্যন্ত বিস্তৃত, তবে ধারাবাহিক। বিষয়টি কেন নিশ্চিত না - যদি কোনও টিএফ দেব স্পষ্ট করে, উত্তর আপডেট করবে।


টিএফ 2 বনাম টিএফ 1 : কোনও টিএফ দেবের প্রাসঙ্গিক অংশের উদ্ধৃতি দিয়ে, প্র। স্কট জু এর প্রতিক্রিয়া - আমার জোরের কিছুটা / পুনর্নির্মাণ:

আগ্রহীভাবে, রানটাইমের জন্য অপ্সটি কার্যকর করতে হবে এবং পাইথন কোডের প্রতিটি লাইনের সংখ্যাসূচক মানটি ফিরিয়ে আনতে হবে। একক পদক্ষেপ কার্যকরকরণের প্রকৃতি এটিকে ধীর করে দেয়

টিএফ 2-এ, কেরাস প্রশিক্ষণ, স্পষ্ট এবং পূর্বাভাসের জন্য এর গ্রাফটি তৈরি করতে tf.function ব্যবহার করে। আমরা তাদেরকে মডেলটির জন্য "এক্সিকিউশন ফাংশন" বলি। টিএফ 1 এ, "এক্সিকিউশন ফাংশন" ছিল একটি ফানকগ্রাফ, যা কিছু সাধারণ উপাদানকে টিএফ ফাংশন হিসাবে ভাগ করে নিয়েছিল, তবে এটির একটি আলাদা বাস্তবায়ন রয়েছে।

প্রক্রিয়া চলাকালীন, আমরা কোনওভাবে ট্রেন_ন_বাচ (), টেস্ট_ন_বাচ () এবং ভবিষ্যদ্বাণী_অন_বাচে () এর জন্য একটি ভুল বাস্তবায়ন রেখে দিয়েছি । তারা এখনও সংখ্যাগতভাবে সঠিক , তবে x_on_batch এর জন্য এক্সিকিউশন ফাংশনটি একটি tf.function মোড়ক পাইথন ফাংশনটির পরিবর্তে খাঁটি পাইথন ফাংশন। এর ফলে মন্থরতা দেখা দেবে

টিএফ 2-তে, আমরা সমস্ত ইনপুট ডেটাকে tf.data.Dataset এ রূপান্তর করি, যার মাধ্যমে আমরা একক প্রকারের ইনপুটগুলি পরিচালনা করতে আমাদের এক্সিকিউশন ফাংশনটি একীভূত করতে পারি। ডেটাসেট রূপান্তরটিতে কিছু ওভারহেড থাকতে পারে এবং আমি মনে করি যে এটি প্রতি-ব্যাচের ব্যয়ের পরিবর্তে এক সময়ের একমাত্র ওভারহেড is

উপরের শেষ অনুচ্ছেদের শেষ বাক্য এবং নীচের অনুচ্ছেদের শেষ ধারা সহ:

উত্সাহী মোডে অলসতা কাটিয়ে উঠতে, আমাদের কাছে @ tf.function আছে, যা একটি অজগর ফাংশনটিকে গ্রাফে পরিণত করবে। যখন এনপি অ্যারের মত সংখ্যাসূচক মান ফিড করা হয়, তখন tf.function এর বডিটি স্ট্যাটিক গ্রাফে রূপান্তরিত হয়, অনুকূলিত হয় এবং চূড়ান্ত মানটি ফেরত দেয় যা দ্রুত এবং TF1 গ্রাফ মোডের মতো অনুরূপ পারফরম্যান্স থাকা উচিত।

আমি একমত নই - আমার প্রোফাইলিং ফলাফল অনুসারে, যা গ্রাহকের চেয়ে ইনগ্রের ডেটা প্রসেসিং যথেষ্ট গতিতে দেখায়। এছাড়াও, tf.data.Datasetবিশেষভাবে সম্পর্কে অনিশ্চিত , তবে ইজিগার বারবার একই ডেটা রূপান্তর পদ্ধতির একাধিক কল করেন - প্রোফাইলার দেখুন।

শেষ অবধি, দেবের সংযুক্ত প্রতিশ্রুতি: কেরাস ভি 2 লুপগুলিকে সমর্থন করার জন্য উল্লেখযোগ্য সংখ্যক পরিবর্তন


ট্রেন লুপস : উপর নির্ভর করে (1) আগ্রহী বনাম গ্রাফ; (২) ইনপুট ডেটা ফর্ম্যাট, প্রশিক্ষণ একটি স্বতন্ত্র ট্রেন লুপের সাথে এগিয়ে যাবে - টিএফ 2 _select_training_loop(), প্রশিক্ষণ.পি , এর মধ্যে একটি:

training_v2.Loop()
training_distributed.DistributionMultiWorkerTrainingLoop(
              training_v2.Loop()) # multi-worker mode
# Case 1: distribution strategy
training_distributed.DistributionMultiWorkerTrainingLoop(
            training_distributed.DistributionSingleWorkerTrainingLoop())
# Case 2: generator-like. Input is Python generator, or Sequence object,
# or a non-distributed Dataset or iterator in eager execution.
training_generator.GeneratorOrSequenceTrainingLoop()
training_generator.EagerDatasetOrIteratorTrainingLoop()
# Case 3: Symbolic tensors or Numpy array-like. This includes Datasets and iterators 
# in graph mode (since they generate symbolic tensors).
training_generator.GeneratorLikeTrainingLoop() # Eager
training_arrays.ArrayLikeTrainingLoop() # Graph

প্রতিটি সম্পদের বরাদ্দকে আলাদাভাবে পরিচালনা করে এবং কার্য সম্পাদন এবং সক্ষমতার উপর পরিণতি বহন করে।


ট্রেন লুপস: fitবনাম train_on_batch, kerasবনামtf.keras : চারটি প্রত্যেকেই পৃথক ট্রেনের লুপ ব্যবহার করে, যদিও সম্ভবত প্রতিটি সম্ভাব্য সংমিশ্রণে তা নয়। keras' fit, উদাহরণস্বরূপ, একটি ফর্ম ব্যবহার করে fit_loop, যেমন training_arrays.fit_loop(), এবং এটি train_on_batchব্যবহার করতে পারে K.function()tf.kerasপূর্ববর্তী বিভাগে অংশে বর্ণিত আরও পরিশীলিত শ্রেণিবিন্যাস রয়েছে।


ট্রেন লুপস: ডকুমেন্টেশন - প্রাসঙ্গিক বিভিন্ন কার্যকরকরণ পদ্ধতির কয়েকটিতে উত্স ডক্ট্রিং :

অন্যান্য টেনসরফ্লো অপারেশনের মতো আমরা পাইথন সংখ্যাসূচক ইনপুটগুলিকে টেনসারে রূপান্তর করি না। অধিকন্তু, প্রতিটি স্বতন্ত্র পাইথন সংখ্যাসূচক মানের জন্য একটি নতুন গ্রাফ তৈরি করা হয়

function ইনপুট আকার এবং ডেটাটাইপগুলির প্রতিটি অনন্য সেটের জন্য একটি পৃথক গ্রাফ ইনস্ট্যান্ট করে

একটি একক tf.function অবজেক্ট হুড অধীনে একাধিক গণনা গ্রাফ মানচিত্র করা প্রয়োজন হতে পারে। এটি কেবল পারফরম্যান্স হিসাবে দৃশ্যমান হওয়া উচিত (ট্রেসিং গ্রাফগুলির একটি ননজারো কম্পিউটেশনাল এবং মেমরির ব্যয় রয়েছে )


ইনপুট ডেটা প্রসেসর : উপরের মতো, প্রসেসর কেস-বাই-কেস নির্বাচিত হয়, রানটাইম কনফিগারেশন (এক্সিকিউশন মোড, ডেটা ফর্ম্যাট, বিতরণ কৌশল) অনুযায়ী সেট করা অভ্যন্তরীণ পতাকাগুলির উপর নির্ভর করে case ইজিয়ারের সাথে সবচেয়ে সহজ কেসটি সরাসরি ডাব্লু / নম্পি অ্যারে কাজ করে। কিছু নির্দিষ্ট উদাহরণের জন্য, এই উত্তরটি দেখুন


মডেল সাইজ, ডেটা সাইজ:

  • সিদ্ধান্ত গ্রহণকারী; কোনও একক কনফিগারেশন সমস্ত মডেল এবং ডেটা মাপের উপরে নিজেকে মুকুটযুক্ত করে না।
  • মডেলের আকারের সাথে সম্পর্কিত ডেটার আকার গুরুত্বপূর্ণ; ছোট ডেটা এবং মডেলের জন্য, ডেটা ট্রান্সফার (যেমন সিপিইউতে জিপিইউ) ওভারহেড আধিপত্য করতে পারে। তেমনিভাবে, ছোট ওভারহেড প্রসেসরগুলি ডেমোর রূপান্তর সময়কে প্রাধান্য দিয়ে বড় ডেটার উপর ধীর গতিতে চলতে পারে ( convert_to_tensor"প্রোফিলার" দেখুন)
  • প্রতি ট্রেনের লুপ 'এবং ইনপুট ডেটা প্রসেসরের' সংস্থানগুলি সংস্থান করার বিভিন্ন উপায়ের সাথে গতি আলাদা হয়।

বেঞ্চমার্কস : পিষিত মাংস - ওয়ার্ড ডকুমেন্ট - এক্সেল স্প্রেডশিট


পরিভাষা :

  • % -বিহীন সংখ্যাগুলি সমস্ত সেকেন্ড
  • % হিসাবে গণনা (1 - longer_time / shorter_time)*100; যুক্তিপূর্ণ: আমরা আগ্রহী হন ফ্যাক্টর কি দ্বারা অন্য একটি তুলনায় দ্রুততর হয়; shorter / longerআসলে একটি অ-রৈখিক সম্পর্ক, সরাসরি তুলনার জন্য কার্যকর নয়
  • % স্বাক্ষর সংকল্প:
    • টিএফ 2 বনাম টিএফ 1: টিএফ 2 +দ্রুত হলে
    • জিভিই (গ্রাফ বনাম আগ্রহী): গ্রাফটি +যদি দ্রুত হয়
  • টিএফ 2 = টেনসরফ্লো ২.০.০ + কেরাস ২.৩.১; টিএফ 1 = টেনসরফ্লো 1.14.0 + কেরাস 2.2.5

প্রোফিলার :


প্রোফেলার - ব্যাখ্যা : স্পাইডার 3.3.6 আইডিই প্রোফাইলার।

  • কিছু ফাংশন অন্যের বাসাতে পুনরাবৃত্তি হয়; অতএব, "ডেটা প্রক্রিয়াকরণ" এবং "প্রশিক্ষণ" ফাংশনগুলির মধ্যে সঠিক বিভাজনটি সন্ধান করা শক্ত, সুতরাং কিছুটা ওভারল্যাপ থাকবে - যেমনটি খুব শেষ ফলাফলে উচ্চারণ করা হয়েছে।

  • % পরিসংখ্যান গণনা করা আর্ট রানটাইম মাইনাস বিল্ড টাইম

  • 1 বা 2 বার ডাকা হত এমন সমস্ত (অনন্য) রানটাইমকে সংযুক্ত করে সময় তৈরির সময় নির্ধারণ করুন
  • ট্রেনের সময়কে সমস্ত (অনন্য) রানটাইম সংযুক্ত করে গণনা করা হয় যা পুনরাবৃত্তির # এর সমান # বার বলা হত, এবং তাদের কিছু নেস্টের রানটাইম
  • দুর্ভাগ্যক্রমে (যেমন প্রোফাইল হিসাবে চিহ্নিত করা হবে ) তাদের মূল নামগুলি অনুসারে ফাংশনগুলি প্রোফাইল করা হয় , যা নির্মাণের সময় মিশে যায় - সুতরাং এটি বাদ দিতে হবে_func = funcfunc

পরীক্ষার পরিবেশ :

  • নীচে ডাব্লু / ন্যূনতম পটভূমির কাজগুলি চালিত কোড
  • এই পোস্টে প্রস্তাবিত সময় অনুসারে পুনরাবৃত্তির আগে জিপিইউ "ওয়ার্ম আপ" হয়েছিল / পুনরুদ্ধার করার কয়েক ঘন্টা আগে ite
  • CUDA 10.0.130, cuDNN 7.6.0, টেনসরফ্লো 1.14.0, এবং টেনসরফ্লো 2.0.0 উত্স থেকে নির্মিত, অ্যানাকোন্ডা
  • পাইথন 3.7.4, স্পাইডার 3.3.6 আইডিই
  • জিটিএক্স 1070, উইন্ডোজ 10, 24 জিবি ডিডিআর 4 2.4-মেগাহার্টজ র‌্যাম, আই 7-7700 এইচকিউ 2.8-গিগাহার্টজ সিপিইউ

পদ্ধতি :

  • বেঞ্চমার্ক 'ছোট', 'মাঝারি', এবং 'বৃহত্তর' মডেল এবং ডেটা মাপ
  • ইনপুট ডেটার আকারের চেয়ে পৃথক প্রতিটি মডেলের আকারের জন্য পরামিতিগুলির # ঠিক করুন
  • "বৃহত্তর" মডেলের আরও পরামিতি এবং স্তর রয়েছে
  • "বৃহত্তর" ডেটার দীর্ঘতর ক্রম রয়েছে তবে একই batch_sizeএবংnum_channels
  • মডেল শুধুমাত্র ব্যবহার Conv1D, Dense'learnable' স্তর; প্রতি টিএফ-সংস্করণ প্রয়োগের জন্য আরএনএনগুলি এড়ানো হয়েছে। পার্থক্য
  • মডেল এবং অপ্টিমাইজার গ্রাফ বিল্ডিং বাদ দিতে সর্বদা একটি ট্রেন বেঞ্চমার্কিং লুপের বাইরে চলে
  • স্পার্স ডেটা (উদাঃ layers.Embedding()) বা স্পার লক্ষ্যবস্তু (উদাঃ) ব্যবহার না করাSparseCategoricalCrossEntropy()

সীমাবদ্ধতা : একটি "সম্পূর্ণ" উত্তরটি প্রতিটি সম্ভাব্য ট্রেনের লুপ এবং পুনরাবৃত্তিকে ব্যাখ্যা করবে তবে এটি অবশ্যই আমার সময় ক্ষমতা, অস্তিত্বহীন বেতন বা সাধারণ প্রয়োজনের বাইরে। ফলাফলগুলি পদ্ধতিগুলির মতোই ভাল - একটি মুক্ত মন দিয়ে ব্যাখ্যা করুন।


কোড :

import numpy as np
import tensorflow as tf
import random
from termcolor import cprint
from time import time

from tensorflow.keras.layers import Input, Dense, Conv1D
from tensorflow.keras.layers import Dropout, GlobalAveragePooling1D
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Adam
import tensorflow.keras.backend as K
#from keras.layers import Input, Dense, Conv1D
#from keras.layers import Dropout, GlobalAveragePooling1D
#from keras.models import Model 
#from keras.optimizers import Adam
#import keras.backend as K

#tf.compat.v1.disable_eager_execution()
#tf.enable_eager_execution()

def reset_seeds(reset_graph_with_backend=None, verbose=1):
    if reset_graph_with_backend is not None:
        K = reset_graph_with_backend
        K.clear_session()
        tf.compat.v1.reset_default_graph()
        if verbose:
            print("KERAS AND TENSORFLOW GRAPHS RESET")

    np.random.seed(1)
    random.seed(2)
    if tf.__version__[0] == '2':
        tf.random.set_seed(3)
    else:
        tf.set_random_seed(3)
    if verbose:
        print("RANDOM SEEDS RESET")

print("TF version: {}".format(tf.__version__))
reset_seeds()

def timeit(func, iterations, *args, _verbose=0, **kwargs):
    t0 = time()
    for _ in range(iterations):
        func(*args, **kwargs)
        print(end='.'*int(_verbose))
    print("Time/iter: %.4f sec" % ((time() - t0) / iterations))

def make_model_small(batch_shape):
    ipt   = Input(batch_shape=batch_shape)
    x     = Conv1D(128, 40, strides=4, padding='same')(ipt)
    x     = GlobalAveragePooling1D()(x)
    x     = Dropout(0.5)(x)
    x     = Dense(64, activation='relu')(x)
    out   = Dense(1,  activation='sigmoid')(x)
    model = Model(ipt, out)
    model.compile(Adam(lr=1e-4), 'binary_crossentropy')
    return model

def make_model_medium(batch_shape):
    ipt = Input(batch_shape=batch_shape)
    x = ipt
    for filters in [64, 128, 256, 256, 128, 64]:
        x  = Conv1D(filters, 20, strides=1, padding='valid')(x)
    x     = GlobalAveragePooling1D()(x)
    x     = Dense(256, activation='relu')(x)
    x     = Dropout(0.5)(x)
    x     = Dense(128, activation='relu')(x)
    x     = Dense(64,  activation='relu')(x)
    out   = Dense(1,   activation='sigmoid')(x)
    model = Model(ipt, out)
    model.compile(Adam(lr=1e-4), 'binary_crossentropy')
    return model

def make_model_large(batch_shape):
    ipt   = Input(batch_shape=batch_shape)
    x     = Conv1D(64,  400, strides=4, padding='valid')(ipt)
    x     = Conv1D(128, 200, strides=1, padding='valid')(x)
    for _ in range(40):
        x = Conv1D(256,  12, strides=1, padding='same')(x)
    x     = Conv1D(512,  20, strides=2, padding='valid')(x)
    x     = Conv1D(1028, 10, strides=2, padding='valid')(x)
    x     = Conv1D(256,   1, strides=1, padding='valid')(x)
    x     = GlobalAveragePooling1D()(x)
    x     = Dense(256, activation='relu')(x)
    x     = Dropout(0.5)(x)
    x     = Dense(128, activation='relu')(x)
    x     = Dense(64,  activation='relu')(x)    
    out   = Dense(1,   activation='sigmoid')(x)
    model = Model(ipt, out)
    model.compile(Adam(lr=1e-4), 'binary_crossentropy')
    return model

def make_data(batch_shape):
    return np.random.randn(*batch_shape), \
           np.random.randint(0, 2, (batch_shape[0], 1))

def make_data_tf(batch_shape, n_batches, iters):
    data = np.random.randn(n_batches, *batch_shape),
    trgt = np.random.randint(0, 2, (n_batches, batch_shape[0], 1))
    return tf.data.Dataset.from_tensor_slices((data, trgt))#.repeat(iters)

batch_shape_small  = (32, 140,   30)
batch_shape_medium = (32, 1400,  30)
batch_shape_large  = (32, 14000, 30)

batch_shapes = batch_shape_small, batch_shape_medium, batch_shape_large
make_model_fns = make_model_small, make_model_medium, make_model_large
iterations = [200, 100, 50]
shape_names = ["Small data",  "Medium data",  "Large data"]
model_names = ["Small model", "Medium model", "Large model"]

def test_all(fit=False, tf_dataset=False):
    for model_fn, model_name, iters in zip(make_model_fns, model_names, iterations):
        for batch_shape, shape_name in zip(batch_shapes, shape_names):
            if (model_fn is make_model_large) and (batch_shape is batch_shape_small):
                continue
            reset_seeds(reset_graph_with_backend=K)
            if tf_dataset:
                data = make_data_tf(batch_shape, iters, iters)
            else:
                data = make_data(batch_shape)
            model = model_fn(batch_shape)

            if fit:
                if tf_dataset:
                    model.train_on_batch(data.take(1))
                    t0 = time()
                    model.fit(data, steps_per_epoch=iters)
                    print("Time/iter: %.4f sec" % ((time() - t0) / iters))
                else:
                    model.train_on_batch(*data)
                    timeit(model.fit, iters, *data, _verbose=1, verbose=0)
            else:
                model.train_on_batch(*data)
                timeit(model.train_on_batch, iters, *data, _verbose=1)
            cprint(">> {}, {} done <<\n".format(model_name, shape_name), 'blue')
            del model

test_all(fit=True, tf_dataset=False)

আপনার কোডটি সঠিক কিনা আমি নিশ্চিত। আপনি মনে করেন যে আপনার মডেলগুলি সর্বদা গ্রাফ মোডে চলে তাই আপনি যুক্তি model.compileছাড়াই কল করেন run_eagerly=True। আগ্রহী মোডে থাকলে, আপনি গ্রাফ মোডে আপনার কোডের কিছু অংশ ব্যবহার করে চালাতে পারেন tf.function। সুতরাং আমি মনে করি যে ডিফল্ট বাস্তবায়ন compileহ'ল পারফরম্যান্স কারণে আগ্রহীভাবে চালানোর পরিবর্তে কম্পিউটেশনাল গ্রাফ তৈরি করা। এছাড়াও মনে রাখবেন যে যদি আপনার মডেলটি সংবিধানমূলক হয় তবে আপনি গ্রাফ মোডে স্পিডআপ দেখতে পাবেন না যেহেতু পাইথন ইন্টারঅ্যাকশনটি ন্যূনতম। আপনি যদি এর চেয়ে অনেক গণিতের অপ্স করেন তবে এটি বড় পার্থক্য করতে পারে (মেমরির ব্যবহারেও)।
ব্যবহারকারী2781994

@ ওভারলর্ডগোলড্রাগন তবে টিএফ 2-তে, উত্সাহী মোড ডিফল্টরূপে তবে গ্রাফ মোড নিশ্চিত না model.compileকরেই হয় run_eagerly=True, না?
ব্যবহারকারী2781994

@OverLordGoldDragon সে ব্যাপারে আমি সম্মত না আমদানিকৃত পদ্ধতি গ্রাফ মোডে চালান কিন্তু আমি মনে করি যে পারেন model.compileবা model.fitযে গ্রাফ মোডে প্রশিক্ষণ রান অভ্যন্তরীণভাবে অবশ্যই নিশ্চিত করতে হবে।
ব্যবহারকারী2781994

@ ওভারলর্ডগোল্ডড্রাগন সত্য - "tf.keras.Model.compile তিনটি গুরুত্বপূর্ণ যুক্তি নিয়েছে: ... অতিরিক্তভাবে, মডেলটি প্রশিক্ষণের জন্য এবং আগ্রহের সাথে মূল্যায়ন করার জন্য, আপনি run_eagerly=Trueকম্পাইল করার জন্য প্যারামিটার হিসাবে পাস করার বিষয়টি নিশ্চিত করতে পারেন ।" (উত্স tensorflow.org/guide/keras/overview ) অতএব আমি যদি আপনি run_eagerly=Trueমডেলটি গ্রাফ মোডে চালাতে না পারেন run আমি সিদ্ধান্ত নিতে পারছি না তা নিশ্চিত কিন্তু এটি আগ্রহী থেকে দক্ষ হলে এটি গ্রাফ মোডে চলবে না কেন।
ব্যবহারকারী2781994

আপনি আরও প্রমাণ চান? :) "ডিফল্টরূপে, আমরা সর্বোত্তম মৃত্যুদন্ড কার্যকর করার জন্য আপনার মডেলটিকে একটি স্ট্যাটিক গ্রাফে সংকলন করার চেষ্টা করব" " ( github.com/tensorflow/tensorflow/blob/r2.0/tensorflow/python/… )
user2781994
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.