تحويل TensorFlow RNN إلى LiteRT

نظرة عامة

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

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

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

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

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

تتوفر وظيفة التحويل هذه عند التحويل إلى LiteRT عبر نموذج محفوظ أو من نموذج 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 إلى LiteRT Colab لتوضيح الاستخدام من النهاية إلى النهاية باستخدام أداة الترجمة الفورية في LiteRT.

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

نوفّر إمكانية تحويل Keras LSTM إلى LiteRT بشكلٍ جاهز. بالنسبة تفاصيل حول كيفية عمل ذلك، يُرجى الرجوع إلى واجهة Keras LSTM وإلى منطق الإحالات الناجحة هنا

ومن المهم أيضًا إبراز عقد LSTM الخاص بـ LiteRT فيما يتعلق إلى تعريف عملية Keras:

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

متغيّرات Keras LSTM

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

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

LSTM ثنائي الاتجاه

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

أمثلة على إحالات ناجحة LSTM التي يحدّدها المستخدم

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

"Bring your own TensorFlow RNN" to LiteRT

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

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

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

وخير مثال على تدفق التحويل هذا هو LSTMCellSimple من Lingvo تحويل LiteRT

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

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

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

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

  4. {input, recurrent} من {cell, enter gate, نسيان بوابة, المخرجات} gate} يتم استخراجها عن طريق تقسيم موتر الوزن الذي تم تبديله.

  5. إنّ {bias} المؤدية إلى {bias} هي المستخرَجة بتقسيم متّجه الانحياز.

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

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

  8. بقية البنية الأساسية لتحويل LiteRT، بما في ذلك جميع بطاقات MLIR وكذلك يمكن تصدير التصدير النهائي إلى المخزن المؤقت لـ LiteRT وإعادة استخدامه.

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

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