A partir do Android 11, a NNAPI inclui duas
operações de fluxo de controle, IF
e WHILE
, que usam outros modelos como argumentos
e os executam condicionalmente (IF
) ou repetidamente (WHILE
). Isso permite
criar modelos que executam operações diferentes com base nos valores de entrada
ou que executam operações várias vezes sem desenrolar. Isso é importante para
casos de uso como RNN dinâmico e seq2seq.
Na NN HAL 1.3, o modelo incorpora vários subgrafos, incluindo o subgrafo
principal usado para especificar entradas e saídas de uma execução. Um
subgrafo pode referenciar outros subgrafos usando operandos do tipo SUBGRAPH
. O
framework só pode enviar uma operação de fluxo de controle para um acelerador se o
acelerador oferecer suporte a todas as operações em todos os subgrafos 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
SUBGRAPH
tipo de operando e o correspondenteSUBGRAPH
tempo de vida do operando- Estrutura
Model
que contém o subgrafo principal e uma lista de subgrafos referenciados - Estrutura
Capabilities
que contémifPerformance
ewhilePerformance
IDevice.hal
contém IDevice
, cujo método getSupportedOperations_1_3()
precisa tratar IF
e WHILE
de maneira diferente de outras operações.
IPreparedModel.hal
contém IPreparedModel
, cujos métodos execute_1_3()
,
executeSynchronously_1_3()
e executeFenced()
usam um argumento
loopTimeoutDuration
opcional.
Implementação do driver
Para conferir um exemplo de implementação de operação, consulte
CpuExecutor::executeIfOperation
e
CpuExecutor::executeWhileOperation
.
Para conferir um exemplo de lógica de validação de operação, consulte
validateIfOperation()
e
validateWhileOperation()
.
É importante oferecer suporte a operações aritméticas e de comparação em
operadores TENSOR_INT32
da forma 1
, já que eles podem ser usados como contadores de loops.
Da mesma forma, as operações que produzem operandos TENSOR_BOOL8
do formato 1
precisam ser
usadas com as condições IF
e WHILE
.
Tempo limite de execução de loop WHILE
Para evitar loops infinitos, a execução precisa ser abortada se um loop WHILE
levar
mais tempo do que o valor loopTimeoutDuration
transmitido 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 mais informações, consulte Validação.