Качество обслуживания

Начиная с 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 указывающим на крайний срок. Для драйверов, способных оценить время выполнения задачи, этот аргумент позволяет прервать задачу до её начала, если драйвер оценивает, что задача не может быть завершена до крайнего срока. Аналогично, аргумент `delayed` позволяет драйверу прервать текущую задачу, которая, по его оценке, не будет завершена до крайнего срока. Аргумент `delayed` не заставляет драйвер прерывать задачу, если задача не завершена к крайнему сроку или если крайний срок уже прошёл. Аргумент `delayed` можно использовать для освобождения вычислительных ресурсов внутри драйвера и более быстрого возврата управления приложению, чем это возможно без аргумента `delayed`.

В NN HAL 1.3 вызовы функций, которые включают в качестве аргумента параметр OptionalTimePoint deadlines, следующие:

  • 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/ ), гарантирующих корректную обработку драйвером крайних сроков.