Ab Android 11 enthält die NNAPI zwei Kontrollflussvorgänge: IF und WHILE. Diese verwenden andere Modelle als Argumente und führen sie bedingt (IF) oder wiederholt (WHILE) aus. So können Modelle erstellt werden, 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 enthält das Modell mehrere Untergraphen, darunter den Hauptuntergraphen, der zum Angeben von Ein- und Ausgaben einer Ausführung verwendet wird. Ein Untergraph kann mit Operanden vom Typ SUBGRAPH auf andere Untergraphen verweisen. Das Framework kann einen Kontrollflussvorgang nur dann an einen Beschleuniger senden, wenn der Beschleuniger alle Vorgänge in allen Untergraphen unterstützt, auf die dieser Kontrollflussvorgang verweist.
HAL-Schnittstellen
In NN HAL 1.3 befinden sich die Definitionen für den Kontrollfluss in
types.hal.
IFundWHILEVorgangstypenSUBGRAPHOperandentyp und die entsprechendeSUBGRAPHLebensdauer des OperandenModelStruktur, die den Haupt Untergraphen und eine Liste der referenzierten Untergraphen enthältCapabilitiesStruktur, dieifPerformanceundwhilePerformanceenthält
IDevice.hal
enthält IDevice, dessen Methode getSupportedOperations_1_3() IF
und WHILE anders als andere Vorgänge behandeln muss.
IPreparedModel.hal
enthält IPreparedModel, dessen Methoden execute_1_3(),
executeSynchronously_1_3() und executeFenced() ein optionales
loopTimeoutDuration Argument verwenden.
Treiberimplementierung
Eine Beispielimplementierung für einen Vorgang finden Sie unter
CpuExecutor::executeIfOperation
und
CpuExecutor::executeWhileOperation.
Beispiele für die Validierungslogik für Vorgänge finden Sie unter
validateIfOperation()
und
validateWhileOperation().
Es ist wichtig, arithmetische und Vergleichsvorgänge für 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 erzeugen, mit IF- und WHILE-Bedingungen verwendet werden.
Zeitlimit für die Ausführung von WHILE-Schleifen
Um Endlosschleifen zu vermeiden, 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() übergeben wurde (oder der Standardwert, falls er weggelassen wurde).
Validierung
Tests für den Kontrollfluss sind Teil der CTS- und VTS-Testsuites. Weitere Informationen finden Sie unter Validierung.