TensorFlow Lite-Delegierte

Einführung

Delegierte ermöglichen die Hardwarebeschleunigung von TensorFlow Lite-Modellen, indem sie Gerätebeschleuniger wie die GPU und den digitalen Signalprozessor (DSP) nutzen .

Standardmäßig verwendet TensorFlow Lite CPU-Kernel, die für den ARM Neon- Befehlssatz optimiert sind. Die CPU ist jedoch ein Mehrzweckprozessor, der nicht unbedingt für die schwere Arithmetik optimiert ist, die normalerweise in Modellen für maschinelles Lernen zu finden ist (z. B. die Matrixmathematik für Faltung und dichte Schichten).

Andererseits enthalten die meisten modernen Mobiltelefone Chips, die diese schweren Operationen besser bewältigen können. Die Verwendung für den Betrieb neuronaler Netze bietet enorme Vorteile in Bezug auf Latenz und Energieeffizienz. Beispielsweise können GPUs die Latenz um das 5-fache beschleunigen , während der Qualcomm® Hexagon DSP in unseren Experimenten gezeigt hat, dass er den Stromverbrauch um bis zu 75% senkt.

Jedem dieser Beschleuniger sind APIs zugeordnet, die benutzerdefinierte Berechnungen ermöglichen, z. B. OpenCL oder OpenGL ES für mobile GPUs und das Qualcomm® Hexagon SDK für DSP. Normalerweise müssen Sie viel benutzerdefinierten Code schreiben, um ein neuronales Netzwerk über diese Schnittstellen auszuführen. Noch komplizierter wird es, wenn man bedenkt, dass jeder Beschleuniger seine Vor- und Nachteile hat und nicht jede Operation in einem neuronalen Netzwerk ausführen kann. Die Delegate-API von TensorFlow Lite löst dieses Problem, indem sie als Brücke zwischen der TFLite-Laufzeit und diesen untergeordneten APIs fungiert.

Laufzeit mit Delegierten

Delegierten auswählen

TensorFlow Lite unterstützt mehrere Delegaten, von denen jeder für bestimmte Plattformen und bestimmte Modelltypen optimiert ist. Normalerweise gibt es mehrere Delegaten für Ihren Anwendungsfall, abhängig von zwei Hauptkriterien: der Plattform (Android oder iOS?), Auf die Sie abzielen, und dem Modelltyp (Gleitkomma oder quantisiert?), Den Sie beschleunigen möchten .

Delegierte nach Plattform

Plattformübergreifend (Android & iOS)

  • GPU-Delegat - Der GPU-Delegat kann sowohl auf Android als auch auf iOS verwendet werden. Es ist für die Ausführung von 32-Bit- und 16-Bit-Float-basierten Modellen optimiert, für die eine GPU verfügbar ist. Es unterstützt auch quantisierte 8-Bit-Modelle und bietet eine GPU-Leistung, die mit der Float-Version vergleichbar ist. Ausführliche Informationen zum GPU-Delegaten finden Sie unter TensorFlow Lite auf der GPU . Schritt-für-Schritt-Anleitungen zur Verwendung des GPU-Delegaten mit Android und iOS finden Sie im TensorFlow Lite GPU-Delegierten-Lernprogramm .

Android

  • NNAPI-Delegat für neuere Android-Geräte - Mit dem NNAPI-Delegat können Modelle auf Android-Geräten mit verfügbarer GPU, DSP und / oder NPU beschleunigt werden. Es ist in Android 8.1 (API 27+) oder höher verfügbar. Eine Übersicht über den NNAPI-Delegaten, schrittweise Anweisungen und bewährte Methoden finden Sie unter TensorFlow Lite NNAPI-Delegat .
  • Hexagon-Delegat für ältere Android-Geräte - Mit dem Hexagon-Delegat können Modelle auf Android-Geräten mit Qualcomm Hexagon DSP beschleunigt werden. Es kann auf Geräten verwendet werden, auf denen ältere Android-Versionen ausgeführt werden, die NNAPI nicht unterstützen. Weitere Informationen finden Sie unter TensorFlow Lite Hexagon-Delegat .

iOS

  • Core ML-Delegat für neuere iPhones und iPads - Bei neueren iPhones und iPads, für die Neural Engine verfügbar ist, können Sie den Core ML-Delegat verwenden, um die Inferenz für 32-Bit- oder 16-Bit-Gleitkommamodelle zu beschleunigen. Neural Engine ist für Apple-Mobilgeräte mit A12 SoC oder höher erhältlich. Eine Übersicht über den Core ML-Delegaten und schrittweise Anweisungen finden Sie unter TensorFlow Lite Core ML-Delegat .

