احفظ التاريخ! يعود مؤتمر Google I / O من 18 إلى 20 مايو. سجل الآن
ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

تكميم ما بعد التدريب

التكميم بعد التدريب هو تقنية تحويل يمكنها تقليل حجم النموذج مع تحسين زمن انتقال وحدة المعالجة المركزية ومسرع الأجهزة ، مع انخفاض ضئيل في دقة النموذج. يمكنك قياس نموذج تعويم 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 بتات وإجراء عمليات حسابية بأوزان وتنشيطات 8 بت. يوفر هذا التحسين زمن انتقال قريب من استدلال النقطة الثابتة بالكامل. ومع ذلك ، لا تزال المخرجات مخزنة باستخدام النقطة العائمة بحيث يكون التسريع مع عمليات النطاق الديناميكي أقل من حساب النقطة الثابتة الكاملة.

تكميم عدد صحيح كامل

يمكنك الحصول على مزيد من التحسينات في زمن الوصول ، وتخفيضات في ذروة استخدام الذاكرة ، والتوافق مع عدد صحيح فقط من الأجهزة أو المسرعات من خلال التأكد من أن جميع الرياضيات في النموذج محددة كميًا.

لتكميم عدد صحيح كامل ، تحتاج إلى معايرة أو تقدير النطاق ، أي (الحد الأدنى ، الحد الأقصى) لجميع موتر الفاصلة العائمة في النموذج. على عكس الموترات الثابتة مثل الأوزان والتحيزات ، لا يمكن معايرة الموترات المتغيرة مثل إدخال النموذج ، والتنشيطات (مخرجات الطبقات الوسيطة) ومخرجات النموذج ما لم نقم بإجراء بضع دورات استدلال. نتيجة لذلك ، يتطلب المحول مجموعة بيانات تمثيلية لمعايرتها. يمكن أن تكون مجموعة البيانات هذه مجموعة فرعية صغيرة (حوالي 100-500 عينة) من بيانات التدريب أو التحقق من الصحة. راجع وظيفة Representative_dataset representative_dataset() أدناه.

def representative_dataset():
  for data in tf.data.Dataset.from_tensor_slices((images)).batch(1).take(100):
    yield [tf.dtypes.cast(data, tf.float32)]

لأغراض الاختبار ، يمكنك استخدام مجموعة بيانات وهمية على النحو التالي:

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 TPU .

بالإضافة إلى ذلك ، لضمان التوافق مع الأجهزة الصحيحة فقط (مثل وحدات التحكم الدقيقة 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 بت. لتمكين تكميم الأوزان ، استخدم الخطوات التالية:

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 Lite . من المهم التحقق من دقة النموذج الكمي للتحقق من أن أي تدهور في الدقة يقع ضمن الحدود المقبولة. توجد أدوات لتقييم دقة نموذج TensorFlow Lite .

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

تمثيل الموترات الكمية

تقترب عملية تكميم 8 بت من قيم النقطة العائمة باستخدام الصيغة التالية.

$$real\_value = (int8\_value - zero\_point) \times scale$$

يتكون التمثيل من جزأين رئيسيين:

  • لكل محور (ويعرف أيضًا باسم كل قناة) أو أوزان كل موتر ممثلة بالقيم التكميلية لـ int8 2 في النطاق [-127 ، 127] بنقطة صفر تساوي 0.

  • عمليات التنشيط / المدخلات لكل موتر ممثلة بالقيم التكميلية لـ int8 two في النطاق [-128 ، 127] ، مع نقطة الصفر في النطاق [-128 ، 127].

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