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 executam operações várias vezes sem desenrolar. Isso é importante para casos de uso como RNN dinâmica 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
- Tipo de operando
SUBGRAPH
e a vida útil do operandoSUBGRAPH
correspondente - 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()
recebem 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 compatibilidade com operações aritméticas e de comparação nos operandos
TENSOR_INT32
na forma 1
, já que eles podem ser usados como contadores de loop.
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 do 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.