TensorFlow Lite-Delegierte

Delegierungen ermöglichen die Hardwarebeschleunigung von TensorFlow Lite-Modellen durch die Nutzung von On-Device-Beschleunigern wie der GPU und dem digitalen Signalprozessor (DSP).

TensorFlow Lite verwendet standardmäßig CPU-Kernel, die für den ARM Neon-Befehlssatz optimiert sind. Die CPU ist jedoch ein Mehrzweckprozessor, der nicht unbedingt für die hohe Arithmetik von Modellen für maschinelles Lernen optimiert ist (z. B. die Matrixberechnung für die Faltung und dichte Schichten).

Andererseits enthalten die meisten modernen Smartphones Chips, die diese anspruchsvollen Vorgänge besser bewältigen. Ihre Verwendung für neuronale Netzwerkvorgänge bietet große Vorteile in Bezug auf Latenz und Energieeffizienz. GPUs können beispielsweise eine bis zu fünffache Beschleunigung der Latenz bieten.

Jedem dieser Beschleuniger sind APIs zugeordnet, die benutzerdefinierte Berechnungen ermöglichen, z. B. OpenCL oder OpenGL ES für mobile GPUs. Normalerweise müssten Sie viel benutzerdefinierten Code schreiben, um ein neuronales Netzwerk über diese Schnittstellen auszuführen. Es wird noch komplizierter, wenn man bedenkt, dass jeder Beschleuniger seine Vor- und Nachteile hat und nicht jeden Vorgang 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 Bevollmächtigten

Bevollmächtigten auswählen

TensorFlow Lite unterstützt mehrere Bevollmächtigte, die jeweils für bestimmte Plattformen und bestimmte Modelltypen optimiert sind. Normalerweise gibt es für Ihren Anwendungsfall mehrere Bevollmächtigte, abhängig von zwei Hauptkriterien: der als Ziel verwendeten Plattform (Android oder iOS?) und dem Modelltyp (Gleitkommazahl oder quantisiert?), den Sie beschleunigen möchten.

Delegierte nach Plattform

Plattformübergreifend (Android und iOS)

  • GPU Delegate: Der GPU Delegate kann sowohl unter Android als auch unter iOS verwendet werden. Es ist für die Ausführung von 32-Bit- und 16-Bit-Float-Modellen mit verfügbarer GPU optimiert. Außerdem unterstützt es 8-Bit-quantisierte Modelle und bietet GPU-Leistung auf dem Niveau ihrer Float-Versionen. Weitere Informationen zum GPU-Delegierung finden Sie unter TensorFlow Lite auf GPU.

iOS

  • Core ML-Delegate für neuere iPhones und iPads: Auf neueren iPhones und iPads, auf denen Neural Engine verfügbar ist, können Sie Core ML Delegate 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 verfügbar. Eine Übersicht über den Core ML-Delegaten und eine detaillierte Anleitung finden Sie unter TensorFlow Lite Core ML-Delegate.

Delegierte nach Modelltyp

Jeder Beschleuniger ist mit einer bestimmten Bitbreite an Daten ausgelegt. Wenn Sie einem Bevollmächtigten, der nur 8-Bit-quantisierte Vorgänge unterstützt, ein Gleitkommamodell bereitstellen, werden alle zugehörigen Vorgänge abgelehnt und das Modell wird vollständig auf der CPU ausgeführt. Um solche Überraschungen zu vermeiden, finden Sie in der folgenden Tabelle einen Überblick über die Bevollmächtigung für die Unterstützung je nach Modelltyp:

Modelltyp GPU CoreML
Gleitkommazahl (32-Bit) Ja Ja
Gleitkommazahl 16-Quantisierung nach Training Ja Ja
Dynamische Bereichsquantisierung nach dem Training Ja Nein
Ganzzahlquantisierung nach dem Training Ja Nein
Quantisierungsorientiertes Training Ja Nein

Leistung überprüfen

Die Informationen in diesem Abschnitt dienen als grobe Richtlinie für die Auswahl der Bevollmächtigten, die Ihre Anwendung verbessern könnten. Dabei ist zu beachten, dass jeder Bevollmächtigte einen vordefinierten Satz von Vorgängen unterstützt, die er unterstützt, und dass die Leistung je nach Modell und Gerät unterschiedlich sein kann. Daher empfiehlt es sich in der Regel, ein Benchmarking durchzuführen, um abzuschätzen, wie nützlich ein Bevollmächtigter für Ihre Anforderungen ist. Dies trägt auch dazu bei, die Binärgröße zu rechtfertigen, die mit dem Anhängen eines Delegats an die TensorFlow Lite-Laufzeit verbunden ist.

