التكميم بعد التدريب هو تقنية تحويل يمكنها تقليل حجم النموذج مع تحسين زمن انتقال وحدة المعالجة المركزية ومسرع الأجهزة ، مع انخفاض ضئيل في دقة النموذج. يمكنك قياس نموذج تعويم تم تدريبه بالفعل على TensorFlow عند تحويله إلى تنسيق TensorFlow Lite باستخدام محول TensorFlow Lite .
طرق التحسين
هناك العديد من خيارات التكميم بعد التدريب للاختيار من بينها. فيما يلي جدول ملخص بالاختيارات والفوائد التي توفرها:
تقنية | فوائد | المعدات |
---|---|---|
تكميم النطاق الديناميكي | 4x أصغر ، تسريع 2x-3x | وحدة المعالجة المركزية |
تكميم عدد صحيح كامل | 4x أصغر ، 3x + تسريع | وحدة المعالجة المركزية ، حافة TPU ، ميكروكنترولر |
Float16 تكميم | 2x أصغر ، تسريع GPU | وحدة المعالجة المركزية ، وحدة معالجة الرسومات |
يمكن أن تساعد شجرة القرار التالية في تحديد طريقة تكميم ما بعد التدريب الأفضل لحالة الاستخدام الخاصة بك:
تكميم النطاق الديناميكي
يعد تكميم النطاق الديناميكي نقطة انطلاق موصى بها لأنه يوفر استخدامًا أقل للذاكرة وحسابًا أسرع دون الحاجة إلى توفير مجموعة بيانات تمثيلية للمعايرة. هذا النوع من التكميم ، يحدد بشكل ثابت الأوزان فقط من النقطة العائمة إلى العدد الصحيح في وقت التحويل ، مما يوفر 8 بتات من الدقة:
import tensorflow as tf converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) converter.optimizations = [tf.lite.Optimize.DEFAULT] tflite_quant_model = converter.convert()
لتقليل زمن الوصول بشكل أكبر أثناء الاستدلال ، يقوم المشغلون "ديناميكي المدى" بتحديد عمليات التنشيط ديناميكيًا استنادًا إلى مداها إلى 8 بتات وإجراء عمليات حسابية باستخدام أوزان وتنشيطات 8 بت. يوفر هذا التحسين زمن انتقال قريب من استدلالات النقطة الثابتة بالكامل. ومع ذلك ، لا تزال المخرجات مخزنة باستخدام النقطة العائمة ، لذا فإن السرعة المتزايدة لعمليات النطاق الديناميكي أقل من حساب النقطة الثابتة الكاملة.
تكميم عدد صحيح كامل
يمكنك الحصول على مزيد من التحسينات في زمن الوصول ، وتخفيضات في ذروة استخدام الذاكرة ، والتوافق مع عدد صحيح فقط من الأجهزة أو المسرعات من خلال التأكد من أن جميع الرياضيات النموذجية محددة بشكل كمي.
لتكميم عدد صحيح كامل ، تحتاج إلى معايرة أو تقدير النطاق ، أي (الحد الأدنى ، الحد الأقصى) لجميع موتر الفاصلة العائمة في النموذج. على عكس الموترات الثابتة مثل الأوزان والتحيزات ، لا يمكن معايرة الموترات المتغيرة مثل إدخال النموذج ، والتنشيطات (مخرجات الطبقات الوسيطة) ومخرجات النموذج ما لم نقم بإجراء بضع دورات استدلال. نتيجة لذلك ، يتطلب المحول مجموعة بيانات تمثيلية لمعايرتها. يمكن أن تكون مجموعة البيانات هذه مجموعة فرعية صغيرة (حوالي 100-500 عينة) من بيانات التدريب أو التحقق من الصحة. راجع وظيفة representative_dataset()
أدناه.
من إصدار TensorFlow 2.7 ، يمكنك تحديد مجموعة البيانات التمثيلية من خلال التوقيع على النحو التالي:
def representative_dataset(): for data in dataset: yield { "image": data.image, "bias": data.bias, }
إذا كان هناك أكثر من توقيع واحد في نموذج TensorFlow المحدد ، فيمكنك تحديد مجموعة البيانات المتعددة عن طريق تحديد مفاتيح التوقيع:
def representative_dataset(): # Feed data set for the "encode" signature. for data in encode_signature_dataset: yield ( "encode", { "image": data.image, "bias": data.bias, } ) # Feed data set for the "decode" signature. for data in decode_signature_dataset: yield ( "decode", { "image": data.image, "hint": data.hint, }, )
يمكنك إنشاء مجموعة البيانات التمثيلية من خلال توفير قائمة موتر الإدخال:
def representative_dataset(): for data in tf.data.Dataset.from_tensor_slices((images)).batch(1).take(100): yield [tf.dtypes.cast(data, tf.float32)]
منذ إصدار TensorFlow 2.7 ، نوصي باستخدام النهج القائم على التوقيع على النهج القائم على قائمة موتر الإدخال لأن ترتيب موتر الإدخال يمكن قلبه بسهولة.
لأغراض الاختبار ، يمكنك استخدام مجموعة بيانات وهمية على النحو التالي:
def representative_dataset(): for _ in range(100): data = np.random.rand(1, 244, 244, 3) yield [data.astype(np.float32)]
عدد صحيح مع تعويم احتياطي (باستخدام إدخال / إخراج تعويم افتراضي)
من أجل تحديد نموذج كمي بشكل كامل ، ولكن استخدم عوامل التشغيل الطافية عندما لا يكون لديهم تنفيذ عدد صحيح (لضمان حدوث التحويل بسلاسة) ، استخدم الخطوات التالية:
import tensorflow as tf converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) converter.optimizations = [tf.lite.Optimize.DEFAULT] converter.representative_dataset = representative_dataset tflite_quant_model = converter.convert()
عدد صحيح فقط
يعد إنشاء نماذج عدد صحيح فقط حالة استخدام شائعة لـ TensorFlow Lite للمتحكمات الدقيقة و Coral Edge TPUs .
بالإضافة إلى ذلك ، لضمان التوافق مع الأجهزة الصحيحة فقط (مثل وحدات التحكم الدقيقة 8 بت) والمسرعات (مثل Coral Edge TPU) ، يمكنك فرض تكميم عدد صحيح كامل لجميع العمليات بما في ذلك المدخلات والمخرجات ، باستخدام الخطوات التالية:
import tensorflow as tf converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) converter.optimizations = [tf.lite.Optimize.DEFAULT] converter.representative_dataset = representative_dataset converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] converter.inference_input_type = tf.int8 # or tf.uint8 converter.inference_output_type = tf.int8 # or tf.uint8 tflite_quant_model = converter.convert()
تكميم Float16
يمكنك تقليل حجم نموذج النقطة العائمة عن طريق تحديد الأوزان إلى float16 ، وهو معيار IEEE لأرقام الفاصلة العائمة ذات 16 بت. لتمكينكمية float16 للأوزان ، استخدم الخطوات التالية:
import tensorflow as tf converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) converter.optimizations = [tf.lite.Optimize.DEFAULT] converter.target_spec.supported_types = [tf.float16] tflite_quant_model = converter.convert()
مزايا تكميم float16 هي كما يلي:
- يقلل حجم النموذج حتى النصف (حيث تصبح جميع الأوزان نصف حجمها الأصلي).
- يتسبب في الحد الأدنى من فقدان الدقة.
- وهو يدعم بعض المندوبين (مثل مفوض GPU) الذين يمكنهم العمل مباشرة على بيانات float16 ، مما يؤدي إلى تنفيذ أسرع من حسابات float32.
مساوئ تكميم float16 هي كما يلي:
- لا تقلل الكمون بقدر ما تقلل من تكميم الرياضيات نقطة ثابتة.
- بشكل افتراضي ، فإن النموذج الكمي float16 "يزيل" قيم الأوزان إلى float32 عند تشغيله على وحدة المعالجة المركزية. (لاحظ أن مفوض GPU لن يقوم بعملية إزالة التواء هذه ، حيث يمكن أن يعمل على بيانات float16.)
عدد صحيح فقط: عمليات تنشيط 16 بت مع أوزان 8 بت (تجريبي)
هذا مخطط تكميم تجريبي. إنه مشابه لمخطط "الأعداد الصحيحة فقط" ، ولكن يتم تحديد عمليات التنشيط على أساس مداها إلى 16 بت ، ويتم تحديد الأوزان في عدد صحيح 8 بت ويتم تقسيم التحيز إلى عدد صحيح 64 بت. ويشار إلى هذا بتكميم 16x8 كذلك.
الميزة الرئيسية لهذا التكميم هي أنه يمكن أن يحسن الدقة بشكل كبير ، ولكن فقط يزيد حجم النموذج بشكل طفيف.
import tensorflow as tf converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) converter.representative_dataset = representative_dataset converter.optimizations = [tf.lite.Optimize.DEFAULT] converter.target_spec.supported_ops = [tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8] tflite_quant_model = converter.convert()
إذا لم يكن التكميم 16x8 مدعومًا لبعض المشغلين في النموذج ، فلا يزال من الممكن تحديد كمي للنموذج ، لكن المشغلين غير المدعومين يظلون في حالة تعويم. يجب إضافة الخيار التالي إلى target_spec للسماح بذلك.
import tensorflow as tf converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) converter.representative_dataset = representative_dataset converter.optimizations = [tf.lite.Optimize.DEFAULT] converter.target_spec.supported_ops = [tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8, tf.lite.OpsSet.TFLITE_BUILTINS] tflite_quant_model = converter.convert()
أمثلة على حالات الاستخدام التي تتضمن تحسينات الدقة التي يوفرها مخطط التكميم هذا:
- دقة فائقة ،
- معالجة الإشارات الصوتية مثل إلغاء الضوضاء وتشكيل الحزمة ،
- إزالة الضوضاء من الصورة ،
- إعادة بناء HDR من صورة واحدة.
عيب هذا التكميم هو:
- الاستدلال حاليًا أبطأ بشكل ملحوظ من 8 بت عدد صحيح كامل بسبب نقص تنفيذ kernel المحسن.
- حاليًا لا يتوافق مع مفوضي TFLite الحاليين المسرعين بالأجهزة.
يمكن العثور على برنامج تعليمي لوضع التكميم هذا هنا .
دقة النموذج
نظرًا لأن الأوزان يتم تحديدها كميًا بعد التدريب ، فقد يكون هناك فقدان في الدقة ، خاصة بالنسبة للشبكات الأصغر. يتم توفير نماذج كمية كاملة مدربة مسبقًا لشبكات محددة على TensorFlow Hub . من المهم التحقق من دقة النموذج الكمي للتحقق من أن أي تدهور في الدقة يقع ضمن الحدود المقبولة. توجد أدوات لتقييم دقة نموذج TensorFlow Lite .
بدلاً من ذلك ، إذا كان الانخفاض في الدقة مرتفعًا جدًا ، ففكر في استخدام التدريب المدرك للتكميم . ومع ذلك ، يتطلب القيام بذلك تعديلات أثناء التدريب النموذجي لإضافة عقد تكميم وهمية ، في حين أن تقنيات التكميم بعد التدريب على هذه الصفحة تستخدم نموذجًا تم تدريبه مسبقًا.
تمثيل الموترات الكمية
تقترب عملية التكميم المكونة من 8 بتات من قيم النقطة العائمة باستخدام الصيغة التالية.
\[real\_value = (int8\_value - zero\_point) \times scale\]
يتكون التمثيل من جزأين رئيسيين:
لكل محور (ويعرف أيضًا باسم كل قناة) أو أوزان كل موتر ممثلة بالقيم التكميلية لـ int8 2 في النطاق [-127 ، 127] بنقطة صفر تساوي 0.
عمليات التنشيط / المدخلات لكل موتر ممثلة بالقيم التكميلية لـ int8 two في النطاق [-128 ، 127] ، مع نقطة الصفر في النطاق [-128 ، 127].
للحصول على عرض تفصيلي لمخططنا الكمي ، يرجى الاطلاع على مواصفات التكمية الخاصة بنا. يتم تشجيع بائعي الأجهزة الذين يرغبون في التوصيل بواجهة مندوب TensorFlow Lite على تنفيذ مخطط التقسيم الموضح هناك.