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

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