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