Flusso di controllo

A partire da Android 11, la NNAPI include due operazioni del flusso di controllo, IF e WHILE , che accettano 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 eseguono operazioni più volte senza srotolarsi. Ciò è importante per casi d'uso come RNN dinamico e seq2seq.

In NN HAL 1.3, il modello incorpora più sottografi, incluso il sottografo principale utilizzato per specificare input e 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 l'acceleratore supporta tutte le operazioni in tutti i sottografi a cui fa riferimento tale operazione del flusso di controllo.

Interfacce HAL

In NN HAL 1.3, le definizioni relative al flusso di controllo sono 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() ed executeFenced() accettano un argomento loopTimeoutDuration opzionale.

Implementazione del driver

Per un'implementazione dell'operazione di esempio, vedere CpuExecutor::executeIfOperation e CpuExecutor::executeWhileOperation . Per la logica di convalida dell'operazione di esempio, vedere validateIfOperation() e validateWhileOperation() .

Tieni presente che è importante supportare le operazioni aritmetiche e di confronto sugli operandi TENSOR_INT32 di forma 1 , poiché questi possono essere utilizzati come contatori di loop. Allo stesso modo, le operazioni che producono operandi TENSOR_BOOL8 di forma 1 dovrebbero essere utilizzate con le condizioni IF e WHILE .

Timeout di esecuzione del ciclo WHILE

Per evitare cicli infiniti, l'esecuzione deve essere interrotta se un ciclo WHILE impiega 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).

Validazione

I test del flusso di controllo fanno parte delle suite di test CTS e VTS. Per ulteriori informazioni, vedere Convalida .