Начиная с 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/
), гарантирующий, что драйвер правильно обрабатывает сроки.