Benchmarking der Qualcomm-NPU
Einführung
- Microsoft bietet Surface-Tablets mit Windows an, das auf Qualcomm-Arm-basierten SoCs läuft.
- Diese Tablets werden als AI-PCs vermarktet und sollen Machine-Learning-Modelle schneller und effizienter als andere Systeme ausführen können.
- Aufgrund des großen Interesses an Qualcomms Hardware, insbesondere der NPU, wurde viel Zeit und Ressourcen investiert, um Drittanbieter-Apps auf diese Plattform zu portieren.
- Da es jedoch kaum Codebeispiele oder Benchmarks von externen Entwicklern gibt, um schnell Ergebnisse zu erzielen, wurde ein eigenständiges Projekt aufgebaut, um die Leistung zu demonstrieren.
- Die Leistung fiel geringer aus als erwartet, daher wird der Benchmark veröffentlicht, um Ideen zur Verringerung der Latenz zu erhalten.
Installation
Python
- Zum Ausführen der Testskripte wird Python verwendet.
- Das Python aus dem Microsoft Store unterstützt die Arm-Architektur nicht, daher wird der offizielle Installer von Python.org empfohlen.
- Für die berichteten Ergebnisse wurde Python 3.11.9 verwendet.
Cmake
- Zum Kompilieren von Onnx wird das Build-Tool cmake benötigt.
- In Powershell den Befehl
winget install cmake ausführen.
Visual Studio
- Für den Compiler wird Visual Studio benötigt.
- Beim Herunterladen und Installieren der Visual Studio Community Edition die Workload
Desktop C++ Development auswählen.
Pip-Pakete
- Die benötigten Python-Pakete können mit dem Befehl
py -m pip install -r requirements.txt installiert werden.
- Verwendet wird Onnx Version 1.16, die mit Qualcomm Onnx Runtime kompatibel ist.
Benchmark
Ausführung
- Benchmark ausführen:
py benchmark_matmul.py
Ausgabe verstehen
- Die Onnx-Runtime erzeugt anfangs viel Log-Spam.
- Die Benchmark-Ergebnisse bestätigen, dass die numerischen Resultate von CPU und NPU übereinstimmen.
- Die CPU erreicht 821 Gigaops, der erste NPU-Ansatz 225 Gigaops und der zweite 573 Gigaops.
Benchmark-Messung
- Der Benchmark führt 6 große Matrixmultiplikationen aus, ähnlich der zeitaufwendigsten Schicht in Transformer-Modellen wie OpenAIs Whisper.
- Die NPU führt vor allem quantisierte Modelle effektiv aus, und Modelle mit 8-Bit-Eingaben und -Ausgaben sind schneller.
Faktoren, die Verwirrung stiften können
Rechenlimitierung
- Moderne Transformer-Modelle basieren auf großen Matrixmultiplikationen und können speicherlimitiert sein.
- Die Eingabematrizen werden quadratischer gemacht, damit Tiling und Wiederverwendung möglich sind.
Energieeinstellungen
- Die Energieeinstellung in Windows auf "Beste Leistung" setzen und das Tablet für den Benchmark an das Stromnetz anschließen.
Modelltopologie
- Es wird ein Graph erzeugt, der moderne AI-Modelle widerspiegelt, aber zur einfacheren Interpretation vereinfacht ist.
Konfigurationsfehler
- Die Art, wie das Modell gebaut und ausgeführt wird, könnte die schnellen Pfade der Treiber- oder Beschleunigerimplementierung verfehlen.
Onnx-Framework
- Es gibt mehrere Möglichkeiten, unter Windows auf AI-Beschleunigung zuzugreifen, und Onnx scheint das am besten geeignete Framework zu sein.
Interpretation der Ergebnisse
- Auf einem Snapdragon X 12-core X1E80100 sind die NPU-Ergebnisse langsamer als die der CPU.
- Die Leistung erreicht nur 1,3 % der in Marketingmaterialien versprochenen 45 Billionen Ops/s.
- Auf einer Nvidia Geforce RTX 4080 Laptop GPU läuft es in 3,2 ms und erreicht 2.160 Gigaops.
Zusammenfassung von GN⁺
- Die Leistung der Qualcomm-NPU bleibt hinter den Erwartungen zurück und ist in den Ergebnissen langsamer als die CPU.
- Es besteht Hoffnung auf mögliche Softwareänderungen zur Optimierung der NPU-Leistung.
- Das Onnx-Framework scheint die beste Wahl zu sein, um Beschleunigungsleistung auf der Qualcomm-NPU zu erzielen.
- Im Vergleich zu Nvidia-GPUs fällt die Leistung der Qualcomm-NPU deutlich ab.
2 Kommentare
Ich dachte, dass die Ryzen-NPU etwas schneller als die CPU ist, aber dadurch ist meine Begeisterung für Snapdragon komplett verflogen.
Hacker-News-Kommentar
Der Leistungsunterschied zwischen CPU und GPU ist gering. Möglicherweise liegt das Problem bei
onnxruntime. Der Fokus der NPU liegt eher auf niedrigem Stromverbrauch als auf Geschwindigkeit.Die Apple Neural Engine ist deutlich schneller als CPU oder GPU.
Der Zweck der NPU ist es, kleine Modelle mit niedrigem Stromverbrauch auszuführen.
Um ein Modell auf einer NPU bereitzustellen, ist profilbasiertes Optimieren erforderlich.
Die Erklärung auf GitHub ist aufschlussreicher als der Blog.
int8 matmulliegt dieonnx-Leistung bei etwa 0,6 TF.Qualcomm erlaubt keinen direkten Zugriff auf die NPU.
Es könnte möglich sein, das Qualcomm SNPE SDK zu verwenden.
Dieser Beitrag bezieht sich auf eine bestimmte NPU, einen bestimmten Benchmark sowie bestimmte Bibliotheken und Frameworks.