بدءًا من نظام التشغيل Android 11، يوفّر NNAPI جودة خدمة أفضل (QoS) من خلال السماح للتطبيق بالإشارة إلى الأولويات النسبية لنماذجه، والحد الأقصى للوقت المتوقع لتجهيز نموذج معيّن، والحد الأقصى للوقت المتوقع لاكتمال عملية تنفيذ معيّنة. علاوةً على ذلك، يقدّم Android 11 قيمًا إضافية لأخطاء NNAPI، ما يتيح للخدمة الإشارة بدقة أكبر إلى الخطأ الذي حدث عند حدوث عطل، ليتمكّن تطبيق العميل من التفاعل والاستعادة بشكل أفضل.
درجة الأهمية
بالنسبة إلى نظام التشغيل Android 11 أو الإصدارات الأحدث، يتم إعداد النماذج مع تحديد ملف تعريف الأولوية في NN HAL 1.3. تكون هذه الأولوية نسبية مقارنةً بالنماذج المعدّة الأخرى التي يملكها التطبيق نفسه. ويمكن أن تستخدم عمليات التنفيذ ذات الأولوية الأعلى موارد معالجة أكثر من عمليات التنفيذ ذات الأولوية الأقل، ويمكن أن تستبق عمليات التنفيذ ذات الأولوية الأقل أو تمنع وصولها إلى الموارد.
طلب NN HAL 1.3 الذي يتضمّن Priority
كوسيطة صريحة هو
IDevice::prepareModel_1_3
.
يُرجى العِلم أنّه
IDevice::prepareModelFromCache_1_3
يتضمّن تلقائيًا Priority
في وسيطات ذاكرة التخزين المؤقت.
هناك العديد من الاستراتيجيات المحتمَلة لدعم الأولويات استنادًا إلى إمكانات المحرّك والمسرِّع. في ما يلي عدة استراتيجيات:
- بالنسبة إلى برامج التشغيل التي تتضمّن دعمًا مضمّنًا لمنح الأولوية، يمكنك نشر الحقل
Priority
مباشرةً في المسرّع. - يمكنك استخدام قائمة انتظار أولوية لكل تطبيق لدعم الأولويات المختلفة حتى قبل أن تصل عملية التنفيذ إلى مسرِّعة الأعمال.
يمكنك إيقاف النماذج ذات الأولوية المنخفضة التي يتم تنفيذها مؤقتًا أو إلغاؤها لمنح المسرِّع مزيدًا من الوقت لتنفيذ النماذج ذات الأولوية العالية. يمكنك إجراء ذلك من خلال إدراج نقاط تفتيش في النماذج ذات الأولوية المنخفضة التي تُجري عند الوصول إليها استعلامًا عن علامة لتحديد ما إذا كان يجب إيقاف التنفيذ الحالي قبل الأوان أو من خلال تقسيم النموذج إلى نماذج فرعية وإجراء استعلام عن العلامة بين عمليات تنفيذ النماذج الفرعية. يُرجى العِلم أنّ استخدام نقاط التفتيش أو نماذج فرعية في النماذج التي تم إعدادها مع الأولوية يمكن أن يؤدي إلى زيادة في التكاليف غير الظاهرة في النماذج التي لا تملك أولوية في الإصدارات التي تقل عن NN HAL 1.3.
- لدعم الاستبدال، يجب الاحتفاظ بسياق التنفيذ، بما في ذلك العملية التالية أو النموذج الفرعي الذي سيتم تنفيذه وأي بيانات وسيطة ذات صلة للم Operand. استخدِم سياق التنفيذ هذا ل استئناف التنفيذ في وقت لاحق.
- ليس من الضروري توفير دعم كامل للاقتطاع، لذا ليس من الضروري الاحتفاظ بسياق التنفيذ. بما أنّ عمليات تنفيذ نماذج NNAPI هي عمليات حتمية، يمكن إعادة تنفيذها من البداية في وقت لاحق.
يتيح نظام التشغيل Android للخدمات التفريق بين تطبيقات الاتصال المختلفة من خلال
استخدام معرّف AID (معرّف Android). تتضمّن HIDL آليات مدمجة لاسترداد UID
للتطبيق المُتصل من خلال الأسلوب
::android::hardware::IPCThreadState::getCallingUid
. يمكن الاطّلاع على قائمة بأرقام تعريف المعلِنين في libcutils/include/cutils/android_filesystem_config.h
.
المواعيد النهائية
بدءًا من Android 11، يمكن بدء إعداد النماذج و
تنفيذها باستخدام مَعلمة الموعد النهائي OptionalTimePoint
. بالنسبة
للسائقين الذين يمكنهم تقدير المدة التي تستغرقها المهمة، يسمح هذا الموعد النهائي
للسائق بإلغاء المهمة قبل بدئها إذا قدر السائق أن المهمة لا يمكن
إنجازها قبل الموعد النهائي. وبالمثل، يسمح الموعد النهائي للسائق بمحاولة
إيقاف مهمة جارية يُقدّر أنّها لن تكتمل قبل الموعد النهائي.
لا تجبر وسيطة الموعد النهائي السائق على إلغاء مهمة إذا لم تكتمل
المهمة بحلول الموعد النهائي أو إذا انقضى الموعد النهائي. يمكن استخدام الوسيطة "الموعد النهائي"
لإخلاء موارد الحوسبة ضمن برنامج التشغيل وإعادة التحكّم
في التطبيق بشكل أسرع مما يمكن بدون الموعد النهائي.
طلبات NN HAL 1.3 التي تتضمّن مهلات OptionalTimePoint
كوسيطة
هي:
IDevice::prepareModel_1_3
IDevice::prepareModelFromCache_1_3
IPreparedModel::execute_1_3
IPreparedModel::executeSynchronously_1_3
IPreparedModel::executeFenced
للاطّلاع على مرجع لتنفيذ ميزة الموعد النهائي لكل من الخطوات المذكورة أعلاه، يمكنك الاطّلاع على نموذج برنامج تشغيل NNAPI على الرابط التالي:
frameworks/ml/nn/driver/sample/SampleDriver.cpp
.
رموز الخطأ
يتضمّن Android 11 أربع قيم لرموز الخطأ في
NN HAL 1.3 لتحسين عملية الإبلاغ عن الأخطاء، ما يتيح للسائقين إبلاغ
حالتهم وتطبيقاتهم بشكل أفضل باسترداد البيانات بشكل أكثر سلاسة. في ما يلي قيم رمز الخطأ
في ErrorStatus
.
MISSED_DEADLINE_TRANSIENT
MISSED_DEADLINE_PERSISTENT
RESOURCE_EXHAUSTED_TRANSIENT
RESOURCE_EXHAUSTED_PERSISTENT
في الإصدار 10 من نظام التشغيل Android أو الإصدارات الأقدم، لا يمكن لبرنامج تشغيل الإشارة إلى حدوث خطأ إلا من خلال رمز الخطأ
GENERAL_FAILURE
. اعتبارًا من Android 11، يمكن استخدام رمزَي الخطأ MISSED_DEADLINE
للإشارة إلى أنّه تم إلغاء عملية المعالجة
لأنّه تم بلوغ الموعد النهائي أو لأنّ برنامج التشغيل توقّع عدم اكتمال عملية المعالجة
بحلول الموعد النهائي. يمكن استخدام رمزَي الخطأ RESOURCE_EXHAUSTED
للإشارة إلى تعذُّر تنفيذ المهمة بسبب محدودية موارد
البرنامج المشغِّل، مثل عدم توفُّر ذاكرة كافية لتحميل
الطلب.
يشير الإصدار TRANSIENT
من كلا الخطأَين إلى أنّ المشكلة مؤقتة،
وقد تنجح عمليات الاتصال المستقبلية بالمهمة نفسها بعد تأخير قصير. على سبيل المثال، يجب عرض رمز الخطأ هذا عندما يكون السائق مشغولاً بعمل سابق واستغرقته مدة طويلة أو موارد كثيفة، ولكن يجب أن تكتمل المهمة الجديدة بنجاح إذا لم يكن السائق مشغولاً بالعمل السابق. يشير PERSISTENT
الإصدار من كلا الخطأَين إلى أنّه من المتوقع دائمًا أن يؤدي تنفيذ المهام نفسها في المستقبل إلى
تعذُّر إكمالها. على سبيل المثال، يجب عرض رمز الخطأ هذا عندما يقدّر السائق أنّ المهمة لن تكتمل بحلول الموعد النهائي حتى في ظل ظروف مثالية، أو عندما يكون النموذج كبيرًا جدًا ويتجاوز موارد السائق.
التحقُّق
يتم اختبار وظيفة جودة الخدمة في اختبارات فحص الأداء لواجهة برمجة التطبيقات NNAPI
(VtsHalNeuralnetworksV1_3Target
). ويشمل ذلك مجموعة من اختبارات التحقّق
(TestGenerated/ValidationTest#Test/
) لضمان رفض برنامج التشغيل للأولويات
غير الصالحة ومجموعة من الاختبارات تُسمى DeadlineTest
(TestGenerated/DeadlineTest#Test/
) لضمان معالجة برنامج التشغيل للمواعيد النهائية
بشكل صحيح.