برامج تشغيل واجهة برمجة تطبيقات الشبكات العصبونية

تقدّم هذه الصفحة نظرة عامة حول كيفية تنفيذ ملفّ تعريف واجهة برمجة التطبيقات Neural Networks API (NNAPI) . لمزيد من التفاصيل، يُرجى الاطّلاع على المستندات المتوفّرة في تعريف HAL الملفات في hardware/interfaces/neuralnetworks. يمكنك العثور على نموذج لتنفيذ برنامج تشغيل في frameworks/ml/nn/driver/sample.

لمزيد من المعلومات حول واجهة برمجة تطبيقات الشبكات العصبية، يمكنك الاطّلاع على واجهة برمجة تطبيقات الشبكات العصبية.

الشبكات العصبية HAL

تُعرّف الشبكة العصبونية (NN) HAL الأجهزة المتنوعة، مثل وحدات معالجة الرسومات (GPUs) ومعالِجات الإشارات الرقمية (DSP)، الموجودة في أحد المنتجات (على سبيل المثال، هاتف أو جهاز لوحي). يجب أن تتوافق برامج تشغيل هذه الأجهزة مع NN HAL. يتم تحديد الواجهة في ملفات تعريف HAL في hardware/interfaces/neuralnetworks.

يوضّح الشكل 1 سير العمل العام للواجهة بين الإطار وبرنامج التشغيل.

تدفق الشبكات العصبية

الشكل 1: مسار الشبكات العصبية

الإعداد

عند الإعداد، يطلب إطار العمل من برنامج التشغيل الاطّلاع على إمكاناته باستخدام IDevice::getCapabilities_1_3. تتضمن بنية @1.3::Capabilities جميع أنواع البيانات وتمثل الأداء غير المريح باستخدام متجه.

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

لتحديد القيم التي يعرضها برنامج التشغيل استجابةً لطلب IDevice::getCapabilities_1_3، استخدِم تطبيق قياس أداء NNAPI لقياس ملفه الشخصي أداء أنواع البيانات المقابلة. ننصحك باستخدام طُرز MobileNet v1 وv2 وasr_float وtts_float لقياس أداء قيم النقطة الثابتة بسعة 32 بت، وننصحك باستخدام طُرز MobileNet v1 وv2 المقيَّدة لقيم النقطة الثابتة بسعة 8 بت. لمزيد من المعلومات، يُرجى الاطّلاع على مجموعة اختبارات تعلُّم الآلة من Android.

في الإصدار 9 من نظام Android والإصدارات الأقدم، تتضمّن بنية Capabilities معلومات أداء برنامج التشغيل فقط للنقطة العائمة والأعداد الكمّية، ولا تتضمّن أنواع البيانات العددية.

قد يطلب إطار العمل كجزء من عملية الإعداد المزيد من المعلومات، وذلك باستخدام IDevice::getType وIDevice::getVersionString وIDevice:getSupportedExtensions وIDevice::getNumberOfCacheFilesNeeded.

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

موسيقى مجمّعة

يحدِّد إطار العمل الأجهزة التي سيتم استخدامها عند تلقّي طلب من أحد التطبيقات. في Android 10، يمكن للتطبيقات اكتشاف وتحديد الأجهزة التي يختار إطار العمل منها. لمزيد من المعلومات، يُرجى الاطّلاع على اكتشاف الأجهزة وتحديدها.

في وقت تجميع النموذج، يرسل إطار العمل النموذج إلى كل ملف تعريف egneted driver من خلال استدعاء IDevice::getSupportedOperations_1_3. يعرض كل سائق صفيفًا من القيم المنطقية التي تشير إلى عمليات النموذج المتوافقة. يمكن أن يحدِّد برنامج التشغيل أنّه لا يمكنه إتاحة عملية معيّنة لعدة أسباب. مثلاً:

  • لا يتوافق برنامج التشغيل مع نوع البيانات.
  • لا يدعم برنامج التشغيل إلا العمليات التي تتضمن معلَمات إدخال معيّنة. على سبيل المثال، قد يتيح برنامج التشغيل عمليات التفاف 3x3 و5x5، ولكن ليس عمليات التفاف 7x7.
  • يواجه برنامج تشغيل الرسوم البيانية قيودًا في الذاكرة تمنع استخدامه لرسوم بيانية أو مدخلات كبيرة.

أثناء تجميع البيانات، قد تكون أبعاد النموذج أو المخرجات والمعاملات الداخلية، كما هو موضّح في السمة OperandLifeTime، قد تكون له أبعاد أو ترتيب غير معروف. لمزيد من المعلومات، يُرجى الاطّلاع على شكل الإخراج.

يطلب إطار العمل من كل برنامج تشغيل محدّد الاستعداد لتنفيذ مجموعة فرعية من النموذج من خلال استدعاء IDevice::prepareModel_1_3. بعد ذلك، يُجمِّع كل برنامج تشغيل مجموعته الفرعية. على سبيل المثال، قد يُنشئ السائق رمزًا أو يُنشئ نسخة من الأوزان تم ترتيبها بشكلٍ مختلف. وبما أنّه قد تكون هناك فترة زمنية كبيرة بين تجميع النموذج وتنفيذ الطلبات، يجب عدم تعيين موارد مثل أجزاء كبيرة من ذاكرة الجهاز أثناء التحويل البرمجي.

عند النجاح، يعرض برنامج التشغيل @1.3::IPreparedModel معرّفًا. إذا أرجع برنامج التشغيل رمز خطأ عند إعداد مجموعة فرعية من النموذج، يشغّل إطار العمل النموذج بأكمله على وحدة المعالجة المركزية.

