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.
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:
ILSVRC 2012 (Bild Klassifizierung) mit top-K Genauigkeit
COCO-Objekterkennung (mit Begrenzungsrahmen) mit durchschnittlicher durchschnittlicher Genauigkeit (mAP)
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.