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

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

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

طبقة تجريد الأجهزة (HAL) للشبكات العصبية

تُعرِّف الشبكات العصبية (NN) طريقة تجريد الأجهزة المختلفة الأجهزة، مثل وحدات معالجة الرسومات (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 و22 الكمّيَين للقيم الكمية بتنسيق 8 بت. لمزيد من المعلومات، يُرجى الاطّلاع على حزمة اختبار تعلُّم الآلة من Android.

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

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

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

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

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

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

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

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

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

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

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

التنفيذ

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

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

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

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

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

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

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

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

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

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

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

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

استخدام ميزة "المقاطع الصوتية بعدّة لغات"

لاستخدام ميزة "المقاطع الصوتية بعدّة لغات":

  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. برامج التشغيل التي تتضمن الإصدار 1.3 من 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 لإطار العمل استرداد معلومات نوع الجهاز (DeviceType) والإصدار. راجِع اكتشاف الجهاز وتخصيصه.
  • ويتم استدعاء طريقة executeSynchronously تلقائيًا لإجراء التنفيذ بشكل متزامن. تخبر الطريقة execute_1_2 إطار العمل بتنفيذ عملية تنفيذ بشكل غير متزامن. يُرجى الاطّلاع على التنفيذ.
  • المعلمة MeasureTiming إلى executeSynchronously وexecute_1_2 وتنفيذ الصور المتسلسلة تحدّد ما إذا كان برنامج التشغيل يقيس مدة التنفيذ. يتم عرض النتائج في بنية Timing. راجِع التوقيت.
  • دعم عمليات التنفيذ التي يكون فيها لمعامِل واحد أو أكثر من مُعامِلات المخرجات أبعادًا أو ترتيبًا غير معروف. راجِع شكل الإخراج.
  • دعم إضافات البائعين، وهي مجموعات من العمليات وأنواع البيانات التي يحددها البائع. يبلِّغ برنامج التشغيل عن الإضافات المتوافقة من خلال طريقة IDevice::getSupportedExtensions. يُرجى الاطّلاع على إضافات المورّدين.
  • القدرة على كائن الصور المتسلسلة للتحكّم في مجموعة من عمليات التنفيذ المتسلسلة باستخدام قوائم انتظار الرسائل السريعة (FMQs) للتواصل بين عمليات التطبيق وبرنامج التشغيل، ما يقلّل من وقت الاستجابة يُرجى الاطّلاع على عمليات التنفيذ المتسلسلة وقوائم انتظار الرسائل السريعة.
  • دعم ADEVICEBuffer للسماح لبرنامج التشغيل بتنفيذ عمليات التنفيذ دون نسخ البيانات. يُرجى الاطّلاع على ADEVICEBuffer.
  • تم تحسين الدعم للتخزين المؤقت لعناصر التجميع لتقليل الوقت المخصص للتجميع عند بدء تشغيل التطبيق. يُرجى الاطّلاع على التخزين المؤقت للتجميع.

يقدّم نظام التشغيل 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

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

تم تقديم 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

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