LiteRT-Bevollmächtigte

Bevollmächtigte ermöglichen die Hardwarebeschleunigung von LiteRT-Modellen durch Nutzung von On-Device-Beschleunigern wie GPU und digitalem Signalprozessor (DSP).

Standardmäßig nutzt LiteRT CPU-Kernel, die für den ARM Neon Befehlssatz. Die CPU ist jedoch ein Mehrzweckprozessor, die unbedingt für die hohe Arithmetik optimiert sind, die normalerweise in Lernmodelle (z. B. die Matrixberechnungen für Faltung und Dichte Ebenen).

Die meisten modernen Mobiltelefone verfügen jedoch über Chips, die eine bessere Leistung um diese aufwendigen Vorgänge zu bewältigen. Sie für neuronale Netzwerkoperationen nutzen bietet enorme Vorteile in puncto Latenz und Energieeffizienz. Beispiel: GPUs bieten eine bis zu 5-fach- beschleunigen an die Latenz.

Jeder dieser Beschleuniger ist mit APIs verknüpft, die benutzerdefinierte Berechnungen ermöglichen. wie OpenCL oder OpenGL ES für mobile GPU. In der Regel benötigen Sie viel benutzerdefinierten Code schreiben, um ein neuronales Netzwerk über diese Schnittstellen auszuführen. Noch komplizierter wird es, wenn man bedenkt, dass jeder Beschleuniger Vorteile und und nicht jede Operation in einem neuronalen Netzwerk ausführen. TensorFlow Die Delegate API von Lite löst dieses Problem, indem sie als Brücke zwischen TFLite fungiert. und diese untergeordneten APIs.

Laufzeit mit Bevollmächtigten

Bevollmächtigten auswählen

LiteRT unterstützt mehrere Bevollmächtigte, die jeweils für bestimmte Plattform(en) und bestimmte Modelltypen. In der Regel gibt es Mehrere Bevollmächtigte für Ihren Anwendungsfall, abhängig von zwei Hauptkriterien: die Platform (Android oder iOS?) für die Ausrichtung und den Model-type (Gleitkommazahl oder quantisiert?), die 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-basierten Modellen mit einer GPU verfügbar. Es unterstützt außerdem quantisierte 8-Bit-Modelle und bietet GPU einer Float-Version auf dem gleichen Niveau wie bisher. Weitere Informationen zur GPU delegieren, siehe LiteRT auf GPU.

iOS

  • Core ML Delegate für neuere iPhones und iPads – für neuere iPhones und iPads Auf iPads, auf denen Neural Engine verfügbar ist, können Sie Core ML Delegate verwenden, um Beschleunigen der Inferenz für 32-Bit- oder 16-Bit-Gleitkommamodelle. Neural Die Engine ist für Apple-Mobilgeräte mit A12-SoC oder höher verfügbar. Für eine eine Übersicht über den Core ML-Delegaten und eine detaillierte Anleitung finden Sie unter LiteRT Core ML-Delegate.

Delegierte nach Modelltyp

Jeder Beschleuniger ist mit einer bestimmten Bitbreite an Daten ausgelegt. Wenn Sie Ein Gleitkommamodell an einen Bevollmächtigten bereitstellen, der nur 8-Bit-quantisierte Daten unterstützt Vorgänge werden alle Vorgänge abgelehnt und das Modell wird die CPU. Um solche Überraschungen zu vermeiden, erhalten Sie in der folgenden Tabelle einen Überblick über Support auf Basis des Modelltyps delegieren:

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 die Ihre Anwendung verbessern könnten. Beachten Sie jedoch, Jeder Bevollmächtigte verfügt über einen vordefinierten Satz an Operationen, die er unterstützt, und kann je nach Modell und Gerät funktioniert. Daher ist es in der Regel wird empfohlen, ein Benchmarking durchzuführen, um einzuschätzen, wie nützlich ein Bevollmächtigter ist. an Ihre Anforderungen anzupassen. Dies trägt auch dazu bei, die mit einen Delegaten an die LiteRT-Laufzeit anhängen.

LiteRT verfügt über umfassende Tools zur Leistungs- und Genauigkeitsbewertung, können Entwickler in der Lage sein, Bevollmächtigte in ihrer Anwendung einzusetzen. Diese Tools werden im nächsten Abschnitt erläutert.

