আপডেট - 1/15/2020 : ছোট ব্যাচের আকারের জন্য বর্তমান সেরা অনুশীলনটি মডেলগুলিতে সরাসরি ইনপুটগুলি খাওয়ানো উচিত - অর্থাত্ preds = model(x)
, এবং যদি স্তরগুলি ট্রেন / অনুমানের ক্ষেত্রে আলাদাভাবে আচরণ করে model(x, training=False)
,। সর্বশেষ প্রতিশ্রুতিবদ্ধ হিসাবে, এটি এখন নথিভুক্ত করা হয় ।
আমি এগুলি বেঞ্চমার্ক করি না, তবে গিট আলোচনার ভিত্তিতে এটি চেষ্টা করার মতোও রয়েছেpredict_on_batch()
- বিশেষত টিএফ ২.১-এর উন্নতি সহ।
চূড়ান্ত অভিযুক্ত ব্যক্তি : self._experimental_run_tf_function = True
। এটি পরীক্ষামূলক । তবে এটি আসলে খারাপ নয়।
যে কোনও টেনসরফ্লো ডিডিং রিডিংয়ের জন্য: আপনার কোডটি পরিষ্কার করুন । এটি একটি জগাখিচুড়ি. এবং এটি গুরুত্বপূর্ণ কোডিং অনুশীলনগুলি লঙ্ঘন করে, যেমন একটি ফাংশন একটি কাজ করে ; _process_inputs
একটি করে অনেক বেশি "প্রসেস ইনপুট", একই আরো _standardize_user_data
। "আমি অর্থ প্রদান করছি না যথেষ্ট" - কিন্তু আপনি কি অতিরিক্ত সময় আপনার নিজের কাপড় বুঝতে অতিবাহিত মধ্যে বেতন,, এবং ব্যবহারকারীদের বাগ সঙ্গে আপনার সমস্যাগুলির পৃষ্ঠা পূরণে সহজ একটা পরিষ্কার কোড সহ সমাধান।
সংক্ষিপ্তসার : এটি দিয়ে কিছুটা ধীরে ধীরে compile()
।
compile()
একটি অভ্যন্তরীণ পতাকা সেট করে যা একটি আলাদা পূর্বাভাস ফাংশন নির্ধারণ করে predict
। এই ফাংশনটি প্রতিটি কলের উপরে একটি নতুন গ্রাফ তৈরি করে, এটি কমপম্পেলের সাথে তুলনামূলকভাবে ধীর করে দেয়। তবে, পার্থক্যটি কেবল তখনই উচ্চারণ করা হয় যখন ডেটা প্রক্রিয়াকরণের সময়ের চেয়ে ট্রেনের সময় অনেক কম থাকে । আমরা যদি মডেলের আকারকে কমপক্ষে মাঝারি আকারে বাড়িয়ে তুলি তবে দুটি সমান হয়ে যায়। নীচে কোড দেখুন।
ডেটা প্রসেসিংয়ের সময় এই সামান্য বৃদ্ধি প্রশস্ত গ্রাফ ক্ষমতা দ্বারা ক্ষতিপূরণ চেয়ে বেশি। যেহেতু এটি কেবলমাত্র একটি মডেলের গ্রাফকে ঘিরে রাখা আরও দক্ষ, তাই একটি প্রাক-সংকলন বাতিল করা হয় ed তবুও : যদি আপনার মডেলটি ডেটার তুলনায় ছোট হয়, আপনি compile()
মডেল অনুমিতি ছাড়াই ভাল । কর্মক্ষেত্রের জন্য আমার অন্যান্য উত্তর দেখুন।
আমার কি করা উচিৎ?
মডেলের পারফরম্যান্সের তুলনা করুন তুলনা করুন বনাম কমম্পাইল করা হিসাবে আমার নীচে কোড রয়েছে।
- সংকলনটি দ্রুততর :
predict
একটি সংকলিত মডেলটিতে চালান ।
- সংকলনটি ধীর :
predict
একটি অসম্পূর্ণ মডেলটিতে চালান ।
হ্যাঁ, উভয়ই সম্ভব এবং এটি (1) ডেটা আকারের উপর নির্ভর করবে; (2) মডেল আকার; (3) হার্ডওয়্যার। নীচের কোডটি আসলে সংকলিত মডেলটি দ্রুত হচ্ছে দেখায় , তবে 10 পুনরাবৃত্তি একটি ছোট নমুনা। "কীভাবে" এর জন্য আমার অন্য উত্তরে "ওয়ার্কআরউন্ডস" দেখুন।
বিশদ বিবরণ :
এটি ডিবাগ করতে কিছুটা সময় নিয়েছিল তবে মজাদার ছিল। নীচে আমি যে মূল অপরাধীদের সন্ধান পেয়েছি তার বর্ণনা দিয়েছি, কিছু প্রাসঙ্গিক ডকুমেন্টেশন উদ্ধৃত করেছি এবং প্রোফাইলার ফলাফলগুলি দেখাই যা চূড়ান্ত বাধা সৃষ্টি করেছিল।
( FLAG == self.experimental_run_tf_function
, ব্রিভিটি জন্য)
Model
ডিফল্ট দ্বারা ইনস্ট্যান্ট করে FLAG=False
। compile()
এটা সেট করে True
।
predict()
ভবিষ্যদ্বাণী ফাংশন অর্জন জড়িত, func = self._select_training_loop(x)
- কোনও বিশেষ কাওয়ার্গ ছাড়াই
predict
এবং এখানে ছাড়া compile
অন্য সমস্ত পতাকাগুলি এমন যে:
- (ক)
FLAG==True
->func = training_v2.Loop()
- (খ)
FLAG==False
->func = training_arrays.ArrayLikeTrainingLoop()
- থেকে সোর্স কোড docstring , (ক) প্রচন্ডভাবে, গ্রাফ-নির্ভরশীল আরো বিতরণ কৌশল ব্যবহার করে এবং অপস তৈরি & গ্রাফ উপাদান, যা (না) "হতে পারে" প্রভাব কর্মক্ষমতা অন্তক প্রবণ।
সত্য অভিযুক্ত ব্যক্তি : _process_inputs()
, হিসাববিদ্যা রানটাইম এর 81% । এর প্রধান উপাদান? _create_graph_function()
, রানটাইমের 72% । এই পদ্ধতি এমনকি নেই কোন অস্তিত্ব জন্য (বি) । একটি মধ্য আকারের মডেল ব্যবহার করে, কিন্তু, _process_inputs
গঠিত রানটাইম কম 1% । নীচে কোড এবং প্রোফাইলিং ফলাফল অনুসরণ করে।
ডেটা প্রসেসর :
(ক) : <class 'tensorflow.python.keras.engine.data_adapter.TensorLikeDataAdapter'>
ব্যবহৃত _process_inputs()
। প্রাসঙ্গিক উত্স কোড
(খ) : numpy.ndarray
দ্বারা ফিরে এসেছিল convert_eager_tensors_to_numpy
। প্রাসঙ্গিক উত্স কোড এবং এখানে
মডেল এক্সিকিউশন ফাংশন (যেমন পূর্বাভাস)
(ক) : বিতরণ ফাংশন , এবং এখানে
(খ) : বিতরণ ফাংশন (বিভিন্ন) এবং এখানে
প্রোফিলার : আমার অন্য উত্তরের কোডের জন্য ফলাফল, "ক্ষুদ্র মডেল", এবং এই উত্তরে, "মাঝারি মডেল":
ক্ষুদ্র মডেল : 1000 পুনরাবৃত্তি,compile()
ক্ষুদ্র মডেল : 1000 পুনরাবৃত্তি, না compile()
মাঝারি মডেল : 10 পুনরাবৃত্তি
ডকুমেন্টেশন (অপ্রত্যক্ষভাবে) এর প্রভাবগুলির উপর compile()
: উত্স
অন্যান্য টেনসরফ্লো অপারেশনের মতো আমরা পাইথন সংখ্যাসূচক ইনপুটগুলিকে টেনসারে রূপান্তর করি না। তদুপরি, প্রতিটি স্বতন্ত্র পাইথনের সংখ্যাসূচক মানের জন্য একটি নতুন গ্রাফ তৈরি করা হয় , উদাহরণস্বরূপ কল করা g(2)
এবং g(3)
দুটি নতুন গ্রাফ তৈরি করবে
function
ইনপুট আকার এবং ডেটাটাইপগুলির প্রতিটি অনন্য সেটের জন্য একটি পৃথক গ্রাফ ইনস্ট্যান্ট করে । উদাহরণস্বরূপ, নিম্নলিখিত কোড স্নিপেটের ফলে তিনটি পৃথক গ্রাফ সনাক্ত করা যাবে, কারণ প্রতিটি ইনপুটটির আলাদা আকার থাকে
একটি একক tf.function অবজেক্ট হুড অধীনে একাধিক গণনা গ্রাফ মানচিত্র করা প্রয়োজন হতে পারে। এটি কেবল পারফরম্যান্স হিসাবে দৃশ্যমান হওয়া উচিত (ট্রেসিং গ্রাফগুলির একটি ননজারো কম্পিউটেশনাল এবং মেমরির ব্যয় থাকে ) তবে প্রোগ্রামটির যথার্থতা প্রভাবিত করা উচিত নয়
দেশ :
from tensorflow.keras.layers import Input, Dense, LSTM, Bidirectional, Conv1D
from tensorflow.keras.layers import Flatten, Dropout
from tensorflow.keras.models import Model
import numpy as np
from time import time
def timeit(func, arg, iterations):
t0 = time()
for _ in range(iterations):
func(arg)
print("%.4f sec" % (time() - t0))
batch_size = 32
batch_shape = (batch_size, 400, 16)
ipt = Input(batch_shape=batch_shape)
x = Bidirectional(LSTM(512, activation='relu', return_sequences=True))(ipt)
x = LSTM(512, activation='relu', return_sequences=True)(ipt)
x = Conv1D(128, 400, 1, 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)
X = np.random.randn(*batch_shape)
timeit(model.predict, X, 10)
model.compile('adam', loss='binary_crossentropy')
timeit(model.predict, X, 10)
ফলাফল :
34.8542 sec
34.7435 sec