تحويل TensorFlow RNN إلى TensorFlow Lite

نظرة عامة

يتيح TensorFlow Lite تحويل نماذج TensorFlow RNN إلى عمليات LSTM المدمجة في TensorFlow Lite. وتهدف العمليات المدمجة لتحسين أداء عمليات تنفيذ النواة الأساسية إلى أقصى حد، فضلاً عن توفير واجهة مستوى أعلى لتحديد التحويلات المعقدة مثل التحليل الكمي.

نظرًا لوجود العديد من المتغيرات لواجهات برمجة تطبيقات RNN في TensorFlow، فإن النهج الذي نتبعه ينطوي على شقين:

  1. توفير دعم أصلي لواجهات برمجة تطبيقات TensorFlow RNN العادية، مثل Keras LSTM وهذا هو الخيار المقترَح.
  2. توفير واجهة في البنية الأساسية للإحالات الناجحة من أجل عمليات تنفيذ RNN المحدّدة من قِبل المستخدم من أجل توصيل الجهاز وتحويله إلى TensorFlow Lite. نحن نقدم مثالين غير تقليديين لهذا التحويل باستخدام واجهتي LSTMCellSimple وLayerNormalizedLSTMCellSimple من lingvo.

واجهة برمجة تطبيقات المحول

هذه الميزة جزء من إصدار TensorFlow 2.3. وهي متاحة أيضًا من خلال لقطة الشاشة tf-nightly من خلال الشاشة الرئيسية.

تتوفّر وظيفة التحويل هذه عند التحويل إلى TensorFlow Lite من خلال SaveModel أو نموذج Keras مباشرةً. الاطّلاع على أمثلة حول الاستخدامات

من النموذج المحفوظ

# build a saved model. Here concrete_function is the exported function
# corresponding to the TensorFlow model containing one or more
# Keras LSTM layers.
saved_model, saved_model_dir = build_saved_model_lstm(...)
saved_model.save(saved_model_dir, save_format="tf", signatures=concrete_func)

# Convert the model.
converter = TFLiteConverter.from_saved_model(saved_model_dir)
tflite_model = converter.convert()

من نموذج Keras

# build a Keras model
keras_model = build_keras_lstm(...)

# Convert the model.
converter = TFLiteConverter.from_keras_model(keras_model)
tflite_model = converter.convert()

مثال

توضّح Keras LSTM إلى TensorFlow Lite Colab طريقة الاستخدام الشاملة من خلال أداة الترجمة الفورية من TensorFlow Lite.

واجهات برمجة تطبيقات TensorFlow RNNs المتوافقة

نوفّر ميزة تحويل مجموعة من Keras LSTM بطريقة غير تقليدية إلى منصة TensorFlow Lite. للحصول على تفاصيل حول آلية عمل ذلك، يُرجى الرجوع إلى واجهة Keras LSTM ومنطق الإحالات الناجحة هنا.

من المهم أيضًا تسليط الضوء على عقد LSTM الخاص بـ TensorFlow Lite في ما يتعلق بتعريف عملية Keras:

  1. السمة 0 لشدة الإدخال هي حجم الدُفعة.
  2. البُعد 0 لموتر recurrent_weight هو عدد المخرجات.
  3. يتم تبديل الموضعين weight وrecurrent_kernel.
  4. يتم تقسيم الوزن المبدل، والمحولات recurrent_kernel وتحيز إلى 4 موترات متساوية الحجم على طول البُعد 0. وتتجاوب هذه مع بوابة الدخول، ونسيان البوابة، والخلية، وبوابة الإخراج.

متغيرات Keras LSTM

النطاق الزمني الرئيسي

ويمكن للمستخدمين اختيار أهم الوقت أو عدم إتاحته على الإطلاق. تضيف Keras LSTM سمة أهم وقت في سمات الدالة def. بالنسبة إلى التسلسل الأحادي الاتجاه LSTM، يمكننا ببساطة التعيين إلى السمة الرئيسية للوقت في unidirecional_result_lstm.

مؤشر LSTM ثنائي الاتجاه

يمكن تنفيذ LSTM ثنائي الاتجاه باستخدام طبقتين من طبقات Keras LSTM، إحداهما للأمام والأخرى للوراء. يمكنك الاطّلاع على الأمثلة هنا. بمجرد أن نرى سمة go_backward، نتعرف عليها على أنها LSTM للخلف، ثم نجمع LSTM للأمام وللخلف معًا. هذا العمل المستقبلي. في الوقت الحالي، يؤدي هذا إلى إنشاء عمليتين UnidirectionalSequenceLSTM في نموذج TensorFlow Lite.

أمثلة على تحويل LSTM من تحديد المستخدم

يوفّر TensorFlow Lite أيضًا طريقة لتحويل تطبيقات LSTM التي يحددها المستخدم. هنا نستخدم LSTM من Lingvo كمثال على كيفية تنفيذ ذلك. لمزيد من التفاصيل، يُرجى الرجوع إلى واجهة lingvo.LSTMCellSimple ومنطق التحويل هنا. ونقدّم أيضًا مثالاً آخر من تعريفات LSTM من Lingvo في واجهة lingvo.LayernormalizedLSTMCellSimple، ومنطق التحويل الخاص به هنا.

