Ultralytics YOLO27:

AMD-Xilinx-Bereitstellung von Ultralytics YOLO mit Vitis AI#

Der native Export von Ultralytics folgt in Kürze

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.

Xilinx oder AMD?

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.

BegriffBedeutung
FPGAFeldprogrammierbares 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 / MPSoCEin 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.
DPUEinheit 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-IPNeuronale 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 AIAMDs Toolchain für die Bereitstellung neuronaler Netze auf AMD-Xilinx-Geräten. Sie umfasst Quantisierung, Kompilierung, Laufzeitumgebungen, Beispiele und Docker-Umgebungen.
AMD QuarkAMDs 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 QATUmwandlung 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.
KalibrierungsbilderEine 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 GenauigkeitBFloat16 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.
XIRXilinx Intermediate Representation: das Graphformat, das der DPU-Compiler erzeugt und die Laufzeitumgebung einliest.
.xmodelEin 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-FingerabdruckDie 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.
SnapshotDas Verzeichnis des kompilierten Modells, das beim NPU-Arbeitsablauf für Versal AI Edge (VEK280) entsteht. Es ist an eine bestimmte NPU-IP-Variante gebunden.
.raiDie Modelldatei, die beim NPU-Arbeitsablauf für Versal AI Edge Gen 2 entsteht.
VART / VART-MLDie Vitis-AI-Laufzeitbibliotheken, die kompilierte Modelle laden und auf der Platine ausführen. Sie bieten C++- und Python-APIs.
ONNX-Runtime-Vitis-AI-EPDas VitisAIExecutionProvider für ONNX Runtime, mit dem ONNX-Modelle auf AMD-NPUs kompiliert und ausgeführt werden.
CPU-Ausweichlösung / GraphaufteilungKann 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.

FamilieBeschreibungAnwendungsprozessorAI-BeschleunigerBeispielplatinen
Zynq UltraScale+ MPSoCArm-CPUs und FPGA-Logik auf einem Chip, in Größen von ZU1 bis ZU19Arm Cortex-A53 mit zwei oder vier KernenIn der programmierbaren Logik integrierte DPUZCU104, ZCU102, kundenspezifische Platinen
Kria K26 System-on-ModuleProduktionsreifes Modul auf Basis eines Zynq UltraScale+ MPSoCArm Cortex-A53 mit vier KernenIn der programmierbaren Logik integrierte DPUKV260 Vision AI Starter Kit, KR260 Robotics Starter Kit
Versal AI Edge SeriesAdaptive SoCs; AIE-ML-Bauteile wie VE2302 und VE2802 führen die NPU ausArm Cortex-A72 mit zwei KernenNPU auf AIE-ML-AI-Engines und in der PLVEK280
Versal AI Edge Series Gen 2Adaptives SoC der nächsten Generation mit AIE-MLv2-AI-EnginesBis zu acht Arm Cortex-A78AENPU auf AIE-MLv2-AI-Engines und in der PLVEK385

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:#fff

AMD 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.

ArbeitsablaufHardwareToolchainQuantisiererKompiliertes ArtefaktLaufzeitumgebung auf der PlatineStatus
DPUZynq UltraScale+, KriaVitis AI 3.5 (Docker)vai_q_pytorch.xmodelVARTEingefrorener Compiler, Modellzoo und DPU-IP
NPU (Versal AI Edge)VEK280 und andere Versal AI Edge-BauteileVitis AI 6.3 (Docker)In den Snapshot-Ablauf integriertSnapshotVART-MLAktiv
NPU (Versal AI Edge Gen 2)VEK385 und andere Gen-2-BauteileVitis AI 6.3 (Docker)AMD Quark.raiONNX Runtime Vitis AI EP oder VART-MLAktiv
Der DPU-Ablauf wird nicht mehr weiterentwickelt

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.

Ryzen AI-Laptops verwenden einen anderen Software-Stack

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:#fff

YOLO-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:#fff

Die 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).

OperatorEinsatzort in YOLODPU (Zynq UltraScale+, Kria)NPU (Versal AI Edge Gen 2)
Faltung + Batch-NormalisierungJeder Conv-Block✅✅
SiLU-AktivierungJeder Conv-Block (Standardaktivierung)❌ Wird auf der CPU ausgeführt; durch Hard-Swish ersetzen✅
Hard-Swish, ReLU, ReLU6, LeakyReLUOptionale Aktivierungen in der Modell-YAML-Datei✅ In die Faltung integriert✅
SigmoidKlassenwerte im Detektionskopf❌ Wird auf der CPU ausgeführt (meist Teil der Nachbearbeitung)✅
MatMul zwischen zwei AktivierungenAttention-Blöcke (C2PSA; YOLO26 C3k2)❌ Wird auf der CPU ausgeführt✅
SoftmaxAttention-Blöcke; DFL in YOLOv8 und YOLO11❌ Wird auf der CPU ausgeführt✅
Umformen, TransponierenAttention-Blöcke⚠️ Wenn möglich integriert, andernfalls auf der CPU ausgeführt✅
Aufteilen, AusschneidenC3k2- und C2f-Blöcke⚠️ In Teilbereiche umgewandelt; Compilerbericht prüfen✅
Resize (Hochskalieren mit nächstem Nachbarn)Hochskalierung im Neck✅✅
MaxPool, Concat, AddSPPF-Block und Zusammenführen von Merkmalen✅✅
TopK, GatherElementsNMS-freier YOLO26-Kopf (nms=False)❌ Wird auf der CPU ausgeführt⚠️ CPU-Aufteilung auf dem Arm-Host
NonMaxSuppressionNur 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-Kopf: kein DFL und eine optionale NMS-freie Ausgabe

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 mode

