Начиная с Android 11, NNAPI включает две операции управления потоком, IF и WHILE, которые принимают другие модели в качестве аргументов и выполняют их условно (IF) или повторно (WHILE). Это позволяет создавать модели, которые выполняют различные операции на основе входных значений или выполняют операции несколько раз без развертывания. Это важно для таких случаев, как динамическая RNN и seq2seq.
В NN HAL 1.3 модель включает несколько подграфов, в том числе основной, который используется для указания входных и выходных данных выполнения. Подграф может ссылаться на другие подграфы, используя операнды типа SUBGRAPH. Фреймворк может отправить операцию управления потоком на ускоритель, только если ускоритель поддерживает все операции во всех подграфах, на которые ссылается эта операция управления потоком.
Интерфейсы HAL
В NN HAL 1.3 определения, связанные с потоком управления, находятся в файле types.hal.
- Типы операций
IFиWHILE SUBGRAPHтип операнда и соответствующийSUBGRAPHвремя жизни операндаModelструктура, содержащая основной подграф и список связанных подграфовCapabilitiesструктура, содержащаяifPerformanceиwhilePerformance
IDevice.hal
содержит IDevice, метод getSupportedOperations_1_3() которого должен обрабатывать IF
и WHILE иначе, чем другие операции.
IPreparedModel.hal содержит IPreparedModel, методы которого execute_1_3(), executeSynchronously_1_3() и executeFenced() принимают необязательный аргумент loopTimeoutDuration.
Реализация драйвера
Примеры реализации операций можно найти в разделах CpuExecutor::executeIfOperation и CpuExecutor::executeWhileOperation.
Примеры логики проверки операций приведены в статьях validateIfOperation() и validateWhileOperation().
Обратите внимание, что важно поддерживать арифметические операции и операции сравнения с операндами TENSOR_INT32 формы 1, поскольку они могут использоваться в качестве счетчиков циклов.
Аналогично, операции, создающие операнды TENSOR_BOOL8 формы 1, следует использовать с условиями IF и WHILE.
Время ожидания выполнения цикла WHILE истекло
Чтобы предотвратить бесконечные циклы, выполнение должно быть прервано, если цикл WHILE занимает больше времени, чем значение loopTimeoutDuration, переданное вызову IPreparedModel::execute_1_3(), IPreparedModel::executeSynchronously_1_3() или IPreparedModel::executeFenced() (или значение по умолчанию, если оно опущено).
Проверка
Тесты потока управления являются частью наборов тестов CTS и VTS. Подробнее о проверке…