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

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

لمزيد من المعلومات حول Neural Networks API، يُرجى الاطّلاع على Neural Networks API.

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

تحدّد طبقة تجريد الأجهزة (HAL) الخاصة بالشبكات العصبية (NN) تجريدًا للأجهزة المختلفة، مثل وحدات معالجة الرسومات (GPU) ومعالجات الإشارات الرقمية (DSP)، التي يتضمّنها أحد المنتجات (مثل هاتف أو جهاز لوحي). يجب أن تتوافق برامج التشغيل الخاصة بهذه الأجهزة مع طبقة تجريد الأجهزة الخاصة بالشبكات العصبية. يتم تحديد الواجهة في ملفات تعريف 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، يمكن للتطبيقات اكتشاف الأجهزة وتحديدها، ثم يختار إطار العمل الأجهزة المحدّدة. لمزيد من المعلومات، يُرجى الاطّلاع على اكتشاف الأجهزة وتحديدها.

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

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

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

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

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

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

التنفيذ

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

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

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

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

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

بالنسبة إلى برامج التشغيل التي تتضمّن 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 التي تم عرضها.

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

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

جودة الخدمة

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

تنظيف

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

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

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

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

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

الدوال المساعدة

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

يحتوي الملف frameworks/ml/nn/common/include/Utils.h على وظائف أدوات متنوعة، مثل تلك المستخدَمة في التسجيل وفي التحويل بين إصدارات مختلفة من طبقة تجريد الأجهزة (HAL) الخاصة بالشبكة العصبية.

  • ‫VLogging: 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 على وحدات ماكرو لتسهيل إضافة معلومات systracing إلى رمز الشبكات العصبية. للاطّلاع على مثال، راجِع استدعاءات ماكرو NNTRACE_* في برنامج التشغيل النموذجي.

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

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

التحقُّق

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

في ما يلي متطلبات الدقة في اختبار التوافق مع نظام التشغيل (CTS) واختبار صحة المورّد (VTS) لواجهة برمجة التطبيقات NNAPI:

  • الفاصلة العائمة: abs(expected - actual) <= atol + rtol  * abs(expected); where:

    • بالنسبة إلى 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.

الأمان

بما أنّ عمليات التطبيق تتواصل مباشرةً مع عملية السائق، يجب أن يتحقّق السائقون من صحة وسائط الاستدعاءات التي يتلقّونها. ويتم التحقّق من صحة هذا الإجراء من خلال &quot;مجموعة أدوات اختبارات التحقّق&quot;. رمز التحقّق هو frameworks/ml/nn/common/include/ValidateHal.h.

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

مجموعة أدوات اختبار تعلُّم الآلة على Android

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

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

يمكن العثور على مقياس أداء NNAPI في مشروعَين في AOSP:

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

يستخدم معيار NNAPI النماذج ومجموعات البيانات التالية.

  • يتم تشغيل MobileNetV1 float وu8 quantized بأحجام مختلفة، وذلك مقابل مجموعة فرعية صغيرة (1500 صورة) من مجموعة بيانات Open Images Dataset الإصدار 4.
  • يتم تشغيل MobileNetV2 float وu8 quantized بأحجام مختلفة، وذلك مقابل مجموعة فرعية صغيرة (1500 صورة) من مجموعة بيانات Open Images Dataset v4.
  • نموذج صوتي مستند إلى الذاكرة الطويلة المدى (LSTM) لتحويل النص إلى كلام، يتم تنفيذه على مجموعة فرعية صغيرة من مجموعة CMU Arctic.
  • نموذج صوتي مستند إلى LSTM للتعرّف التلقائي على الكلام، يتم تنفيذه على مجموعة فرعية صغيرة من مجموعة بيانات LibriSpeech.

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

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

تتضمّن &quot;مجموعة اختبارات تعلُّم الآلة على Android&quot; سلسلة من اختبارات الأعطال للتحقّق من قدرة برامج التشغيل على التحمّل في ظروف الاستخدام المكثّف أو في الحالات الحدّية لسلوك العملاء.

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

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

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

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

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

استخدام MLTS

لاستخدام خدمة 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 وNeural Networks HAL.

Android 11

يقدّم نظام التشغيل Android 11 الإصدار 1.3 من طبقة تجريد الأجهزة (HAL) الخاصة بالشبكة العصبية، والذي يتضمّن التغييرات الملحوظة التالية.

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

‫Android 8.1

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