Quantisiertes YOLO für Edge-Lösungen

Im vorherigen Artikel haben wir besprochen, wie wir die Taubenerkennung auf einem Edge-Gerät eingerichtet haben. Wir haben die Existenz eines quantisierten Modells, das deployt werden kann, als selbstverständlich angenommen. Das ist keine triviale Methode – lassen uns in diesem Artikel näher besprechen, wie deploybare Modelle erreicht werden können. Falls ihr den vorherigen Artikel nicht gelesen habt, lest ihn bitte hier: Pigeons On the Edge.
Quantisierung
Quantisierung ist der Prozess der Verringerung der Berechnungspräzision eines Modells auf einen niedrigeren Datentyp, z. B. von FP32 (Fließkomma) auf INT8. Die Wahl des bevorzugten Datentyps bei der Quantisierung ist stark von der Hardware abhängig. In diesem Artikel konzentrieren wir uns hauptsächlich auf INT8 aus folgenden Gründen:
- Coral AI Edge TPU unterstützt nur INT8-Operationen
- NXP iMX8 Plus ist in INT8-Präzision effizienter und verbraucht weniger Strom
- Neuere Intel-CPUs verfügen über dedizierte INT8-Coprozessoren und Befehlssätze, z. B. Intel® Advanced Matrix Extensions, die 2048 INT8-Operationen pro Zyklus durchführen können
Was erwarten wir von einem quantisierten Modell auf dedizierter Hardware?
- Effiziente Ausführung sowohl in Bezug auf Leistung als auch Stromverbrauch
- Verringerte Modellgröße:
- Coral AI Edge TPU hat nur 8 MB Cache
- Neuere Large Language Models werden sogar auf INT4 quantisiert, um in Consumer-GPU-Hardware zu passen
- Verringerte Modellgenauigkeit aufgrund niedrigerer Berechnungspräzision
Wie quantisiert man ein Modell?
Post-Training-Quantisierung, bei der ein bereits trainiertes Modell quantisiert wird. Jedes Edge-Gerät hat normalerweise seinen eigenen Quantisierer für das Deployment von Modellen.
Quantization Aware Training, bei dem während des Trainings nicht nur die Modellgenauigkeit, sondern auch die Quantisierungsfaktoren optimiert werden, was die Komplexität des Trainings und des Deployments erhöht.
Wie funktioniert Quantisierung?
- Skalierte Integer, bei denen reelle Zahlen als Integer multipliziert mit einem Faktor und verschoben um einen Bias dargestellt werden
- Lookup-Tabelle (LUT), bei der komplexe Funktionen wie Sigmoid und Softmax vorberechnet und ihre Ausgaben gespeichert werden können
- Wenn diese Methoden angewendet werden, ist ein repräsentativer Datensatz erforderlich
- Es gibt weitere Techniken, aber das sind die gebräuchlichsten
YOLO deployen
Nachdem wir nun einen besseren Überblick über die Quantisierung haben, versuchen wir, das YOLO-Modell zu quantisieren. Um fortzufahren, benötigen wir ein grundlegendes Verständnis des YOLO-Modells:
- Backbone, das ein Convolutional Neural Network ist und eine Feature-Pyramide ausgibt
- Head #1, bei dem die letzten 3 Ebenen der Pyramide hochskaliert und gefaltet werden
- Head #2, bei dem die Detection-Schicht ausgeführt wird
- Head #3, bei dem die Scores und Bounding-Box-Koordinaten berechnet werden
Head #3 von YOLO korrigieren
Bei der Anwendung von INT8-Quantisierung auf das YOLO7-Modell waren die Ausgabewerte fehlerhaft. Bei der Analyse des Codes wurde festgestellt, dass Pixelkoordinaten und Klassen-Score-Werte nicht im gleichen Bereich liegen, weshalb die Quantisierung zusammenbricht. Nach der Anwendung einer Normalisierung der Koordinatenwerte durch die Bildgröße war eine vernünftigere Ausgabe sichtbar, aber einige Werte waren immer noch falsch. Modelle mit großen Eingabebildgrößen litten immer noch unter dem Quantisierungszusammenbruch. Nach der Analyse der Modell-Quantisierungsparameter (Faktor, Bias) wurde festgestellt, dass eine große numerische Instabilität vorhanden ist. Dies wurde durch die Verwendung normalisierter Skalierungsfaktoren anstelle der Normalisierung der Ausgabewerte durch die Bildgröße weiter verbessert. Die Vorberechnung der Skalierungsfaktoren ist möglich, weil wir statische Modelle quantisieren, was bedeutet, dass die Eingabegröße immer gleich sein muss und sich während der Inferenz nicht ändern kann.
Im nächsten Schritt wurde YOLO8 getestet, bei dem dieselbe numerische Instabilität sichtbar war. Auch hier die Verwendung normalisierter Skalierungsfaktoren anstelle der Normalisierung durch die Bildgröße zu ändern, behob einen Bug und verbesserte die Modellpräzision um weitere 4 % im Vergleich zu den zuvor gemeldeten Werten.

Auf dem ersten Bild können wir beobachten, dass die Normalisierung durch die Bildgröße zu einem Faktorunterschied von 10^5 führt.

