A partire da Android 11, la NNAPI include due
operazioni di flusso di controllo, IF e WHILE, che prendono altri modelli come argomenti
e li eseguono in modo condizionale (IF) o ripetutamente (WHILE). Ciò consente di
costruire modelli che eseguono operazioni diverse in base ai valori di input
o eseguire operazioni più volte senza srotolamento. Questo è importante per
casi d'uso come RNN dinamiche e seq2seq.
In NN HAL 1.3, il modello incorpora più 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 di flusso di controllo a un acceleratore solo se l'acceleratore supporta tutte le operazioni in tutti i sottografi a cui fa riferimento l'operazione di flusso di controllo.
Interfacce HAL
In NN HAL 1.3, le definizioni relative al flusso di controllo si trovano in
types.hal.
IFeWHILEtipi di operazioniSUBGRAPHtipo di operando e la relativaSUBGRAPHdurata dell'operandoModelstruttura che contiene il sottografo principale e un elenco di sottografi a cui viene fatto riferimentoCapabilitiesstruttura che contieneifPerformanceewhilePerformance
IDevice.hal
contiene IDevice, il cui metodo getSupportedOperations_1_3() deve trattare IF
e WHILE in modo diverso rispetto ad altre operazioni.
IPreparedModel.hal
contiene IPreparedModel, i cui metodi execute_1_3(),
executeSynchronously_1_3() e executeFenced() accettano un argomento
loopTimeoutDuration facoltativo.
Implementazione del driver
Per un'implementazione di esempio di un'operazione, vedi
CpuExecutor::executeIfOperation
e
CpuExecutor::executeWhileOperation.
Per la logica di convalida delle operazioni di esempio, consulta
validateIfOperation()
e
validateWhileOperation().
Tieni presente che è importante supportare le operazioni aritmetiche e di confronto sugli operandi TENSOR_INT32 di forma 1, in quanto possono essere utilizzati come contatori di loop.
Allo stesso modo, le operazioni che producono operandi TENSOR_BOOL8 di forma 1 devono essere
utilizzate con le condizioni IF e WHILE.
Timeout di esecuzione del ciclo WHILE
Per evitare loop infiniti, l'esecuzione deve essere interrotta se un loop WHILE richiede
più tempo del valore loopTimeoutDuration passato a una chiamata di
IPreparedModel::execute_1_3(), IPreparedModel::executeSynchronously_1_3()
o IPreparedModel::executeFenced() (o il valore predefinito se omesso).
Convalida
I test del flusso di controllo fanno parte delle suite di test CTS e VTS. Per ulteriori informazioni, consulta la sezione Convalida.