Delegierte nach Modelltyp

Jeder Beschleuniger ist für eine bestimmte Bitbreite von Daten ausgelegt. Wenn Sie einem Delegaten ein Gleitkommamodell bereitstellen, das nur quantisierte 8-Bit-Operationen unterstützt (z. B. den Hexagon-Delegaten ), werden alle seine Operationen abgelehnt und das Modell wird vollständig auf der CPU ausgeführt. Um solche Überraschungen zu vermeiden, bietet die folgende Tabelle einen Überblick über die Delegiertenunterstützung basierend auf dem Modelltyp:

Modelltyp GPU NNAPI Hexagon CoreML
Gleitkomma (32 Bit) Ja Ja Nein Ja
Float16-Quantisierung nach dem Training Ja Nein Nein Ja
Quantisierung des Dynamikbereichs nach dem Training Ja Ja Nein Nein
Ganzzahlquantisierung nach dem Training Ja Ja Ja Nein
Quantisierungsbewusstes Training Ja Ja Ja Nein

Leistung validieren

Die Informationen in diesem Abschnitt dienen als grobe Richtlinie für die Auswahl der Delegierten, die Ihre Anwendung verbessern könnten. Es ist jedoch wichtig zu beachten, dass jeder Delegat über einen vordefinierten Satz von Vorgängen verfügt, die er unterstützt, und je nach Modell und Gerät unterschiedliche Leistungen erbringen kann. Beispielsweise kann der NNAPI-Delegierte die Edge-TPU von Google auf einem Pixel-Telefon verwenden, während ein DSP auf einem anderen Gerät verwendet wird. Daher wird normalerweise empfohlen, ein Benchmarking durchzuführen, um festzustellen, wie nützlich ein Delegierter für Ihre Anforderungen ist. Dies hilft auch, die Erhöhung der Binärgröße zu rechtfertigen, die mit dem Anhängen eines Delegaten an die TensorFlow Lite-Laufzeit verbunden ist.

TensorFlow Lite verfügt über umfangreiche Tools zur Leistungs- und Genauigkeitsbewertung, mit denen Entwickler sicher sein können, Delegierte in ihrer Anwendung zu verwenden. Diese Tools werden im nächsten Abschnitt erläutert.

Tools zur Bewertung

Latenz & Speicherbedarf

Das Benchmark-Tool von TensorFlow Lite kann mit geeigneten Parametern verwendet werden, um die Modellleistung zu schätzen, einschließlich der durchschnittlichen Inferenzlatenz, des Initialisierungsaufwands, des Speicherbedarfs usw. Dieses Tool unterstützt mehrere Flags, um die beste Delegatenkonfiguration für Ihr Modell zu ermitteln. Zum Beispiel kann --gpu_backend=gl mit --use_gpu angegeben --use_gpu , um die GPU-Ausführung mit OpenGL zu messen. Die vollständige Liste der unterstützten Delegatenparameter ist in der ausführlichen Dokumentation definiert .

Hier ist ein Beispiel für ein quantisiertes Modell mit GPU über adb :

adb shell /data/local/tmp/benchmark_model \
  --graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
  --use_gpu=true

Sie können die vorgefertigte Version dieses Tools für die 64-Bit-ARM-Architektur für Android hier herunterladen ( weitere Details ).

Genauigkeit und Korrektheit

Delegierte führen Berechnungen normalerweise mit einer anderen Genauigkeit durch als ihre CPU-Kollegen. Infolgedessen gibt es einen (normalerweise geringfügigen) Kompromiss bei der Genauigkeit, der mit der Verwendung eines Delegaten für die Hardwarebeschleunigung verbunden ist. Beachten Sie, dass dies nicht immer der Fall ist. Da die GPU beispielsweise Gleitkommapräzision verwendet, um quantisierte Modelle auszuführen, kann es zu einer leichten Verbesserung der Präzision kommen (z. B. <1% Top-5-Verbesserung der ILSVRC-Bildklassifizierung).

TensorFlow Lite verfügt über zwei Arten von Werkzeugen, mit denen gemessen werden kann, wie genau sich ein Delegat für ein bestimmtes Modell verhält: aufgabenbasiert und aufgabenunabhängig . Alle in diesem Abschnitt beschriebenen Tools unterstützen die erweiterten Delegierungsparameter, die vom Benchmarking-Tool aus dem vorherigen Abschnitt verwendet wurden. Beachten Sie, dass sich die folgenden Unterabschnitte eher auf die Delegatenbewertung (führt der Delegat die gleiche Leistung wie die CPU durch?) Als auf die Modellbewertung (Ist das Modell selbst für die Aufgabe geeignet?) Konzentrieren.

