Начиная с 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
. Список AID можно найти в 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
обеих ошибок указывает на то, что последующие вызовы той же задачи всегда будут завершаться сбоем. Например, этот код ошибки должен возвращаться, когда драйвер оценивает, что задача не завершится к установленному сроку даже при идеальных условиях, или когда модель изначально слишком велика и превышает ресурсы драйвера.
Проверка
Функциональность качества обслуживания проверяется в тестах VTS NNAPI ( VtsHalNeuralnetworksV1_3Target
). Они включают набор тестов для валидации ( TestGenerated/ValidationTest#Test/
), гарантирующих отклонение драйвером недопустимых приоритетов, и набор тестов DeadlineTest
( TestGenerated/DeadlineTest#Test/
), гарантирующих корректную обработку драйвером крайних сроков.