Flusso di controllo

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.

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.