Aufgabenbasierte Bewertung

TensorFlow Lite verfügt über Tools zur Bewertung der Korrektheit bei zwei bildbasierten Aufgaben:

Vorgefertigte Binärdateien dieser Tools (Android, 64-Bit-ARM-Architektur) sowie Dokumentation finden Sie hier:

Das folgende Beispiel zeigt die Bewertung der Bildklassifizierung mit NNAPI unter Verwendung von Googles Edge-TPU auf einem Pixel 4:

adb shell /data/local/tmp/run_eval \
  --model_file=/data/local/tmp/mobilenet_quant_v1_224.tflite \
  --ground_truth_images_path=/data/local/tmp/ilsvrc_images \
  --ground_truth_labels=/data/local/tmp/ilsvrc_validation_labels.txt \
  --model_output_labels=/data/local/tmp/model_output_labels.txt \
  --output_file_path=/data/local/tmp/accuracy_output.txt \
  --num_images=0 # Run on all images. \
  --use_nnapi=true \
  --nnapi_accelerator_name=google-edgetpu

Die erwartete Ausgabe ist eine Liste von Top-K-Metriken von 1 bis 10:

Top-1 Accuracy: 0.733333
Top-2 Accuracy: 0.826667
Top-3 Accuracy: 0.856667
Top-4 Accuracy: 0.87
Top-5 Accuracy: 0.89
Top-6 Accuracy: 0.903333
Top-7 Accuracy: 0.906667
Top-8 Accuracy: 0.913333
Top-9 Accuracy: 0.92
Top-10 Accuracy: 0.923333

Aufgabenunabhängige Bewertung

Für Aufgaben, bei denen es kein etabliertes Tool zur Geräteauswertung gibt oder wenn Sie mit benutzerdefinierten Modellen experimentieren, verfügt TensorFlow Lite über das Inference Diff- Tool. (Android, 64-Bit-ARM-Binärarchitektur binär hier )

Inference Diff vergleicht die Ausführung von TensorFlow Lite (in Bezug auf Latenz und Abweichung des Ausgabewerts) in zwei Einstellungen:

  • Single-Threaded-CPU-Inferenz
  • Benutzerdefinierte Inferenz - definiert durch diese Parameter

Zu diesem Zweck generiert das Tool zufällige Gaußsche Daten und leitet sie durch zwei TFLite-Interpreter - einen mit Single-Threaded-CPU-Kerneln und einen mit den Argumenten des Benutzers parametrisierten.

Es misst die Latenz beider sowie die absolute Differenz zwischen den Ausgangstensoren von jedem Interpreter auf Elementbasis.

Bei einem Modell mit einem einzelnen Ausgangstensor könnte die Ausgabe folgendermaßen aussehen:

Num evaluation runs: 50
Reference run latency: avg=84364.2(us), std_dev=12525(us)
Test run latency: avg=7281.64(us), std_dev=2089(us)
OutputDiff[0]: avg_error=1.96277e-05, std_dev=6.95767e-06

Dies bedeutet, dass sich für den Ausgangstensor am Index 0 die Elemente aus der CPU-Ausgabe von der Delegatenausgabe um durchschnittlich 1.96e-05 .

Beachten Sie, dass die Interpretation dieser Zahlen eine tiefere Kenntnis des Modells und der Bedeutung jedes Ausgangstensors erfordert. Wenn es sich um eine einfache Regression handelt, die eine Art von Punktzahl oder Einbettung bestimmt, sollte der Unterschied gering sein (andernfalls handelt es sich um einen Fehler beim Delegierten). Ausgaben wie die Erkennungsklasse von SSD-Modellen sind jedoch etwas schwieriger zu interpretieren. Zum Beispiel könnte es mit diesem Tool einen Unterschied zeigen, aber das bedeutet möglicherweise nicht, dass mit dem Delegierten etwas wirklich nicht stimmt: Betrachten Sie zwei (gefälschte) Klassen: "TV (ID: 10)", "Monitor (ID: 20)" - If Ein Delegierter ist ein wenig von der goldenen Wahrheit entfernt und zeigt Monitor anstelle von TV. Der Ausgangsunterschied für diesen Tensor kann zwischen 20 und 10 = 10 liegen.