Начиная с 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. Подробнее см. в разделе «Валидация» .