مندوبي TensorFlow Lite

مقدمة

يقوم المندوبون بتمكين تسريع الأجهزة لنماذج TensorFlow Lite من خلال الاستفادة من المسرعات الموجودة على الجهاز مثل وحدة معالجة الرسومات (GPU ) ومعالج الإشارة الرقمية (DSP) .

بشكل افتراضي ، يستخدم TensorFlow Lite نواة وحدة المعالجة المركزية التي تم تحسينها لمجموعة تعليمات ARM Neon . ومع ذلك ، فإن وحدة المعالجة المركزية هي معالج متعدد الأغراض ليس بالضرورة مُحسَّنًا للحسابات الثقيلة الموجودة عادةً في نماذج التعلم الآلي (على سبيل المثال ، الرياضيات المصفوفة المتضمنة في الالتواء والطبقات الكثيفة).

من ناحية أخرى ، تحتوي معظم الهواتف المحمولة الحديثة على شرائح أفضل في التعامل مع هذه العمليات الثقيلة. يوفر استخدامها في عمليات الشبكة العصبية فوائد كبيرة من حيث زمن الوصول وكفاءة الطاقة. على سبيل المثال ، يمكن أن توفر وحدات معالجة الرسومات تسريعًا يصل إلى 5x في زمن الانتقال ، بينما أظهر Qualcomm® Hexagon DSP قدرته على تقليل استهلاك الطاقة بنسبة تصل إلى 75٪ في تجاربنا.

تحتوي كل مسرعات من هذه المسرعات على واجهات برمجة تطبيقات مرتبطة تتيح عمليات حسابية مخصصة ، مثل OpenCL أو OpenGL ES لوحدة معالجة الرسومات المحمولة و Qualcomm® Hexagon SDK لـ DSP. عادة ، يجب عليك كتابة الكثير من التعليمات البرمجية المخصصة لتشغيل شبكة عصبية من خلال هذه الواجهات. تصبح الأمور أكثر تعقيدًا عندما تفكر في أن لكل مسرّع مزايا وعيوب ولا يمكنه تنفيذ كل عملية في الشبكة العصبية. تعمل واجهة API المندوبة في TensorFlow Lite على حل هذه المشكلة من خلال العمل كجسر بين وقت تشغيل TFLite وواجهات برمجة التطبيقات ذات المستوى المنخفض.

وقت التشغيل مع المندوبين

اختيار مندوب

يدعم TensorFlow Lite العديد من المندوبين ، كل منها مُحسَّن لمنصة (أنظمة) معينة وأنواع معينة من النماذج. عادة ، سيكون هناك العديد من المندوبين المطبقين على حالة الاستخدام الخاصة بك ، اعتمادًا على معيارين رئيسيين: النظام الأساسي (Android أو iOS؟) الذي تستهدفه ، ونوع النموذج (النقطة العائمة أم الكمي؟) الذي تحاول تسريعها .

المندوبين حسب المنصة

عبر الأنظمة الأساسية (Android و iOS)

  • مندوب GPU - يمكن استخدام مفوض GPU على كل من Android و iOS. تم تحسينه لتشغيل النماذج القائمة على التعويم 32 بت و 16 بت حيث تتوفر وحدة معالجة الرسومات. كما أنه يدعم النماذج الكمية 8 بت ويوفر أداء GPU على قدم المساواة مع إصداراتها العائمة. للحصول على تفاصيل حول مفوض GPU ، راجع TensorFlow Lite على وحدة معالجة الرسومات . للحصول على برامج تعليمية خطوة بخطوة حول استخدام مندوب GPU مع Android و iOS ، راجع البرنامج التعليمي لمندوب GPU TensorFlow Lite .

ذكري المظهر

  • مندوب NNAPI لأجهزة Android الأحدث - يمكن استخدام مفوض NNAPI لتسريع النماذج على أجهزة Android مع توفر GPU و / أو DSP و / أو NPU. إنه متوفر في Android 8.1 (API 27+) أو أعلى. للحصول على نظرة عامة حول مفوض NNAPI وإرشادات خطوة بخطوة وأفضل الممارسات ، راجع مندوب TensorFlow Lite NNAPI .
  • مندوب Hexagon لأجهزة Android القديمة - يمكن استخدام مندوب Hexagon لتسريع الطرز على أجهزة Android باستخدام Qualcomm Hexagon DSP. يمكن استخدامه على الأجهزة التي تعمل بإصدارات أقدم من Android والتي لا تدعم NNAPI. راجع مندوب TensorFlow Lite Hexagon لمزيد من التفاصيل.

