1 Punkte von GN⁺ 2024-10-17 | 2 Kommentare | Auf WhatsApp teilen

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

 
bungker 2024-10-18

Ich dachte, dass die Ryzen-NPU etwas schneller als die CPU ist, aber dadurch ist meine Begeisterung für Snapdragon komplett verflogen.

 
GN⁺ 2024-10-17
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 NPU wird genutzt, um AI-Berechnungen von der CPU auszulagern, und ist Teil des SoC.
    • Wenn man den Stromverbrauch von CPU, NPU und GPU in einer Endlosschleife misst, ist zu erwarten, dass die NPU am wenigsten verbraucht.
    • Da die NPU viel Siliziumfläche einnimmt, ist es schade, wenn sie nicht sinnvoll genutzt wird.
  • Die Apple Neural Engine ist deutlich schneller als CPU oder GPU.

    • Je nach Modellarchitektur, Konvertierung und Tuning fällt die Leistung unterschiedlich aus.
    • Xcode bietet Werkzeuge, um die Ausführungszeit von Modellen zu messen.
    • ML-Frameworks/Laufzeiten implementieren möglicherweise nicht alle Operatoren.
  • Der Zweck der NPU ist es, kleine Modelle mit niedrigem Stromverbrauch auszuführen.

    • Die NPU ist für optimierte Modelle gedacht und erledigt kleine Aufgaben.
    • Unter Windows kann sie Dinge wie Vollbild-OCR ausführen.
  • Um ein Modell auf einer NPU bereitzustellen, ist profilbasiertes Optimieren erforderlich.

    • Ein Modell, das auf der CPU gut funktioniert, kann auf der NPU enttäuschende Ergebnisse liefern.
  • Die Erklärung auf GitHub ist aufschlussreicher als der Blog.

    • Beim Ausführen von int8 matmul liegt die onnx-Leistung bei etwa 0,6 TF.
  • Qualcomm erlaubt keinen direkten Zugriff auf die NPU.

    • Konvertierungstools könnten Optimierungen übersehen.
    • Die NPU eignet sich für kleine ML-Modelle und schnelle Funktionsapproximation.
  • Es könnte möglich sein, das Qualcomm SNPE SDK zu verwenden.

    • Es stellt sich die Frage, ob das Hexagon SDK ordentlich funktioniert.
  • Dieser Beitrag bezieht sich auf eine bestimmte NPU, einen bestimmten Benchmark sowie bestimmte Bibliotheken und Frameworks.

    • Daher ist es schwierig, allgemeine Schlussfolgerungen zu ziehen.