Controllo del flusso

Partendo da Android 11, il NNAPI comprende due operazioni del flusso di controllo, IF e WHILE , che prendono altri modelli come argomenti e li eseguono condizionale ( IF ) o più volte ( WHILE ). Ciò consente di costruire modelli che eseguono operazioni diverse in base ai valori di input o eseguono operazioni più volte senza srotolare. Questo è 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 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 sono in types.hal .

IDevice.hal contiene IDevice , il cui metodo getSupportedOperations_1_3() deve trattare IF e WHILE diversamente da altre operazioni.

IPreparedModel.hal contiene IPreparedModel , i cui metodi execute_1_3() , executeSynchronously_1_3() , e executeFenced() prendere un optional loopTimeoutDuration argomento.

Implementazione del driver

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

Si noti che è importante per supportare le operazioni aritmetiche e confronto su TENSOR_INT32 operandi di forma 1 , in quanto questi possono essere utilizzati come contatori di ciclo. Analogamente, le operazioni che producono TENSOR_BOOL8 operandi di forma 1 devono essere usati con IF e WHILE condizioni.

WHILE timeout di esecuzione del ciclo

Per evitare loop infinito, esecuzione deve essere interrotta se un WHILE ciclo richiede più loopTimeoutDuration valore 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, vedere Convalida .