iOS

  • مندوب Core ML لأجهزة iPhone و iPad الأحدث - بالنسبة لأجهزة iPhone و iPad الأحدث حيث يتوفر المحرك العصبي ، يمكنك استخدام مندوب Core ML لتسريع الاستدلال لنماذج النقطة العائمة 32 بت أو 16 بت. المحرك العصبي Neural Engine متاح لأجهزة Apple المحمولة مع A12 SoC أو أعلى. للحصول على نظرة عامة حول مندوب Core ML والتعليمات خطوة بخطوة ، راجع مندوب TensorFlow Lite Core ML .

المندوبين حسب نوع النموذج

تم تصميم كل مسرّع مع وضع عرض بت معين للبيانات في الاعتبار. إذا قمت بتوفير نموذج النقطة العائمة لمندوب لا يدعم سوى العمليات الكمية 8 بت (مثل المفوض السداسي ) ، فسوف يرفض جميع عملياته وسيعمل النموذج بالكامل على وحدة المعالجة المركزية. لتجنب مثل هذه المفاجآت ، يقدم الجدول أدناه نظرة عامة على دعم المندوبين بناءً على نوع النموذج:

نوع النموذج GPU NNAPI سداسي الزوايا CoreML
النقطة العائمة (32 بت) نعم نعم رقم نعم
تكميم float16 بعد التدريب نعم رقم رقم نعم
تكميم النطاق الديناميكي بعد التدريب نعم نعم رقم رقم
تكميم صحيح بعد التدريب نعم نعم نعم رقم
التدريب على الوعي الكمي نعم نعم نعم رقم

التحقق من صحة الأداء

تعمل المعلومات الواردة في هذا القسم كدليل تقريبي لاختيار المندوبين الذين يمكنهم تحسين تطبيقك. ومع ذلك ، من المهم ملاحظة أن كل مندوب لديه مجموعة محددة مسبقًا من العمليات التي يدعمها ، وقد تؤدي بشكل مختلف وفقًا للطراز والجهاز ؛ على سبيل المثال ، قد يختار مندوب NNAPI استخدام Google's Edge-TPU على هاتف Pixel أثناء استخدام DSP على جهاز آخر. لذلك ، يوصى عادةً بإجراء بعض المقارنة المعيارية لقياس مدى فائدة المندوب لاحتياجاتك. يساعد هذا أيضًا في تبرير زيادة الحجم الثنائي المرتبطة بإرفاق مفوض بوقت تشغيل TensorFlow Lite.

يحتوي TensorFlow Lite على أدوات شاملة للأداء وتقييم الدقة يمكن أن تمكن المطورين من الثقة في استخدام المندوبين في تطبيقاتهم. تمت مناقشة هذه الأدوات في القسم التالي.

أدوات التقييم

الكمون وبصمة الذاكرة

يمكن استخدام أداة قياس الأداء في TensorFlow Lite مع معلمات مناسبة لتقدير أداء النموذج ، بما في ذلك متوسط ​​زمن انتقال الاستدلال ونفقات التهيئة العامة وبصمة الذاكرة وما إلى ذلك. على سبيل المثال ، يمكن تحديد --gpu_backend=gl باستخدام --use_gpu لقياس تنفيذ وحدة معالجة الرسومات باستخدام OpenGL. يتم تحديد القائمة الكاملة لمعلمات المفوض المدعومة في الوثائق التفصيلية .

فيما يلي مثال على تشغيل لنموذج كمي باستخدام GPU عبر adb :

adb shell /data/local/tmp/benchmark_model \
  --graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
  --use_gpu=true

يمكنك تنزيل الإصدار المبني مسبقًا من هذه الأداة لنظام Android ، بنية ARM 64 بت هنا ( مزيد من التفاصيل ).

الدقة والصحة

عادةً ما يقوم المندوبون بإجراء العمليات الحسابية بدقة مختلفة عن نظرائهم في وحدة المعالجة المركزية. نتيجة لذلك ، هناك مقايضة دقة (عادة ثانوية) مرتبطة باستخدام مفوض لتسريع الأجهزة. لاحظ أن هذا ليس صحيحًا دائمًا ؛ على سبيل المثال ، نظرًا لأن وحدة معالجة الرسومات تستخدم دقة النقطة العائمة لتشغيل النماذج الكمية ، فقد يكون هناك تحسن طفيف في الدقة (على سبيل المثال ، <1٪ تحسين أعلى 5 في تصنيف صور ILSVRC).