Auf dem zweiten Bild sehen wir, dass die Verwendung normalisierter Skalierungsfaktoren für die Bounding-Box-Berechnung unseren Quantisierungsfaktorunterschied auf nur 10^2 reduziert.
Modell
mAP50-95
Hinweis
yolov8n FP32
37,3
Nicht quantisiert
yolov8n INT8 Main
8,1
Bug im Repo
yolov8n INT8 Claimed
28,7
Angegebene Ergebnisse
yolov8n INT8 Fixed
32,9
Korrigierte Ergebnisse
Sollte die Quantisierung überhaupt auf Head #3 angewendet werden?
Tests haben gezeigt, dass wenn die letzten mathematischen Operationen von der Quantisierung ausgeschlossen werden, die Präzision des Modells zunimmt, während die Verarbeitungszeit kaum steigt. Auf einem Gerät mit ausschließlich INT8-Operationen würde das bedeuten, dass die letzten Schritte auf der CPU ausgeführt werden müssen, sofern FP32-Befehle verfügbar sind. Das würde auch bedeuten, dass eine Normalisierung nicht notwendig ist und die vorherige Diskussion irrelevant wäre. Das Abtrennen des Heads ist derzeit für TFLite-Quantisierung (TPU, NXP) recht umständlich zu implementieren und kann nur mit unsauberen Tricks erreicht werden.
Für Intel-CPUs ist das ein anderes Szenario, da Operationen auf die CPU zurückfallen können, um in FP32-Präzision ausgeführt zu werden. Der OpenVINO-Quantisierer unterstützt solche Änderungen, indem explizit definiert wird, welche Operationen von der Quantisierung ausgeschlossen werden sollen. Dank dieser Freiheit ist eine Normalisierung nicht notwendig, da der Quantisierer Operationen implizit ausschließt, wenn die Quantisierung zusammenbricht. Nach sorgfältigem Testen, um den gesamten Head #3 auszuschließen, wurde die Präzision des Modells um 1,4 % verbessert, während die durchschnittliche Inferenzgeschwindigkeit auf einer Intel-CPU der 9. Generation nur um 0,3 % gestiegen ist.
Modell
mAP50-95
Inferenz
Hinweis
yolov8n FP32
37,3
PyTorch
Nicht quantisiert
yolov8n INT8
32,9
TFLite (TPU, NXP)
Korrigierte Ergebnisse
yolov8n INT8 + FP32
35,2
TFLite (TPU, NXP)
Abgetrennter Head #3
yolov8n INT8
35,7
OpenVINO (Intel)
Main-Branch
yolov8n INT8 + FP32
37,1
OpenVINO (Intel)
Verbesserte Ergebnisse
HINWEIS: OpenVINO wendet Per-Channel-Quantisierung an, während TFLite zwischen Per-Tensor oder Per-Channel umgeschaltet werden kann. Per-Tensor hat einen Faktor und Bias, während Per-Channel für jeden Kanal einen Faktor und Bias hat.
Modell
mAP50-95
Inferenz
Hinweis
yolov8n INT8
32,9
TFLite (TPU, NXP)
Per-Tensor
yolov8n INT8
33,9
TFLite (TPU, NXP)
Per-Channel
yolov8n INT8 + FP32
35,2
TFLite (TPU, NXP)
Per-Tensor
yolov8n INT8 + FP32
36,3
TFLite (TPU, NXP)
Per-Channel
Aktivierungsfunktionen auf Edge-Geräten
Da einige der ausgewählten Geräte eingeschränkte Befehlssätze haben, werden für deployte Modelle verschiedene Aktivierungsfunktionen benötigt.
LeakyReLU
- YOLOv7-Tiny wird mit LeakyReLU trainiert
- Coral AI Edge TPU unterstützt LeakyReLU nicht
- Die NXP-Ausgabe ist bei Verwendung von LeakyReLU fehlerhaft.
- Intel funktioniert mit LeakyReLU
SiLU
- YOLOv8n wird mit SiLU trainiert
- Coral AI Edge TPU stürzt bei Verwendung von SiLU ab
- Intel funktioniert mit SiLU
ReLU6
- ReLU6 erreicht nach dem Training sowohl für YOLO7 als auch für YOLO8 einen niedrigeren mAP.
- ReLU6 hat einen geringeren Genauigkeitsverlust nach der Quantisierung
- ReLU6 funktioniert sowohl auf Coral Edge TPU als auch auf NXP
Modell
mAP50-95 SiLU
mAP50-95 ReLU6
yolov8n F32
37,4
34,0
yolov8n INT8
33,9
31,4
yolov8n INT8 + FP32
36,3
33,9
Abschließende Gedanken
Quantisierung ist eine hardwareabhängige Aufgabe. Um die besten Ergebnisse zu erzielen, sollte man sowohl das KI-Modell als auch die Hardware verstehen, auf der es deployt werden soll. Die in diesem Artikel bezüglich TFLite und OpenVINO für YOLO8 erwähnten Änderungen wurden in das Haupt-Repository gemergt.
Agent Hub
Gehen Sie über vereinzelte AI-Piloten hinaus und schaffen Sie eine sichere, skalierbare Grundlage für Agentic AI in Ihrer gesamten Organisation.
Zur Demo




