কেরাস অসঙ্গতিপূর্ণ পূর্বাভাস সময়


17

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

import time
import numpy as np
from sklearn.datasets import make_classification
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten

# Make a dummy classification problem
X, y = make_classification()

# Make a dummy model
model = Sequential()
model.add(Dense(10, activation='relu',name='input',input_shape=(X.shape[1],)))
model.add(Dense(2, activation='softmax',name='predictions'))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

model.fit(X, y, verbose=0, batch_size=20, epochs=100)

for i in range(1000):
    # Pick a random sample
    sample = np.expand_dims(X[np.random.randint(99), :], axis=0)
    # Record the prediction time 10x and then take the average
    start = time.time()
    for j in range(10):
        y_pred = model.predict_classes(sample)
    end = time.time()
    print('%d, %0.7f' % (i, (end-start)/10))

সময়টি নমুনার উপর নির্ভর করে না (এটি এলোমেলোভাবে নেওয়া হচ্ছে)। যদি পরীক্ষাটি পুনরাবৃত্তি করা হয়, তবে ভবিষ্যদ্বাণীটি যে লুপে লম্বা হয় সেখানে সূচিগুলি আবার (প্রায়) একই হতে চলেছে।

এখানে চিত্র বর্ণনা লিখুন

আমি ব্যাবহার করছি:

tensorflow 2.0.0
python 3.7.4

আমার আবেদনের জন্য আমাকে একটি নির্দিষ্ট সময়ে কার্যকর করার গ্যারান্টি দেওয়া দরকার need যদিও আচরণটি বিবেচনা করে এটি অসম্ভব। কি ভুল হচ্ছে? এটি কেরাসে বাগ বা টেনসরফ্লো ব্যাকএন্ডে কোনও বাগ?

সম্পাদনা: predict_on_batchএকই আচরণ দেখায়, তবে আরও কম: এখানে চিত্র বর্ণনা লিখুন

y_pred = model(sample, training=False).numpy() কিছু ভারী বিদেশী দেখায়, তবে তারা বাড়ছে না। এখানে চিত্র বর্ণনা লিখুন

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

এইভাবে আমরা উপসংহারে পৌঁছাতে পারি যে এটি টেনস্রোফ্লো ২.০-র অন্তর্নিহিত সমস্যা বলে মনে হচ্ছে, যা অন্যান্য পরিস্থিতিতে যেমনটি ওভারলর্ডগোল্ডড্রাগন উল্লেখ করেছে তেমন আচরণ দেখায়।


এই আচরণটি অনুমানযোগ্য মনে হয় .... বৃদ্ধিটি একরকম রৈখিক। আপনি যদি এই আচরণটি আপনার সময় গণনায় অন্তর্ভুক্ত করেন, তবে তা কি যায় না? --- আমি জানি না সেখানে কী হচ্ছে .... তবে আপনি যদি এর predict_on_batchপরিবর্তে চেষ্টা করেন তবে কী ঘটে ?
ড্যানিয়েল মুলার

আরেকটি প্রয়াস, কি দিয়ে ঘটবে y_pred = model(sample).numpy()এবং y_pred = model(sample, training=False).numpy()?
ড্যানিয়েল মুলার

আমি আমার অনুসন্ধানগুলি যুক্ত করেছি। অদ্ভুত সংস্করণগুলি আচরণটি দেখায় বলে মনে হয় না।
ga97dil

তবে predict_classesএখনও এটি দ্রুততম .... মনে হয়। শুধু কি predict?
ড্যানিয়েল মুলার

1
আমি ধরে নিলাম এটি কোনও ধরণের মেমরি পরিষ্কার হতে পারে ....
ড্যানিয়েল মুলার

উত্তর:


10

টিএফ 2 সাধারণত বেশিরভাগ ক্ষেত্রে আমার মুখোমুখি হওয়া দরিদ্র এবং বাগ-জাতীয় মেমরি পরিচালনা প্রদর্শন করে - সংক্ষিপ্ত বিবরণ এখানে এবং এখানে । বিশেষত পূর্বাভাসের সাথে, সর্বাধিক পারফরম্যান্স খাওয়ানোর পদ্ধতিটি model(x)সরাসরি মাধ্যমে হয় - এখানে দেখুন এবং এর লিঙ্কযুক্ত আলোচনা দেখুন।

