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

ملخص

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

نظرًا لوجود العديد من المتغيرات لواجهات RNN API في TensorFlow، فقد كان نهجنا ذو شقين:

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

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

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

تتوفر وظيفة التحويل هذه عند التحويل إلى TensorFlow Lite عبر SavedModel أو من نموذج 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()

من موديل كيراس

# 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 لموتر الوزن المتكرر هو عدد النواتج.
  3. يتم نقل الموترات الوزن و recurrent_kernel .
  4. يتم تقسيم الوزن المنقول والنواة المتكررة المنقولة وموترات التحيز إلى 4 موترات متساوية الحجم على طول البعد 0. وتتوافق هذه مع بوابة الإدخال وبوابة النسيان والخلية وبوابة الإخراج .

متغيرات Keras LSTM

الوقت الرئيسي

يمكن للمستخدمين اختيار الوقت الرئيسي أو عدم وجود وقت رئيسي. يضيف Keras LSTM سمة زمنية رئيسية في سمات تعريف الوظيفة. بالنسبة للتسلسل أحادي الاتجاه LSTM، يمكننا ببساطة تعيين السمة الرئيسية للوقت لـ unidirecional_sequence_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 الخاصة بالمستخدم مختلفة عن الواجهة القياسية المدعومة، فهناك خياران:

الخيار 1: كتابة رمز المحول في TensorFlow python لتكييف واجهة RNN مع واجهة Keras RNN. وهذا يعني وجود tf.function مع تعليق توضيحي tf_implements على وظيفة واجهة RNN التي تم إنشاؤها والتي تكون مماثلة لتلك التي تم إنشاؤها بواسطة طبقة Keras LSTM. بعد ذلك، ستعمل نفس واجهة برمجة تطبيقات التحويل المستخدمة في Keras LSTM.

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

والمثال الكامل لتدفق التحويل هذا هو تحويل LSTMCellSimple إلى TensorFlow Lite من Lingvo.

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

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

    عقد التحويل:

  3. يتم نقل موترات الوزن والإسقاط .

  4. يتم استخراج {الإدخال، المتكرر} إلى {الخلية، بوابة الإدخال، بوابة النسيان، بوابة الإخراج} عن طريق تقطيع موتر الوزن المنقول.

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

  6. يتم استخراج الإسقاط عن طريق تقطيع موتر الإسقاط المنقول.

  7. تتم كتابة تحويل مماثل لـ LayerNormalizedLSTMCellSimple .

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

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

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