Sehen Sie sich Keynotes, Produktsitzungen, Workshops und mehr in Google I / O an. Siehe Wiedergabeliste

TensorFlow Lite NNAPI-Delegierter

Die Android Neural Networks API (NNAPI) ist auf allen Android-Geräten verfügbar, auf denen Android 8.1 (API-Stufe 27) oder höher ausgeführt wird. Es bietet Beschleunigung für TensorFlow Lite-Modelle auf Android-Geräten mit unterstützten Hardwarebeschleunigern, darunter:

  • Grafikverarbeitungseinheit (GPU)
  • Digitaler Signalprozessor (DSP)
  • Neuronale Verarbeitungseinheit (NPU)

Die Leistung hängt von der auf dem Gerät verfügbaren Hardware ab.

Diese Seite beschreibt die Verwendung des NNAPI-Delegaten mit dem TensorFlow Lite Interpreter in Java und Kotlin. Informationen zu Android C-APIs finden Sie in der Dokumentation zum Android Native Developer Kit .

Versuchen Sie den NNAPI-Delegaten auf Ihrem eigenen Modell

Gradle-Import

Der NNAPI-Delegat ist Teil des Android-Interpreters TensorFlow Lite, Version 1.14.0 oder höher. Sie können es in Ihr Projekt importieren, indem Sie Ihrer Modul-Gradle-Datei Folgendes hinzufügen:

dependencies {
   implementation 'org.tensorflow:tensorflow-lite:2.0.0'
}

Initialisieren des NNAPI-Delegaten

Fügen Sie den Code zum Initialisieren des NNAPI-Delegaten hinzu, bevor Sie den TensorFlow Lite-Interpreter initialisieren.

import org.tensorflow.lite.Interpreter;
import org.tensorflow.lite.nnapi.NnApiDelegate;

Interpreter.Options options = (new Interpreter.Options());
NnApiDelegate nnApiDelegate = null;
// Initialize interpreter with NNAPI delegate for Android Pie or above
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    nnApiDelegate = new NnApiDelegate();
    options.addDelegate(nnApiDelegate);
}

// Initialize TFLite interpreter
try {
    tfLite = new Interpreter(loadModelFile(assetManager, modelFilename), options);
} catch (Exception e) {
    throw new RuntimeException(e);
}

// Run inference
// ...

// Unload delegate
tfLite.close();
if(null != nnApiDelegate) {
    nnApiDelegate.close();
}

Empfohlene Vorgehensweise

Testen Sie die Leistung vor der Bereitstellung

Die Laufzeitleistung kann aufgrund der Modellarchitektur, der Größe, des Betriebs, der Hardwareverfügbarkeit und der Laufzeithardwareauslastung erheblich variieren. Wenn eine App beispielsweise die GPU stark zum Rendern verwendet, kann die NNAPI-Beschleunigung die Leistung aufgrund von Ressourcenkonflikten möglicherweise nicht verbessern. Wir empfehlen, einen einfachen Leistungstest mit dem Debug-Logger durchzuführen, um die Inferenzzeit zu messen. Führen Sie den Test auf mehreren Telefonen mit unterschiedlichen Chipsätzen (Hersteller oder Modelle desselben Herstellers) durch, die für Ihre Benutzerbasis repräsentativ sind, bevor Sie NNAPI in der Produktion aktivieren.

Für fortgeschrittene Entwickler bietet TensorFlow Lite auch ein Modell-Benchmark-Tool für Android .

Erstellen Sie eine Geräteausschlussliste

In der Produktion kann es Fälle geben, in denen NNAPI nicht wie erwartet funktioniert. Wir empfehlen Entwicklern, eine Liste von Geräten zu führen, die die NNAPI-Beschleunigung in Kombination mit bestimmten Modellen nicht verwenden sollten. Sie können diese Liste basierend auf dem Wert von "ro.board.platform" , den Sie mit dem folgenden "ro.board.platform" abrufen können:

String boardPlatform = "";

try {
    Process sysProcess =
        new ProcessBuilder("/system/bin/getprop", "ro.board.platform").
        redirectErrorStream(true).start();

    BufferedReader reader = new BufferedReader
        (new InputStreamReader(sysProcess.getInputStream()));
    String currentLine = null;

    while ((currentLine=reader.readLine()) != null){
        boardPlatform = line;
    }
    sysProcess.destroy();
} catch (IOException e) {}

Log.d("Board Platform", boardPlatform);

Für fortgeschrittene Entwickler sollten Sie diese Liste über ein Remote-Konfigurationssystem verwalten. Das TensorFlow-Team arbeitet aktiv an Möglichkeiten zur Vereinfachung und Automatisierung der Ermittlung und Anwendung der optimalen NNAPI-Konfiguration.

Quantisierung

Durch die Quantisierung wird die Modellgröße reduziert, indem 8-Bit-Ganzzahlen oder 16-Bit-Gleitkommazahlen anstelle von 32-Bit-Gleitkommazahlen für die Berechnung verwendet werden. 8-Bit-Integer-Modellgrößen sind ein Viertel der 32-Bit-Float-Versionen. 16-Bit-Floats sind halb so groß. Durch die Quantisierung kann die Leistung erheblich verbessert werden, obwohl der Prozess die Modellgenauigkeit beeinträchtigen kann.

Es stehen verschiedene Arten von Quantisierungstechniken nach dem Training zur Verfügung. Für maximale Unterstützung und Beschleunigung auf der aktuellen Hardware empfehlen wir jedoch die vollständige Ganzzahlquantisierung . Dieser Ansatz wandelt sowohl das Gewicht als auch die Operationen in ganze Zahlen um. Für diesen Quantisierungsprozess ist ein repräsentativer Datensatz erforderlich.

Verwenden Sie unterstützte Modelle und Operationen

Wenn der NNAPI-Delegat einige der Operationen oder Parameterkombinationen in einem Modell nicht unterstützt, führt das Framework nur die unterstützten Teile des Diagramms auf dem Beschleuniger aus. Der Rest läuft auf der CPU, was zu einer geteilten Ausführung führt. Aufgrund der hohen Kosten für die Synchronisation von CPU und Beschleuniger kann dies zu einer langsameren Leistung führen als die Ausführung des gesamten Netzwerks auf der CPU allein.

NNAPI bietet die beste Leistung, wenn Modelle nur unterstützte Operationen verwenden . Die folgenden Modelle sind bekanntermaßen mit NNAPI kompatibel:

Die NNAPI-Beschleunigung wird auch nicht unterstützt, wenn das Modell dynamisch dimensionierte Ausgaben enthält. In diesem Fall erhalten Sie eine Warnung wie:

ERROR: Attempting to use a delegate that only supports static-sized tensors \
with a graph that has dynamic-sized tensors.

Aktivieren Sie die NNAPI-CPU-Implementierung

Ein Diagramm, das von einem Beschleuniger nicht vollständig verarbeitet werden kann, kann auf die NNAPI-CPU-Implementierung zurückgreifen. Da dies jedoch in der Regel weniger leistungsfähig ist als der TensorFlow-Interpreter, ist diese Option im NNAPI-Delegaten für Android 10 (API-Ebene 29) oder höher standardmäßig deaktiviert. Um dieses Verhalten zu überschreiben, setzen Sie setUseNnapiCpu im NnApiDelegate.Options Objekt auf true .