جودة الخدمة

بدءًا من 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.

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

يمكّن Android الخدمات من التمييز بين تطبيقات الاتصال المختلفة من خلال استخدام AID (Android UID). يحتوي HIDL على آليات مضمنة لاسترداد المعرف الفريد (UID) لتطبيق الاتصال من خلال الطريقة ::android::hardware::IPCThreadState::getCallingUid . يمكن العثور على قائمة بمعرفات AIDs في 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

في نظام التشغيل Android 10 أو الإصدارات الأقدم، يمكن للسائق فقط الإشارة إلى الفشل من خلال رمز الخطأ GENERAL_FAILURE . من Android 11، يمكن استخدام رمزي الخطأ MISSED_DEADLINE للإشارة إلى أنه تم إلغاء عبء العمل بسبب الوصول إلى الموعد النهائي أو لأن السائق توقع عدم اكتمال عبء العمل بحلول الموعد النهائي. يمكن استخدام رمزي الخطأ RESOURCE_EXHAUSTED للإشارة إلى فشل المهمة بسبب وجود قيود على الموارد داخل برنامج التشغيل، مثل عدم وجود ذاكرة كافية في برنامج التشغيل لإجراء المكالمة.

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

تصديق

يتم اختبار جودة وظائف الخدمة في اختبارات NNAPI VTS ( VtsHalNeuralnetworksV1_3Target ). يتضمن ذلك مجموعة من الاختبارات للتحقق من الصحة ( TestGenerated/ValidationTest#Test/ ) للتأكد من أن برنامج التشغيل يرفض الأولويات غير الصالحة ومجموعة من الاختبارات تسمى DeadlineTest ( TestGenerated/DeadlineTest#Test/ ) للتأكد من أن برنامج التشغيل يتعامل مع المواعيد النهائية بشكل صحيح.