لتقليل الوقت المُستغرَق في التجميع عند بدء تشغيل تطبيق ما، يمكن لبرنامج التشغيل التخزين المؤقت لعناصر التجميع. لمزيد من المعلومات، يُرجى الاطّلاع على التخزين المؤقت للتجميع.

التنفيذ

عندما يطلب التطبيق من إطار العمل تنفيذ طلب، يستدعي إطار العمل طريقة HAL IPreparedModel::executeSynchronously_1_3 تلقائيًا لتنفيذ عملية تنفيذ متزامنة على نموذج مُعدّ. يمكن أيضًا تنفيذ الطلب بشكل غير متزامن باستخدام الأسلوب execute_1_3 أو الأسلوب executeFenced (راجِع التنفيذ المحدود)، أو تنفيذه باستخدام أسلوب التنفيذ المكثّف.

تُحسِّن طلبات التنفيذ المتزامنة الأداء وتقلل من أعباء سلاسل المحادثات مقارنةً بالمكالمات غير المتزامنة، وذلك لأنّ التحكّم لا يعود إلى عملية التطبيق إلا بعد اكتمال التنفيذ. وهذا يعني أنّه ليس بحاجة إلى آلية منفصلة لإعلام عملية التطبيق بأنّه اكتمل تنفيذ الإجراء.

باستخدام طريقة execute_1_3 غير المتزامنة، يعود التحكّم إلى عملية التطبيق بعد بدء التنفيذ، وعلى برنامج التشغيل إعلام الإطار الأساسي عند اكتمال التنفيذ باستخدام @1.3::IExecutionCallback.

تسرد معلمة Request التي تم تمريرها إلى طريقة التنفيذ معاملات الإدخال والمخرجات المستخدمة في التنفيذ. يجب أن تستخدم الذاكرة التي تخزِّن بيانات الم Operand الترتيب حسب الصفوف مع تكرار السمة الأولى ببطء أكبر وألا يكون هناك ملء في نهاية أي صف. لمعرفة المزيد من المعلومات عن أنواع المعاملات، يمكنك الاطّلاع على العوامل.

بالنسبة إلى برامج تشغيل NN HAL 1.2 أو الإصدارات الأعلى، عند اكتمال الطلب، يتم إرجاع حالة الخطأ وشكل المخرجات ومعلومات الوقت إلى إطار العمل. أثناء التنفيذ، يمكن أن يكون للمُخرجات أو المُعامِلات الداخلية للنموذج سمة واحدة أو أكثر غير معروفة أو ترتيب غير معروف. عندما يكون عنصر معالجة واحد على الأقل في المخرجات له سمة أو ترتيب غير معروفَين، يجب أن يعرض برنامج التشغيل معلومات مخرجات بحجم ديناميكي.

بالنسبة إلى برامج التشغيل التي تحمل الإصدار 1.1 من NN HAL 1.1 أو إصدار أقدم، يتم عرض حالة الخطأ فقط عند اكتمال الطلب. يجب تحديد سمات مَعلمات الإدخال والإخراج بالكامل كي يكتمل التنفيذ بنجاح. يمكن أن تملك المُعامِلات الداخلية سمة واحدة أو أكثر غير معروفة، ولكن يجب أن يكون لها ترتيب محدّد.

بالنسبة إلى طلبات المستخدمين التي تغطي برامج تشغيل متعددة، يكون إطار العمل مسؤولاً عن حجز ذاكرة متوسطة وتسلسل استدعاءات كل برنامج تشغيل.

يمكن تقديم طلبات متعددة بالتوازي على رمز @1.3::IPreparedModel نفسه. يمكن لبرنامج التشغيل تنفيذ الطلبات بالتوازي أو تنفيذ عمليات التنفيذ بشكل متسلسل.

يمكن أن يطلب إطار العمل من السائق الاحتفاظ بأكثر من نموذج واحد معدّ. على سبيل المثال، تجهيز النموذج m1، وتجهيز m2، وتنفيذ الطلب r1 على m1، وتنفيذ r2 على m2، وتنفيذ r3 على m1، وتنفيذ r4 على m2، وإصدار (كما هو موضّح في التنظيف) m1، وإصدار m2.

لتجنُّب تنفيذ بطيء لأول مرة قد يؤدي إلى تجربة مستخدم سيئة (مثل تقطُّع الإطار الأول)، يجب أن ينفِّذ برنامج التشغيل معظم عمليات الإعداد في مرحلة الترجمة. يجب أن يقتصر الإعداد عند التنفيذ الأول على الإجراءات التي تؤثر سلبًا في سلامة النظام عند تنفيذها مبكرًا، مثل حجز مخازن مؤقتة كبيرة أو زيادة معدل الساعة لأحد الأجهزة. قد تحتاج برامج التشغيل التي يمكنها إعداد عدد محدود من النماذج المتزامنة فقط إلى إجراء عملية الإعداد عند التنفيذ الأول.

في نظام التشغيل Android 10 أو الإصدارات الأحدث، في الحالات التي يتم فيها تنفيذ عدة عمليات تنفيذ بالنموذج المُعد نفسه بتتابع سريع، قد يختار العميل استخدام كائن تنفيذ متسلسلة من أجل التواصل بين عمليات التطبيق وبرامج التشغيل. للحصول على مزيد من المعلومات، يمكنك الاطّلاع على عمليات التنفيذ المتسلسلة وقوائم انتظار الرسائل السريعة.

لتحسين الأداء لعمليات التنفيذ المتعددة في تتابع سريع، يمكن لبرنامج التشغيل الاحتفاظ بالموارد الاحتياطية المؤقتة أو زيادة معدلات الساعة. يُنصَح بإنشاء سلسلة محادثات مراقب النظام لتحرير الموارد إذا لم يتم إنشاء طلبات جديدة بعد فترة زمنية محددة.

شكل الإخراج

