Flusso di controllo

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.

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.