النماذج المحفوظة القابلة لإعادة الاستخدام

مقدمة

يستضيف TensorFlow Hub نماذج محفوظة (SavedModels) لـ TensorFlow 2، بالإضافة إلى موارد أخرى. يمكن تحميل هذه النماذج مرة أخرى إلى برنامج بايثون باستخدام obj = hub.load(url) [ للمزيد من المعلومات ]. الكائن obj المُعاد هو نتيجة استدعاء tf.saved_model.load() (راجع دليل النماذج المحفوظة في TensorFlow). يمكن أن يحتوي هذا الكائن على سمات متنوعة، مثل دوال TensorFlow (tf.functions)، ومتغيرات TensorFlow (tf.Variables) (مُهيأة بقيمها المُدرّبة مسبقًا)، وموارد أخرى، بالإضافة إلى المزيد من هذه الكائنات بشكل متكرر.

تصف هذه الصفحة واجهةً يجب على الكائن المُحمّل ( obj تنفيذها لإعادة استخدامه في برنامج بايثون مكتوب بلغة TensorFlow. تُسمى النماذج المحفوظة (SavedModels) التي تتوافق مع هذه الواجهة "نماذج محفوظة قابلة لإعادة الاستخدام" (Reusable SavedModels ).

إعادة الاستخدام تعني بناء نموذج أكبر حول الكائن obj ، بما في ذلك إمكانية ضبطه بدقة. الضبط الدقيق يعني تدريب الأوزان في الكائن obj المُحمّل كجزء من النموذج المحيط. يتم تحديد دالة الخسارة والمُحسِّن بواسطة النموذج المحيط؛ بينما يُحدد obj فقط عملية ربط تنشيطات المدخلات بتنشيطات المخرجات (التمرير الأمامي)، وقد يشمل ذلك تقنيات مثل التسرب أو التطبيع الدفعي.

يوصي فريق TensorFlow Hub بتطبيق واجهة Reusable SavedModel في جميع نماذج SavedModels التي يُراد إعادة استخدامها بالمعنى المذكور أعلاه. تتطلب العديد من الأدوات المساعدة من مكتبة tensorflow_hub ، ولا سيما hub.KerasLayer ، أن تُطبّق نماذج SavedModels هذه الواجهة.

العلاقة بتعريفات التوقيع

تُعدّ هذه الواجهة، من حيث دوال tf.functions وغيرها من ميزات TF2، منفصلةً عن توقيعات SavedModel، المتوفرة منذ TF1 والتي لا تزال تُستخدم في TF2 للاستدلال (مثل نشر SavedModels على TF Serving أو TF Lite). توقيعات الاستدلال غير كافية لدعم الضبط الدقيق، بينما توفر tf.function واجهة برمجة تطبيقات بايثون أكثر سلاسةً ووضوحًا للنموذج المُعاد استخدامه.

العلاقة بمكتبات بناء النماذج

يستخدم نموذج SavedModel القابل لإعادة الاستخدام عناصر TensorFlow 2 الأساسية فقط، بشكل مستقل عن أي مكتبة بناء نماذج محددة مثل Keras أو Sonnet. وهذا يُسهّل إعادة استخدامه عبر مكتبات بناء النماذج المختلفة، دون الاعتماد على كود بناء النموذج الأصلي.

سيتطلب الأمر بعض التعديلات لتحميل نماذج SavedModels القابلة لإعادة الاستخدام أو حفظها من أي مكتبة بناء نماذج. بالنسبة لـ Keras، توفر hub.KerasLayer عملية التحميل، وقد أُعيد تصميم آلية الحفظ المدمجة في Keras بصيغة SavedModel لـ TF2 بهدف توفير مجموعة شاملة من هذه الواجهة (انظر RFC الصادر في مايو 2019).

العلاقة بواجهات برمجة تطبيقات "النماذج المحفوظة المشتركة" الخاصة بالمهام

يُتيح تعريف الواجهة في هذه الصفحة أي عدد ونوع من المدخلات والمخرجات. تعمل واجهات برمجة تطبيقات Common SavedModel لـ TF Hub على تحسين هذه الواجهة العامة من خلال وضع قواعد استخدام لمهام محددة، مما يجعل النماذج قابلة للتبديل بسهولة.

تعريف الواجهة

صفات

النموذج المحفوظ القابل لإعادة الاستخدام هو نموذج محفوظ من TensorFlow 2 بحيث تُعيد الدالة obj = tf.saved_model.load(...) كائنًا يحتوي على السمات التالية

  • __call__ . مطلوب. دالة tf.function التي تنفذ عملية حساب النموذج (عملية "التمرير الأمامي") وفقًا للمواصفات أدناه.

  • variables : قائمة بكائنات tf.Variable، تسرد جميع المتغيرات المستخدمة بواسطة أي استدعاء ممكن لـ __call__ ، بما في ذلك المتغيرات القابلة للتدريب وغير القابلة للتدريب.

    يمكن حذف هذه القائمة إذا كانت فارغة.

  • trainable_variables : قائمة بكائنات tf.Variable بحيث تكون v.trainable صحيحة لجميع عناصرها. يجب أن تكون هذه المتغيرات مجموعة فرعية من variables . هذه هي المتغيرات التي سيتم تدريبها عند ضبط الكائن بدقة. قد يختار مُنشئ SavedModel حذف بعض المتغيرات التي كانت قابلة للتدريب في الأصل للإشارة إلى أنه لا ينبغي تعديلها أثناء الضبط الدقيق.

    يمكن حذف هذه القائمة إذا كانت فارغة، وخاصة إذا كان النموذج المحفوظ لا يدعم الضبط الدقيق.

  • regularization_losses : قائمة من دوال TensorFlow، كل منها لا تتطلب أي مدخلات وتعيد موترًا عدديًا من نوع float. يُنصح مستخدم SavedModel بإضافة هذه الدوال كحدود تنظيم إضافية إلى دالة الخسارة لتحسين الأداء (في أبسط الحالات، دون الحاجة إلى تغيير المقياس). تُستخدم هذه الدوال عادةً لتمثيل مُنظِّمات الأوزان. (في حال عدم توفر مدخلات، لا يمكن لهذه الدوال التعبير عن مُنظِّمات النشاط).

    يمكن حذف هذه القائمة إذا كانت فارغة، على وجه الخصوص، إذا كان النموذج المحفوظ لا يدعم الضبط الدقيق أو لا يرغب في تحديد تنظيم الوزن.

دالة __call__

يحتوي obj المستعاد من نوع SavedModel على سمة obj.__call__ وهي عبارة عن دالة tf.function مستعادة وتسمح باستدعاء obj على النحو التالي.

ملخص (شفرة زائفة):

outputs = obj(inputs, trainable=..., **kwargs)

الحجج

الحجج هي كالتالي.

  • يوجد وسيط موضعي واحد إلزامي مع مجموعة من عمليات تنشيط الإدخال للنموذج المحفوظ. نوعه أحد الأنواع التالية:

    • موتر واحد لمدخل واحد،
    • قائمة من الموترات لتسلسل مرتب من المدخلات غير المسماة،
    • قاموس من الموترات مفهرسة بمجموعة معينة من أسماء المدخلات.

    (قد تسمح المراجعات المستقبلية لهذه الواجهة بإنشاء تداخلات أكثر عمومية.) يختار مُنشئ SavedModel أحد هذه التداخلات، بالإضافة إلى أشكال الموتر وأنواع البيانات. وعند الحاجة، يجب أن تكون بعض أبعاد الشكل غير مُحددة (لا سيما حجم الدفعة).

  • قد يتوفر وسيط اختياري باسم " training يقبل قيمة منطقية ( True أو False ) في لغة بايثون. القيمة الافتراضية هي False . إذا كان النموذج يدعم الضبط الدقيق، وإذا اختلف حسابه بين الطريقتين (كما في حالة التسرب والتطبيع الدفعي مثلاً)، فسيتم تطبيق هذا التمييز باستخدام هذا الوسيط. وإلا، فقد لا يكون هذا الوسيط موجودًا.

    ليس من الضروري أن تقبل الدالة __call__ وسيط training من نوع Tensor. يقع على عاتق المُستدعي استخدام tf.cond() إذا لزم الأمر للتحويل بينهما.

  • قد يختار منشئ SavedModel قبول المزيد kwargs الاختيارية ذات أسماء معينة.

    • بالنسبة للوسائط ذات القيم الموترية، يُحدد مُنشئ SavedModel أنواع البيانات وأشكالها المسموح بها. تقبل tf.function قيمة افتراضية من بايثون لوسيط يتم تتبعه باستخدام مُدخل tf.TensorSpec. يمكن استخدام هذه الوسائط للسماح بتخصيص المعلمات الفائقة العددية المُستخدمة في __call__ (مثل معدل التسرب).

    • بالنسبة للوسائط التي تُرجع قيمًا من نوع بايثون، يُحدد مُنشئ SavedModel القيم المسموح بها. يمكن استخدام هذه الوسائط كعلامات لإجراء خيارات منفصلة في الدالة المُتتبعة (لكن انتبه إلى التزايد الهائل في عدد عمليات التتبع).

يجب أن توفر دالة __call__ المُستعادة آثارًا لجميع تركيبات الوسائط المسموح بها. ويجب ألا يؤدي تغيير قيمة training بين True و False إلى تغيير مدى جوازية الوسائط.

نتيجة

يمكن أن تكون outputs استدعاء obj

  • موتر واحد لمخرج واحد،
  • قائمة من الموترات لتسلسل مرتب من المخرجات غير المسماة،
  • قاموس من الموترات مفهرس بمجموعة معينة من أسماء المخرجات.

(قد تسمح المراجعات المستقبلية لهذه الواجهة بإنشاء تداخلات أكثر عمومية.) قد يختلف نوع القيمة المُعادة تبعًا للوسائط المُسماة (kwargs) المُحددة بلغة بايثون. وهذا يسمح باستخدام علامات تُنتج مُخرجات إضافية. يُحدد مُنشئ SavedModel أنواع البيانات وأشكالها المُخرجة، بالإضافة إلى اعتمادها على المُدخلات.

الدوال المسماة

يمكن لنموذج SavedModel القابل لإعادة الاستخدام توفير أجزاء نموذجية متعددة بالطريقة الموضحة أعلاه، وذلك بوضعها في كائنات فرعية مُسماة، على سبيل المثال، obj.foo و obj.bar وما إلى ذلك. يوفر كل كائن فرعي دالة __call__ وخصائص داعمة تتعلق بالمتغيرات وما إلى ذلك، الخاصة بذلك الجزء من النموذج. في المثال أعلاه، سيكون لدينا obj.foo.__call__ و obj.foo.variables وما إلى ذلك.

لاحظ أن هذه الواجهة لا تغطي أسلوب إضافة دالة tf.function مباشرة كـ tf.foo .

يُتوقع من مستخدمي Reusable SavedModels التعامل مع مستوى واحد فقط من التداخل ( obj.bar وليس obj.bar.baz ). (قد تسمح المراجعات المستقبلية لهذه الواجهة بتداخل أعمق، وقد تتخلى عن شرط أن يكون الكائن ذو المستوى الأعلى قابلاً للاستدعاء).

ملاحظات ختامية

العلاقة بواجهات برمجة التطبيقات داخل العملية

تصف هذه الوثيقة واجهة فئة بايثون التي تتكون من عناصر أساسية مثل tf.function و tf.Variable، والتي تبقى محفوظةً بعد عملية التسلسل عبر tf.saved_model.save() و tf.saved_model.load() . مع ذلك، كانت هذه الواجهة موجودةً مسبقًا في الكائن الأصلي الذي تم تمريره إلى tf.saved_model.save() . يُمكّن التكيف مع هذه الواجهة من تبادل أجزاء النموذج عبر واجهات برمجة تطبيقات بناء النماذج ضمن برنامج TensorFlow واحد.