AMD-Xilinx-Bereitstellung von Ultralytics YOLO mit Vitis AI#
Die Unterstützung für den nativen Export von Ultralytics auf AMD-Xilinx-Geräte wird in Kürze verfügbar sein. Bis dahin erklärt diese Anleitung die Hardware- und Softwarelandschaft von AMD Xilinx und zeigt, wie du Ultralytics YOLO26 schon heute mit AMD Vitis AI bereitstellst – ausgehend von einem ONNX-Export oder einem PyTorch-Checkpoint.
AMD-Xilinx-Geräte sind in vielen Industriekameras, Bildverarbeitungssystemen für Fahrzeuge, Robotern, Drohnen und Produkten für die medizinische Bildgebung weltweit im Einsatz. Sie verbinden Arm-Prozessoren mit programmierbarer Logik und verfügen bei neueren Geräten zusätzlich über dedizierte AI Engines. Dadurch kann ein einzelner Chip Video erfassen und vorverarbeiten, Objekte erkennen und mit niedriger, vorhersehbarer Inferenzlatenz auf die Ergebnisse reagieren.
Diese Anleitung erläutert die einzelnen AMD-Xilinx-Gerätefamilien, die Ausführung von AI auf diesen Geräten, die von den jeweiligen Beschleunigern unterstützten Ultralytics-YOLO-Operatoren und den schrittweisen Arbeitsablauf für die Bereitstellung von YOLO-Modellen auf Zynq UltraScale+-, Kria- und Versal-Hardware.
Was ist AMD Xilinx?#
Xilinx erfand in den 1980er-Jahren das feldprogrammierbare Gate-Array (FPGA) und wurde zu einem führenden Anbieter von adaptiven SoCs und FPGAs. AMD schloss die Übernahme von Xilinx im Februar 2022 ab. Die Produktlinien werden nun unter der Marke AMD als AMD Zynq, AMD Kria, AMD Versal und AMD Vitis verkauft.
Beide Namen beziehen sich auf dieselben Produkte. AMD vermarktet sie als „adaptive SoCs und FPGAs“, aber unter Entwicklerinnen und Entwicklern ist „Xilinx“ weiterhin weit verbreitet. Die Teilenummern behalten das Präfix XC bei (zum Beispiel xczu7ev). Das ältere Vitis-AI-Repository und die Docker-Images werden auf GitHub und Docker Hub weiterhin unter dem Namen Xilinx geführt. Diese Anleitung verwendet „AMD Xilinx“, damit du sie unter beiden Namen finden kannst.
Wichtige Begriffe und Konzepte#
Bei der Bereitstellung auf AMD Xilinx kommt eine eigene Terminologie zum Einsatz. Die folgende Tabelle erläutert alle in dieser Anleitung verwendeten Begriffe.
| Begriff | Bedeutung |
|---|---|
| FPGA | Feldprogrammierbares Gate-Array: ein Chip, dessen digitale Logik nach der Herstellung durch das Laden eines als Bitstream bezeichneten Entwurfs konfiguriert wird. Damit lassen sich kundenspezifische Hardwarekomponenten wie Videoverarbeitungspipelines oder Beschleuniger für neuronale Netze implementieren. |
| Programmierbare Logik (PL) | Die FPGA-Logik innerhalb eines AMD-Xilinx-SoCs. Bei Zynq- und Kria-Geräten ist der AI-Beschleuniger in der PL implementiert. |
| Verarbeitungssystem (PS) | Die fest integrierten Arm-CPU-Kerne, Speichercontroller und Peripheriegeräte des SoCs. Darauf laufen Linux, deine Anwendung und alle Modellschichten, die der Beschleuniger nicht ausführen kann. |
| Adaptives SoC / MPSoC | Ein System-on-Chip, das ein Verarbeitungssystem mit programmierbarer Logik und bei vielen Versal-Geräten zusätzlich mit AI Engines verbindet. MPSoC steht für Multiprozessor-System-on-Chip. |
| AI Engine (AIE, AIE-ML, AIE-MLv2) | Gruppen fest integrierter Vektorprozessoren auf vielen Versal-Geräten, darunter die hier behandelte Versal-AI-Edge-Serie. Sie sind für maschinelles Lernen und Signalverarbeitung ausgelegt. |
| DPU | Einheit zur Verarbeitung von Deep Learning: AMDs INT8-Beschleuniger für neuronale Netze, der als IP bereitgestellt und in die PL integriert wird (zum Beispiel DPUCZDX8G auf Zynq UltraScale+ und Kria). Größen von B512 bis B4096 geben die maximale Anzahl von Operationen pro Taktzyklus an. |
| NPU / NPU-IP | Neuronale Verarbeitungseinheit: AMDs Beschleuniger der aktuellen Generation für Inferenz, der in neueren Vitis-AI-Versionen die DPU ersetzt. AMD beschreibt seine NPU-IP als einen Soft-Beschleuniger, der AI Engines mit programmierbarer Logik verbindet und daher ebenfalls ein passendes Hardwaredesign benötigt. Siehe den Glossareintrag zur NPU. |
| Vitis AI | AMDs Toolchain für die Bereitstellung neuronaler Netze auf AMD-Xilinx-Geräten. Sie umfasst Quantisierung, Kompilierung, Laufzeitumgebungen, Beispiele und Docker-Umgebungen. |
| AMD Quark | AMDs aktuelle Bibliothek zur Modellquantisierung. Sie wird im Arbeitsablauf für Versal AI Edge Gen 2 verwendet, um ein FP32-ONNX-Modell in ein INT8-Modell umzuwandeln. |
| Quantisierung, PTQ und QAT | Umwandlung von FP32-Gewichten und -Aktivierungen in INT8. Bei der Quantisierung nach dem Training (PTQ) werden Kalibrierungsbilder verwendet. Beim quantisierungsbewussten Training (QAT) wird das Modell feinabgestimmt, um die Genauigkeit wiederherzustellen. |
| Kalibrierungsbilder | Eine kleine, repräsentative Bildauswahl, die bei der PTQ durch das Modell geleitet wird, um die INT8-Skalierung für jeden Tensor festzulegen. |
| BF16 und gemischte Genauigkeit | BFloat16 ist ein Gleitkommaformat mit 16 Bit, das den Wertebereich von FP32 beibehält. Bei gemischter Genauigkeit läuft der größte Teil des Netzes mit INT8, während empfindliche Schichten BF16 verwenden. |
| XIR | Xilinx Intermediate Representation: das Graphformat, das der DPU-Compiler erzeugt und die Laufzeitumgebung einliest. |
.xmodel | Ein serialisierter XIR-Graph. Der Quantisierer schreibt ein quantisiertes .xmodel; der DPU-Compiler wandelt es in ein kompiliertes .xmodel mit DPU-Anweisungen, quantisierten Gewichten und etwaigen CPU-Teilgraphen um. Für das kompilierte Modell ist die passende DPU-Konfiguration erforderlich. |
arch.json / DPU-Fingerabdruck | Die Datei, die eine bestimmte DPU-Konfiguration beschreibt. Der DPU-Compiler benötigt diese Datei. Ein für einen bestimmten Fingerabdruck kompiliertes .xmodel läuft nicht mit einem anderen Fingerabdruck. |
| Snapshot | Das Verzeichnis des kompilierten Modells, das beim NPU-Arbeitsablauf für Versal AI Edge (VEK280) entsteht. Es ist an eine bestimmte NPU-IP-Variante gebunden. |
.rai | Die Modelldatei, die beim NPU-Arbeitsablauf für Versal AI Edge Gen 2 entsteht. |
| VART / VART-ML | Die Vitis-AI-Laufzeitbibliotheken, die kompilierte Modelle laden und auf der Platine ausführen. Sie bieten C++- und Python-APIs. |
| ONNX-Runtime-Vitis-AI-EP | Das VitisAIExecutionProvider für ONNX Runtime, mit dem ONNX-Modelle auf AMD-NPUs kompiliert und ausgeführt werden. |
| CPU-Ausweichlösung / Graphaufteilung | Kann der Beschleuniger einen Operator nicht ausführen, teilt der Compiler das Modell üblicherweise in Teilgraphen für den Beschleuniger und die CPU auf. Jede Aufteilung verursacht eine Datenübertragung, die die Latenz deutlich erhöhen kann. Bei manchen Operatoren wird stattdessen das gesamte Modell auf die CPU verlagert oder die Kompilierung schlägt fehl. |
AMD-Xilinx-Gerätefamilien für Edge AI#
AMD-Xilinx-Geräte für Edge AI gehören zu drei Familien. Zynq und Kria nutzen die DPU in der programmierbaren Logik, während die hier behandelten Versal-AI-Edge-Geräte die NPU auf ihren AI Engines einsetzen.
| Familie | Beschreibung | Anwendungsprozessor | AI-Beschleuniger | Beispielplatinen |
|---|---|---|---|---|
| Zynq UltraScale+ MPSoC | Arm-CPUs und FPGA-Logik auf einem Chip, in Größen von ZU1 bis ZU19 | Arm Cortex-A53 mit zwei oder vier Kernen | In der programmierbaren Logik integrierte DPU | ZCU104, ZCU102, kundenspezifische Platinen |
| Kria K26 System-on-Module | Produktionsreifes Modul auf Basis eines Zynq UltraScale+ MPSoC | Arm Cortex-A53 mit vier Kernen | In der programmierbaren Logik integrierte DPU | KV260 Vision AI Starter Kit, KR260 Robotics Starter Kit |
| Versal AI Edge Series | Adaptive SoCs; AIE-ML-Bauteile wie VE2302 und VE2802 führen die NPU aus | Arm Cortex-A72 mit zwei Kernen | NPU auf AIE-ML-AI-Engines und in der PL | VEK280 |
| Versal AI Edge Series Gen 2 | Adaptives SoC der nächsten Generation mit AIE-MLv2-AI-Engines | Bis zu acht Arm Cortex-A78AE | NPU auf AIE-MLv2-AI-Engines und in der PL | VEK385 |
Zynq UltraScale+ MPSoC#
Jeder Zynq UltraScale+-Chip verbindet ein Arm-Verarbeitungssystem mit FPGA-Logik. Das Verarbeitungssystem verfügt je nach Variante über Cortex-A53-Kerne mit zwei Kernen (CG) oder vier Kernen (EG und EV) sowie Cortex-R5F-Echtzeitkerne. EV-Geräte bieten zusätzlich einen fest integrierten H.264/H.265-Videocodec. Für neuronale Netze integrieren Entwicklerinnen und Entwickler eine DPU in die Logik neben den Kamera- und Videopipelines. Bei kleinen Geräten beansprucht die DPU Platz, der dann für andere Teile des Designs fehlt.
Kria-System-on-Modules#
Das Kria-K26-Modul vereint einen Zynq UltraScale+ MPSoC, Speicher und Stromversorgung auf einem produktionsreifen Modul. So musst du Prozessor, Speicher und Stromversorgung nicht selbst entwerfen. Das Modul wird auf eine Trägerplatine gesteckt, entweder auf eine Platine aus einem Starter Kit oder auf eine eigene Platine. Es bildet die Grundlage für das KV260 Vision AI Starter Kit für intelligente Kameras und das KR260 Robotics Starter Kit für Robotik. Da das K26 auf Zynq UltraScale+ basiert, nutzt es denselben DPU-Arbeitsablauf. Zum Kria-Portfolio gehören auch weitere Module. Prüfe daher vor der Wahl eines Arbeitsablaufs, welchen Prozessor dein Modul verwendet.
Adaptive Versal-SoCs#
Versal ist AMDs Familie adaptiver SoCs. Die AI-Edge- und AI-Core-Serien verfügen neben den Arm-Kernen und der programmierbaren Logik über fest integrierte AI Engines, während einige andere Versal-Serien keine AI Engines bieten. AMDs NPU-IP wird gemeinsam auf AI Engines und programmierbarer Logik ausgeführt. Vitis AI unterstützt die AIE-ML-Bauteile der AI-Edge-Serie, zum Beispiel VE2302 und VE2802. Die Versal AI Edge Series (VEK280-Evaluierungskit) und die Versal AI Edge Series Gen 2 (VEK385-Evaluierungskit) sind AMDs aktuelle Zielplattformen für Edge AI und stehen im Mittelpunkt der aktuellen Vitis-AI-Versionen.
So läuft AI auf AMD-Xilinx-Geräten: DPU und NPU im Vergleich#
Die meisten AI-Bereitstellungen auf AMD-Xilinx-Geräten folgen demselben Muster. Der Beschleuniger verarbeitet die von ihm unterstützten Schichten. Die Arm-CPU übernimmt die Vorverarbeitung, die Nachverarbeitung und alle Schichten, die der Beschleuniger nicht ausführen kann. Eine Laufzeitumgebung auf der Platine koordiniert beide.
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 hat zwei Beschleunigergenerationen auf den Markt gebracht, jeweils mit eigener Toolchain und eigener Modelldatei. Diese Anleitung behandelt Vitis AI 3.5 für die DPU und Vitis AI 6.3 für die NPU. Informationen zu späteren Versionen findest du in der aktuellen AMD-Dokumentation.
| Arbeitsablauf | Hardware | Toolchain | Quantisierer | Kompiliertes Artefakt | Laufzeitumgebung auf der Platine | Status |
|---|---|---|---|---|---|---|
| DPU | Zynq UltraScale+, Kria | Vitis AI 3.5 (Docker) | vai_q_pytorch | .xmodel | VART | Eingefrorener Compiler, Modellzoo und DPU-IP |
| NPU (Versal AI Edge) | VEK280 und andere Versal AI Edge-Bauteile | Vitis AI 6.3 (Docker) | In den Snapshot-Ablauf integriert | Snapshot | VART-ML | Aktiv |
| NPU (Versal AI Edge Gen 2) | VEK385 und andere Gen-2-Bauteile | Vitis AI 6.3 (Docker) | AMD Quark | .rai | ONNX Runtime Vitis AI EP oder VART-ML | Aktiv |
Vitis AI 3.5 ist die letzte Version mit Aktualisierungen des DPU-Compilers und der Modellbibliothek. In späteren Versionen des Repositorys Xilinx/Vitis-AI bleiben Compiler, Modellbibliothek und Zynq UltraScale+ DPU-IP unverändert; aktualisiert werden hingegen die Laufzeitumgebung und die Kompatibilität mit neueren AMD-Toolversionen (siehe die Vitis AI 5.0-Versionshinweise). Die aktuelle Vitis AI-Dokumentation von AMD beschreibt die NPU als Ersatz für die veraltete DPU-Architektur. Bestehende Zynq UltraScale+- und Kria-Produkte können weiterhin mit der DPU ausgeliefert werden, aber deren Unterstützung für Operatoren wird nicht erweitert. Neuere Modellarchitekturen benötigen daher die unter YOLO-Modellkompatibilität beschriebenen Anpassungen.
AMD Ryzen AI-Prozessoren in PCs enthalten ebenfalls eine NPU, verwenden aber den separaten Software-Stack Ryzen AI Software statt der eingebetteten Vitis AI-Abläufe in dieser Anleitung. Informationen zu AMD Instinct- und Radeon-GPUs findest du unter AMD-GPU-Integration.
Welchen Vitis AI-Ablauf brauche ich?#
Wähle anhand des Geräts auf deiner Platine den passenden Ablauf aus:
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:#fffYOLO-Modellkompatibilität und unterstützte Operatoren#
Ein Beschleuniger beschleunigt nur die Operatoren, die er in Hardware implementiert. Enthält ein Modell einen nicht unterstützten Operator, führt der Compiler diesen Teil des Netzwerks in der Regel auf der Arm-CPU aus. Jeder Wechsel zwischen Beschleuniger und CPU erhöht die Latenz. Manche Operatoren lassen sich nicht aufteilen: Für die Versal AI Edge Gen 2 NPU führt AMD Operatoren wie NonZero und NonMaxSuppression auf, die das gesamte Modell auf die CPU zwingen können. Die Operatorunterstützung ist der wichtigste Faktor dafür, wie gut ein YOLO-Modell auf AMD Xilinx-Hardware läuft.
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:#fffDie Tabelle zeigt, wo jeder Operator in einem YOLO26-Modell ausgeführt wird. Ein unveränderter YOLO26n-ONNX-Export enthält 87 SiLU-Aktivierungen, die jeweils als Sigmoid und Mul exportiert werden, sowie 4 MatMul- und 2 Softmax-Operatoren aus den beiden Attention-Blöcken: dem C2PSA-Block am Ende des Backbones (Layer 10) und dem Attention-fähigen C3k2-Block, der die P5-Ausgabe erzeugt (Layer 22).
| Operator | Einsatzort in YOLO | DPU (Zynq UltraScale+, Kria) | NPU (Versal AI Edge Gen 2) |
|---|---|---|---|
| Faltung + Batch-Normalisierung | Jeder Conv-Block | ✅ | ✅ |
| SiLU-Aktivierung | Jeder Conv-Block (Standardaktivierung) | ❌ Wird auf der CPU ausgeführt; durch Hard-Swish ersetzen | ✅ |
| Hard-Swish, ReLU, ReLU6, LeakyReLU | Optionale Aktivierungen in der Modell-YAML-Datei | ✅ In die Faltung integriert | ✅ |
| Sigmoid | Klassenwerte im Detektionskopf | ❌ Wird auf der CPU ausgeführt (meist Teil der Nachbearbeitung) | ✅ |
| MatMul zwischen zwei Aktivierungen | Attention-Blöcke (C2PSA; YOLO26 C3k2) | ❌ Wird auf der CPU ausgeführt | ✅ |
| Softmax | Attention-Blöcke; DFL in YOLOv8 und YOLO11 | ❌ Wird auf der CPU ausgeführt | ✅ |
| Umformen, Transponieren | Attention-Blöcke | ⚠️ Wenn möglich integriert, andernfalls auf der CPU ausgeführt | ✅ |
| Aufteilen, Ausschneiden | C3k2- und C2f-Blöcke | ⚠️ In Teilbereiche umgewandelt; Compilerbericht prüfen | ✅ |
| Resize (Hochskalieren mit nächstem Nachbarn) | Hochskalierung im Neck | ✅ | ✅ |
| MaxPool, Concat, Add | SPPF-Block und Zusammenführen von Merkmalen | ✅ | ✅ |
| TopK, GatherElements | NMS-freier YOLO26-Kopf (nms=False) | ❌ Wird auf der CPU ausgeführt | ⚠️ CPU-Aufteilung auf dem Arm-Host |
| NonMaxSuppression | Nur bei Export mit nms=True | ❌ Wird auf der CPU ausgeführt | ❌ Kann das gesamte Modell auf die CPU zwingen |
Quellen: AMD UG1414 – unterstützte Operatoren, PyTorch-Unterstützung für Operatoren sowie die Listen der von Versal AI Edge Gen 2 unterstützten, auf der CPU ausgeführten und nicht unterstützten Operatoren. Die Unterstützung hängt auch von deiner DPU-Konfiguration und den Graphmustern ab. Prüfe daher immer den Aufteilungsbericht des Compilers.
YOLO26 verzichtet auf den Verteilungsfokusverlust (DFL). Anders als bei YOLO11 und YOLOv8 müssen die Box-Ausgaben deshalb nicht per Softmax dekodiert werden. Im Vergleich zu YOLO11 enthält das Modell außerdem einen zweiten Attention-Block. Vergleiche daher die Compilerberichte für dein Zielgerät und die Messwerte auf dem Gerät, bevor du ein Modell auswählst. Bei Exporten mit nicht gesetztem nms bleibt der One-to-many-Kopf erhalten; wie bei anderen YOLO-Modellen ist dann NMS auf der CPU erforderlich. Verwende beim Export nms=False, um stattdessen den NMS-freien One-to-one-Kopf von YOLO26 zu nutzen. Dieser ersetzt NMS durch eine einfache Top-k-Auswahl, die auf der CPU ausgeführt wird.
YOLO26 mit Hard-Swish für die DPU vorbereiten#
Die DPU integriert nur ReLU, ReLU6, LeakyReLU, Hard-Swish und Hard-Sigmoid in ihre Faltungen. Hard-Swish ist eine hardwarefreundliche Näherung von SiLU und daher der naheliegende Ersatz. In den YAML-Dateien für Ultralytics-Modelle kannst du mit dem Schlüssel activation die Standardaktivierung der Conv-Blöcke ändern (Anleitung zur Modell-YAML-Konfiguration).
Kopiere yolo26.yaml nach yolo26-hswish.yaml und füge unter den Parametern eine Zeile hinzu:
# Parameters
nc: 80 # number of classes
activation: nn.Hardswish() # default Conv activation, DPU-native
end2end: True # whether to use end-to-end modeErstelle anschließend das Modell, übertrage die vortrainierten YOLO26-Gewichte und führe auf deinem Datensatz eine Feinabstimmung durch:
from ultralytics import YOLO
# # YOLO26n mit Hard-Swish-Aktivierungen erstellen; das „n“ im Namen bezeichnet die Nano-Größenvariante
model = YOLO("yolo26n-hswish.yaml").load("yolo26n.pt") # # vortrainierte Gewichte übertragen
# # Durch Feinabstimmung das Netzwerk an Hard-Swish anpassen
model.train(data="coco8.yaml", epochs=100, imgsz=640)Aktivierungen haben keine Gewichte, daher werden alle vortrainierten Gewichte übernommen. Der exportierte ONNX-Graph enthält dann 87 HardSwish-Operatoren und keine SiLU-Operatoren. Ersetze coco8.yaml durch deinen eigenen Datensatz und vergleiche vor der Bereitstellung mit dem SiLU-Modell die Genauigkeit im Validierungsmodus.
- Beim Quantisieren austauschen: Setze
"convert_silu_to_hswish": truein der JSON-Konfiguration des Vitis AI 3.5 PyTorch-Quantisierers, um SiLU während der Quantisierung zu ersetzen. So entfällt ein Trainingslauf, allerdings geht dies meist mit einem größeren Genauigkeitsverlust einher. Diesen kann AMDs schnelle Feinabstimmung oder QAT teilweise ausgleichen. Siehe die Konfigurationsanleitung für vai_q_pytorch. - LeakyReLU: Die DPU implementiert LeakyReLU mit einer festen negativen Steigung von 26/256 (etwa 0,1). Wenn du LeakyReLU verwendest, trainiere mit
activation: nn.LeakyReLU(0.1015625), damit die Steigungen beim Training und bei der Bereitstellung übereinstimmen.
Attention-Blöcke auf der DPU verarbeiten#
YOLO26 wendet Attention an der niedrigsten Auflösung (ein 20×20-Raster bei einer Eingabegröße von 640) an zwei Stellen an: im C2PSA-Block auf Layer 10 und im Attention-fähigen C3k2-Block auf Layer 22. YOLO11 hat einen C2PSA-Block. Auf einer DPU werden dessen MatMul- und Softmax-Operatoren auf der CPU ausgeführt. Dadurch wird das Modell in abwechselnde DPU- und CPU-Untergraphen aufgeteilt. Du hast drei Möglichkeiten:
-
Die CPU-Blöcke akzeptieren. Das kompilierte
.xmodelenthält dann CPU-Untergraphen. Führe es daher mit AMDs Graph Runner aus, der DPU- und CPU-Untergraphen gemeinsam ausführt, sofern für jeden Operator eine CPU-Implementierung vorhanden ist. Andernfalls musst du die fehlenden Operatoren implementieren und registrieren. Bei 20×20 ist die Attention-Berechnung klein, aber jede zusätzliche Übertragung zwischen DPU und CPU erhöht die Latenz. Miss daher die Leistung auf deiner Platine. -
Eine YAML-Datei ohne Attention verwenden. Ersetze in deiner Hard-Swish-YAML-Datei den C2PSA-Layer durch
nn.Identity, damit die vonConcatundDetectverwendeten Layer-Indizes gültig bleiben, und deaktiviere Attention in Layer 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)Der exportierte ONNX-Graph enthält dann keine MatMul- oder Softmax-Operatoren. Die Attention-Gewichte sind nicht mehr anwendbar (624 von 666 YOLO26n-Gewichten werden übernommen). Führe daher eine längere Feinabstimmung durch und vergleiche die Genauigkeit im Validierungsmodus.
-
Ein Modell ohne Attention verwenden, zum Beispiel YOLOv8, das AMD in eigenen DPU-Beispielen verwendet hat.
Auf Versal AI Edge Gen 2 werden Attention-Operatoren als von der NPU unterstützt aufgeführt, daher sind diese Änderungen normalerweise nicht nötig. Prüfe im Compilerbericht, wo die Operatoren ausgeführt werden, denn laut AMD können auch unterstützte Operatoren aufgrund von Konfigurations- oder Speicherbeschränkungen auf die CPU ausweichen.
Modellkompatibilität auf einen Blick#
| Modell | DPU (Zynq UltraScale+, Kria) | NPU (Versal AI Edge Gen 2) |
|---|---|---|
| YOLO26 | Mit Hard-Swish trainieren; zwei Attention-Blöcke werden zu CPU-Untergraphen; kein DFL | Voraussichtlich ohne Änderungen ausführbar; auf deiner Platine überprüfen |
| YOLO11 | Mit Hard-Swish trainieren; C2PSA und DFL-Softmax werden auf der CPU ausgeführt | Voraussichtlich ohne Änderungen ausführbar; auf deiner Platine überprüfen |
| YOLOv8 | Mit Hard-Swish trainieren; DFL-Softmax wird auf der CPU ausgeführt | AMDs YOLOv8m-Tutorial (Vitis AI 6.3, VEK385, INT8 mit BF16-Abschluss): Der Compilerbericht weist 1.181 Operatoren (99,915 %) und 99,994 % der GOPs auf der NPU aus; keine Modelländerungen erforderlich |
YOLO26 noch heute auf AMD Xilinx bereitstellen#
Bis ein nativer Export verfügbar ist, umfasst die Bereitstellung vier Schritte:
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:#fffSchritt 1: Modell trainieren oder feinabstimmen#
Trainiere mit deinen eigenen Daten im Trainingsmodus oder auf der Ultralytics-Plattform. Beginne bei DPU-Zielgeräten mit der Hard-Swish-YAML-Datei. Erfasse mit dem Validierungsmodus einen Ausgangswert, damit du später die Auswirkungen der Quantisierung auf die Genauigkeit messen kannst.
Schritt 2: Für NPU-Zielgeräte nach ONNX exportieren#
ONNX ist die gemeinsame Eingabe für AMDs NPU-Abläufe. Beim DPU-Ablauf wird der trainierte PyTorch-Prüfpunkt direkt im Vitis AI 3.5-Docker-Image quantisiert; DPU-Nutzer können diesen Schritt also überspringen. Exportiere mit einer festen Batchgröße von 1 und einer von AMD unterstützten Opset-Version. AMDs YOLOv8m-Tutorial für Versal AI Edge Gen 2 verwendet Opset 17.
from ultralytics import YOLO
# # Das in Schritt 1 trainierte Modell laden
model = YOLO("runs/detect/train/weights/best.pt")
# # Für den AMD-Compiler mit statischer Form nach ONNX exportieren
model.export(format="onnx", opset=17, imgsz=640) # # erstellt 'best.onnx' neben 'best.pt'Alle Optionen findest du unter ONNX-Integration und Exportargumente. Wenn nms nicht gesetzt ist, führe NMS nach der Inferenz auf der CPU aus. Bei YOLO26 wählt nms=False stattdessen den NMS-freien Kopf aus. Bette NMS nicht mit nms=True ein, denn AMD führt NonMaxSuppression unter den Operatoren auf, die das gesamte Modell auf die CPU zwingen können.
AMDs Docker-Images enthalten einen eigenen ONNX Runtime-Build mit dem Vitis AI Execution Provider. Ultralytics prüft beim Export, ob ONNX Runtime verfügbar ist, und kann dabei das Standardpaket darüber installieren. Exportiere auf einem beliebigen Rechner und kopiere die Datei .onnx in den Container, oder setze YOLO_AUTOINSTALL=false, wenn du Ultralytics im AMD-Docker-Image ausführst.
Schritt 3: Mit Vitis AI quantisieren und kompilieren#
Für die folgenden Arbeitsabläufe werden AMD-Docker-Images auf einem x86-64-Linux-Host verwendet. Für diesen Schritt brauchst du die Platine nicht. Wähle den Tab für dein Gerät aus:
- Starte AMDs Vitis AI 6.3-Docker-Image für Versal AI Edge Gen 2. Siehe die Systemanforderungen.
- Quantisiere das ONNX-Modell mit AMD Quark und der Konfiguration
VINT8auf INT8. AMDs Minimalkonfiguration erfordert außerdemInt32Bias=False,enable_npu_cnn=True,DedicatedQDQPair=TrueundQuantizeAllOpTypes=True. Quark liest Kalibrierungsdaten über einen von dir geschriebenen Datenleser ein. Verwende daher dieselbe Vorverarbeitung wie bei der Inferenz: Letterbox-Skalierung auf die Exportgröße, RGB-Kanalreihenfolge, Skalierung auf 0–1 und NCHW-Layout, angewendet auf repräsentative Bilder aus deinem Datensatz. - Schließe den Nachbearbeitungs-Teilgraphen von der Quantisierung aus. AMDs YOLOv8m-Tutorial warnt davor, dass seine Quantisierung zu übersehenen Erkennungen führt. In diesem YOLOv8m-Beispiel führt der Compiler den letzten Teil dann in BF16 auf der NPU aus; nicht unterstützte Operatoren im letzten Teil, etwa die Top-k-Auswahl von YOLO26, laufen weiterhin auf der CPU.
- Wähle die Board-Laufzeitumgebung vor dem Kompilieren aus. Die Standardkompilierung funktioniert mit ONNX Runtime, das nicht NPU-kompatible Operatoren wie die Top-k-Auswahl von YOLO26 auf der CPU selbst ausführt, sowie mit VART-ML, aber nur, wenn alle Operatoren auf der NPU laufen. Um ein Modell mit CPU-Operatoren unter VART-ML auszuführen, füge AMDs CPU-Partitionierungspässe zu
vitisai_config.jsonhinzu. Diese Artefakte können nicht über ONNX Runtime ausgeführt werden. - Kompiliere, indem du eine ONNX-Runtime-Sitzung mit
VitisAIExecutionProviderund einemvitisai_config.jsonerstellst, das dein Zielgerät angibt. Beim Kompilieren wird eine Datei.raiin das Cache-Verzeichnis geschrieben. Siehe Modell kompilieren.
Um die Quantisierung zu überspringen, kompiliere das FP32-ONNX-Modell direkt; der Compiler wandelt es in BF16 um. Zum Kompilieren ist eine Lizenz für den AMD AI Engine-Compiler erforderlich; siehe Lizenzierungsseite von AMD.
Schritt 4: Auf dem Board ausführen und validieren#
Bereite zuerst das Board vor. Darauf müssen ein Hardwaredesign und ein Linux-Image laufen, die die kompilierte Beschleunigerkonfiguration enthalten, sowie die dazu passende Vitis-AI-Laufzeitumgebung. Siehe die Einrichtungsanleitungen von AMD für Zynq UltraScale+- und Kria-DPU-Ziele, Versal AI Edge (VEK280) und Versal AI Edge Gen 2 (VEK385).
Kopiere anschließend die Artefakte, die deine Laufzeitumgebung benötigt:
| Arbeitsablauf | Auf das Board zu kopierende Artefakte | Laufzeitumgebung auf der Platine |
|---|---|---|
| DPU (Zynq UltraScale+, Kria) | Kompiliertes .xmodel | VART; Graph Runner für CPU-Teilgraphen |
| NPU (Versal AI Edge, VEK280) | Verzeichnis der Momentaufnahme | VART-ML |
| NPU (Versal AI Edge Gen 2), ORT | Für die Kompilierung verwendetes FP32- oder quantisiertes ONNX-Modell, vitisai_config.json und das kompilierte Cache-Verzeichnis | ONNX Runtime mit dem Vitis-AI-EP |
| NPU (Versal AI Edge Gen 2), VART-ML | Datei .rai (mit CPU-Partitionierungspässen, falls ein Operator auf der CPU ausgeführt wird) sowie eine VART-ML-Runner-Konfiguration | VART-ML |
Bei den NPU-Abläufen dekodiert der exportierte ONNX-Graph bereits die Boxen und wendet die Sigmoid-Funktion auf die Klassenwerte an, sodass der Host die Ausgabe nur noch interpretieren muss:
nmsnicht gesetzt: Erkennungsmodelle geben einen(1, 4 + nc, anchors)-Tensor mitxywhBoxen und Bewertungen pro Klasse aus. Wähle die beste Klasse für jeden Anker aus, wandle die Boxen in Eckkoordinaten um, filtere nach Konfidenz und führe NMS aus; die Ultralytics-Funktionnon_max_suppressionführt alle diese Schritte aus.nms=False(YOLO26): Das Modell gibt einen(1, max_det, 6)-Tensor mit[x1, y1, x2, y2, score, class]Zeilen aus, für den lediglich ein Konfidenzschwellenwert festgelegt werden muss.
In beiden Fällen musst du die Boxen von der Eingabe mit Letterboxing auf das ursprüngliche Bild zurückskalieren. Nur bei Graphen, die vor dem Dekodierungsschritt abgeschnitten werden, müssen die Boxen auf dem Host dekodiert werden. Auf der DPU enthalten VART-Puffer Festkommawerte im INT8-Format: Ermittle Form und fix_point-Skalierung jedes Tensors, quantisiere die Eingaben und dequantisiere die Ausgaben, bevor du die obigen Schritte ausführst. Der Graph Runner gibt die Ausgaben des vollständigen Graphen zurück, während ein reiner DPU-Runner Zwischenausgaben der DPU-Teilgraphen zurückgibt, deren Berechnung dein Code abschließen muss. Die obigen Layouts sind ONNX-Layouts (CPU-Ansicht): VART-ML verwendet standardmäßig Hardware-Tensoransichten, deren Form, Datentyp und Speicherlayout abweichen können. Konfiguriere daher die Eingabe- und Ausgabetensortypen des Runners als CPU-Ansichten oder wandle das Hardwareformat selbst um (siehe AMDs Übersicht zur VART-ML-Architektur).
Vergleiche die Genauigkeit auf dem Gerät mit der FP32-Baseline aus Schritt 1 anhand deines eigenen Validierungssatzes und derselben Leistungskennzahlen, beispielsweise mAP. Die von AMD veröffentlichten YOLOv8m-Ergebnisse auf dem VEK385 zeigen den Genauigkeitsverlust beim INT8-Einsatz:
| YOLOv8m-Konfiguration | Hardware | mAP50-95 (COCO) |
|---|---|---|
| FP32 ONNX | Host-CPU | 49.95 |
| BF16 | VEK385 NPU | 50.29 |
| VINT8-quantisiert, FP32-Abschluss | Host-CPU | 48.75 |
| VINT8 mit BF16-Abschluss | VEK385 NPU | 48.38 |
Quelle: AMD-YOLOv8m-Tutorial für Versal AI Edge Gen 2, das bei dp_size=1 auch eine durchschnittliche Inferenzzeit von 10.69 ms für 100 VART-Läufe angibt.
Für den Vertrieb von Ultralytics YOLO als Bestandteil eines kommerziellen AMD-Xilinx-Produkts musst du entweder die Bedingungen der AGPL-3.0-Lizenz einhalten oder eine Ultralytics Enterprise-Lizenz erwerben.
Anwendungen in der Praxis#
AMD-Xilinx-Geräte sind überall verbreitet, wo Vision-KI in Echtzeit, mit geringem Stromverbrauch und in Sensornähe ausgeführt werden muss:
- Sicherheit in Industrie und Bauwesen: Erkenne Personen und Maschinen in der Nähe schwerer Geräte und überwache Arbeitsbereiche mit Objekterkennung und Objektzählung.
- Bildverarbeitung für Straßenfahrzeuge und Geländefahrzeuge: Führe kamerabasierte Wahrnehmung auf qualifizierten Fahrzeugkomponenten aus und unterstütze autonome Fahrzeuge sowie Fahrerassistenz.
- Intelligente Kameras und Videoanalyse: Kombiniere Videoaufnahme, Kodierung und YOLO-Inferenz auf einem Chip für Sicherheitssysteme und Videoanalyse.
- Industrielle Bildverarbeitung und Qualitätsprüfung: Kombiniere FPGA-basierte Hochgeschwindigkeits-Bildaufnahme mit YOLO-Instanzsegmentierung oder Klassifizierung, um Fehler direkt in der Produktionslinie zu erkennen.
- Robotik und Drohnen: Nutze Kria KR260 oder Versal-Module für Posenschätzung, Erkennung gedrehter Objekte und Navigation mit deterministischer Latenz.
Zusammenfassung#
AMD-Xilinx-Geräte führen YOLO-Modelle über zwei Beschleunigergenerationen aus. Die DPU in Zynq UltraScale+ und Kria verwendet den eingefrorenen Vitis-AI-3.5-Ablauf und erzeugt .xmodel-Dateien. Sie benötigt DPU-native Aktivierungsfunktionen wie Hard-Swish und führt Attention auf der CPU aus. Die NPU in Versal AI Edge und Versal AI Edge Gen 2 nutzt aktuelle Vitis-AI-Versionen. Die NPU der zweiten Generation unterstützt SiLU- und Attention-Operatoren und führt AMDs YOLOv8m-Beispiel auf dem VEK385 fast vollständig auf der NPU aus. Die Abdeckung der Operatoren durch die frühere VEK280-NPU hängt dagegen von der Vitis-AI-Version und der Präzision ab.
Der native Ultralytics-Export für AMD-Xilinx-Geräte ist in Kürze verfügbar. Bis dahin kannst du mit Ultralytics trainieren, für Versal-NPU-Ziele nach ONNX exportieren oder für DPU-Ziele den PyTorch-Prüfpunkt beibehalten und wie oben beschrieben mit Vitis AI kompilieren. Informationen zu weiteren Bereitstellungszielen findest du im Leitfaden zu Modellbereitstellungsoptionen, in den bewährten Methoden für die Bereitstellung und bei Beschleunigerintegrationen wie Hailo, Rockchip RKNN und Axelera.
Häufig gestellte Fragen#
Ja. AMD schloss die Übernahme von Xilinx im Februar 2022 ab. Xilinx-Produkte werden nun als adaptive SoCs und FPGAs von AMD verkauft: AMD Zynq, AMD Kria, AMD Versal und AMD Vitis. Ingenieure verwenden den Namen Xilinx weiterhin häufig, und die Teilenummern behalten das Präfix
XC.Noch nicht. Der native Ultralytics-Export für AMD-Xilinx-Geräte ist in Kürze verfügbar. Exportiere derzeit für Versal-NPU-Ziele mit
model.export(format="onnx")nach ONNX oder quantisiere den trainierten PyTorch-Prüfpunkt für Zynq UltraScale+- und Kria-DPU-Ziele mitvai_q_pytorch. Kompiliere ihn dann mit den Vitis-AI-Werkzeugen von AMD, wie unter YOLO26 jetzt auf AMD Xilinx bereitstellen gezeigt.Die DPU (Deep-Learning-Verarbeitungseinheit) ist der frühere INT8-Beschleuniger von AMD. Sie ist in die programmierbare Logik von Zynq UltraScale+- und Kria-Geräten integriert, wird mit Vitis AI 3.5 kompiliert und erzeugt
.xmodel-Dateien. In aktuellen Vitis-AI-Versionen wird sie durch die NPU ersetzt. In Versal-AI-Edge-Geräten kombiniert die NPU gehärtete AI Engines mit programmierbarer Logik, unterstützt INT8, BF16 und gemischte Präzision sowie mehr Operatoren, darunter SiLU und, bei Versal AI Edge Gen 2, Attention.Eine
.xmodelist ein serialisierter XIR-Graph, der in der AMD-DPU-Werkzeugkette verwendet wird. Der Quantisierer schreibt ein quantisiertes.xmodel, und der Compilervai_c_xirwandelt es in ein kompiliertes.xmodelum. Dieses enthält den DPU-Befehlsspeicher, quantisierte INT8-Gewichte und alle Teilgraphen, die auf der CPU ausgeführt werden müssen. Die kompilierte Datei ist für eine bestimmte DPU-Konfiguration vorgesehen, die durch einenarch.json-Fingerabdruck beschrieben wird. Sie wird auf dem Board über die Vitis AI Runtime (VART) oder, wenn sie CPU-Teilgraphen enthält, über den Graph Runner ausgeführt.Nein. Die DPU beschleunigt nur die Aktivierungsfunktionen ReLU, ReLU6, LeakyReLU, Hard-Swish und Hard-Sigmoid. Sigmoid, Softmax und MatMul zwischen zwei Aktivierungen führt sie auf der CPU aus. Trainiere YOLO mit
activation: nn.Hardswish()in der Modell-YAML-Datei, damit die Faltungen auf der DPU ausgeführt werden. Informationen zu Attention-Optionen findest du unter Attention-Blöcke auf der DPU verarbeiten. NPUs der Versal AI Edge Gen 2 unterstützen SiLU, Softmax und MatMul nativ.Der KV260 verwendet ein Zynq UltraScale+ MPSoC mit einer DPU; folge daher dem DPU-Ablauf. Trainiere ein YOLO26-Modell mit Hard-Swish, quantisiere es mit
vai_q_pytorchim Vitis-AI-3.5-Docker-Image, kompiliere es mitvai_c_xirfür dasarch.jsondes KV260 und führe das resultierende.xmodelauf dem Board mit VART aus oder mit dem Graph Runner, falls es CPU-Teilgraphen enthält.Nein. Quantisierung und Kompilierung laufen in den Vitis-AI-Docker-Images von AMD auf einem x86-64-Linux-Host. Das Board benötigst du nur, um das kompilierte Modell auszuführen und Latenz und Genauigkeit auf dem Gerät zu messen.
Jede Aufgabe kann ausgeführt werden, wenn sich ihre Operatoren für deinen Beschleuniger kompilieren lassen. Nicht unterstützte Operatoren werden üblicherweise auf der CPU ausgeführt, einige können jedoch dazu führen, dass das gesamte Modell auf der CPU ausgeführt wird oder die Kompilierung fehlschlägt. Objekterkennung ist der häufigste Arbeitslasttyp und wird auch in AMDs eigenen Beispielen verwendet. Prüfe bei Segmentierung, Posenschätzung und anderen Aufgaben den Partitionierungsbericht des Compilers, um sicherzustellen, dass die rechenintensiven Schichten auf dem Beschleuniger laufen.