সংক্ষেপে: model(x)তার তার মাধ্যমে কাজ করে __call__পদ্ধতি (যা তা থেকে উত্তরাধিকারী base_layer.Layer), যেহেতু predict(), predict_classes()ইত্যাদির মাধ্যমে ডেডিকেটেড লুপ ফাংশন জড়িত _select_training_loop(); প্রত্যেকে আলাদা আলাদা ব্যবহারের ক্ষেত্রে উপযুক্ত এবং প্রাক-প্রক্রিয়াজাতকরণের পদ্ধতি বিভিন্নভাবে ব্যবহার করে model(x)এবং ২.১-তে বিশেষত দ্রুততম ছোট-মডেল / ছোট-ব্যাচ (এবং সম্ভবত কোনও আকারের) পারফরম্যান্স (এবং এখনও ২.০ এ দ্রুততম) উপস্থাপনের জন্য ডিজাইন করা হয়েছিল।

সংযুক্ত আলোচনা থেকে একটি টেনসরফ্লো দেবের উদ্ধৃতি :

আপনি মডেল কল ব্যবহার করে আউটপুটটি পূর্বাভাস দিতে পারেন, মডেল পূর্বাভাস নয়, কল করা model(x)এটি আরও দ্রুত করে তুলবে কারণ কোনও "ডেটাসেটে রূপান্তর" অংশ নেই, এবং এটি সরাসরি ক্যাশে কল করছে tf.function

দ্রষ্টব্য : এটি ২.১-এ এবং বিশেষত ২.২-তে কোনও ইস্যু কম হওয়া উচিত - তবে যাইহোক প্রতিটি পদ্ধতি পরীক্ষা করুন। এছাড়াও আমি বুঝতে পারি যে এটি সরাসরি আপনার প্রশ্নের উত্তর টাইম স্পাইকগুলিতে দেয় না; আমি সন্দেহ করি এটি অ্যাগ্রের ক্যাশেিংয়ের সাথে সম্পর্কিত, তবে এটি নির্ধারণের সবচেয়ে নিশ্চিত উপায় TF Profilerহ'ল এটি ২.১-এ ভাঙা


আপডেট : ক্রমবর্ধমান স্পাইক সম্পর্কিত, সম্ভাব্য জিপিইউ থ্রোটলিং; আপনি ~ 1000 ইটার করেছেন, পরিবর্তে 10,000 চেষ্টা করুন - অবশেষে, বৃদ্ধি বন্ধ হওয়া উচিত। যেমন আপনি আপনার মন্তব্যে উল্লেখ করেছেন, এটির সাথে ঘটে না model(x); আরও কম জিপিইউ পদক্ষেপ জড়িত হওয়ায় ("ডেটাসেটে রূপান্তর") বোঝায়।

আপডেট 2 : আপনি যদি এই সমস্যার মুখোমুখি হন তবে আপনি এটি সম্পর্কে এখানে ডিভগুলি বাগ করতে পারেন; এটি বেশিরভাগ ক্ষেত্রেই আমি সেখানে গান করি


এটি কেন একটি পদ্ধতি ধীর হয় তার একটি উত্তরের উত্তর, তবে এটি একাধিক রানের উপরে ক্রমবর্ধমান রান সময়কে ব্যাখ্যা করে না।
LLSv2.0

1
@ LLSv2.0 না সম্পূর্ণরূপে নিশ্চিত নিজেকে, কিন্তু আপডেট উত্তর - আমি এখনও devs থেকে একটি প্রতিক্রিয়ার জন্য অপেক্ষা করছি যখন আমি এই সমস্যা নিজেকে উত্থাপিত এখানে
OverLordGoldDragon

1
@ ga97dil হ্যাঁ, তারপরে আমি ব্যাখ্যা থেকে বাইরে এসেছি - গিথুবকে জিজ্ঞাসা করার চেষ্টা করুন, যদিও আপনি দীর্ঘ সাড়া পড়তে পারেন।
ওভারলর্ডগোল্ডড্রাগন

