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