Erstelle anschließend das Modell, übertrage die vortrainierten YOLO26-Gewichte und führe auf deinem Datensatz eine Feinabstimmung durch:

Ein YOLO26-Modell mit Hard-Swish feinabstimmen
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.

Alternativen zum erneuten Trainieren
  • Beim Quantisieren austauschen: Setze "convert_silu_to_hswish": true in 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:

  1. Die CPU-Blöcke akzeptieren. Das kompilierte .xmodel enthä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.

  2. Eine YAML-Datei ohne Attention verwenden. Ersetze in deiner Hard-Swish-YAML-Datei den C2PSA-Layer durch nn.Identity, damit die von Concat und Detect verwendeten 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.

  3. 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#

ModellDPU (Zynq UltraScale+, Kria)NPU (Versal AI Edge Gen 2)
YOLO26Mit Hard-Swish trainieren; zwei Attention-Blöcke werden zu CPU-Untergraphen; kein DFLVoraussichtlich ohne Änderungen ausführbar; auf deiner Platine überprüfen
YOLO11Mit Hard-Swish trainieren; C2PSA und DFL-Softmax werden auf der CPU ausgeführtVoraussichtlich ohne Änderungen ausführbar; auf deiner Platine überprüfen
YOLOv8Mit Hard-Swish trainieren; DFL-Softmax wird auf der CPU ausgeführtAMDs 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:#fff

Schritt 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.

Exportieren
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 ONNX Runtime-Build beibehalten

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:

  1. Starte AMDs Vitis AI 6.3-Docker-Image für Versal AI Edge Gen 2. Siehe die Systemanforderungen.
  2. Quantisiere das ONNX-Modell mit AMD Quark und der Konfiguration VINT8 auf INT8. AMDs Minimalkonfiguration erfordert außerdem Int32Bias=False, enable_npu_cnn=True, DedicatedQDQPair=True und QuantizeAllOpTypes=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.
  3. 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.
  4. 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.json hinzu. Diese Artefakte können nicht über ONNX Runtime ausgeführt werden.
  5. Kompiliere, indem du eine ONNX-Runtime-Sitzung mit VitisAIExecutionProvider und einem vitisai_config.json erstellst, das dein Zielgerät angibt. Beim Kompilieren wird eine Datei .rai in 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:

ArbeitsablaufAuf das Board zu kopierende ArtefakteLaufzeitumgebung auf der Platine
DPU (Zynq UltraScale+, Kria)Kompiliertes .xmodelVART; Graph Runner für CPU-Teilgraphen
NPU (Versal AI Edge, VEK280)Verzeichnis der MomentaufnahmeVART-ML
NPU (Versal AI Edge Gen 2), ORTFür die Kompilierung verwendetes FP32- oder quantisiertes ONNX-Modell, vitisai_config.json und das kompilierte Cache-VerzeichnisONNX Runtime mit dem Vitis-AI-EP
NPU (Versal AI Edge Gen 2), VART-MLDatei .rai (mit CPU-Partitionierungspässen, falls ein Operator auf der CPU ausgeführt wird) sowie eine VART-ML-Runner-KonfigurationVART-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:

  • nms nicht gesetzt: Erkennungsmodelle geben einen (1, 4 + nc, anchors)-Tensor mit xywh Boxen 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-Funktion non_max_suppression fü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-KonfigurationHardwaremAP50-95 (COCO)
FP32 ONNXHost-CPU49.95
BF16VEK385 NPU50.29
VINT8-quantisiert, FP32-AbschlussHost-CPU48.75
VINT8 mit BF16-AbschlussVEK385 NPU48.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.

Lizenzierung für kommerzielle Produkte

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 mit vai_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 .xmodel ist ein serialisierter XIR-Graph, der in der AMD-DPU-Werkzeugkette verwendet wird. Der Quantisierer schreibt ein quantisiertes .xmodel, und der Compiler vai_c_xir wandelt es in ein kompiliertes .xmodel um. 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 einen arch.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_pytorch im Vitis-AI-3.5-Docker-Image, kompiliere es mit vai_c_xir für das arch.json des KV260 und führe das resultierende .xmodel auf 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.

Mitwirkende

Kommentare