تقدّم هذه الصفحة نظرة عامة حول كيفية تنفيذ ملف تعريف برمجي لواجهة برمجة التطبيقات Neural Networks API (NNAPI). لمزيد من التفاصيل، يُرجى الاطّلاع على المستندات المتوفّرة في تعريف HAL
الملفات في
hardware/interfaces/neuralnetworks
.
يمكنك العثور على نموذج لتنفيذ برنامج تشغيل في
frameworks/ml/nn/driver/sample
.
لمزيد من المعلومات حول Neural Networks API، يُرجى الاطّلاع على Neural Networks API.
الشبكات العصبية HAL
يحدِّد HAL للشبكات العصبية (NN) تمثيلًا مجردًا للأجهزة المختلفة،
مثل وحدات معالجة الرسومات (GPU) ومعالجات الإشارات الرقمية (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
معرّفًا. إذا أرجع برنامج التشغيل رمز خطأ عند إعداد مجموعة فرعية من
النموذج، يشغّل إطار العمل النموذج بأكمله على وحدة المعالجة المركزية.
لتقليل الوقت المستغرَق في عملية الترجمة عند بدء تشغيل أحد التطبيقات، يمكن لبرنامج التشغيل تخزين عناصر الترجمة في ذاكرة التخزين المؤقت. لمزيد من المعلومات، يُرجى الاطّلاع على الترجمة compiling التخزين المؤقت caching.
التنفيذ
عندما يطلب تطبيق من إطار العمل تنفيذ طلب، يُطلِب إطار العمل
طريقة
IPreparedModel::executeSynchronously_1_3
HAL تلقائيًا لتنفيذ تنفيذ متزامن على نموذج معدّ.
يمكن أيضًا تنفيذ الطلب بشكل غير متزامن باستخدام الأسلوب
execute_1_3
أو الأسلوب
executeFenced
(راجِع التنفيذ المحدود)،
أو تنفيذه باستخدام أسلوب
التنفيذ المكثّف.
تعمل طلبات التنفيذ المتزامنة على تحسين الأداء وتقليل وقت تنفيذ معالجة المهام مقارنةً بطلبات التنفيذ غير المتزامنة، لأنّ عملية التحكّم تعود إلى عملية التطبيق فقط بعد اكتمال التنفيذ. وهذا يعني أنّه ليس بحاجة إلى آلية منفصلة لإعلام عملية التطبيق بأنّه اكتمل تنفيذ الإجراء.
باستخدام طريقة execute_1_3
غير المتزامنة، يعود التحكّم إلى
عملية التطبيق بعد بدء التنفيذ، ويجب أن يُعلم برنامج التشغيل
الإطار الأساسي عند اكتمال التنفيذ باستخدام
@1.3::IExecutionCallback
.
تسرد المَعلمة Request
التي تم تمريرها إلى طريقة التنفيذ عاملي المعالجة
للإدخال والإخراج المستخدَمين في التنفيذ. يجب أن تستخدم الذاكرة التي تخزِّن بيانات الم Operand
الترتيب حسب الصفوف مع تكرار السمة الأولى ببطء أكبر وألا يكون هناك
ملء في نهاية أي صف. لمزيد من المعلومات عن أنواع المَعلمات،
راجِع
المَعلمات.
بالنسبة إلى برامج تشغيل 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 تحسينًا في جودة الخدمة (QoS) من خلال السماح للتطبيق بتحديد الأولويات النسبية لنماذجه، والحد الأقصى للوقت المتوقّع لإعداد النموذج، والحد الأقصى للوقت المتوقّع لإكمال التنفيذ. لمزيد من المعلومات، يُرجى الاطّلاع على جودة الخدمة.
تنظيف
عند انتهاء أحد التطبيقات من استخدام نموذج معدّ، يُطلق الإطار المرجعي
@1.3::IPreparedModel
للعنصر. عندما لا تتم الإشارة إلى عنصر IPreparedModel
، يتم
إتلافه تلقائيًا في خدمة برنامج التشغيل التي أنشأته. يمكن استرداد موارد
الخاصة بالنموذج في الوقت الحالي عند تنفيذ ملف التعريف لأسلوب
التدمير. إذا أرادت خدمة برنامج التشغيل أن يتم
إتلاف كائن IPreparedModel
تلقائيًا عندما لا يعود العميل بحاجة إليه، يجب ألا تحتفظ
بأيّ إحالات إلى كائن IPreparedModel
بعد
إرجاع كائن IPreparedeModel
من خلال
IPreparedModelCallback::notify_1_3
.
استخدام وحدة المعالجة المركزية
من المتوقّع أن تستخدم برامج تشغيل الأجهزة وحدة المعالجة المركزية لإعداد العمليات الحسابية. يجب ألا تستخدم برامج التشغيل المعالج المركزي لإجراء عمليات حسابية للرسوم البيانية لأنّ ذلك يتداخل مع قدرة الإطار على تخصيص العمل بشكل صحيح. على السائق الإبلاغ عن الأجزاء التي لا يمكنه التعامل معها إلى الإطار والسماح للإطار بالتعامل مع الباقي.
يقدّم إطار العمل تنفيذًا لوحدة المعالجة المركزية لجميع عمليات 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
إذا كان بالإمكان تحويل عنصر 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
على دوالّ مساعدة للتحقّق من صلاحية عنصر HAL لشبكات العصبونات الاصطناعي
وفقًا لمواصفات إصدار HAL.
-
validate*
: يعرض القيمةtrue
إذا كان عنصر 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(القيمة المتوقّعة - القيمة الفعلية) <= atol + 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 على وحدة المعالجة المركزية، وذلك باستخدام النموذج ومجموعات البيانات نفسها. يضمن ذلك ألّا تكون دقة برنامج التشغيل أسوأ من التنفيذ المرجعي لوحدة المعالجة المركزية.
يستخدم مطوّرو منصة Android أيضًا أداة MLTS لتقييم وقت الاستجابة ودقيقة برامج تشغيل الأجهزة.
يمكن العثور على مقياس أداء NNAPI في مشروعَين في AOSP:
platform/test/mlts/benchmark
(تطبيق قياس الأداء)platform/test/mlts/models
(النماذج ومجموعات البيانات)
النماذج ومجموعات البيانات
يستخدِم مقياس أداء NNAPI النماذج ومجموعات البيانات التالية.
- MobileNetV1 float وu8 مُعدَّلَان بحجمَين مختلفَين، تم تشغيلهما على مجموعة فرعية صغيرة (1500 صورة) من الإصدار 4 من مجموعة Open Images Dataset.
- MobileNetV2 float وu8 مُعدَّلَان بحجمَين مختلفَين، تم تشغيلهما على مجموعة فرعية صغيرة (1500 صورة) من الإصدار 4 من مجموعة Open Images Dataset.
- نموذج صوتي يستند إلى الذاكرة قصيرة المدى (LSTM) لتحويل النص إلى كلام، تم تشغيله على مجموعة فرعية صغيرة من مجموعة CMU Arctic
- نموذج صوتي يستند إلى 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
.
إصدارات Neural Networks HAL
يصف هذا القسم التغييرات التي تم إدخالها في إصدارات Android وNeural Networks HAL.
Android 11
يقدّم نظام التشغيل Android 11 حزمة NN HAL 1.3 التي تتضمّن التغييرات البارزة التالية.
- إتاحة استخدام كمية 8 بت موقَّعة في NNAPI تُضيف نوع الم Operand
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
جميع أنواع البيانات، بما في ذلك أنواع البيانات scalar ، وتُمثّل الأداء غير المريح باستخدام متجه بدلاً من الحقول المُسمّاة. - تسمح الطريقتان
getVersionString
وgetType
للإطار الأساسي ب retrieving type of device (DeviceType
) and version information. راجِع اكتشاف الأجهزة وتحديدها. - يتم استدعاء طريقة
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
تم طرح الإصدار 1.1 من NN HAL في 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
حتى تتمكّن وحدة التحكّم من الإبلاغ عن الأداء المُخفَّض إلى الإطار.
Android 8.1
تم إصدار الإصدار الأولي من Neural Networks HAL (1.0) في Android 8.1. لمزيد من
المعلومات، يُرجى الاطّلاع على
/neuralnetworks/1.0/
.