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

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

,

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