إحضار TensorFlow RNN الخاص بك إلى TensorFlow Lite

إذا كانت واجهة RNN الخاصة بالمستخدم مختلفة عن تلك العادية المتوافقة، هناك خياران:

الخيار الأول: اكتب رمز المحوِّل بلغة TensorFlow python لضبط واجهة RNN مع واجهة Keras RNN. وهذا يعني استخدام دالة tf.مع تعليق توضيحي بشأن tf_implements على دالة واجهة RNN التي تم إنشاؤها، وهي مطابِقة للدالة التي تم إنشاؤها بواسطة طبقة Keras LSTM. بعد ذلك، ستعمل واجهة برمجة التطبيقات الخاصة بالإحالة الناجحة نفسها المستخدَمة في Keras LSTM.

الخيار 2: في حال لم يكن ما سبق ممكنًا (مثلاً، تفتقد آلية Keras LSTM إلى بعض الوظائف المعروضة حاليًا من خلال عملية تسوية LSTM المدمجة في TensorFlow Lite)، يمكنك توسيع نطاق محوّل TensorFlow Lite عن طريق كتابة رمز إحالة ناجحة مخصّص وإدخاله في دالة ML-pass التجهيز هنا. يجب التعامل مع واجهة الدالة كعقد لواجهة برمجة التطبيقات ويجب أن تحتوي على الوسيطات اللازمة للتحويل إلى عمليات TensorFlow Lite LSTM المدمجة، أي الإدخال والانحياز والأوزان والإسقاط وتسوية الطبقة وما إلى ذلك. ويُفضل أن تكون الموترات التي يتم تمريرها كوسيطات لهذه الدالة للحصول على ترتيب معروف (مثل RankedTensorType في ML. وهذا يسهل كثيرًا كتابة رمز الإحالة الناجحة الذي يمكنه افتراض هذه الموتّرات على أنها RankedTensorType، ويساعد في تحويلها إلى قيم متكافئة مرتَّبة متوافقة مع معاملات عامل التشغيل TensorFlow Lite المدمجة.

ومن الأمثلة الكاملة على تدفق الإحالات الناجحة هذا إجراء تحويل LSTMCellSimple إلى TensorFlow Lite من Lingvo.

يتم تعريف LSTMCellSimple في Lingvo هنا. يمكن تحويل النماذج المدرَّبة باستخدام خلية LSTM هذه إلى TensorFlow Lite على النحو التالي:

  1. يجب إحاطة جميع استخدامات LSTMCellSimple بدالة tf.function مع تعليق توضيحي tf_implements مصنَّف على هذا النحو (على سبيل المثال، lingvo.LSTMCellSimple سيكون اسم تعليق توضيحي جيدًا هنا). تأكد من أن الدالة tf.التي يتم إنشاؤها تتطابق مع واجهة الدالة المتوقعة في رمز الإحالة الناجحة. وهذا عبارة عن عقد بين مؤلف النموذج الذي يضيف التعليق التوضيحي ورمز الإحالة الناجحة.
  2. عليك تمديد تمرير الدوال المركّبة للتوصيل بتحويل عملية مركب مخصص إلى TensorFlow Lite من أجل تحويل العمليات LSTM المصغَّر. اطّلع على رمز تحويل LSTMCellSimple.

    عقد الإحالة الناجحة:

  3. يتم تبديل موضعَي الوزن والإسقاط.

  4. يتم استخراج {input, recurrent} إلى {cell,إدخال بوابة, نسيان بوابة، وبوابة المخرجات} من خلال تقسيم موتر الوزن الذي تم تغيير موضعه.

  5. يتم استخراج {bias} إلى {cell,واي بوابة الإدخال, نسيان البوابة، وبوابة المخرجات} عن طريق تقسيم مشد الانحياز.

  6. يتم استخراج الإسقاط عن طريق تقسيم مشد الإسقاط الذي تم تغيير موضعه.

  7. تمت كتابة إحالة ناجحة مشابهة من أجل LayerNormalizedLSTMCellSimple.

  8. يمكن إعادة استخدام بقية البنية الأساسية للإحالات الناجحة من TensorFlow Lite، بما في ذلك جميع بطاقات MLIR بالإضافة إلى البيانات النهائية التي تم تصديرها إلى TensorFlow Lite Flabuffer.

المشاكل/القيود المعروفة

  1. لا يتوفّر حاليًا سوى تحويل Keras LSTM الذي لا يحمل حالة (السلوك التلقائي في Keras). إنّ عملية التحويل من Keras LSTM الناجحة هي عمل مستقبلي.
  2. لا يزال من الممكن تصميم طبقة من طبقات Keras LSTM الأساسية باستخدام طبقة Keras LSTM الأساسية التي لا تتضمّن حالة وإدارة الحالة بشكل صريح في برنامج المستخدم. لا يزال من الممكن تحويل برنامج TensorFlow إلى TensorFlow Lite باستخدام الميزة الموضّحة هنا.
  3. يتم حاليًا وضع نموذج LSTM ثنائي الاتجاه كعمليتَي UnidirectionalSequenceLSTM في TensorFlow Lite. سيتم استبدال هذا بعملية BidirectionalSequenceLSTM واحدة.