Ab Android 11 enthält die NNAPI zwei Kontrollflussvorgänge, IF
und WHILE
, die andere Modelle als Argumente annehmen und diese bedingt (IF
) oder wiederholt (WHILE
) ausführen. So lassen sich Modelle erstellen, die je nach Eingabewerten unterschiedliche Vorgänge ausführen oder Vorgänge mehrmals ausführen, ohne sie zu entrollen. Das ist wichtig für Anwendungsfälle wie dynamische RNNs und seq2seq.
In NN HAL 1.3 umfasst das Modell mehrere Teildiagramme, einschließlich des Hauptuntergraphen, der zum Festlegen von Ein- und Ausgaben einer Ausführung verwendet wird. Ein untergeordneter Graph kann mithilfe von Operanden vom Typ SUBGRAPH
auf andere untergeordnete Graphen verweisen. Das Framework kann nur dann einen Vorgang zur Ablaufsteuerung an einen Beschleuniger senden, wenn der Beschleuniger alle Vorgänge in allen Teilgraphen unterstützt, auf die dieser Vorgang zur Steuerung des Ablaufs verweist.
HAL-Schnittstellen
In NN HAL 1.3 finden Sie die Definitionen zum Kontrollfluss unter types.hal
.
IF
- undWHILE
-VorgangstypenSUBGRAPH
Operandentyp und die entsprechendeSUBGRAPH
OperandenlebensdauerModel
-Struktur, die den HauptSubgraphen und eine Liste der referenzierten Subgraphen enthältCapabilities
-Struktur, dieifPerformance
undwhilePerformance
enthält
IDevice.hal
enthält IDevice
, deren Methode getSupportedOperations_1_3()
IF
und WHILE
anders behandeln muss als andere Vorgänge.
IPreparedModel.hal
enthält IPreparedModel
, dessen Methoden execute_1_3()
, executeSynchronously_1_3()
und executeFenced()
ein optionales loopTimeoutDuration
-Argument annehmen.
Treiberimplementierung
Ein Beispiel für die Implementierung eines Vorgangs finden Sie unter CpuExecutor::executeIfOperation
und CpuExecutor::executeWhileOperation
.
Beispiele für die Logik zur Validierung von Vorgängen finden Sie unter validateIfOperation()
und validateWhileOperation()
.
Es ist wichtig, arithmetische und Vergleichsoperationen auf TENSOR_INT32
-Operanden der Form 1
zu unterstützen, da diese als Schleifenzähler verwendet werden können.
Ebenso sollten Vorgänge, die TENSOR_BOOL8
-Operanden der Form 1
liefern, mit IF
- und WHILE
-Bedingungen verwendet werden.
Zeitlimit für WHILE-Schleifenausführung
Um endlose Schleifen zu vermeiden, muss die Ausführung abgebrochen werden, wenn eine WHILE
-Schleife länger dauert als der loopTimeoutDuration
-Wert, der an einen Aufruf von IPreparedModel::execute_1_3()
, IPreparedModel::executeSynchronously_1_3()
oder IPreparedModel::executeFenced()
übergeben wird (oder der Standardwert, falls er weggelassen wird).
Zertifizierungsstufe
Tests der Programmabfolge sind Teil der CTS- und VTS-Testsuites. Weitere Informationen finden Sie unter Validierung.