مؤتمر Google I / O هو التفاف! تابع جلسات TensorFlow اعرض الجلسات

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

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

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