Kontrollfluss

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.

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.