يحتوي TensorFlow Lite على نوعين من الأدوات لقياس مدى دقة تصرف المندوب مع نموذج معين: مستند إلى المهام ومحايد المهام . تدعم جميع الأدوات الموضحة في هذا القسم معلمات التفويض المتقدمة المستخدمة بواسطة أداة قياس الأداء من القسم السابق. لاحظ أن الأقسام الفرعية أدناه تركز على تقييم المفوض (هل يقوم المفوض بنفس أداء وحدة المعالجة المركزية؟) بدلاً من تقييم النموذج (هل النموذج نفسه جيد للمهمة؟).

التقييم القائم على المهام

يحتوي TensorFlow Lite على أدوات لتقييم الدقة في مهمتين تعتمدان على الصور:

يمكن العثور على الثنائيات التي تم إنشاؤها مسبقًا لهذه الأدوات (Android ، بنية ARM 64 بت) ، بالإضافة إلى الوثائق هنا:

يوضح المثال أدناه تقييم تصنيف الصور باستخدام NNAPI باستخدام Google Edge-TPU على Pixel 4:

adb shell /data/local/tmp/run_eval \
  --model_file=/data/local/tmp/mobilenet_quant_v1_224.tflite \
  --ground_truth_images_path=/data/local/tmp/ilsvrc_images \
  --ground_truth_labels=/data/local/tmp/ilsvrc_validation_labels.txt \
  --model_output_labels=/data/local/tmp/model_output_labels.txt \
  --output_file_path=/data/local/tmp/accuracy_output.txt \
  --num_images=0 # Run on all images. \
  --use_nnapi=true \
  --nnapi_accelerator_name=google-edgetpu

الناتج المتوقع هو قائمة مقاييس Top-K من 1 إلى 10:

Top-1 Accuracy: 0.733333
Top-2 Accuracy: 0.826667
Top-3 Accuracy: 0.856667
Top-4 Accuracy: 0.87
Top-5 Accuracy: 0.89
Top-6 Accuracy: 0.903333
Top-7 Accuracy: 0.906667
Top-8 Accuracy: 0.913333
Top-9 Accuracy: 0.92
Top-10 Accuracy: 0.923333

التقييم الملحد للمهام

بالنسبة للمهام التي لا توجد فيها أداة تقييم مثبتة على الجهاز ، أو إذا كنت تقوم بتجربة نماذج مخصصة ، فإن TensorFlow Lite لديها أداة Inference Diff . (Android ، ثنائي هندسة ARM ثنائي 64 بت هنا )

يقارن Inference Diff تنفيذ TensorFlow Lite (من حيث زمن الانتقال وانحراف قيمة المخرجات) في إعدادين:

  • استدلال وحدة المعالجة المركزية أحادية الخيوط
  • الاستدلال المحدد من قبل المستخدم - محدد بواسطة هذه المعلمات

للقيام بذلك ، تقوم الأداة بإنشاء بيانات Gaussian عشوائية وتمريرها من خلال مترجمين TFLite - أحدهما يعمل بنواة وحدة المعالجة المركزية أحادية الخيط ، والآخر يتم تحديد معلماته بواسطة وسيطات المستخدم.

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

بالنسبة إلى نموذج موتر الإخراج الفردي ، قد يبدو الإخراج كما يلي:

Num evaluation runs: 50
Reference run latency: avg=84364.2(us), std_dev=12525(us)
Test run latency: avg=7281.64(us), std_dev=2089(us)
OutputDiff[0]: avg_error=1.96277e-05, std_dev=6.95767e-06

ما يعنيه هذا هو أنه بالنسبة لموتّر الإخراج في الفهرس 0 ، تختلف العناصر من إخراج وحدة المعالجة المركزية عن إخراج المندوب بمتوسط 1.96e-05 .

لاحظ أن تفسير هذه الأرقام يتطلب معرفة أعمق بالنموذج ، وما يدل عليه كل موتر ناتج. إذا كان الانحدار البسيط هو الذي يحدد نوعًا من النقاط أو التضمين ، فيجب أن يكون الاختلاف منخفضًا (وإلا فسيكون خطأ مع المفوض). ومع ذلك ، فإن المخرجات مثل "فئة الكشف" من نماذج SSD يصعب تفسيرها قليلاً. على سبيل المثال ، قد يُظهر اختلافًا باستخدام هذه الأداة ، ولكن هذا قد لا يعني وجود خطأ حقيقي مع المفوض: ضع في اعتبارك صنفين (مزيفين): "TV (ID: 10)" ، "Monitor (ID: 20)" - إذا المندوب بعيد قليلاً عن الحقيقة الذهبية ويعرض الشاشة بدلاً من التلفزيون ، قد يكون اختلاف الإخراج لهذا الموتر شيئًا يصل إلى 20-10 = 10.