1
@ ga97dil প্রকৃতপক্ষে, টিএফ 1 টিএফ 2 এর চেয়ে অনেক দ্রুত হতে পারে - যদিও টিএফ 2.1 ছোট মডেলগুলি এবং ডেটাসেটগুলির জন্য চেষ্টা করা উপযুক্ত, কারণ এটি আমার মানদণ্ডের প্রশিক্ষণে সবচেয়ে দ্রুত (পূর্বাভাস করেনি)। আরও গুরুত্বপূর্ণ, আপনি যদি কখনও টিএফ 2 ব্যবহার করেন তবে আমি দৃ strongly়ভাবে আপনাকে গ্রাফ বনাম এগ্রারে প্রজননযোগ্যতা পরীক্ষা করার পরামর্শ দিচ্ছি ; ফলাফল টিএফ ২.১-এ অত্যন্ত পৃথক হতে পারে ।
ওভারলর্ড গোল্ডড্রেগন

1
আমি আপনার পোস্টটি গিট থ্রেডে এবং আমার টিএফ 2 বনাম টিএফ 1 পোস্টে যুক্ত করেছি। সমস্যাটি টিএফ 1 এ অদৃশ্য হয়ে যাওয়ার জন্য আপনাকে ধন্যবাদ
ওভারলর্ডগোল্ডড্রাগন

2

যদিও আমি মৃত্যুদন্ড কার্যকর করার সময় অসঙ্গতিগুলি ব্যাখ্যা করতে পারি না, আমি আপনাকে সুপারিশ করতে পারি যে আপনি একক ডেটা রেকর্ড বা ছোট ব্যাচগুলির পূর্বাভাস বাড়িয়ে তুলতে আপনার মডেলটিকে টেনসরফ্লো লাইটে রূপান্তর করার চেষ্টা করবেন।

আমি এই মডেলটির একটি মানদণ্ড চালিয়েছি:

model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(384, activation='elu', input_shape=(256,)),
    tf.keras.layers.Dense(384, activation='elu'),
    tf.keras.layers.Dense(256, activation='elu'),
    tf.keras.layers.Dense(128, activation='elu'),
    tf.keras.layers.Dense(32, activation='tanh')
])

একক রেকর্ডগুলির জন্য পূর্বাভাসের সময়গুলি ছিল:

  1. model.predict(input): 18 মিমি
  2. model(input): 1.3 মিমি
  3. মডেল টেনসরফ্লো লাইট: 43 এ রূপান্তরিত

মডেল রূপান্তর সময় ছিল 2 সেকেন্ড।

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

class LiteModel:

    @classmethod
    def from_file(cls, model_path):
        return LiteModel(tf.lite.Interpreter(model_path=model_path))

    @classmethod
    def from_keras_model(cls, kmodel):
        converter = tf.lite.TFLiteConverter.from_keras_model(kmodel)
        tflite_model = converter.convert()
        return LiteModel(tf.lite.Interpreter(model_content=tflite_model))

    def __init__(self, interpreter):
        self.interpreter = interpreter
        self.interpreter.allocate_tensors()
        input_det = self.interpreter.get_input_details()[0]
        output_det = self.interpreter.get_output_details()[0]
        self.input_index = input_det["index"]
        self.output_index = output_det["index"]
        self.input_shape = input_det["shape"]
        self.output_shape = output_det["shape"]
        self.input_dtype = input_det["dtype"]
        self.output_dtype = output_det["dtype"]

    def predict(self, inp):
        inp = inp.astype(self.input_dtype)
        count = inp.shape[0]
        out = np.zeros((count, self.output_shape[1]), dtype=self.output_dtype)
        for i in range(count):
            self.interpreter.set_tensor(self.input_index, inp[i:i+1])
            self.interpreter.invoke()
            out[i] = self.interpreter.get_tensor(self.output_index)[0]
        return out

    def predict_single(self, inp):
        """ Like predict(), but only for a single record. The input data can be a Python list. """
        inp = np.array([inp], dtype=self.input_dtype)
        self.interpreter.set_tensor(self.input_index, inp)
        self.interpreter.invoke()
        out = self.interpreter.get_tensor(self.output_index)
        return out[0]

সম্পূর্ণ বেঞ্চমার্ক কোড এবং একটি প্লট এখানে পাওয়া যাবে: https://medium.com/@micwurm/ using-tensorflow-lite-to-speed-up-predictions-a3954886eb98


শীতল, এর আগে কখনও চেষ্টা করে দেখেনি তবে এটি শটের জন্য উপযুক্ত হবে। ইঙ্গিতটির জন্য ধন্যবাদ!
ga97dil
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.