بالنسبة إلى الطلبات التي لا تحتوي فيها مَعلمة ناتجة واحدة أو أكثر على جميع السمات المحدّدة، على برنامج التشغيل تقديم قائمة بأشكال الإخراج التي تحتوي على معلومات السمات لكل مَعلمة ناتجة بعد التنفيذ. لمزيد من المعلومات حول السمات، يُرجى الاطّلاع على OutputShape.

إذا تعذّر التنفيذ بسبب سعة تخزين مؤقتة للإخراج صغيرة جدًا، على برنامج التشغيل تحديد المعاملات التي تُنتج ناتجًا بحجم تخزين مؤقت غير كافٍ في قائمة أشكال الإخراج، ويجب الإبلاغ عن أكبر قدر ممكن من معلومات السمات، باستخدام القيمة صفر للسمات غير المعروفة.

التوقيت

في Android 10، يمكن لتطبيق أن يطلب وقت التنفيذ إذا حدد التطبيق جهازًا واحدًا لاستخدامه أثناء عملية التحويل البرمجي. للاطّلاع على التفاصيل، يُرجى الاطّلاع على MeasureTiming واكتشاف الأجهزة وتحديدها. في هذه الحالة، يجب أن يقيس سائق NN HAL 1.2 مدة التنفيذ أو يُبلغ عن UINT64_MAX (لتبيان أنّ المدة غير متاحة) عند تنفيذ طلب. يجب أن يقلل السائق من أي عقوبة أداء ناتجة عن قياس مدّة تنفيذه.

يُبلغ برنامج تشغيل الجهاز عن المدّات التالية بالميكرو ثانية في بنية Timing :

  • وقت التنفيذ على الجهاز: لا يشمل وقت التنفيذ في البرنامج المشغِّل الذي يعمل على المعالج المضيف.
  • مدة التنفيذ في برنامج التشغيل: يشمل وقت التنفيذ على الجهاز.

يجب أن تتضمّن هذه الفترات الوقت الذي يتم فيه تعليق التنفيذ، على سبيل المثال، الوقت الذي تم فيه منع التنفيذ من خلال مهام أخرى أو انتظار توفُّر مورد.

عندما لا يُطلب من برنامج التشغيل قياس مدة التنفيذ أو عندما يحدث خطأ في التنفيذ، يجب أن يُبلغ برنامج التشغيل عن المُدد على أنّها UINT64_MAX. حتى إذا طُلب من برنامج التشغيل قياس مدّة التنفيذ، يمكنه بدلاً من ذلك الإبلاغ عن UINT64_MAX للوقت على الجهاز أو الوقت في برنامج التشغيل أو كليهما. عندما يُبلغ برنامج التشغيل عن المددتَين كقيمة غير UINT64_MAX، يجب أن تكون مدة التنفيذ في برنامج التشغيل مساويًا للوقت على الجهاز أو تتجاوزه.

التنفيذ بدون قيود

في Android 11، يسمح NNAPI للعمليات بالانتظار للحصول على قائمة بعناصر sync_fence واختياريًا عرض عنصر sync_fence، والذي يتم إعلامه عند اكتمال التنفيذ. وهذا يحد من النفقات العامة لنماذج التسلسلات الصغيرة وحالات استخدام البث. يتيح التنفيذ المحدود أيضًا إمكانية التشغيل التفاعلي بكفاءة أكبر مع المكوّنات الأخرى التي قد تشير إلى sync_fence أو تنتظره. لمزيد من المعلومات عن sync_fence، يُرجى الاطّلاع على إطار عمل المزامنة.

في التنفيذ المحدود، يستدعي إطار العمل الطريقة IPreparedModel::executeFenced لبدء تنفيذ غير متزامن ومحدود على نموذج معدّ بأحد مصادر مزامنة الانتظار. إذا اكتملت المهمة غير المتزامنة قبل ظهور المكالمة، يمكن عرض مؤشر فارغ لـ sync_fence. يجب أيضًا عرض عنصر IFencedExecutionCallback للسماح للإطار العمل بإجراء استعلام عن حالة الخطأ ومعلومات المدة.

بعد اكتمال عملية التنفيذ، يمكن الاستعلام عن قيمتَي التوقيت التاليتَين لقياس مدة التنفيذ من خلال IFencedExecutionCallback::getExecutionInfo.

  • timingLaunched: المدة التي تُستغرقها عملية استدعاء executeFenced إلى أن يُرسِل executeFenced إشارة إلى syncFence المُعاد.
  • timingFenced: المدة التي تتم فيها الإشارة إلى جميع حدود المزامنة التي ينتظرها التنفيذ حتى تشير executeFenced إلى نسبة syncFence المعروضة.

التحكّم في التدفق

بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل Android 11 أو الإصدارات الأحدث، تتضمّن واجهة NNAPI عمليتَي تدفق تحكُّم، IF وWHILE، تستخدمان نماذج أخرى كوسيطات وتنفِّذهما بشكل مشروط (IF) أو بشكل متكرّر (WHILE). لمزيد من المعلومات حول كيفية تنفيذ ذلك، راجِع خطوات التحكّم.

جودة الخدمة

في Android 11، يتضمّن NNAPI تحسينًا في جودة الخدمة (QoS) من خلال السماح للتطبيق بتحديد الأولويات النسبية لنماذجه، والحد الأقصى للوقت المتوقّع لإعداد النموذج، والحد الأقصى للوقت المتوقّع لإكمال التنفيذ. لمزيد من المعلومات، يُرجى الاطّلاع على جودة الخدمة.

تنظيف

