A partir do Android 11, a NNAPI inclui duas operações de controle de fluxo, IF e WHILE, que recebem outros modelos como argumentos e os executam condicionalmente (IF) ou repetidamente (WHILE). Isso permite construir modelos que executam operações diferentes com base nos valores de entrada ou executam operações várias vezes sem desenrolamento. 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 principal, que é 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 controle de fluxo para um acelerador se ele oferecer suporte a todas as operações em todos os subgrafos referenciados por essa operação de controle de fluxo.
Interfaces HAL
Na NN HAL 1.3, as definições relacionadas ao controle de fluxo estão em
types.hal.
IFeWHILEtipos de operaçãoSUBGRAPHtipo de operando e oSUBGRAPHtempo de vida do operando correspondenteModelestrutura que contém o subgrafo principal e uma lista de subgrafos referenciadosCapabilitiesestrutura que contémifPerformanceewhilePerformance
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 suporte a operações aritméticas e de comparação em operandos TENSOR_INT32 de formato 1, já que eles podem ser usados como contadores de loop.
Da mesma forma, as operações que produzem operandos TENSOR_BOOL8 de formato 1 precisam ser usadas com condições IF e WHILE.
Tempo limite de execução do loop WHILE
Para evitar loops infinitos, a execução precisa ser interrompida 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 controle de fluxo fazem parte dos conjuntos de testes CTS e VTS. Para mais informações, consulte Validação.