TensorFlow Lite bietet umfassende Tools zur Leistungs- und Genauigkeitsbewertung, mit denen Entwickler auf die Verwendung von Bevollmächtigten in ihrer Anwendung vertrauen können. Diese Tools werden im nächsten Abschnitt erläutert.

Bewertungstools

Latenz und Arbeitsspeicherbedarf

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 Arbeitsspeicherbedarfs usw. Dieses Tool unterstützt mehrere Flags, um die beste Delegationskonfiguration für Ihr Modell zu ermitteln. Beispielsweise kann --gpu_backend=gl mit --use_gpu angegeben werden, um die GPU-Ausführung mit OpenGL zu messen. Die vollständige Liste der unterstützten Delegatparameter finden Sie in der ausführlichen Dokumentation.

Hier ist eine Beispielausführung 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 vordefinierte Version dieses Tools für die 64-Bit-ARM-Architektur von Android hier herunterladen (weitere Informationen).

Genauigkeit und Richtigkeit

Delegierte führen Berechnungen normalerweise mit einer anderen Genauigkeit durch als ihre CPU-Gegenstücke. Dies hat zur Folge, dass mit der Verwendung eines Delegierten für die Hardwarebeschleunigung ein (in der Regel geringfügiger) Kompromiss bei der Genauigkeit verbunden ist. Beachten Sie, dass dies nicht immer wahr ist. Da die GPU beispielsweise Gleitkommagenauigkeit zum Ausführen quantisierter Modelle verwendet, kann die Genauigkeit geringfügig verbessert werden (z. B. Verbesserung der ILSVRC-Bildklassifizierung um weniger als 1 %.

TensorFlow Lite bietet zwei Arten von Tools, um zu messen, wie genau sich ein Bevollmächtigter für ein bestimmtes Modell verhält: aufgabenbasiert und aufgabenunabhängig. Alle in diesem Abschnitt beschriebenen Tools unterstützen die erweiterten Delegationsparameter, die vom Benchmarking-Tool aus dem vorherigen Abschnitt verwendet werden. In den folgenden Unterabschnitten geht es um die Bewertung der Delegierung (Leistung des Bevollmächtigten wie die CPU?) und nicht auf die Modellbewertung (Ist das Modell selbst für die Aufgabe geeignet?).

Aufgabenbasierte Bewertung

TensorFlow Lite bietet Tools, um die Richtigkeit von zwei bildbasierten Aufgaben zu bewerten:

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

Im folgenden Beispiel wird die Auswertung der Bildklassifizierung mit GPU auf einem Pixel 4 veranschaulicht:

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_gpu=true

Die erwartete Ausgabe ist eine Liste der Top-K-Messwerte 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, für die es kein etabliertes Bewertungstool auf dem Gerät gibt, oder wenn Sie mit benutzerdefinierten Modellen experimentieren, bietet TensorFlow Lite das Inferenz-Diff-Tool. (Android, 64-Bit-ARM-Binärarchitekturarchitektur hier)

Die Inferenzdifferenz vergleicht die TensorFlow Lite-Ausführung (in Bezug auf Latenz und Ausgabewertabweichung) in zwei Einstellungen:

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

Dazu generiert das Tool zufällige Gauß'sche Daten und übergibt sie über zwei TFLite-Interpreter: einer mit Single-Threaded-CPU-Kerneln und der andere mit den Argumenten des Nutzers parametrisiert.

Sie misst die Latenz beider Elemente sowie die absolute Differenz zwischen den Ausgabetensoren jedes Interpreters pro Element.

Bei einem Modell mit einem einzelnen Ausgabetensor könnte die Ausgabe so 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

Das bedeutet, dass sich für den Ausgabetensor an Index 0 die Elemente aus der CPU-Ausgabe um einen Durchschnitt von 1.96e-05 von der Delegierungsausgabe unterscheiden.

Beachten Sie, dass für die Interpretation dieser Zahlen tiefere Kenntnisse über das Modell und die Bedeutung der einzelnen Ausgabetensoren erforderlich sind. Wenn es sich um eine einfache Regression handelt, die eine Art von Wert oder Einbettung bestimmt, sollte der Unterschied gering sein (andernfalls tritt ein Fehler beim Bevollmächtigten auf). Ausgaben wie die Erkennungsklasse von SSD-Modellen sind jedoch etwas schwieriger zu interpretieren. Zum Beispiel kann es einen Unterschied bei der Verwendung dieses Tools geben, aber das bedeutet nicht unbedingt, dass etwas wirklich kein Problem mit dem Delegaten besteht: Betrachten Sie zwei (Fake-)Klassen: „TV (ID: 10)“ und „Monitor (ID:20)“. Wenn ein Delegate etwas nicht mit der goldenen Wahrheit übereinstimmt und Monitor anstelle von TV anzeigt, kann der Ausgabeunterschied für diesen Tensor so hoch = 10-1 sein.