Начиная с 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. Для получения дополнительной информации см. Проверка .
, Начиная с 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. Для получения дополнительной информации см. Проверка .