عند انتهاء تطبيق من استخدام نموذج مُعدّ، يصدر إطار العمل مرجعه إلى عنصر @1.3::IPreparedModel. عندما لا تتم الإشارة إلى عنصر IPreparedModel، يتم إتلافه تلقائيًا في خدمة برنامج التشغيل التي أنشأته. ويمكن إعادة استرداد الموارد الخاصة بالنموذج في هذا الوقت أثناء تنفيذ برنامج التشغيل لأداة التلف. إذا أرادت خدمة السائق أن يتم إتلاف كائن IPreparedModel تلقائيًا عندما لا يحتاجه العميل، يجب ألا يحتوي على أي إشارات إلى الكائن IPreparedModel بعد إرجاع عنصر IPreparedeModel من خلال IPreparedModelCallback::notify_1_3.

استخدام وحدة المعالجة المركزية

من المتوقع أن تستخدم برامج التشغيل وحدة المعالجة المركزية (CPU) لإعداد العمليات الحسابية. وينبغي ألا تستخدم برامج التشغيل وحدة المعالجة المركزية (CPU) لإجراء عمليات حسابية للرسم البياني لأن ذلك يتداخل مع قدرة إطار العمل على تخصيص العمل بشكل صحيح. يجب على برنامج التشغيل الإبلاغ عن الأجزاء التي لا يمكنه التعامل معها لإطار العمل والسماح لإطار العمل بالتعامل مع الباقي.

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

إنّ العمليات التي تم تقديمها في Android 10 (المستوى 29 من واجهة برمجة التطبيقات) تتضمّن فقط تنفيذًا مرجعيًا لوحدة المعالجة المركزية للتحقّق من صحة اختبارَي CTS وVTS . تُفضل عمليات التنفيذ المُحسَّنة المضمنة في أطر عمل التعلم الآلي المتنقلة على تنفيذ وحدة المعالجة المركزية NNAPI.

وظائف المرافق

تتضمن قاعدة رموز NNAPI دوال الأداة التي يمكن استخدامها بواسطة خدمات برنامج التشغيل.

يحتوي ملف frameworks/ml/nn/common/include/Utils.h على دوال مساعدة متنوّعة، مثل تلك المستخدَمة للتسجيل والتحويل بين إصدارات NN HAL المختلفة.

  • تسجيل الدخول: VLOG هو وحدة ماكرو لبرامج تضمين حول LOG في Android، ولا تسجِّل الرسالة إلا إذا تم ضبط العلامة المناسبة في السمة debug.nn.vlog. يجب الاتصال initVLogMask() قبل أي مكالمات إلى VLOG. يمكن استخدام وحدة ماكرو VLOG_IS_ON للتحقق مما إذا كان VLOG مفعّلاً حاليًا، ما يتيح تخطّي رمز التسجيل المعقد إذا لم يكن هناك حاجة إليه. يجب أن تكون قيمة السمة إحدى القيم التالية:

    • سلسلة فارغة تشير إلى عدم إجراء أي تسجيل
    • الرمزان المميزّان 1 أو all للإشارة إلى أنّ كل عملية التسجيل يجب إتمامها.
    • قائمة بالعلامات، مفصولة بمسافات أو فواصل أو نقطتين، للإشارة إلى التسجيل المطلوب إجراؤه. وهذه العلامات هي compilation وcpuexe وdriver وexecution وmanager وmodel.
  • compliantWithV1_*: تعرض true إذا كان من الممكن تحويل كائن NN HAL إلى النوع نفسه من إصدار مختلف من HAL بدون فقدان المعلومات. على سبيل المثال، يؤدي استدعاء compliantWithV1_0 على V1_2::Model إلى عرض false إذا كان النموذج يتضمّن أنواع العمليات التي تم تقديمها في NN HAL 1.1 أو NN HAL 1.2.

  • convertToV1_*: تحوّل عنصر HAL لشبكات العصبونات من إصدار إلى آخر. يتم تسجيل تحذير إذا أدت الإحالة الناجحة إلى فقدان المعلومات (أي إذا لم يتمكن الإصدار الجديد من النوع من تمثيل القيمة بشكل كامل).

  • الإمكانات: يمكن استخدام الدالتَين nonExtensionOperandPerformance وupdate للمساعدة في إنشاء الحقل Capabilities::operandPerformance .

  • طلب البحث عن المواقع من الأنواع: isExtensionOperandType، isExtensionOperationType، nonExtensionSizeOfData، nonExtensionOperandSizeOfData، nonExtensionOperandTypeIsScalar، tensorHasUnspecifiedDimensions

يحتوي frameworks/ml/nn/common/include/ValidateHal.h على دوال فائدة للتحقّق من صلاحية كائن NN HAL وفقًا لمواصفات إصدار HAL الخاص به.

  • validate*: تعرض true إذا كان عنصر NN HAL صالحًا وفقًا لمواصفات إصدار HAL. لم يتم التحقق من صحة أنواع المصنّعين الأصليين والإضافات. على سبيل المثال، تعرِض validateModel القيمة false إذا كان النموذج يحتوي على عملية تشير إلى فهرس عامل لا يوجد، أو عملية غير متوافقة مع إصدار HAL هذا.

يحتوي ملف frameworks/ml/nn/common/include/Tracing.h على وحدات ماكرو لتبسيط إضافة معلومات systracing إلى رمز الشبكات العصبية. على سبيل المثال، يمكنك الاطّلاع على NNTRACE_* عمليات استدعاء الوحدات النمطية في نموذج برنامج التشغيل.

يحتوي frameworks/ml/nn/common/include/GraphDump.h على دالة أداة لتفريغ محتوى Model بتنسيق رسومي لأغراض تصحيح الأخطاء.

  • graphDump: لكتابة تمثيل للنموذج بتنسيق Graphviz (.dot) في البث المحدّد (إذا تم توفيره) أو في logcat (إذا لم يتم توفير أي بث)

التحقُّق

