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

تقدّم هذه الصفحة نظرة عامة حول كيفية تنفيذ برنامج تشغيل لواجهة برمجة التطبيقات الخاصة بالشبكات العصبونية (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 التي تم عرضها.

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

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

جودة الخدمة

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

تنظيف

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

استخدام CPU

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

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

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

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

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

يحتوي الملف frameworks/ml/nn/common/include/Utils.h على دوال مساعدة متنوعة، مثل الدوال المستخدَمة في التسجيل وفي التحويل بين إصدارات مختلفة من طبقة تجريد الأجهزة (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 على وحدات ماكرو لتسهيل إضافة معلومات 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.

الأمان

بما أنّ عمليات التطبيق تتواصل مباشرةً مع عملية السائق، يجب أن يتحقّق السائقون من صحة وسيطات المكالمات التي يتلقّونها. يتم التحقّق من صحة هذا التحقّق من خلال مجموعة اختبارات التحقّق من صحة الجهاز (VTS). يمكنك العثور على رمز التحقّق في 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 v4.
  • يتم تشغيل MobileNetV2 float وu8 quantized بأحجام مختلفة، وذلك مقابل مجموعة فرعية صغيرة (1500 صورة) من مجموعة بيانات Open Images 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 واجهة برمجة التطبيقات 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 الإصدار 1.2 من طبقة تجريد الأجهزة (HAL) الخاصة بالشبكة العصبية، والذي يتضمّن التغييرات الملحوظة التالية.

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