Поток управления

Начиная с Android 11, NNAPI включает две операции потока управления, IF и WHILE , которые принимают другие модели в качестве аргументов и выполняют их условно ( IF ) или многократно ( WHILE ). Это позволяет создавать модели, которые выполняют различные операции на основе входных значений или выполняют операции многократно без развёртки. Это важно для таких случаев использования, как динамические рекуррентные нейронные сети (RNN) и seq2seq.

В NN HAL 1.3 модель включает несколько подграфов, включая основной подграф, используемый для задания входных и выходных данных выполнения. Подграф может ссылаться на другие подграфы, используя операнды типа SUBGRAPH . Фреймворк может отправить операцию потока управления ускорителю только в том случае, если ускоритель поддерживает все операции во всех подграфах, на которые ссылается эта операция потока управления.

Интерфейсы HAL

В NN HAL 1.3 определения, связанные с потоком управления, находятся в types.hal .

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