مندوبو TensorFlow Lite

مقدمة

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

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

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

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

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

اختيار مندوب

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

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

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

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

ذكري المظهر

  • مندوب 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 لمزيد من التفاصيل.

دائرة الرقابة الداخلية

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

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

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

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

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

تعمل المعلومات الواردة في هذا القسم كمبدأ توجيهي تقريبي لوضع قائمة مختصرة للمندوبين الذين يمكنهم تحسين طلبك. ومع ذلك، من المهم ملاحظة أن كل مندوب لديه مجموعة محددة مسبقًا من العمليات التي يدعمها، وقد يؤديها بشكل مختلف اعتمادًا على الطراز والجهاز؛ على سبيل المثال، قد يختار مندوب NNAPI استخدام Google 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 بت هنا ( مزيد من التفاصيل ).

الدقة والصحة

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

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

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