تقدّم هذه الصفحة نظرة عامة حول كيفية تنفيذ ملفّ تعريف واجهة برمجة التطبيقات 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:
platform/test/mlts/benchmark
(تطبيق قياس الأداء)platform/test/mlts/models
(النماذج ومجموعات البيانات)
النماذج ومجموعات البيانات
يستخدِم مقياس أداء 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
لاستخدام ميزة "الإعلانات المتجاوبة على شبكة البحث":
- عليك توصيل جهاز مستهدَف بمحطة العمل الخاصة بك والتأكد من إمكانية الوصول إليه من خلال
adb.
تصدير متغيّر بيئة الجهاز المستهدَف
ANDROID_SERIAL
إذا كان أكثر من جهاز واحد متصلاً 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/
.