Déploiement d'Ultralytics YOLO sur AMD Xilinx avec Vitis AI#
La prise en charge native de l'exportation Ultralytics pour les appareils AMD Xilinx sera bientôt disponible. En attendant, ce guide présente l'écosystème matériel et logiciel AMD Xilinx et explique comment déployer dès maintenant Ultralytics YOLO26 avec les outils Vitis AI d'AMD, à partir d'un export ONNX ou d'un checkpoint PyTorch.
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 les différentes familles d'appareils AMD Xilinx, le fonctionnement de l'IA sur ces appareils, les opérateurs Ultralytics YOLO pris en charge par chaque accélérateur et le workflow de déploiement des modèles YOLO sur le matériel Zynq UltraScale+, Kria et Versal, étape par étape.
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.
graph LR
A[Camera / video input]:::start --> B[Arm CPU<br>Linux, preprocessing,<br>post-processing]:::proc
B <--> C[AI accelerator<br>DPU in programmable logic<br>or NPU on AI Engines + PL]:::out
B --> D[Application<br>alerts, control, display]:::start
classDef start fill:#4CAF50,color:#fff
classDef proc fill:#2196F3,color:#fff
classDef out fill:#9C27B0,color:#fffAMD 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 :
graph TD
A[Start: which AMD device<br>is on your board?]:::start --> B{Device family?}:::decide
B -->|Zynq UltraScale+ MPSoC<br>or Kria K26| C[DPU flow<br>Vitis AI 3.5]:::proc
B -->|Versal AI Edge<br>VEK280| D[NPU snapshot flow<br>Vitis AI 6.3]:::proc
B -->|Versal AI Edge Gen 2<br>VEK385| E[NPU Quark flow<br>Vitis AI 6.3]:::proc
C --> F[Train YOLO with Hard-Swish<br>then compile to .xmodel]:::out
D --> G[Run your model on calibration<br>images to capture a snapshot]:::out
E --> H[Quantize ONNX with Quark<br>then compile to .rai]:::out
classDef start fill:#4CAF50,color:#fff
classDef proc fill:#2196F3,color:#fff
classDef decide fill:#FF9800,color:#fff
classDef out fill:#9C27B0,color:#fffCompatibilité 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.
graph LR
subgraph S1 [Stock YOLO26 on the DPU]
A1[Conv]:::out --> A2[SiLU<br>CPU]:::error --> A3[Conv]:::out --> A4[SiLU<br>CPU]:::error --> A5[...]:::proc
end
subgraph S2 [Hard-Swish YOLO26 on the DPU]
B1[Backbone<br>Conv + Hard-Swish<br>DPU]:::out --> B2[C2PSA attention<br>CPU]:::error --> B3[Neck<br>DPU]:::out --> B4[C3k2 attention<br>CPU]:::error --> B5[Detect head<br>DPU]:::out --> B6[Sigmoid and<br>post-processing<br>CPU]:::error
end
classDef proc fill:#2196F3,color:#fff
classDef out fill:#9C27B0,color:#fff
classDef error fill:#F44336,color:#fffLe 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 | Devrait s’exécuter sans modification ; valide le résultat sur ta carte |
| YOLO11 | Entraînement avec Hard-Swish ; C2PSA et le softmax DFL s’exécutent sur le CPU | Devrait s’exécuter sans modification ; valide le résultat sur ta carte |
| YOLOv8 | Entraînement avec Hard-Swish ; le softmax DFL s’exécute sur le CPU | Tutoriel YOLOv8m d’AMD (Vitis AI 6.3, VEK385, INT8 avec queue BF16) : le rapport du compilateur indique 1 181 opérateurs (99,915 %) et 99,994 % des GOP sur la NPU, sans modification du modèle |
Déployer YOLO26 sur du matériel AMD Xilinx dès aujourd’hui#
En attendant la disponibilité de l’export natif, le déploiement se déroule en quatre étapes :
graph LR
A[1. Train or fine-tune<br>Ultralytics YOLO]:::start --> B{Target?}:::decide
B -->|Versal NPU| C[2. Export to ONNX<br>model.export]:::proc
B -->|Zynq or Kria DPU| D[2. Keep the trained<br>PyTorch checkpoint]:::proc
C --> E[3. Quantize and compile<br>Vitis AI 6.3 Docker]:::proc
D --> F[3. Quantize and compile<br>Vitis AI 3.5 Docker]:::proc
E --> G[4. Run on the board<br>VART-ML or ONNX Runtime]:::out
F --> H[4. Run on the board<br>VART]:::out
G -.->|accuracy check| A
H -.->|accuracy check| A
classDef start fill:#4CAF50,color:#fff
classDef proc fill:#2196F3,color:#fff
classDef decide fill:#FF9800,color:#fff
classDef out fill:#9C27B0,color:#fffÉtape 1 : entraîner ou affiner ton modèle#
Entraîne ton modèle sur tes propres données avec le mode Train ou sur la plateforme Ultralytics. Pour les cibles DPU, pars du YAML Hard-Swish. Établis une référence avec le mode Val afin de pouvoir mesurer plus tard l’impact de la quantification sur la précision.
Étape 2 : exporter au format ONNX pour les cibles NPU#
ONNX est le format d’entrée commun aux flux NPU d’AMD. Le flux DPU quantifie directement le checkpoint PyTorch entraîné dans l’image Docker Vitis AI 3.5 ; les utilisateurs de DPU peuvent donc ignorer cette étape. Exporte avec une taille de lot fixe de 1 et un opset pris en charge par AMD ; le tutoriel YOLOv8m d’AMD pour Versal AI Edge Gen 2 utilise l’opset 17.
from ultralytics import YOLO
# Charger le modèle entraîné à l’étape 1
model = YOLO("runs/detect/train/weights/best.pt")
# Exporter au format ONNX avec une forme statique pour le compilateur AMD
model.export(format="onnx", opset=17, imgsz=640) # crée « best.onnx » à côté de « best.pt »Consulte l’intégration ONNX et les arguments d’export pour connaître toutes les options. Si nms n’est pas défini, exécute NMS sur le CPU après l’inférence ; pour YOLO26, nms=False sélectionne à la place la tête sans NMS. N’intègre pas NMS avec nms=True, car AMD répertorie NonMaxSuppression parmi les opérateurs susceptibles de contraindre l’ensemble du modèle à s’exécuter sur le CPU.
Les images Docker d’AMD incluent leur propre version d’ONNX Runtime avec le Vitis AI Execution Provider. Ultralytics vérifie la présence d’ONNX Runtime lors de l’export et peut remplacer cette version par le paquet standard. Effectue l’export sur n’importe quelle machine et copie le fichier .onnx dans le conteneur, ou définis YOLO_AUTOINSTALL=false lorsque tu exécutes Ultralytics dans l’image Docker d’AMD.
Étape 3 : quantifier et compiler avec Vitis AI#
Les flux de travail ci-dessous utilisent les images Docker d’AMD sur un hôte Linux x86-64. Tu n’as pas besoin de la carte pour cette étape. Choisis l’onglet correspondant à ton appareil :
- Lance l’image Docker Vitis AI 6.3 d’AMD pour Versal AI Edge Gen 2. Consulte la configuration système requise.
- Quantifie le modèle ONNX en INT8 avec AMD Quark à l’aide de la configuration
VINT8. La configuration minimale d’AMD nécessite égalementInt32Bias=False,enable_npu_cnn=True,DedicatedQDQPair=TrueetQuantizeAllOpTypes=True. Quark lit les données d’étalonnage via un lecteur de données que tu écris ; applique donc le même prétraitement qu’à l’inférence : redimensionnement letterbox à la taille d’export, ordre des canaux RGB, mise à l’échelle de 0 à 1 et disposition NCHW, sur des images représentatives de ton jeu de données. - Exclus le sous-graphe de post-traitement de la quantification. Le tutoriel YOLOv8m d’AMD avertit que sa quantification entraîne des détections manquées. Dans cet exemple YOLOv8m, le compilateur exécute ensuite la partie finale en BF16 sur le NPU ; les opérateurs finaux non pris en charge, comme la sélection top-k de YOLO26, s’exécutent quand même sur le CPU.
- Choisis l’environnement d’exécution de la carte avant la compilation. La compilation standard fonctionne avec ONNX Runtime, qui exécute lui-même sur le CPU les opérateurs incompatibles avec le NPU, comme la sélection top-k de YOLO26, et avec VART-ML uniquement lorsque tous les opérateurs s’exécutent sur le NPU. Pour exécuter avec VART-ML un modèle qui conserve des opérateurs CPU, ajoute les passes de partitionnement CPU d’AMD à
vitisai_config.json. Ces artefacts ne peuvent pas être exécutés avec ONNX Runtime. - Compile en créant une session ONNX Runtime avec
VitisAIExecutionProvideret unvitisai_config.jsonqui indique ton appareil cible. La compilation écrit un fichier.raidans le répertoire de cache. Consulte la compilation d’un modèle.
Pour ignorer la quantification, compile directement le modèle ONNX FP32 ; le compilateur le convertit en BF16. La compilation nécessite une licence du compilateur AMD AI Engine ; consulte la page des licences d’AMD.
Étape 4 : exécution et validation sur la carte#
Commence par préparer la carte. Elle doit exécuter une conception matérielle et une image Linux qui contiennent 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 d’AMD pour les cibles DPU Zynq UltraScale+ et Kria, Versal AI Edge (VEK280) et Versal AI Edge Gen 2 (VEK385).
Copie ensuite 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 |
| NPU (Versal AI Edge Gen 2), ORT | Modèle ONNX FP32 ou quantifié utilisé pour la compilation, vitisai_config.json et répertoire de cache compilé | ONNX Runtime avec le Vitis AI EP |
| NPU (Versal AI Edge Gen 2), VART-ML | Fichier .rai (avec les passes de partitionnement CPU si un opérateur s’exécute sur le CPU), ainsi qu’une configuration d’exécution VART-ML | VART-ML |
Pour les flux NPU, le graphe ONNX exporté décode déjà les boîtes et applique la fonction sigmoïde aux scores de classe ; l’hôte n’a donc qu’à interpréter la sortie :
nmsnon défini : les modèles de détection produisent un tenseur(1, 4 + nc, anchors)composé dexywhboîtes et de scores par classe. Sélectionne la meilleure classe pour chaque ancre, convertis les boîtes en coordonnées de coins, applique un seuil de confiance et exécute NMS ; la fonctionnon_max_suppressiond’Ultralytics effectue toutes ces étapes.nms=False(YOLO26) : le modèle produit un tenseur(1, max_det, 6)composé de[x1, y1, x2, y2, score, class]lignes, auquel il suffit d’appliquer un seuil de confiance.
Dans les deux cas, redimensionne les boîtes de l’image d’entrée avec letterboxing aux dimensions de l’image d’origine. Seuls les graphes coupés avant l’étape de décodage nécessitent le décodage des boîtes sur l’hôte. Sur le DPU, les tampons VART stockent des valeurs INT8 à virgule fixe : interroge la forme et l’échelle fix_point de chaque tenseur, quantifie les entrées et déquantifie les sorties avant d’appliquer les étapes ci-dessus. Graph Runner renvoie les sorties du graphe complet, tandis qu’un exécuteur DPU seul renvoie les sorties intermédiaires du sous-graphe DPU, dont ton code doit terminer le calcul. Les dispositions ci-dessus correspondent aux dispositions ONNX (vue CPU) : par défaut, VART-ML utilise des vues de tenseur matérielles dont la forme, le type de données et la disposition mémoire peuvent différer ; configure donc les types de tenseur 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).
Compare la précision sur l’appareil à la référence FP32 de l’étape 1 en utilisant ton propre jeu de validation et les mêmes métriques de performance, comme le mAP. Les résultats publiés par AMD pour YOLOv8m sur le VEK385 illustrent le coût en précision du déploiement INT8 :
| 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.
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é#
Les appareils AMD Xilinx exécutent les modèles YOLO avec deux générations d’accélérateurs. Le DPU des appareils Zynq UltraScale+ et Kria utilise le flux Vitis AI 3.5 figé et produit des fichiers .xmodel. Il nécessite des activations natives du DPU, comme Hard-Swish, et exécute l’attention sur le CPU. Le NPU de Versal AI Edge et Versal AI Edge Gen 2 utilise les versions actuelles de Vitis AI. Le NPU Gen 2 prend en charge SiLU et les opérateurs d’attention, et exécute l’exemple YOLOv8m d’AMD sur le VEK385 presque entièrement sur le NPU, tandis que la couverture des opérateurs sur le NPU VEK280, plus ancien, dépend de la version de Vitis AI et de la précision.
L’export natif Ultralytics pour les appareils AMD Xilinx sera bientôt disponible. D’ici là, entraîne avec Ultralytics, exporte au format ONNX pour les cibles NPU Versal ou conserve le checkpoint PyTorch pour les cibles DPU, puis compile avec Vitis AI comme décrit ci-dessus. 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.Pas encore. L’export natif Ultralytics pour les appareils AMD Xilinx sera bientôt disponible. Pour l’instant, exporte au format ONNX avec
model.export(format="onnx")pour les cibles NPU Versal, ou quantifie le checkpoint PyTorch entraîné avecvai_q_pytorchpour les cibles DPU Zynq UltraScale+ et Kria, puis compile avec les outils Vitis AI d’AMD, comme indiqué dans Déployer YOLO26 sur AMD Xilinx dès aujourd’hui.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. La quantification et la compilation s’exécutent dans les images Docker Vitis AI d’AMD sur un hôte Linux x86-64. Tu n’as besoin de la carte que pour exécuter le modèle compilé et mesurer la latence et la précision sur l’appareil.
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.