Export AMD Xilinx pour Ultralytics YOLO avec Vitis AI#
L’export des modèles Ultralytics YOLO26 avec format="xilinx" les quantifie avec AMD Quark pour le NPU des SoC adaptatifs AMD Versal AI Edge Series Gen 2, afin que le compilateur Vitis AI d’AMD puisse créer un modèle .rai. Le même export vérifie la précision INT8 sur n’importe quel hôte avant le déploiement.
L’export cible le workflow NPU Vitis AI activement maintenu pour les appareils Versal AI Edge Series Gen 2, comme le kit d’évaluation VEK385. Les DPU Zynq UltraScale+ et Kria, ainsi que le NPU Versal AI Edge de première génération (VEK280), utilisent d’autres workflows Vitis AI décrits dans Déployer sur d’autres cibles AMD Xilinx.
Les appareils AMD Xilinx équipent de nombreuses caméras industrielles, de nombreux systèmes de vision automobile, robots, drones et produits d’imagerie médicale dans le monde. Ils associent des processeurs Arm à une logique programmable et, sur les appareils les plus récents, à des AI Engines dédiés, si bien qu’une seule puce peut capturer une vidéo, la prétraiter, effectuer la détection d’objets et agir sur le résultat avec une latence d’inférence faible et prévisible.
Ce guide présente l’export AMD Xilinx, sa compilation et son exécution sur une carte Versal, les différentes familles d’appareils AMD Xilinx, leur fonctionnement avec l’IA et les opérateurs Ultralytics YOLO pris en charge par chaque accélérateur.
Qu'est-ce qu'AMD Xilinx ?#
Xilinx a inventé les réseaux logiques programmables (FPGA) dans les années 1980 et est devenu un fournisseur majeur de SoC adaptatifs et de FPGA. AMD a finalisé l'acquisition de Xilinx en février 2022, et les gammes de produits sont désormais commercialisées sous la marque AMD sous les noms AMD Zynq, AMD Kria, AMD Versal et AMD Vitis.
Les deux noms désignent les mêmes produits. AMD les commercialise sous l'appellation « SoC adaptatifs et FPGA », mais les ingénieurs parlent encore souvent de « Xilinx ». Les références des composants conservent le préfixe XC (par exemple xczu7ev), et l'ancien dépôt Vitis AI ainsi que les images Docker sont toujours hébergés sous le nom Xilinx sur GitHub et Docker Hub. Ce guide utilise « AMD Xilinx » pour que tu puisses le trouver sous l'un ou l'autre nom.
Termes et concepts clés#
Le déploiement sur AMD Xilinx utilise un vocabulaire qui lui est propre. Le tableau ci-dessous explique tous les termes employés dans ce guide.
| Terme | Signification |
|---|---|
| FPGA | Réseau logique programmable : puce dont la logique numérique est configurée après sa fabrication par le chargement d'une conception appelée bitstream. Elle peut mettre en œuvre du matériel personnalisé, comme des pipelines vidéo ou des accélérateurs de réseaux neuronaux. |
| Logique programmable (PL) | Le tissu FPGA intégré au SoC AMD Xilinx. Sur les appareils Zynq et Kria, l'accélérateur IA est intégré à la PL. |
| Système de traitement (PS) | Les cœurs CPU Arm câblés, les contrôleurs mémoire et les périphériques du SoC. Il exécute Linux, ton application et les couches du modèle que l'accélérateur ne peut pas traiter. |
| SoC adaptatif / MPSoC | Un système sur puce qui associe un système de traitement à une logique programmable, ainsi que des moteurs IA sur de nombreux appareils Versal. MPSoC signifie « système multiprocesseur sur puce ». |
| Moteur IA (AIE, AIE-ML, AIE-MLv2) | Réseaux de processeurs vectoriels câblés présents sur de nombreux appareils Versal, dont la série Versal AI Edge abordée ici, conçus pour l'apprentissage automatique et le traitement du signal. |
| DPU | Unité de traitement de l'apprentissage profond : accélérateur de réseaux neuronaux INT8 d'AMD, fourni sous forme d'IP intégrée à la PL (par exemple DPUCZDX8G sur Zynq UltraScale+ et Kria). Les tailles allant de B512 à B4096 indiquent le nombre maximal d'opérations par cycle d'horloge. |
| NPU / IP NPU | Unité de traitement neuronal : accélérateur d'inférence de génération actuelle d'AMD, qui remplace la DPU dans les versions récentes de Vitis AI. AMD décrit son IP NPU comme un accélérateur logiciel associant des moteurs IA à une logique programmable, ce qui nécessite également une conception matérielle correspondante. Consulte l'entrée du glossaire sur les NPU. |
| Vitis AI | Chaîne d'outils d'AMD pour déployer des réseaux neuronaux sur les appareils AMD Xilinx. Elle comprend la quantification, la compilation, les environnements d'exécution, des exemples et des environnements Docker. |
| AMD Quark | Bibliothèque actuelle d'AMD pour la quantification de modèles, utilisée dans le workflow Versal AI Edge Gen 2 pour convertir un modèle ONNX FP32 en modèle INT8. |
| Quantification, PTQ et QAT | Conversion des poids et des activations FP32 en INT8. La quantification après entraînement (PTQ) utilise des images d'étalonnage. L'entraînement tenant compte de la quantification (QAT) affine le modèle pour retrouver en précision. |
| Images d'étalonnage | Petit ensemble d'images représentatives traitées par le modèle pendant la PTQ afin de déterminer l'échelle INT8 de chaque tenseur. |
| BF16 et précision mixte | BFloat16 est un format à virgule flottante de 16 bits qui conserve la plage de FP32. La précision mixte exécute la majeure partie du réseau en INT8 et les couches sensibles en BF16. |
| XIR | Représentation intermédiaire de Xilinx : format de graphe produit par le compilateur DPU et lu par l'environnement d'exécution. |
.xmodel | Un graphe XIR sérialisé. Le quantificateur écrit un .xmodel quantifié, puis le compilateur DPU le convertit en .xmodel compilé, contenant les instructions DPU, les poids quantifiés et les éventuels sous-graphes CPU. Le modèle compilé nécessite la configuration DPU correspondante. |
arch.json / empreinte DPU | Fichier décrivant une configuration DPU spécifique. Le compilateur DPU en a besoin, et un .xmodel compilé pour une empreinte donnée ne fonctionnera pas avec une autre. |
| Instantané | Répertoire du modèle compilé produit par le workflow NPU Versal AI Edge (VEK280). Il est associé à une seule variante d'IP NPU. |
.rai | Fichier du modèle compilé produit par le workflow NPU Versal AI Edge Gen 2. |
| VART / VART-ML | Bibliothèques Vitis AI Runtime qui chargent les modèles compilés et les exécutent sur la carte, avec des API C++ et Python. |
| ONNX Runtime Vitis AI EP | Le VitisAIExecutionProvider pour ONNX Runtime, qui compile et exécute les modèles ONNX sur les NPU AMD. |
| Repli sur le CPU / partitionnement du graphe | Lorsque l'accélérateur ne peut pas exécuter un opérateur, le compilateur divise généralement le modèle en sous-graphes destinés à l'accélérateur et au CPU. Chaque division ajoute un transfert de données qui peut dominer la latence. Certains opérateurs imposent plutôt l'exécution du modèle entier sur le CPU ou font échouer la compilation. |
Familles d'appareils AMD Xilinx pour l'IA en périphérie#
Les appareils AMD Xilinx destinés à l'IA en périphérie se répartissent en trois familles. Zynq et Kria utilisent la DPU dans la logique programmable, tandis que les appareils Versal AI Edge abordés ici utilisent le NPU sur leurs moteurs IA.
| Famille | Description | CPU applicatif | Accélérateur IA | Cartes en exemple |
|---|---|---|---|---|
| Zynq UltraScale+ MPSoC | Processeurs Arm et logique FPGA réunis sur une puce, avec des tailles allant de ZU1 à ZU19 | Arm Cortex-A53 double ou quadruple cœur | DPU intégrée à la logique programmable | ZCU104, ZCU102, cartes personnalisées |
| Module système Kria K26 | Module prêt pour la production, basé sur un Zynq UltraScale+ MPSoC | Arm Cortex-A53 à quatre cœurs | DPU intégrée à la logique programmable | Kit de démarrage Vision AI KV260, kit de démarrage robotique KR260 |
| Série Versal AI Edge | SoC adaptatifs ; les composants AIE-ML tels que VE2302 et VE2802 exécutent le NPU | Arm Cortex-A72 à deux cœurs | NPU sur les moteurs IA AIE-ML et la PL | VEK280 |
| Série Versal AI Edge Gen 2 | SoC adaptatif de nouvelle génération avec des moteurs IA AIE-MLv2 | Jusqu'à huit Arm Cortex-A78AE | NPU sur les moteurs IA AIE-MLv2 et la PL | VEK385 |
Zynq UltraScale+ MPSoC#
Chaque puce Zynq UltraScale+ associe une logique FPGA à un système de traitement Arm, doté de cœurs Cortex-A53 double cœur (CG) ou quadruple cœur (EG et EV) et de cœurs Cortex-R5F temps réel. Les appareils EV intègrent un codec vidéo H.264/H.265 câblé. Pour exécuter des réseaux neuronaux, les concepteurs intègrent une DPU à la logique, à côté de leurs pipelines caméra et vidéo. Sur les petits appareils, la DPU doit partager l'espace avec le reste de la conception.
Modules système Kria#
Le module Kria K26 regroupe un Zynq UltraScale+ MPSoC, de la mémoire et l'alimentation dans un module prêt pour la production. Tu n'as donc pas à concevoir toi-même le sous-système processeur, mémoire et alimentation. Le module se branche sur une carte porteuse, qu'il s'agisse d'une carte de kit de démarrage ou de ta propre conception. Il équipe le kit de démarrage Vision AI KV260 pour les caméras intelligentes et le kit de démarrage robotique KR260 pour la robotique. Comme le K26 repose sur Zynq UltraScale+, il utilise le même workflow DPU. La gamme Kria comprend également d'autres modules : vérifie donc le processeur utilisé par ton module avant de choisir un workflow.
SoC adaptatifs Versal#
Versal est la famille de SoC adaptatifs d'AMD. Les séries AI Edge et AI Core ajoutent des moteurs IA câblés aux côtés des cœurs Arm et de la logique programmable, tandis que certaines autres séries Versal ne comportent pas de moteurs IA. L'IP NPU d'AMD fonctionne conjointement sur les moteurs IA et la logique programmable, et Vitis AI cible les composants AIE-ML de la série AI Edge, tels que VE2302 et VE2802. La série Versal AI Edge (kit d'évaluation VEK280) et la série Versal AI Edge Gen 2 (kit d'évaluation VEK385) sont les cibles actuelles d'AMD pour l'IA en périphérie et le principal objectif des versions récentes de Vitis AI.
Fonctionnement de l'IA sur les appareils AMD Xilinx : DPU ou NPU#
La plupart des déploiements d'IA sur AMD Xilinx suivent le même principe. L'accélérateur exécute les couches qu'il prend en charge, le CPU Arm gère le prétraitement, le post-traitement et les couches que l'accélérateur ne peut pas exécuter, et un environnement d'exécution sur la carte coordonne les deux.
AMD a commercialisé deux générations d'accélérateurs, chacune avec sa propre chaîne d'outils et son propre fichier de modèle compilé. Ce guide s'appuie sur Vitis AI 3.5 pour la DPU et Vitis AI 6.3 pour le NPU ; consulte la documentation AMD actuelle pour les versions ultérieures.
| Workflow | Matériel | Chaîne d'outils | Quantificateur | Artefact compilé | Environnement d'exécution sur la carte | Statut |
|---|---|---|---|---|---|---|
| DPU | Zynq UltraScale+, Kria | Vitis AI 3.5 (Docker) | vai_q_pytorch | .xmodel | VART | Compilateur figé, zoo de modèles et IP DPU |
| NPU (Versal AI Edge) | VEK280 et autres composants Versal AI Edge | Vitis AI 6.3 (Docker) | Intégré au flux de capture d’instantané | Instantané | VART-ML | Actif |
| NPU (Versal AI Edge Gen 2) | VEK385 et autres composants Gen 2 | Vitis AI 6.3 (Docker) | AMD Quark | .rai | ONNX Runtime Vitis AI EP ou VART-ML | Actif |
Vitis AI 3.5 est la dernière version à proposer des mises à jour du compilateur DPU et du zoo de modèles. Les versions ultérieures du dépôt Xilinx/Vitis-AI conservent le compilateur, le zoo de modèles et l’IP DPU Zynq UltraScale+ inchangés, tout en mettant à jour le runtime et la compatibilité avec les versions plus récentes des outils AMD (voir les notes de version de Vitis AI 5.0). La documentation actuelle de Vitis AI d’AMD décrit la NPU comme le remplacement de l’architecture DPU obsolète. Les produits Zynq UltraScale+ et Kria existants peuvent continuer à être commercialisés avec la DPU, mais la prise en charge des opérateurs n’évoluera pas ; les architectures de modèles plus récentes nécessitent donc les adaptations décrites dans Compatibilité des modèles YOLO.
Les processeurs AMD Ryzen AI pour PC intègrent également une NPU, mais ils utilisent la pile distincte Ryzen AI Software plutôt que les flux Vitis AI embarqués présentés dans ce guide. Pour les GPU AMD Instinct et Radeon, consulte l’intégration des GPU AMD.
Quel flux Vitis AI me faut-il ?#
Choisis le flux en fonction du composant de ta carte :
Exporter vers AMD Xilinx : convertir ton modèle YOLO#
Tâches prises en charge#
L’export AMD Xilinx prend en charge les sept tâches Ultralytics. La segmentation sémantique et l’estimation de profondeur sont uniquement disponibles avec YOLO26, la seule famille qui propose ces têtes.
| Tâche | YOLOv8 | YOLO11 | YOLO26 |
|---|---|---|---|
| Détecter | ✅ | ✅ | ✅ |
| Segmenter | ✅ | ✅ | ✅ |
| Sémantique | ❌ | ❌ | ✅ |
| Profondeur | ❌ | ❌ | ✅ |
| Classifier | ✅ | ✅ | ✅ |
| Pose | ✅ | ✅ | ✅ |
| OBB | ✅ | ✅ | ✅ |
Installation#
L’export AMD Xilinx s’exécute sous Linux (x86-64 ou ARM64) avec Python 3.11 à 3.13, les versions prises en charge par AMD Quark. Le premier export compile également les opérateurs personnalisés de Quark, ce qui nécessite un compilateur C++, comme g++.
# Install the required package for YOLO
pip install ultralyticsAMD Quark est installé automatiquement depuis PyPI lors du premier export. Pour installer au préalable les dépendances d’export :
pip install "ultralytics[export-xilinx]"Pour installer le dépôt en mode éditable, remplace "ultralytics[export-xilinx]" par -e ".[export-base,export-xilinx]". Pour reproduire l’environnement Python 3.12 et l’export de vérification utilisés par CI, exécute le générateur d’environnement existant depuis la racine du dépôt :
ULTRALYTICS_ISOLATED_VENVS="$PWD/.venvs" python .github/scripts/create-export-env.py --env isolated-xilinxUtilisation#
Le format AMD Xilinx prend en charge les modes Export, Predict et Validate. Sans le Vitis AI Execution Provider d’AMD, Predict et Validate exécutent le modèle quantifié sur le CPU avec ONNX Runtime, ce qui permet de mesurer sa précision INT8 sur n’importe quel hôte. Lorsque ONNX Runtime fournit VitisAIExecutionProvider, comme sur une carte Versal AI Edge Series Gen 2, Ultralytics le sélectionne automatiquement.
from ultralytics import YOLO
# Charger un modèle YOLO26
model = YOLO("yolo26n.pt")
# Exporter au format AMD Xilinx pour le VEK385 (quantize=8 est appliqué automatiquement)
model.export(format="xilinx") # creates 'yolo26n_xilinx_model/'from ultralytics import YOLO
# Charger le modèle AMD Xilinx exporté
model = YOLO("yolo26n_xilinx_model")
# Exécuter l’inférence
results = model("https://ultralytics.com/images/bus.jpg")from ultralytics import YOLO
# Charger le modèle AMD Xilinx exporté
model = YOLO("yolo26n_xilinx_model")
# Valider la précision INT8 sur le jeu de données COCO8
metrics = model.val(data="coco8.yaml")Les noms de format vitis, vitisai et versal sont des alias de xilinx.
Arguments d’exportation#
| Argument | Type | Valeur par défaut | Description |
|---|---|---|---|
format | str | 'xilinx' | Format cible du modèle exporté, qui définit sa compatibilité avec les NPU AMD Versal AI Edge Series Gen 2. |
imgsz | int ou tuple | 640 | Taille d’image souhaitée pour l’entrée du modèle, sous forme d’un entier pour les images carrées ou d’un tuple (height, width). Le modèle exporté a une taille de lot fixe de 1. |
quantize | int ou str | 8/auto | Précision de quantification. 8 (Vitis AI INT8) est obligatoire et activé automatiquement si aucune valeur n’est spécifiée. |
data | str | None | Fichier YAML du jeu de données utilisé pour l’étalonnage INT8 ; pour la classification, il faut plutôt indiquer un répertoire de jeu de données ou un nom de jeu de données intégré. Si tu ne le précises pas, Ultralytics utilise le jeu de données d’étalonnage de la tâche, par exemple coco128.yaml pour la détection. |
fraction | float | 1.0 | Fraction du jeu de données d’étalonnage à utiliser. |
name | str | 've2-xc2ve3858' | Appareil du compilateur Vitis AI : 've2-xc2ve3858' (kit d’évaluation VEK385), 've2-xc2ve3804', 've2-xc2ve3558', 've2-xc2ve3504', 've2-xc2ve3358' ou 've2-xc2ve3304'. |
opset | int | None | Opset ONNX du graphe intermédiaire. La valeur par défaut est 17, l’opset qu’AMD valide pour YOLO sur Vitis AI. |
simplify | bool | True | Simplifie le graphe ONNX intermédiaire avec onnxslim. |
device | str | None | Spécifie le périphérique utilisé pour l’export : GPU (device=0) ou CPU (device=cpu). |
Définis nms=False pour exporter la tête sans NMS de YOLO26. La NMS intégrée (nms=True) n’est pas prise en charge, car AMD indique que NonMaxSuppression fait partie des opérateurs susceptibles de faire exécuter l’ensemble du modèle sur le CPU.
La précision INT8 dépend de la capacité des images d’étalonnage à représenter la scène de déploiement. Fournis à data= un fichier YAML de jeu de données contenant au moins 300 images représentatives issues de tes propres caméras ; les jeux de données d’étalonnage par défaut sont de petits échantillons publics.
Pour en savoir plus sur le processus d’export, consulte la page de la documentation Ultralytics consacrée à l’export.
Structure de sortie#
Après un export réussi, un répertoire de modèle est créé avec la structure suivante :
yolo26n_xilinx_model/
├── yolo26n.onnx # AMD Quark VINT8 model with the Ultralytics metadata
└── vitisai_config.json # Vitis AI compiler configuration for the target deviceLa compilation du modèle, décrite ci-dessous, ajoute un cache compilateur yolo26n/ dans le même répertoire. Il contient le modèle NPU yolo26n.rai et les rapports de compilation d’AMD, tels que final-vaiml-pass-summary.txt.
Fonctionnement de l’export#
L’export suit le workflow Vitis AI documenté par AMD pour Versal AI Edge Series Gen 2 :
- Export ONNX avec l’opset 17 et une taille de lot statique de 1.
- Quantification AMD Quark avec la configuration
VINT8(INT8 symétrique avec des échelles en puissances de deux) et les options exigées par AMD pour la compilation NPU :Int32Bias=False,enable_npu_cnn=True,DedicatedQDQPair=TrueetQuantizeAllOpTypes=True. L’étalonnage utilise le chargeur standard d’étalonnage INT8 d’Ultralytics, avec le même letterbox et le même prétraitement RGB et 0–1 que pour l’inférence. - Précision mixte : la tête du modèle reste en virgule flottante et le compilateur Vitis AI l’exécute en BF16 sur le NPU. La quantification de la tête en INT8 entraîne la majeure partie de la perte de précision, et le tutoriel YOLOv8m d’AMD exclut également sa partie post-traitement de l’INT8 pour cette même raison.
- Configuration du compilateur :
vitisai_config.jsonsélectionne la cibleVAIMLet l’appareil défini parname.
Précision#
Le tableau compare le modèle INT8 exporté au modèle ONNX FP32 sur l’ensemble val2017 de COCO (5 000 images) en 640, les deux étant exécutés avec ONNX Runtime sur le CPU de l’hôte. Les modèles INT8 ont été étalonnés sur le jeu de données par défaut coco128.yaml ; l’étalonnage sur tes propres images de déploiement réduit généralement l’écart.
Ces résultats sur l’hôte proviennent de l’exécution du modèle quantifié avec ONNX Runtime sur le CPU, la référence utilisée par la méthodologie de précision d’AMD pour comparer les résultats du NPU. Les résultats publiés par AMD pour YOLOv8m sur le VEK385 utilisent la même approche à précision mixte sur le NPU :
| Configuration YOLOv8m | Matériel | mAP50-95 (COCO) |
|---|---|---|
| ONNX FP32 | CPU hôte | 49.95 |
| BF16 | NPU VEK385 | 50.29 |
| VINT8 quantifié, partie finale FP32 | CPU hôte | 48.75 |
| VINT8 avec partie finale BF16 | NPU VEK385 | 48.38 |
Source : tutoriel YOLOv8m pour Versal AI Edge Gen 2 d’AMD, qui indique également un temps d’inférence moyen de 10,69 ms sur 100 exécutions VART à dp_size=1.
Compiler et exécuter sur Versal AI Edge Gen 2#
Le répertoire exporté est prêt pour le compilateur Vitis AI d’AMD, qui crée le modèle .rai exécuté sur le NPU.
-
Prépare l’hôte et la carte. Effectue la compilation sur un hôte Linux x86-64 avec l’image Docker Vitis AI 6.3 d’AMD pour Versal AI Edge Gen 2 et une licence du compilateur AMD AI Engine (consulte la page des licences d’AMD). Configure le VEK385 à l’aide du guide de configuration de carte d’AMD.
-
Compile. Dans le conteneur, crée une session ONNX Runtime avec le Vitis AI Execution Provider, comme dans le guide de compilation d’AMD. La commande écrit le cache
yolo26n/contenantyolo26n.raidans le répertoire d’export :import onnxruntime as ort d = "yolo26n_xilinx_model" options = {"config_file": f"{d}/vitisai_config.json", "cache_dir": d, "cache_key": "yolo26n", "target": "VAIML"} ort.InferenceSession(f"{d}/yolo26n.onnx", providers=["VitisAIExecutionProvider"], provider_options=[options])Consulte
yolo26n_xilinx_model/yolo26n/final-vaiml-pass-summary.txtpour connaître la part du modèle exécutée sur le NPU. Pour YOLO26n en 640, le compilateur Vitis AI 6.3 d’AMD place 99,9 % des opérateurs et des calculs sur le NPU VEK385 dans une seule partition. -
Exécute sur la carte. Copie le répertoire d’export sur le VEK385. ONNX Runtime avec le Vitis AI Execution Provider charge le modèle compilé
yolo26n.raiet l’exécute sur le NPU ;YOLO("yolo26n_xilinx_model")sélectionne automatiquement ce provider lorsqu’il est disponible.
La compilation ne nécessite que ONNX Runtime d’AMD ; tu peux donc effectuer l’export sur n’importe quelle machine Linux et copier le répertoire dans le conteneur plutôt que d’y installer Ultralytics, ce qui risque de modifier les packages dont les versions sont épinglées dans le conteneur. Lorsqu’Ultralytics est installé à côté de la version onnxruntime-vitisai d’AMD, comme sur la carte, il conserve cette version au lieu de la remplacer par onnxruntime standard.
L’export configure la compilation standard pour ONNX Runtime, qui exécute lui-même sur le CPU Arm les opérateurs incompatibles avec le NPU, comme la sélection top-k de YOLO26 avec nms=False. VART-ML n’exécute un modèle que si tous ses opérateurs sont affectés au NPU, sauf si tu ajoutes les passes de partitionnement CPU d’AMD à vitisai_config.json ; ces artefacts ne peuvent pas être exécutés avec ONNX Runtime.
Compatibilité des modèles YOLO et opérateurs pris en charge#
Un accélérateur n’accélère que les opérateurs qu’il implémente matériellement. Lorsqu’un modèle contient un opérateur non pris en charge, le compilateur délègue généralement cette partie du réseau au CPU Arm, et chaque aller-retour entre l’accélérateur et le CPU ajoute de la latence. Certains opérateurs ne peuvent pas être partitionnés : sur la NPU Versal AI Edge Gen 2, AMD répertorie des opérateurs comme NonZero et NonMaxSuppression qui peuvent contraindre l’ensemble du modèle à s’exécuter sur le CPU. La prise en charge des opérateurs est le facteur le plus important pour les performances d’un modèle YOLO sur le matériel AMD Xilinx.
Le tableau indique où s’exécute chaque opérateur d’un modèle YOLO26. Un export ONNX standard de YOLO26n contient 87 activations SiLU, chacune exportée sous la forme d’un Sigmoid et d’un Mul, ainsi que 4 opérateurs MatMul et 2 opérateurs Softmax issus de ses deux blocs d’attention : le bloc C2PSA à la fin du backbone (couche 10) et le bloc C3k2 avec attention qui produit la sortie P5 (couche 22).
| Opérateur | Emplacement dans YOLO | DPU (Zynq UltraScale+, Kria) | NPU (Versal AI Edge Gen 2) |
|---|---|---|---|
| Convolution + normalisation par lots | Chaque bloc Conv | ✅ | ✅ |
| Activation SiLU | Chaque bloc Conv (activation par défaut) | ❌ S’exécute sur le CPU ; remplacer par Hard-Swish | ✅ |
| Hard-Swish, ReLU, ReLU6, LeakyReLU | Activations facultatives définies dans le YAML du modèle | ✅ Fusionnée dans la convolution | ✅ |
| Sigmoid | Scores de classe dans la tête de détection | ❌ S’exécute sur le CPU (généralement pendant le post-traitement) | ✅ |
| MatMul entre deux activations | Blocs d’attention (C2PSA ; C3k2 de YOLO26) | ❌ S’exécute sur le CPU | ✅ |
| Softmax | Blocs d’attention ; DFL dans YOLOv8 et YOLO11 | ❌ S’exécute sur le CPU | ✅ |
| Reshape, Transpose | Blocs d’attention | ⚠️ Fusionné si possible, sinon exécuté sur le CPU | ✅ |
| Split, Slice | Blocs C3k2 et C2f | ⚠️ Convertis en tranches ; vérifie le rapport du compilateur | ✅ |
| Resize (suréchantillonnage au plus proche voisin) | Suréchantillonnage du neck | ✅ | ✅ |
| MaxPool, Concat, Add | Bloc SPPF et fusion des caractéristiques | ✅ | ✅ |
| TopK, GatherElements | Tête YOLO26 sans NMS (nms=False) | ❌ S’exécute sur le CPU | ⚠️ Partition CPU sur l’hôte Arm |
| NonMaxSuppression | Uniquement en cas d’export avec nms=True | ❌ S’exécute sur le CPU | ❌ Peut contraindre le modèle à s’exécuter sur le CPU |
Sources : opérateurs pris en charge UG1414 d’AMD, prise en charge des opérateurs PyTorch et listes d’opérateurs pris en charge, partition CPU et non pris en charge pour Versal AI Edge Gen 2. La prise en charge dépend aussi de ta configuration DPU et des motifs du graphe ; vérifie donc toujours le rapport de partition du compilateur.
YOLO26 supprime Distribution Focal Loss (DFL) ; contrairement à YOLO11 et YOLOv8, ses sorties de boîtes ne nécessitent donc pas de décodage softmax. Le modèle ajoute aussi un second bloc d’attention par rapport à YOLO11 ; compare donc les rapports du compilateur propres à la cible et les benchmarks sur l’appareil avant de choisir un modèle. Les exports où nms n’est pas défini conservent la tête one-to-many et nécessitent une NMS sur le CPU, comme les autres modèles YOLO. Exporte avec nms=False pour utiliser à la place la tête one-to-one de YOLO26 sans NMS, qui remplace NMS par une sélection top-k légère exécutée sur le CPU.
Rendre YOLO26 compatible avec la DPU grâce à Hard-Swish#
La DPU ne fusionne dans ses convolutions que ReLU, ReLU6, LeakyReLU, Hard-Swish et Hard-Sigmoid. Hard-Swish est une approximation de SiLU adaptée au matériel, ce qui en fait son remplacement naturel. Les fichiers YAML de modèles Ultralytics acceptent une clé activation qui modifie l’activation par défaut des blocs Conv (Guide de configuration YAML des modèles).
Copie yolo26.yaml vers yolo26-hswish.yaml, puis ajoute une ligne sous les paramètres :
# Parameters
nc: 80 # number of classes
activation: nn.Hardswish() # default Conv activation, DPU-native
end2end: True # whether to use end-to-end modeConstruis ensuite le modèle, transfère les poids YOLO26 préentraînés et affine le modèle sur ton jeu de données :
from ultralytics import YOLO
# Construire YOLO26n avec des activations Hard-Swish ; le « n » du nom indique l’échelle nano
model = YOLO("yolo26n-hswish.yaml").load("yolo26n.pt") # transférer les poids préentraînés
# Affiner le modèle pour que le réseau s’adapte à Hard-Swish
model.train(data="coco8.yaml", epochs=100, imgsz=640)Les activations n’ont pas de poids, donc tous les poids préentraînés sont transférés. Le graphe ONNX exporté contient alors 87 opérateurs HardSwish et aucun SiLU. Remplace coco8.yaml par ton propre jeu de données, puis compare la précision au modèle SiLU avec le mode Val avant le déploiement.
- Remplacer au moment de la quantification : définis
"convert_silu_to_hswish": truedans la configuration JSON du quantificateur PyTorch de Vitis AI 3.5 pour remplacer SiLU pendant la quantification. Cela évite une phase d’entraînement, mais entraîne généralement une perte de précision plus importante, que le fine-tuning rapide ou la QAT d’AMD peut compenser en partie. Consulte le guide de configuration vai_q_pytorch. - LeakyReLU : la DPU implémente LeakyReLU avec une pente négative fixe de 26/256 (environ 0,1). Si tu utilises LeakyReLU, entraîne avec
activation: nn.LeakyReLU(0.1015625)pour que les pentes du modèle entraîné et déployé correspondent.
Gérer les blocs d’attention sur la DPU#
YOLO26 applique l’attention à la résolution la plus basse (une grille de 20 × 20 pour une entrée de 640) à deux endroits : le bloc C2PSA à la couche 10 et le bloc C3k2 avec attention à la couche 22. YOLO11 comporte un seul bloc C2PSA. Sur une DPU, ses opérateurs MatMul et Softmax s’exécutent sur le CPU, ce qui divise le modèle en sous-graphes alternant entre DPU et CPU. Tu as trois possibilités :
-
Accepter les blocs CPU. Le
.xmodelcompilé contient alors des sous-graphes CPU. Exécute-le avec le Graph Runner d’AMD, qui exécute ensemble les sous-graphes DPU et CPU lorsqu’une implémentation CPU existe pour chaque opérateur ; sinon, tu dois implémenter et enregistrer les opérateurs manquants. À 20 × 20, le calcul d’attention est léger, mais chaque transfert supplémentaire entre la DPU et le CPU ajoute de la latence ; mesure donc les performances sur ta carte. -
Utiliser un YAML sans attention. Dans ton YAML Hard-Swish, remplace la couche C2PSA par
nn.Identitypour que les indices de couche utilisés parConcatetDetectrestent valides, puis désactive l’attention dans la couche 22 :backbone: # ... layers 0-9 unchanged - [-1, 1, nn.Identity, []] # 10 C2PSA removed; keeps later layer indices valid head: # ... layers 11-21 unchanged - [-1, 1, C3k2, [1024, True, 0.5, False]] # 22 (P5/32-large), attention disabled - [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)Le graphe ONNX exporté ne contient alors aucun opérateur MatMul ni Softmax. Les poids d’attention ne sont plus applicables (624 des 666 poids de YOLO26n sont transférés) ; affine donc le modèle plus longtemps et compare la précision avec le mode Val.
-
Utiliser un modèle sans attention, comme YOLOv8, qu’AMD a utilisé dans ses propres exemples DPU.
Sur Versal AI Edge Gen 2, les opérateurs d’attention sont répertoriés comme pris en charge par la NPU ; ces modifications sont donc généralement inutiles. Vérifie leur emplacement dans le rapport du compilateur, car AMD précise que des opérateurs pris en charge peuvent tout de même basculer sur le CPU en raison de contraintes de configuration ou de mémoire.
Compatibilité des modèles en un coup d’œil#
| Modèle | DPU (Zynq UltraScale+, Kria) | NPU (Versal AI Edge Gen 2) |
|---|---|---|
| YOLO26 | Entraînement avec Hard-Swish ; deux blocs d’attention deviennent des sous-graphes CPU ; pas de DFL | Export natif format="xilinx" ; la tête s’exécute en BF16 |
| YOLO11 | Entraînement avec Hard-Swish ; C2PSA et le softmax DFL s’exécutent sur le CPU | Export natif format="xilinx" ; la tête s’exécute en BF16 |
| YOLOv8 | Entraînement avec Hard-Swish ; le softmax DFL s’exécute sur le CPU | Export natif format="xilinx". Tutoriel YOLOv8m d’AMD (Vitis AI 6.3, VEK385, INT8 avec partie finale en BF16) : le rapport du compilateur indique 1 181 opérateurs (99,915 %) et 99,994 % des GOP sur le NPU, sans modification du modèle. |
Déployer sur d’autres cibles AMD Xilinx#
Les DPU Zynq UltraScale+ et Kria, ainsi que le NPU Versal AI Edge de première génération, utilisent des workflows Vitis AI que format="xilinx" ne produit pas. Entraîne ton modèle avec Ultralytics, puis crée l’artefact cible avec les outils AMD dans leurs images Docker Linux x86-64. Choisis l’onglet correspondant à ton appareil :
-
Démarre l’image Docker Vitis AI 6.3 d’AMD pour Versal AI Edge.
-
Active l’environnement NPU pour l’IP NPU de ta carte en exécutant la commande source sur
settings.sh. Passe le nom de l’IP NPU de ta carte en argument, ou utiliseLISTpour afficher les IP disponibles. -
Capture un instantané en exécutant un script d’inférence standard sur des images représentatives, avec la variable d’environnement
VAISW_SNAPSHOT_DIRECTORYdéfinie. Aucune modification du code n’est nécessaire :# Activate the NPU environment inside the Vitis AI Docker container source $VITIS_AI_REPO/npu_ip/settings.sh # Capture a mixed INT8/BF16 snapshot, calibrating on 100 images from your inference script VAISW_SNAPSHOT_DIRECTORY=snapshot.yolo26n VAISW_FE_PRECISION=MIXED VAISW_QUANTIZATION_NBIMAGES=100 python3 my_inference.py
VAISW_FE_PRECISION accepte INT8 (par défaut), BF16 ou MIXED, et VAISW_QUANTIZATION_NBIMAGES est réglé par défaut sur 4 images ; choisis donc un nombre plus élevé et représentatif pour les modèles de détection. L’instantané dépend de la variante d’IP NPU de ta carte. Les parties finales du post-traitement YOLO s’exécutent sur les AI Engines uniquement en précision BF16 ou MIXED. La documentation d’AMD diverge au sujet de Softmax : la page des exemples indique que Softmax n’est pas accéléré et que la partie Softmax finale de YOLOv8 est exécutée sur le CPU, tandis que les notes de version de Vitis AI 6.1 signalent une accélération complète de YOLOv8 en précision mixte. Examine le fichier wrp_network_iriz.onnx dans l’instantané pour confirmer quelles parties de ton modèle, notamment l’attention de YOLO11 et YOLO26, s’exécutent sur le NPU. Consulte l’utilisation de ton propre modèle.
Prépare la carte avec une conception matérielle et une image Linux qui intègrent la configuration de l’accélérateur pour laquelle tu as compilé, ainsi que l’environnement d’exécution Vitis AI correspondant. Consulte les guides de configuration AMD pour les cibles DPU Zynq UltraScale+ et Kria et Versal AI Edge (VEK280), puis copie les artefacts nécessaires à ton environnement d’exécution :
| Workflow | Artefacts à copier sur la carte | Environnement d'exécution sur la carte |
|---|---|---|
| DPU (Zynq UltraScale+, Kria) | .xmodel compilé | VART ; Graph Runner pour les sous-graphes CPU |
| NPU (Versal AI Edge, VEK280) | Répertoire de l’instantané | VART-ML |
Sur le DPU, les tampons VART contiennent des valeurs INT8 en virgule fixe : récupère la forme et l’échelle fix_point de chaque tenseur, quantifie les entrées et déquantifie les sorties avant le post-traitement. Graph Runner renvoie les sorties du graphe complet, tandis qu’un exécuteur DPU seul renvoie les sorties des sous-graphes intermédiaires du DPU, que ton code doit compléter. VART-ML sur le VEK280 utilise par défaut des vues de tenseurs matérielles dont la forme, le type de données et la disposition mémoire peuvent différer des dispositions ONNX. Configure donc les types de tenseurs d’entrée et de sortie de l’exécuteur en vues CPU, ou convertis toi-même le format matériel (consulte la présentation de l’architecture VART-ML d’AMD).
La distribution de YOLO Ultralytics dans un produit commercial AMD Xilinx nécessite soit de respecter la licence AGPL-3.0, soit de disposer d’une licence Ultralytics Enterprise.
Applications concrètes#
Les appareils AMD Xilinx sont courants dans les cas où l’IA visuelle doit fonctionner en temps réel, avec une faible consommation et à proximité du capteur :
- Sécurité industrielle et dans la construction : détecte les personnes et les machines à proximité d’équipements lourds, et surveille les zones de travail grâce à la détection d’objets et au comptage d’objets.
- Vision automobile et hors route : exécute la perception par caméra sur des composants homologués pour l’automobile, au service des véhicules autonomes et de l’aide à la conduite.
- Caméras intelligentes et analyse vidéo : combine la capture vidéo, l’encodage et l’inférence YOLO sur une seule puce pour les systèmes de sécurité et l’analyse vidéo.
- Vision industrielle et contrôle qualité : associe l’acquisition d’images à grande vitesse basée sur FPGA à YOLO pour la segmentation d’instances ou la classification afin de détecter les défauts en ligne.
- Robotique et drones : utilise les modules Kria KR260 ou Versal pour l’estimation de pose, la détection d’objets orientés et la navigation avec une latence déterministe.
Résumé#
L’export avec format="xilinx" quantifie les modèles Ultralytics YOLO avec AMD Quark pour les NPU Versal AI Edge Series Gen 2, conserve la tête en BF16 et place la configuration du compilateur Vitis AI à côté du modèle. Vérifie la précision INT8 sur n’importe quel hôte, compile le modèle .rai dans l’image Docker Vitis AI d’AMD, puis exécute-le sur la carte avec ONNX Runtime et le Vitis AI Execution Provider.
Les anciens appareils AMD Xilinx utilisent d’autres workflows. Le DPU des Zynq UltraScale+ et Kria utilise la chaîne d’outils figée Vitis AI 3.5 et les fichiers .xmodel, nécessite des activations propres au DPU comme Hard-Swish et exécute l’attention sur le CPU. Le NPU Versal AI Edge de première génération utilise le workflow snapshot, dont la couverture des opérateurs dépend de la version et de la précision de Vitis AI.
Pour d’autres cibles de déploiement, consulte le guide des options de déploiement des modèles, les bonnes pratiques de déploiement et les intégrations d’accélérateurs comme Hailo, Rockchip RKNN et Axelera.
FAQ#
Oui. AMD a finalisé l’acquisition de Xilinx en février 2022, et les produits Xilinx sont désormais commercialisés sous forme de SoC adaptatifs et de FPGA AMD : AMD Zynq, AMD Kria, AMD Versal et AMD Vitis. Les ingénieurs utilisent encore largement le nom Xilinx, et les références des composants conservent le préfixe
XC.Oui.
model.export(format="xilinx")quantifie le modèle avec AMD Quark pour les NPU Versal AI Edge Series Gen 2 et crée un répertoire contenant le modèle ONNX quantifié et sa configuration de compilateur Vitis AI. Compile-le en.raiavec les outils Vitis AI d’AMD, comme indiqué dans Compiler et exécuter sur Versal AI Edge Gen 2. Pour les cibles Zynq UltraScale+, Kria et VEK280, utilise les workflows présentés dans Déployer sur d’autres cibles AMD Xilinx.Le DPU (unité de traitement de l’apprentissage profond) est l’accélérateur INT8 de génération précédente d’AMD. Il est intégré à la logique programmable des appareils Zynq UltraScale+ et Kria, se compile avec Vitis AI 3.5 et produit des fichiers
.xmodel. Le NPU le remplace dans les versions actuelles de Vitis AI. Sur les appareils Versal AI Edge, il associe des AI Engines intégrés à de la logique programmable, prend en charge INT8, BF16 et la précision mixte, ainsi qu’un plus grand nombre d’opérateurs, notamment SiLU et, sur Versal AI Edge Gen 2, l’attention.Un
.xmodelest un graphe XIR sérialisé utilisé par la chaîne d’outils AMD DPU. Le quantificateur écrit un.xmodelquantifié, puis le compilateurvai_c_xirle transforme en.xmodelcompilé, qui contient le flux d’instructions du DPU, des poids INT8 quantifiés et les sous-graphes qui doivent s’exécuter sur le CPU. Le fichier compilé cible une configuration DPU particulière, décrite par une empreintearch.json, et s’exécute sur la carte via Vitis AI Runtime (VART), ou via Graph Runner lorsqu’il contient des sous-graphes CPU.Non. Le DPU accélère uniquement les activations ReLU, ReLU6, LeakyReLU, Hard-Swish et Hard-Sigmoid, et exécute Sigmoid, Softmax et MatMul entre deux activations sur le CPU. Entraîne YOLO avec
activation: nn.Hardswish()dans le YAML du modèle pour conserver les convolutions sur le DPU, et consulte Gérer les blocs d’attention sur le DPU pour connaître les options d’attention. Les NPU Versal AI Edge Gen 2 prennent nativement en charge SiLU, Softmax et MatMul.Le KV260 utilise un MPSoC Zynq UltraScale+ avec un DPU ; suis donc le flux DPU. Entraîne un modèle YOLO26 avec Hard-Swish, quantifie-le avec
vai_q_pytorchdans l’image Docker Vitis AI 3.5, compile-le avecvai_c_xiren utilisantarch.jsondu KV260, puis exécute le.xmodelobtenu sur la carte avec VART, ou avec Graph Runner s’il contient des sous-graphes CPU.Non. L’export s’exécute sur n’importe quel hôte Linux avec Python 3.11 à 3.13, sans compte AMD, et le modèle exporté s’exécute sur le CPU pour les vérifications de précision sur n’importe quel hôte. La compilation du modèle
.rainécessite l’image Docker Vitis AI et une licence du compilateur AI Engine d’AMD ; son exécution sur le NPU nécessite une carte Versal AI Edge Series Gen 2.Ultralytics utilise le Vitis AI Execution Provider uniquement lorsqu’ONNX Runtime le propose, comme avec la version
onnxruntime-vitisaid’AMD sur une carte Versal ou dans l’image Docker d’AMD. Dans les autres environnements, le modèle quantifié s’exécute sur le CPU avec ONNX Runtime standard, ce qui permet de mesurer la précision INT8 avant le déploiement.Toutes les tâches peuvent s’exécuter si leurs opérateurs se compilent pour ton accélérateur. Les opérateurs non pris en charge s’exécutent généralement sur le CPU, mais certains peuvent forcer l’exécution du modèle entier sur le CPU ou faire échouer la compilation. La détection d’objets est la charge de travail la plus courante et celle utilisée dans les exemples d’AMD. Pour la segmentation, l’estimation de pose et les autres tâches, consulte le rapport de partitionnement du compilateur pour confirmer que les couches les plus lourdes s’exécutent sur l’accélérateur.