Flusso di controllo

A partire da Android 11, 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 ripetuto (WHILE). Ciò consente di costruire modelli che eseguono operazioni diverse in base ai valori di input o eseguono operazioni più volte senza annullamento. Questo è importante per i casi d'uso come le 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.

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() accettano un argomento facoltativo loopTimeoutDuration.

Implementazione del driver

Per un'implementazione di esempio dell'operazione, consulta 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 su operandi TENSOR_INT32 di forma 1, in quanto possono essere utilizzati come contatori di loop. Analogamente, le operazioni che producono operandi TENSOR_BOOL8 di forma 1 devono essere impiegate con le condizioni IF e WHILE.

Timeout di esecuzione del loop WHILE

Per evitare cicli 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 di flusso di controllo fanno parte delle suite di test CTS e VTS. Per ulteriori informazioni, consulta la sezione Convalida.