لاختبار تنفيذ واجهة NNAPI، استخدِم اختبارات VTS وCTS المضمَّنة في إطار عمل Android. تتدرب أداة VTS على السائقين بشكل مباشر (دون استخدام إطار العمل)، بينما تمارس CTS السائقين بشكل غير مباشر من خلال إطار العمل. تختبر هذه الطرق كل طريقة من طرق واجهة برمجة التطبيقات وتتحقق من أن جميع العمليات المتوافقة مع برامج التشغيل تعمل بشكل صحيح وتوفر نتائج تلبي متطلبات الدقة.

فيما يلي متطلبات الدقة في CTS وVTS لواجهة NNAPI:

  • النقطة العائمة: المطلقة(المتوقعة - الفعلية) <= أتول + rtol * abs(المتوقعة)؛ حيث:

    • بالنسبة إلى fp32, atol = 1e-5f, rtol = 5.0f * 1.1920928955078125e-7
    • بالنسبة إلى fp16، atol = rtol = 5.0f * 0.0009765625f
  • القيم المحدَّدة: مختلفة بمقدار واحد (باستثناء mobilenet_quantized، التي تختلف بمقدار ثلاثة)

  • منطقي: مطابقة تامة

تتمثل إحدى طرق اختبار CTS لـ NNAPI في إنشاء رسوم بيانية عشوائية عشوائية تُستخدم لاختبار نتائج التنفيذ من كل برنامج تشغيل ومقارنتها مع تنفيذ مرجع NNAPI. بالنسبة إلى برامج تشغيل NN HAL 1.2 أو الإصدارات الأحدث، إذا كانت النتائج لا تستوفي معايير الدقة، يُبلغ CTS عن خطأ ويُفرغ ملف المواصفات الخاص بالنموذج الذي تعذّر اختباره ضمن /data/local/tmp لتصحيح الأخطاء. لمزيد من التفاصيل عن معايير الدقة، يُرجى الاطّلاع على TestRandomGraph.cpp و TestHarness.h.

اختبار الزغب

والغرض من اختبار التشويش هو تحديد الأعطال أو التأكيدات أو الانتهاكات في الذاكرة أو أي سلوك عام غير محدد في الرمز الذي يخضع للاختبار بسبب عدة عوامل، مثل الإدخالات غير المتوقعة. لاختبار NNAPI العشوائي، يستخدم Android اختبارات تستند إلى مكتبة libFuzzer، وهي اختبارات فعالة في الاختبارات العشوائية لأنّها تستخدِم تغطية السطر لحالات الاختبار السابقة لإنشاء مدخلات عشوائية جديدة. على سبيل المثال، تفضل libFuzzer حالات الاختبار التي يتم تشغيلها على أسطر جديدة من التعليمات البرمجية. ويؤدي ذلك إلى تقليل الوقت الذي تستغرقه الاختبارات للعثور على الرمز البرمجي الذي يتضمّن مشاكل.

لإجراء اختبار التحقق من صحة تنفيذ برنامج التشغيل، عليك تعديل frameworks/ml/nn/runtime/test/android_fuzzing/DriverFuzzTest.cpp في أداة اختبار libneuralnetworks_driver_fuzzer المتوفّرة في AOSP لتضمين رمز برنامج التشغيل. لمزيد من المعلومات حول اختبار الأخطاء في NNAPI، يمكنك الاطّلاع على frameworks/ml/nn/runtime/test/android_fuzzing/README.md.

الأمان

بما أنّ عمليات التطبيق تتواصل مباشرةً مع عملية برنامج التشغيل، يجب أن يتحقق برنامج التشغيل من صحّة الوسيطات للطلبات التي يتلقّاها. يتم التحقق من هذا التحقق بواسطة VTS. يمكنك العثور على رمز التحقّق في frameworks/ml/nn/common/include/ValidateHal.h.

على السائقين أيضًا التأكّد من أنّ التطبيقات لا يمكنها التدخل في التطبيقات الأخرى عند استخدام الجهاز نفسه.

حزمة اختبار تعلُّم الآلة في Android

"حزمة اختبار تعلُّم الآلة" من Android (MLTS) هي معيار معيار NNAPI تم تضمينه في CTS وVTS للتحقق من دقة النماذج الحقيقية على أجهزة المورّدين. يقيّم مقياس الأداء وقت الاستجابة والدقة، ويقارن نتائج برامج التشغيل بالنتائج باستخدام TF Lite الذي يتم تشغيله على وحدة المعالجة المركزية (CPU) للطراز نفسه ومجموعات البيانات نفسها. يضمن ذلك ألّا تكون دقة برنامج التشغيل أسوأ من التنفيذ المرجعي لوحدة المعالجة المركزية.

يستخدم مطورو أنظمة Android الأساسية أيضًا تقنية MLTS لتقييم وقت الاستجابة ودقة برامج التشغيل.

يمكن العثور على معيار NNAPI في مشروعين في AOSP:

النماذج ومجموعات البيانات

يستخدِم مقياس أداء NNAPI النماذج ومجموعات البيانات التالية.

  • يتم تشغيل MobileNetV1 عائمًا وu8 بأحجام مختلفة، إذ يتم تشغيله مع مجموعة فرعية صغيرة (1500 صورة) من مجموعة بيانات الصور المفتوحة الإصدار 4.
  • يتم تشغيل البيانات العائمة وu8 من MobileNetV2 بأحجام مختلفة على مجموعة فرعية صغيرة (1500 صورة) من الإصدار 4 من مجموعة بيانات الصور المفتوحة.
  • النموذج الصوتي المستند إلى الذاكرة القصيرة المدى (LSTM) لتحويل النص إلى كلام، ويُجري هذا النموذج مع مجموعة فرعية صغيرة من مجموعة بيانات "مطابقة البيانات في القطب الشمالي" (CMU).
  • يعمل النموذج الصوتي المستند إلى LSTM للتعرف التلقائي على الكلام مع مجموعة فرعية صغيرة من مجموعة بيانات LibriSpeech.

