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

В Android 11 NNAPI предлагает более высокое качество обслуживания, позволяя приложению указывать относительные приоритеты своих моделей, максимальное время подготовки модели и максимальное время выполнения. Кроме того, в 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). В HIDL встроены механизмы для получения UID вызывающего приложения с помощью метода ::android::hardware::IPCThreadState::getCallingUid. Список идентификаторов приложений можно найти в файле libcutils/include/cutils/android_filesystem_config.h.

Сроки

Начиная с Android 11 подготовку и выполнение модели можно запускать с аргументом крайнего срока OptionalTimePoint. Если драйвер может оценить, сколько времени займет задача, этот срок позволяет ему прервать задачу до ее начала, если драйвер считает, что задача не может быть выполнена до истечения срока. Аналогично, крайний срок позволяет водителю прервать текущую задачу, которая, по его оценкам, не будет выполнена до крайнего срока. Аргумент deadline не заставляет драйвер прерывать задачу, если она не будет выполнена к указанному сроку или если срок уже истек. Аргумент deadline можно использовать, чтобы освободить вычислительные ресурсы в драйвере и быстрее вернуть управление приложению, чем без него.

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