1 points par GN⁺ 2024-10-17 | 2 commentaires | Partager sur WhatsApp

Benchmark du NPU Qualcomm

Introduction

  • Microsoft propose des tablettes Surface équipées de Windows fonctionnant sur des SoC Qualcomm basés sur Arm.
  • Ces tablettes sont présentées comme des AI PC et sont censées exécuter des modèles de machine learning plus rapidement et plus efficacement que d'autres systèmes.
  • L'auteur s'intéresse beaucoup au matériel de Qualcomm, en particulier au NPU, et a investi beaucoup de temps et de ressources pour porter des applications tierces sur cette plateforme.
  • Cependant, il existe très peu d'exemples de code ou de benchmarks permettant aux développeurs externes d'obtenir rapidement des résultats, d'où la mise en place d'un projet indépendant pour démontrer les performances.
  • Les performances se sont révélées inférieures aux attentes, et ce benchmark est publié afin de trouver des idées pour réduire la latence.

Installation

Python

  • Python est utilisé pour exécuter les scripts de test.
  • La version Python du Microsoft Store ne prend pas en charge l'architecture Arm ; il est donc recommandé d'utiliser l'installateur officiel de Python.org.
  • Les résultats rapportés ont été obtenus avec Python 3.11.9.

Cmake

  • L'outil de build cmake est nécessaire pour compiler Onnx.
  • Exécuter la commande winget install cmake dans Powershell.

Visual Studio

  • Visual Studio est nécessaire pour le compilateur.
  • Lors du téléchargement et de l'installation de Visual Studio Community Edition, sélectionner la charge de travail Desktop C++ Development.

Paquets Pip

  • Les paquets Python nécessaires peuvent être installés avec la commande py -m pip install -r requirements.txt.
  • La version 1.16 d'Onnx est utilisée pour être compatible avec Qualcomm Onnx Runtime.

Benchmark

Exécution

  • Lancer le benchmark : py benchmark_matmul.py

Comprendre la sortie

  • Le runtime Onnx génère d'abord beaucoup de logs.
  • Les résultats du benchmark confirment que les résultats numériques du CPU et du NPU correspondent.
  • Le CPU atteint 821 Gigaops, la première approche NPU 225 Gigaops, et la seconde 573 Gigaops.

Mesure du benchmark

  • Le benchmark exécute 6 grandes multiplications de matrices, similaires aux couches les plus coûteuses en temps dans les modèles de transformeurs tels que Whisper d'OpenAI.
  • Le NPU exécute principalement efficacement des modèles quantifiés, et les modèles utilisant des entrées et sorties sur 8 bits sont plus rapides.

Facteurs pouvant prêter à confusion

Limites de calcul
  • Les modèles de transformeurs modernes reposent sur de grandes multiplications de matrices, qui peuvent être limitées par la mémoire.
  • Les matrices d'entrée sont rendues plus carrées afin de permettre le tuilage et la réutilisation.
Réglages d'alimentation
  • Régler les paramètres d'énergie de Windows sur "Performances optimales" et brancher la tablette sur secteur pour exécuter le benchmark.
Topologie du modèle
  • Le graphe est généré de manière à refléter les modèles d'IA modernes, tout en étant simplifié pour faciliter l'interprétation.
Erreurs de configuration
  • La façon dont le modèle est construit et exécuté peut faire sortir le pilote ou l'implémentation de l'accélérateur des chemins rapides.
Framework Onnx
  • Il existe plusieurs moyens d'accéder à l'accélération IA sur Windows, et Onnx semble être le framework le plus adapté.

Interprétation des résultats

  • Sur un Snapdragon X 12-core X1E80100, le résultat du NPU est plus lent que celui du CPU.
  • Les performances ne représentent que 1,3 % des 45 billions d'ops/s promis dans les supports marketing.
  • Sur un GPU Nvidia Geforce RTX 4080 Laptop, l'exécution prend 3,2 ms, soit 2 160 Gigaops.

Résumé de GN⁺

  • Les performances du NPU de Qualcomm sont en deçà des attentes et donnent des résultats plus lents que le CPU.
  • Il existe un espoir d'améliorations logicielles pour optimiser les performances du NPU.
  • Le framework Onnx semble être le meilleur choix pour obtenir des performances d'accélération sur le NPU de Qualcomm.
  • Comparé au GPU Nvidia, le NPU Qualcomm affiche des performances nettement inférieures.

2 commentaires

 
bungker 2024-10-18

Je pensais que le NPU des Ryzen était un peu plus rapide que le CPU, mais ça m’a complètement coupé l’envie du Snapdragon.

 
GN⁺ 2024-10-17
Avis Hacker News
  • L’écart de performances entre le CPU et le GPU est faible. Il est possible que le problème vienne d’onnxruntime. Le NPU met davantage l’accent sur la faible consommation électrique que sur la vitesse

    • Le NPU sert à déporter les calculs d’IA hors du CPU et s’utilise comme une partie du SoC
    • Si l’on mesure la consommation du CPU, du NPU et du GPU dans une boucle infinie, on peut s’attendre à ce que le NPU soit le plus sobre
    • Le NPU occupe une grande surface de silicium, donc c’est dommage s’il n’est pas correctement exploité
  • L’Apple Neural Engine est bien plus rapide que le CPU ou le GPU

    • Les performances varient selon l’architecture du modèle, la conversion et le tuning
    • XCode fournit des outils pour mesurer le temps d’exécution des modèles
    • Les frameworks/runtimes ML n’implémentent pas forcément tous les opérateurs
  • Le but du NPU est d’exécuter de petits modèles avec une faible consommation

    • Le NPU est conçu pour des modèles optimisés et prend en charge de petites tâches
    • Sous Windows, il peut servir à exécuter de l’OCR en plein écran, par exemple
  • Déployer un modèle sur un NPU nécessite une optimisation fondée sur le profilage

    • Même un modèle qui fonctionne bien sur CPU peut donner des résultats décevants sur NPU
  • L’explication sur GitHub est plus utile que le billet de blog

    • Lors de l’exécution de int8 matmul, les performances d’onnx atteignent environ 0,6 TF
  • Qualcomm n’autorise pas l’accès direct au NPU

    • Les outils de conversion peuvent passer à côté de certaines optimisations
    • Le NPU convient aux petits modèles de ML et aux approximations rapides de fonctions
  • Il pourrait être possible d’utiliser le SDK Qualcomm SNPE

    • On peut se demander si le SDK Hexagon fonctionne correctement
  • Cet article porte sur un NPU précis, un benchmark précis, ainsi qu’une bibliothèque, un framework précis

    • Il est donc difficile d’en tirer des conclusions générales