لمزيد من المعلومات، يُرجى الاطّلاع على platform/test/mlts/models.

اختبار الإجهاد

تتضمّن "حزمة اختبار تعلُّم الآلة" من Android سلسلة من اختبارات الأعطال للتحقّق من مرونة السائقين في ظروف الاستخدام الكثيفة أو في حالات زاوية سلوك العملاء.

توفّر جميع اختبارات الأعطال الميزات التالية:

  • رصد التعليق: في حال تعليق برنامج NNAPI أثناء الاختبار، يتعذّر الاختبار مع سبب الفشل HANG وسيتم نقل مجموعة الاختبار إلى الاختبار التالي.
  • رصد أعطال برنامج تشغيل NNAPI: تستمر الاختبارات في العمل حتى في حال حدوث أعطال في البرنامج، و تتعذّر إكمال الاختبارات بسبب الخطأ CRASH.
  • رصد الأعطال في برامج التشغيل: يمكن أن ترصد الاختبارات أي عطل في برنامج التشغيل يؤدي إلى حدوث خطأ في طلب NNAPI. تجدر الإشارة إلى أنّه قد تكون هناك أعطال في عمليات برنامج التشغيل لا تؤدي إلى تعطُّل NNAPI ولا تؤدي إلى تعذُّر الاختبار. لتغطية هذا النوع من الأعطال، ننصحك بتنفيذ الأمر tail في سجلّ النظام للاطّلاع على الأخطاء أو الأعطال المرتبطة بالبرامج المشغِّلة.
  • استهداف جميع مسرِّعات الأعمال المتاحة: يتم إجراء الاختبارات على جميع برامج التشغيل المتاحة.

تتضمّن جميع اختبارات التصادم النتائج الأربعة المحتملة التالية:

  • SUCCESS: اكتملت عملية التنفيذ بدون خطأ.
  • FAILURE: تعذَّر التنفيذ. يحدث ذلك عادةً بسبب تعذُّر اختبار نموذج، ما يشير إلى تعذُّر قيام برنامج التشغيل بتجميع النموذج أو تنفيذه .
  • HANG: أصبحت عملية الاختبار غير مستجيبة.
  • CRASH: تعطّلت عملية الاختبار.

لمزيد من المعلومات حول اختبار الإجهاد والاطّلاع على قائمة كاملة باختبارات الأعطال، يُرجى الاطّلاع على platform/test/mlts/benchmark/README.txt.

استخدام MLTS

لاستخدام ميزة "الإعلانات المتجاوبة على شبكة البحث":

  1. عليك توصيل جهاز مستهدَف بمحطة العمل الخاصة بك والتأكد من إمكانية الوصول إليه من خلال adb. تصدير متغيّر بيئة الجهاز المستهدَف ANDROID_SERIAL إذا كان أكثر من جهاز واحد متصلاً
  2. cd في دليل المصدر العالي المستوى على Android.

    source build/envsetup.sh
    lunch aosp_arm-userdebug # Or aosp_arm64-userdebug if available.
    ./test/mlts/benchmark/build_and_run_benchmark.sh
    

    في نهاية عملية تنفيذ مقياس الأداء، يتم عرض النتائج كصفحة HTML وتمريرها إلى xdg-open.

لمزيد من المعلومات، يُرجى الاطّلاع على platform/test/mlts/benchmark/README.txt.

إصدارات HAL للشبكات العصبية

يصف هذا القسم التغييرات التي تم إدخالها في إصدارات Android و"الشبكات العصبونية" HAL.

Android 11

يقدّم نظام التشغيل Android 11 حزمة NN HAL 1.3 التي تتضمّن التغييرات البارزة التالية.

  • إتاحة قياس الكمّي بنظام 8 بت في NNAPI. تُضيف نوع عامل التشغيل TENSOR_QUANT8_ASYMM_SIGNED . يجب أن تتيح برامج التشغيل التي تستخدم NN HAL 1.3 العمليات التي تستخدم التقريب غير الموقَّت، ويجب أن تتيح أيضًا استخدام الصيغ الموقَّتة لتلك العمليات. عند تشغيل إصدارات موقَّعة وغير موقَّعة لمعظم العمليات الكميّة، يجب أن تقدِّم برامج التشغيل النتائج نفسها بما يصل إلى إزاحة 128. هناك خمسة استثناءات لهذا الشرط: CAST HASHTABLE_LOOKUP وLSH_PROJECTION وPAD_V2 وQUANTIZED_16BIT_LSTM. لا تتوافق عملية QUANTIZED_16BIT_LSTM مع المُعامِلات ذات القيمة الموجبة، ويُرجى العِلم أنّ العمليات الأربع الأخرى تتوافق مع التقريب الموجب، ولكنّها لا تتطلّب أن تكون النتائج متطابقة.
  • إتاحة عمليات التنفيذ المحدود حيث يستدعي إطار العمل الطريقة IPreparedModel::executeFenced لبدء تنفيذ غير متزامن ومحدود على نموذج معدّ بأحد مصادر قيود المزامنة التي يجب الانتظار عليها لمزيد من المعلومات، يُرجى الاطّلاع على التنفيذ السيّئ.
  • دعم تدفق التحكم. إضافة عمليتَي IF وWHILE اللتين تستخدمان نماذج أخرى كوسيطات وتنفّذهما بشكل مشروط (IF) أو بشكل متكرّر (WHILE). لمزيد من المعلومات، راجِع تدفق التحكم.
  • تحسين جودة الخدمة (QoS)، لأنّ التطبيقات يمكنها الإشارة إلى الأولويات النسبية لتصاميمها والحد الأقصى للوقت المتوقّع لإعداد النموذج والحد الأقصى للوقت المتوقّع لإكمال التنفيذ لمزيد من المعلومات، يُرجى الاطّلاع على جودة الخدمة.
  • إتاحة نطاقات الذاكرة التي توفّر واجهات لموزّعي الذاكرة للمخازن المؤقتة التي يديرها برنامج التشغيل يتيح ذلك تمرير ذاكرات الجهاز الأصلية في جميع عمليات التنفيذ، ما يؤدي إلى إيقاف عمليات نسخ البيانات وتحويلها غير الضرورية بين عمليات التنفيذ المتتالية على برنامج التشغيل نفسه. لمزيد من المعلومات، يُرجى الاطّلاع على نطاقات الذاكرة.

