A partire da Android 11, l'NNAPI include due
operazioni di flusso di controllo, IF
e WHILE
, che prendono gli altri modelli come argomenti
e li eseguono in modo condizionale (IF
) o ripetutamente (WHILE
). Questo consente
di creare modelli che eseguono operazioni diverse in base ai valori di input
o che eseguono operazioni più volte senza eseguire operazioni di srotolamento. Questo è importante per
casi d'uso come RNN dinamico e seq2seq.
In NN HAL 1.3, il modello incorpora vari sottografi, incluso il sottografo principale, utilizzato per specificare gli input e gli output di un'esecuzione. Un
sottografo può fare riferimento ad altri sottografi utilizzando operandi di tipo SUBGRAPH
. Il framework può inviare un'operazione del flusso di controllo a un acceleratore solo se quest'ultimo supporta tutte le operazioni in tutti i grafici secondari a cui viene fatto riferimento.
Interfacce HAL
In NN HAL 1.3, le definizioni relative al flusso di controllo si trovano in
types.hal
.
- Tipi di operazioni
IF
eWHILE
- Tipo di operando
SUBGRAPH
e durata dell'operandoSUBGRAPH
corrispondente Model
che contiene il sottografo principale e un elenco di sottografi di riferimentoCapabilities
struttura che contieneifPerformance
ewhilePerformance
IDevice.hal
contiene IDevice
, il cui metodo getSupportedOperations_1_3()
deve trattare IF
e WHILE
in modo diverso dalle altre operazioni.
IPreparedModel.hal
contiene IPreparedModel
, i cui metodi execute_1_3()
,
executeSynchronously_1_3()
e executeFenced()
prendono un argomento
loopTimeoutDuration
facoltativo.
Implementazione del driver
Per un'implementazione di operazioni di esempio, consulta
CpuExecutor::executeIfOperation
e
CpuExecutor::executeWhileOperation
.
Per esempi di logica di convalida delle operazioni, consulta
validateIfOperation()
e
validateWhileOperation()
.
Tieni presente che è importante supportare operazioni aritmetiche e di confronto sugli
operandi TENSOR_INT32
della forma 1
, poiché possono essere utilizzati come contatori di loop.
Allo stesso modo, le operazioni che producono operandi TENSOR_BOOL8
con forma 1
devono essere utilizzate con le condizioni IF
e WHILE
.
Timeout esecuzione loop WHILE
Per evitare loop infiniti, l'esecuzione deve essere interrotta se un ciclo WHILE
richiede più tempo del valore loopTimeoutDuration
passato a una chiamata di IPreparedModel::execute_1_3()
, IPreparedModel::executeSynchronously_1_3()
o IPreparedModel::executeFenced()
(o del valore predefinito, se omesso).
Convalida
I test del flusso di controllo fanno parte delle suite di test CTS e VTS. Per maggiori informazioni, consulta la sezione Convalida.