قابلة لإعادة الاستخدام SavedModels

مقدمة

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

توضح هذه الصفحة واجهة لأن تنفذها تحميل obj من أجل إعادة استخدامها في برنامج TensorFlow بيثون. يُطلق على SavedModels المتوافقة مع هذه الواجهة اسم SavedModels القابل لإعادة الاستخدام .

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

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

العلاقة مع SignatureDefs

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

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

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

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

العلاقة بـ "Common SavedModel APIs" الخاصة بالمهمة

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

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

صفات

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

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

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

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

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

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

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

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

وظيفة __call__

يحتوي كائن SavedModel المستعاد على سمة obj obj.__call__ وهي وظيفة tf تمت استعادتها وتسمح باستدعاء obj على النحو التالي.

ملخص (كود زائف):

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

الحجج

الحجج على النحو التالي.

  • هناك وسيطة موضعية واحدة مطلوبة مع مجموعة من عمليات تنشيط الإدخال في SavedModel. نوعه هو واحد من

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

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

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

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

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

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

    • بالنسبة للحجج ذات القيمة Python ، يحدد منشئ SavedModel القيم المسموح بها. يمكن استخدام مثل هذه الحجج كأعلام لاتخاذ خيارات منفصلة في وظيفة التتبع (لكن ضع في اعتبارك الانفجار الاندماجي للآثار).

يجب أن توفر وظيفة __call__ المستعادة تتبعات لجميع مجموعات الوسائط المسموح بها. التقليب training بين True و False يجب عدم تغيير جواز الحجج.

نتيجة

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

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

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

مسميات

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

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

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

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

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

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