Android 10

يقدّم نظام التشغيل Android 10 حزمة NN HAL 1.2 التي تتضمّن التغييرات البارزة التالية.

  • تشمل بنية Capabilities جميع أنواع البيانات، بما في ذلك أنواع البيانات العددية، وتمثل أداءً غير مريح باستخدام متّجه بدلاً من الحقول المُسمّاة.
  • تسمح الطريقتان getVersionString وgetType للإطار الأساسي ب retrieving type of device (DeviceType) and version information. راجِع اكتشاف الجهاز وتخصيصه.
  • يتم استدعاء طريقة executeSynchronously تلقائيًا لتنفيذ التنفيذ بشكل متزامن. تُطلب من إطار العمل من خلال الطريقة execute_1_2 تنفيذ عملية التنفيذ بشكل غير متزامن. يُرجى الاطّلاع على التنفيذ.
  • المعلمة MeasureTiming إلى executeSynchronously وexecute_1_2 وتنفيذ الصور المتسلسلة تحدّد ما إذا كان برنامج التشغيل يقيس مدة التنفيذ. يتم تسجيل النتائج في بنية Timing. اطّلِع على التوقيت.
  • دعم عمليات التنفيذ التي يكون فيها لمعامِل واحد أو أكثر من مُعامِلات المخرجات أبعادًا أو ترتيبًا غير معروف. راجِع شكل الإخراج.
  • دعم إضافات البائعين، وهي مجموعات من العمليات وأنواع البيانات التي يحددها البائع. يُبلغ برنامج تشغيل الإضافة عن الإضافات المتوافقة من خلال طريقة IDevice::getSupportedExtensions. اطّلِع على إضافات المورّدين.
  • إمكانية التحكّم في مجموعة من عمليات التنفيذ المكثّفة باستخدام طوابير الرسائل السريعة (FMQ) للتواصل بين عمليات التطبيق وعمليات السائق، ما يقلل من وقت الاستجابة راجِع عمليات التنفيذ المكثّفة وقوائم الرسائل السريعة.
  • دعم ADEVICEBuffer للسماح لبرنامج التشغيل بتنفيذ عمليات التنفيذ دون نسخ البيانات. راجِع AHardwareBuffer.
  • تحسين التوافق مع ميزة التخزين المؤقت لعناصر الترجمة والربط لتقليل الوقت المستخدَم في الترجمة والربط عند بدء تشغيل أحد التطبيقات اطّلِع على تخزين الترجمة البرمجية.

يقدّم نظام التشغيل Android 10 أنواع العمليات والعمليات التالية:

  • أنواع خاصة

    • ANEURALNETWORKS_BOOL
    • ANEURALNETWORKS_FLOAT16
    • ANEURALNETWORKS_TENSOR_BOOL8
    • ANEURALNETWORKS_TENSOR_FLOAT16
    • ANEURALNETWORKS_TENSOR_QUANT16_ASYMM
    • ANEURALNETWORKS_TENSOR_QUANT16_SYMM
    • ANEURALNETWORKS_TENSOR_QUANT8_SYMM
    • ANEURALNETWORKS_TENSOR_QUANT8_SYMM_PER_CHANNEL
  • العمليات

    • ANEURALNETWORKS_ABS
    • ANEURALNETWORKS_ARGMAX
    • ANEURALNETWORKS_ARGMIN
    • ANEURALNETWORKS_AXIS_ALIGNED_BBOX_TRANSFORM
    • ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_LSTM
    • ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_RNN
    • ANEURALNETWORKS_BOX_WITH_NMS_LIMIT
    • ANEURALNETWORKS_CAST
    • ANEURALNETWORKS_CHANNEL_SHUFFLE
    • ANEURALNETWORKS_DETECTION_POSTPROCESSING
    • ANEURALNETWORKS_EQUAL
    • ANEURALNETWORKS_EXP
    • ANEURALNETWORKS_EXPAND_DIMS
    • ANEURALNETWORKS_GATHER
    • ANEURALNETWORKS_GENERATE_PROPOSALS
    • ANEURALNETWORKS_GREATER
    • ANEURALNETWORKS_GREATER_EQUAL
    • ANEURALNETWORKS_GROUPED_CONV_2D
    • ANEURALNETWORKS_HEATMAP_MAX_KEYPOINT
    • ANEURALNETWORKS_INSTANCE_NORMALIZATION
    • ANEURALNETWORKS_LESS
    • ANEURALNETWORKS_LESS_EQUAL
    • ANEURALNETWORKS_LOG
    • ANEURALNETWORKS_LOGICAL_AND
    • ANEURALNETWORKS_LOGICAL_NOT
    • ANEURALNETWORKS_LOGICAL_OR
    • ANEURALNETWORKS_LOG_SOFTMAX
    • ANEURALNETWORKS_MAXIMUM
    • ANEURALNETWORKS_MINIMUM
    • ANEURALNETWORKS_NEG
    • ANEURALNETWORKS_NOT_EQUAL
    • ANEURALNETWORKS_PAD_V2
    • ANEURALNETWORKS_POW
    • ANEURALNETWORKS_PRELU
    • ANEURALNETWORKS_QUANTIZE
    • ANEURALNETWORKS_QUANTIZED_16BIT_LSTM
    • ANEURALNETWORKS_RANDOM_MULTINOMIAL
    • ANEURALNETWORKS_REDUCE_ALL
    • ANEURALNETWORKS_REDUCE_ANY
    • ANEURALNETWORKS_REDUCE_MAX
    • ANEURALNETWORKS_REDUCE_MIN
    • ANEURALNETWORKS_REDUCE_PROD
    • ANEURALNETWORKS_REDUCE_SUM
    • ANEURALNETWORKS_RESIZE_NEAREST_NEIGHBOR
    • ANEURALNETWORKS_ROI_ALIGN
    • ANEURALNETWORKS_ROI_POOLING
    • ANEURALNETWORKS_RSQRT
    • ANEURALNETWORKS_SELECT
    • ANEURALNETWORKS_SIN
    • ANEURALNETWORKS_SLICE
    • ANEURALNETWORKS_SPLIT
    • ANEURALNETWORKS_SQRT
    • ANEURALNETWORKS_TILE
    • ANEURALNETWORKS_TOPK_V2
    • ANEURALNETWORKS_TRANSPOSE_CONV_2D
    • ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_LSTM
    • ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_RNN

