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