Bewertungstools

Latenz und Arbeitsspeicherbedarf

Das Benchmark-Tool von LiteRT kann für Geeignete Parameter zur Schätzung der Modellleistung, einschließlich der durchschnittlichen Inferenz Latenz, Initialisierungsaufwand, Speicherbedarf usw. Flags verwenden, um die beste Delegatkonfiguration für Ihr Modell zu ermitteln. Für Instanz --gpu_backend=gl kann zum Messen der GPU mit --use_gpu angegeben werden mit OpenGL ausgeführt werden. Die vollständige Liste der unterstützten Delegate-Parameter ist die in den detaillierten 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 eine vordefinierte Version dieses Tools für Android (64-Bit-ARM-Version) herunterladen Architektur hier (weitere Details).

Genauigkeit und Richtigkeit

Delegierte führen Berechnungen normalerweise mit einer anderen Genauigkeit durch als ihre CPU die entsprechenden Entsprechungen. Dies hat zur Folge, dass die Genauigkeit (meist geringfügig) Kompromisse bei der Genauigkeit einnimmt. die mit der Nutzung eines Delegierten zur Hardwarebeschleunigung verbunden sind. Beachten Sie, dass dies ist nicht immer wahr; Da die GPU zum Beispiel eine Gleitkommazahl, quantisierte Modelle ausführen, kann die Genauigkeit geringfügig verbessert werden (z.B. Verbesserung der ILSVRC-Bildklassifizierung um weniger als 1 %.

LiteRT bietet zwei Arten von Tools, mit denen Sie messen können, wie genau ein Bevollmächtigter für ein bestimmtes Modell verhält: Aufgabenbasiert und Aufgabenunabhängig. Alle Tools die in diesem Abschnitt beschriebenen Unterstützung für die erweiterte Delegierung Parameter vom Benchmarking-Tool aus dem vorherigen Abschnitt verwendet. Das Feld In den Unterabschnitten unten geht es um die Bewertung der Bevollmächtigung. Führt der Bevollmächtigte die wie die CPU?) statt der Modellbewertung (Ist das Modell selbst gut für die Aufgabe?)

Aufgabenbasierte Bewertung

LiteRT bietet Tools zur Bewertung der Richtigkeit von zwei bildbasierten Aufgaben:

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

Im folgenden Beispiel wird die Bildklassifizierung veranschaulicht: Bewertung mit GPU auf 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_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 LiteRT die Inferenzfunktion Unterschiede . (Android, 64-Bit-ARM-Binärarchitekturarchitektur) hier)

Inference Diff vergleicht die LiteRT-Ausführung (in Bezug auf Latenz und Ausgabewertabweichung) in zwei Einstellungen verwenden:

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

Dazu generiert das Tool zufällige Gauß'sche Daten und übergibt diese zwei TFLite-Interpreters – einer mit Single-Threaded-CPU-Kerneln und der andere parametrisiert durch die Argumente des Nutzers.

Sie misst die Latenz beider und die absolute Differenz zwischen Ausgabetensoren von jedem Interpreter auf Pro-Element-Basis.

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 für den Ausgabetensor an Index 0 die Elemente aus die CPU-Ausgabe um durchschnittlich 1.96e-05 von der Delegate-Ausgabe unterscheidet.

Beachten Sie, dass für die Interpretation dieser Zahlen tiefe Kenntnisse des Modells erforderlich sind. was jeder Ausgabetensor bedeutet. Wenn es sich um eine einfache Regression handelt, oder Einbettungen sein, sollte der Unterschied gering sein (andernfalls Fehler beim Bevollmächtigten). Ausgaben wie „detection class“ werden eine von SSD-Modelle sind etwas schwieriger zu interpretieren. Beispielsweise könnte eine den Unterschied zwischen der Nutzung dieses Tools, aber das ist nicht unbedingt ein Problem mit Delegat: Betrachte zwei (fiktive) Klassen: "TV (ID: 10)" und "Monitor (ID:20)". - Wenn Ein Bevollmächtigter ist etwas falsch und zeigt einen Monitor anstelle des Fernsehens, kann die Ausgabedifferenz für diesen Tensor 20-10 = 10 betragen.