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
.
- Tipi di operazioni
IF
eWHILE
- Tipo di operando
SUBGRAPH
e durata dell'operandoSUBGRAPH
corrispondente - Struttura
Model
che contiene il sottografo principale e un elenco di sottografi a cui si fa riferimento - Struttura
Capabilities
che contieneifPerformance
ewhilePerformance
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 .