Ab Android 11 umfasst die NNAPI zwei Kontrollflussoperationen, IF
und WHILE
, die andere Modelle als Argumente verwenden und diese bedingt ( IF
) oder wiederholt ( WHILE
) ausführen. Dies ermöglicht die Konstruktion von Modellen, die basierend auf den Eingabewerten unterschiedliche Operationen ausführen oder Operationen mehrmals ausführen, ohne sie abzuwickeln. Dies ist wichtig für Anwendungsfälle wie dynamisches RNN und seq2seq.
In NN HAL 1.3 umfasst das Modell mehrere Untergraphen, einschließlich des Hauptuntergraphen, der zum Spezifizieren von Eingaben und Ausgaben einer Ausführung verwendet wird. Ein Untergraph kann mithilfe von Operanden vom Typ SUBGRAPH
auf andere Untergraphen verweisen. Das Framework kann eine Kontrollflussoperation nur dann an einen Beschleuniger senden, wenn der Beschleuniger alle Operationen in allen Untergraphen unterstützt, auf die diese Kontrollflussoperation verweist.
HAL-Schnittstellen
In NN HAL 1.3 befinden sich die Definitionen im Zusammenhang mit dem Kontrollfluss in types.hal
.
-
IF
undWHILE
Operationstypen -
SUBGRAPH
Operandentyp und die entsprechendeSUBGRAPH
Operandenlebensdauer -
Model
, die den Hauptuntergraphen und eine Liste der referenzierten Untergraphen enthält -
Capabilities
Struktur, dieifPerformance
undwhilePerformance
enthält
IDevice.hal
enthält IDevice
, dessen Methode getSupportedOperations_1_3()
IF
und WHILE
anders behandeln muss als andere Operationen.
IPreparedModel.hal
enthält IPreparedModel
, dessen Methoden execute_1_3()
, executeSynchronously_1_3()
und executeFenced()
ein optionales Argument „ loopTimeoutDuration
annehmen.
Treiberimplementierung
Eine Beispieloperationsimplementierung finden Sie unter CpuExecutor::executeIfOperation
und CpuExecutor::executeWhileOperation
. Eine Beispiellogik für die Operationsvalidierung finden Sie unter validateIfOperation()
und validateWhileOperation()
.
Beachten Sie, dass es wichtig ist, Rechen- und Vergleichsoperationen für TENSOR_INT32
Operanden der Form 1
zu unterstützen, da diese als Schleifenzähler verwendet werden können. Ebenso sollten Operationen, TENSOR_BOOL8
Operanden der Form 1
erzeugen, mit IF
und WHILE
-Bedingungen verwendet werden.
Zeitüberschreitung bei der Ausführung der WHILE-Schleife
Um Endlosschleifen zu verhindern, muss die Ausführung abgebrochen werden, wenn eine WHILE
Schleife länger dauert als der Wert loopTimeoutDuration
, der an einen Aufruf von IPreparedModel::execute_1_3()
, IPreparedModel::executeSynchronously_1_3()
oder IPreparedModel::executeFenced()
(oder den Standardwert) übergeben wird falls weggelassen).
Validierung
Kontrollflusstests sind Teil der CTS- und VTS-Testsuiten. Weitere Informationen finden Sie unter Validierung .