A partir do Android 11, a NNAPI inclui duas operações de fluxo de controle, IF
e WHILE
, que recebem outros modelos como argumentos e os executam condicionalmente ( IF
) ou repetidamente ( WHILE
). Isso permite construir modelos que executam diferentes operações com base nos valores de entrada ou executam operações várias vezes sem desenrolar. Isso é importante para casos de uso como RNN dinâmico e seq2seq.
No NN HAL 1.3, o modelo incorpora vários subgráficos, incluindo o subgráfico principal que é usado para especificar entradas e saídas de uma execução. Um subgrafo pode referenciar outros subgrafos usando operandos do tipo SUBGRAPH
. A estrutura pode enviar uma operação de fluxo de controle para um acelerador somente se o acelerador suportar todas as operações em todos os subgráficos referenciados por essa operação de fluxo de controle.
Interfaces HAL
No NN HAL 1.3, as definições relacionadas ao fluxo de controle estão em types.hal
.
- Tipos de operação
IF
eWHILE
- Tipo de operando
SUBGRAPH
e o tempo de vida do operandoSUBGRAPH
correspondente - Estrutura do
Model
que contém o subgrafo principal e uma lista de subgrafos referenciados - Estrutura de
Capabilities
que contémifPerformance
ewhilePerformance
IDevice.hal
contém IDevice
, cujo método getSupportedOperations_1_3()
deve tratar IF
e WHILE
de forma diferente de outras operações.
IPreparedModel.hal
contém IPreparedModel
, cujos métodos execute_1_3()
, executeSynchronously_1_3()
e executeFenced()
recebem um argumento loopTimeoutDuration
opcional.
Implementação do driver
Para obter uma implementação de operação de amostra, consulte CpuExecutor::executeIfOperation
e CpuExecutor::executeWhileOperation
. Para a lógica de validação de operação de amostra, consulte validateIfOperation()
e validateWhileOperation()
.
Observe que é importante oferecer suporte a operações aritméticas e de comparação em operandos TENSOR_INT32
de formato 1
, pois eles podem ser usados como contadores de loop. Da mesma forma, as operações que produzem operandos TENSOR_BOOL8
de formato 1
devem ser usadas com as condições IF
e WHILE
.
WHILE tempo limite de execução do loop
Para evitar loops infinitos, a execução deve ser abortada se um loop WHILE
demorar mais do que o valor loopTimeoutDuration
passado para uma chamada de IPreparedModel::execute_1_3()
, IPreparedModel::executeSynchronously_1_3()
ou IPreparedModel::executeFenced()
(ou o valor padrão se omitido).
Validação
Os testes de fluxo de controle fazem parte dos conjuntos de testes CTS e VTS. Para obter mais informações, consulte Validação .