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.

A flowchart shows a neural network model with tensor operations, tailored for Edge Solutions. Two red boxes highlight quantization values with q = 128 in the tensor information panel on the right, illustrating how Quantized YOLO processes data efficiently. Various layers and tensors are labeled throughout.

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

A neural network graph highlights a Mul node. On the right, the nodes’ detailed properties and quantization values are shown, with key quantization sections outlined in red for emphasis—demonstrating techniques commonly employed in Quantized YOLO models for efficient Edge Solutions.

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.