يقدّم Android 10 تحديثات للعديد من العمليات الحالية. ترتبط التحديثات بشكل أساسي بما يلي:

  • إتاحة تنسيق ذاكرة NCHW
  • إتاحة استخدام مصفوفات ذات ترتيب مختلف عن 4 في عمليات softmax و التسوية
  • إتاحة عمليات التفاف الموسّعة
  • دعم المدخلات التي تتضمن أنواعًا مختلطة من ANEURALNETWORKS_CONCATENATION

تعرض القائمة أدناه العمليات التي تم تعديلها في Android 10. للاطّلاع على التفاصيل الكاملة للتغييرات، يُرجى الاطّلاع على OperationCode في المستندات المرجعية لـ NNAPI.

  • ANEURALNETWORKS_ADD
  • ANEURALNETWORKS_AVERAGE_POOL_2D
  • ANEURALNETWORKS_BATCH_TO_SPACE_ND
  • ANEURALNETWORKS_CONCATENATION
  • ANEURALNETWORKS_CONV_2D
  • ANEURALNETWORKS_DEPTHWISE_CONV_2D
  • ANEURALNETWORKS_DEPTH_TO_SPACE
  • ANEURALNETWORKS_DEQUANTIZE
  • ANEURALNETWORKS_DIV
  • ANEURALNETWORKS_FLOOR
  • ANEURALNETWORKS_FULLY_CONNECTED
  • ANEURALNETWORKS_L2_NORMALIZATION
  • ANEURALNETWORKS_L2_POOL_2D
  • ANEURALNETWORKS_LOCAL_RESPONSE_NORMALIZATION
  • ANEURALNETWORKS_LOGISTIC
  • ANEURALNETWORKS_LSH_PROJECTION
  • ANEURALNETWORKS_LSTM
  • ANEURALNETWORKS_MAX_POOL_2D
  • ANEURALNETWORKS_MEAN
  • ANEURALNETWORKS_MUL
  • ANEURALNETWORKS_PAD
  • ANEURALNETWORKS_RELU
  • ANEURALNETWORKS_RELU1
  • ANEURALNETWORKS_RELU6
  • ANEURALNETWORKS_RESHAPE
  • ANEURALNETWORKS_RESIZE_BILINEAR
  • ANEURALNETWORKS_RNN
  • ANEURALNETWORKS_ROI_ALIGN
  • ANEURALNETWORKS_SOFTMAX
  • ANEURALNETWORKS_SPACE_TO_BATCH_ND
  • ANEURALNETWORKS_SPACE_TO_DEPTH
  • ANEURALNETWORKS_SQUEEZE
  • ANEURALNETWORKS_STRIDED_SLICE
  • ANEURALNETWORKS_SUB
  • ANEURALNETWORKS_SVDF
  • ANEURALNETWORKS_TANH
  • ANEURALNETWORKS_TRANSPOSE

Android 9

تم تقديم NN HAL 1.1 في نظام التشغيل Android 9 ويتضمن التغييرات البارزة التالية.

  • يحتوي IDevice::prepareModel_1_1 على مَعلمة ExecutionPreference . ويمكن للسائق استخدام هذا الإعداد لتعديل تحضيره، علمًا أنّ التطبيق يفضّل التوفير في البطارية أو سينفّذ النموذج في مكالمات سريعة متتالية.
  • تمت إضافة تسع عمليات جديدة: BATCH_TO_SPACE_ND وDIV وMEAN PAD وSPACE_TO_BATCH_ND وSQUEEZE وSTRIDED_SLICE وSUB وTRANSPOSE.
  • يمكن للتطبيق تحديد إمكانية تنفيذ عمليات حسابية باستخدام أعداد الفاصلة العائمة بسعة 32 بت باستخدام نطاق و/أو دقة أعداد الفاصلة العائمة بسعة 16 بت من خلال ضبط Model.relaxComputationFloat32toFloat16 على true. تحتوي البنية Capabilities على الحقل الإضافي relaxedFloat32toFloat16Performance حتى تتمكّن وحدة التحكّم من الإبلاغ عن الأداء المُخفَّض إلى الإطار.

الإصدار 8.1 من نظام التشغيل Android

تم إصدار الإصدار الأولي من Neural Networks HAL (1.0) في Android 8.1. لمزيد من المعلومات، يُرجى الاطّلاع على /neuralnetworks/1.0/.