No Android 11 e versões mais recentes, 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
a construção de 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âmica e seq2seq.
Na NN HAL 1.3, o modelo incorpora vários subgráficos, incluindo o subgráfico principal, usado para especificar entradas e saídas de uma execução. Um
subgráfico pode referenciar outros subgráficos usando operandos do tipo SUBGRAPH
. O
framework só poderá enviar uma operação de fluxo de controle a um acelerador se ele
for compatível com todas as operações em todos os subgráficos referenciados por essa
operação de fluxo de controle.
Interfaces HAL
Na 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 ciclo de vida do operandoSUBGRAPH
correspondente - Estrutura
Model
que contém o subgráfico principal e uma lista de subgráficos 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 a lógica de validação da operação de amostra, consulte
validateIfOperation()
e
validateWhileOperation()
.
É importante oferecer suporte a 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
na forma 1
precisam ser
usadas com as condições IF
e WHILE
.
Tempo limite de execução do loop WHILE
Para evitar repetições infinitas, a execução precisará ser abortada se uma repetição WHILE
demorar
mais 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.