Esportazione AMD Xilinx per Ultralytics YOLO con Vitis AI#
L'esportazione dei modelli Ultralytics YOLO26 con format="xilinx" li quantizza con AMD Quark per la NPU dei SoC adattivi AMD Versal AI Edge Series Gen 2, pronti per la compilazione di un modello .rai con il compilatore Vitis AI di AMD. La stessa esportazione convalida la precisione INT8 su qualsiasi host prima della distribuzione.
L'esportazione è destinata al flusso NPU Vitis AI attualmente mantenuto per dispositivi Versal AI Edge Series Gen 2, come il kit di valutazione VEK385. Le DPU Zynq UltraScale+ e Kria e la NPU Versal AI Edge di prima generazione (VEK280) usano altri flussi Vitis AI, descritti in Distribuzione su altre destinazioni AMD Xilinx.
I dispositivi AMD Xilinx sono alla base di molte telecamere industriali, sistemi di visione per il settore automobilistico, robot, droni e prodotti di diagnostica per immagini nel mondo. Combinano processori Arm con logica programmabile e, nei dispositivi più recenti, AI Engine dedicati; così, un singolo chip può acquisire video, preelaborarlo, eseguire il rilevamento di oggetti e agire in base al risultato con una latenza di inferenza bassa e prevedibile.
Questa guida illustra l'esportazione AMD Xilinx, come compilarla ed eseguirla su una scheda Versal, le famiglie di dispositivi AMD Xilinx, il funzionamento dell'AI su questi dispositivi e gli operatori Ultralytics YOLO supportati da ciascun acceleratore.
Che cos'è AMD Xilinx?#
Xilinx ha inventato il field-programmable gate array (FPGA), ovvero l'array di gate programmabile sul campo, negli anni '80 ed è diventata un fornitore leader di SoC e FPGA adattivi. AMD ha completato l'acquisizione di Xilinx nel febbraio 2022 e ora commercializza queste linee di prodotti con il marchio AMD: AMD Zynq, AMD Kria, AMD Versal e AMD Vitis.
Entrambi i nomi si riferiscono agli stessi prodotti. AMD li commercializza come "SoC e FPGA adattivi", ma gli ingegneri continuano a usare comunemente "Xilinx". I codici prodotto mantengono il prefisso XC (ad esempio xczu7ev), mentre il vecchio repository Vitis AI e le immagini Docker sono ancora disponibili con il nome Xilinx su GitHub e Docker Hub. Questa guida usa "AMD Xilinx" così puoi trovarla con entrambi i nomi.
Termini e concetti chiave#
La distribuzione AMD Xilinx usa un vocabolario specifico. La tabella seguente spiega tutti i termini usati in questa guida.
| Termine | Cosa significa |
|---|---|
| FPGA | Array di gate programmabile sul campo: chip la cui logica digitale viene configurata dopo la produzione caricando un progetto, chiamato bitstream. Può implementare hardware personalizzato, come pipeline video o acceleratori di reti neurali. |
| Logica programmabile (PL) | La struttura FPGA all'interno di un SoC AMD Xilinx. Nei dispositivi Zynq e Kria, l'acceleratore AI è realizzato nella PL. |
| Sistema di elaborazione (PS) | I core CPU Arm, i controller di memoria e le periferiche integrate del SoC. Esegue Linux, la tua applicazione e gli eventuali livelli del modello che l'acceleratore non è in grado di eseguire. |
| SoC adattivo / MPSoC | Un sistema su chip che combina un sistema di elaborazione con logica programmabile e, in molti dispositivi Versal, anche AI Engine. MPSoC significa sistema multiprocessore su chip. |
| AI Engine (AIE, AIE-ML, AIE-MLv2) | Array di processori vettoriali integrati in molti dispositivi Versal, compresa la serie Versal AI Edge descritta qui, progettati per il machine learning e l'elaborazione dei segnali. |
| DPU | Unità di elaborazione per il deep learning: l'acceleratore di reti neurali INT8 di AMD, fornito come IP integrato nella PL (ad esempio DPUCZDX8G su Zynq UltraScale+ e Kria). Le dimensioni, da B512 a B4096, indicano il numero massimo di operazioni per ciclo di clock. |
| NPU / IP NPU | Unità di elaborazione neurale: l'acceleratore di inferenza di ultima generazione di AMD, che nelle versioni recenti di Vitis AI sostituisce la DPU. AMD descrive il proprio IP NPU come un acceleratore soft che combina AI Engine e logica programmabile, quindi richiede anche un progetto hardware corrispondente. Consulta la voce del glossario NPU. |
| Vitis AI | La toolchain di AMD per distribuire reti neurali sui dispositivi AMD Xilinx. Include quantizzazione, compilazione, runtime, esempi e ambienti Docker. |
| AMD Quark | La libreria AMD corrente per la quantizzazione dei modelli, utilizzata dal flusso Versal AI Edge Gen 2 per convertire un modello ONNX FP32 in un modello INT8. |
| Quantizzazione, PTQ e QAT | Conversione dei pesi e delle attivazioni FP32 in INT8. La quantizzazione post-addestramento (PTQ) usa immagini di calibrazione. L'addestramento con consapevolezza della quantizzazione (QAT) perfeziona il modello per recuperare accuratezza. |
| Immagini di calibrazione | Un piccolo insieme rappresentativo di immagini elaborato dal modello durante la PTQ per scegliere la scala INT8 di ciascun tensore. |
| BF16 e precisione mista | BFloat16 è un formato in virgola mobile a 16 bit che mantiene l'intervallo di FP32. La precisione mista esegue la maggior parte della rete in INT8 e i livelli sensibili in BF16. |
| XIR | Rappresentazione intermedia Xilinx: il formato del grafo prodotto dal compilatore DPU e letto dal runtime. |
.xmodel | Un grafo XIR serializzato. Il quantizzatore scrive un .xmodel quantizzato, quindi il compilatore DPU lo trasforma in un .xmodel compilato, con istruzioni DPU, pesi quantizzati ed eventuali sottografi CPU. Il modello compilato richiede la configurazione DPU corrispondente. |
arch.json / impronta DPU | Il file che descrive una specifica configurazione DPU. È necessario al compilatore DPU e un .xmodel compilato per una determinata impronta non funzionerà con un'altra. |
| Snapshot | La directory del modello compilato prodotta dal flusso NPU Versal AI Edge (VEK280). È vincolata a una variante specifica dell'IP NPU. |
.rai | Il file del modello compilato prodotto dal flusso NPU Versal AI Edge Gen 2. |
| VART / VART-ML | Le librerie Vitis AI Runtime che caricano i modelli compilati e li eseguono sulla scheda, con API C++ e Python. |
| ONNX Runtime Vitis AI EP | L'VitisAIExecutionProvider per ONNX Runtime, che compila ed esegue modelli ONNX sulle NPU AMD. |
| Fallback CPU / partizionamento del grafo | Quando l'acceleratore non è in grado di eseguire un operatore, in genere il compilatore suddivide il modello in sottografi per l'acceleratore e per la CPU; ogni suddivisione aggiunge un trasferimento di dati che può dominare la latenza. Alcuni operatori, invece, impongono l'esecuzione dell'intero modello sulla CPU o causano un errore di compilazione. |
Famiglie di dispositivi AMD Xilinx per l'AI edge#
I dispositivi AMD Xilinx per l'AI edge appartengono a tre famiglie. Zynq e Kria usano la DPU nella logica programmabile, mentre i dispositivi Versal AI Edge descritti qui usano la NPU sui rispettivi AI Engine.
| Famiglia | Descrizione | CPU dell'applicazione | Acceleratore AI | Schede di esempio |
|---|---|---|---|---|
| Zynq UltraScale+ MPSoC | CPU Arm e logica FPGA su un unico chip, in dimensioni da ZU1 a ZU19 | Arm Cortex-A53 dual-core o quad-core | DPU integrata nella logica programmabile | ZCU104, ZCU102, schede personalizzate |
| System-on-Module Kria K26 | Modulo pronto per la produzione, basato su un MPSoC Zynq UltraScale+ | Arm Cortex-A53 quad-core | DPU integrata nella logica programmabile | KV260 Vision AI Starter Kit, KR260 Robotics Starter Kit |
| Serie Versal AI Edge | SoC adattivi; i componenti AIE-ML come VE2302 e VE2802 eseguono la NPU | Arm Cortex-A72 dual-core | NPU su AI Engine AIE-ML e PL | VEK280 |
| Serie Versal AI Edge Gen 2 | SoC adattivo di nuova generazione con AI Engine AIE-MLv2 | Fino a otto Arm Cortex-A78AE | NPU su AI Engine AIE-MLv2 e PL | VEK385 |
MPSoC Zynq UltraScale+#
Ogni chip Zynq UltraScale+ abbina la logica FPGA a un sistema di elaborazione Arm, con core Cortex-A53 dual-core (CG) o quad-core (EG ed EV) e core Cortex-R5F in tempo reale. I dispositivi EV aggiungono un codec video H.264/H.265 integrato. Per eseguire reti neurali, i progettisti integrano una DPU nella logica, accanto alle pipeline della videocamera e del video. Nei dispositivi più piccoli la DPU deve condividere lo spazio con il resto del progetto.
System-on-Module Kria#
Il modulo Kria K26 integra un MPSoC Zynq UltraScale+, memoria e alimentazione in un modulo pronto per la produzione, così non devi progettare autonomamente il processore, la memoria e il sottosistema di alimentazione. Il modulo si collega a una scheda carrier, che può essere quella di un kit di sviluppo o una tua scheda. È alla base del KV260 Vision AI Starter Kit per le telecamere intelligenti e del KR260 Robotics Starter Kit per la robotica. Poiché il K26 è basato su Zynq UltraScale+, usa lo stesso flusso DPU. La gamma Kria comprende anche altri moduli: verifica quale processore usa il tuo modulo prima di scegliere un flusso.
SoC adattivi Versal#
Versal è la famiglia di SoC adattivi di AMD. Le serie AI Edge e AI Core aggiungono AI Engine integrati accanto ai core Arm e alla logica programmabile, mentre alcune altre serie Versal non dispongono di AI Engine. L'IP NPU di AMD usa insieme AI Engine e logica programmabile, e Vitis AI è destinato ai componenti AIE-ML della serie AI Edge, come VE2302 e VE2802. La serie Versal AI Edge (kit di valutazione VEK280) e la serie Versal AI Edge Gen 2 (kit di valutazione VEK385) sono gli attuali target di AMD per l'AI edge e l'obiettivo delle versioni correnti di Vitis AI.
Come funziona l'AI sui dispositivi AMD Xilinx: DPU e NPU a confronto#
La maggior parte delle distribuzioni AI AMD Xilinx segue lo stesso schema. L'acceleratore esegue i livelli supportati, la CPU Arm gestisce la preelaborazione, la post-elaborazione e gli eventuali livelli non supportati dall'acceleratore, mentre un runtime sulla scheda coordina le due componenti.
AMD ha distribuito due generazioni di acceleratori, ciascuna con la propria toolchain e il proprio file del modello compilato. Questa guida tratta Vitis AI 3.5 per la DPU e Vitis AI 6.3 per la NPU; consulta la documentazione AMD aggiornata per le versioni successive.
| Flusso | Hardware | Toolchain | Quantizzatore | Artefatto compilato | Runtime della scheda | Stato |
|---|---|---|---|---|---|---|
| DPU | Zynq UltraScale+, Kria | Vitis AI 3.5 (Docker) | vai_q_pytorch | .xmodel | VART | Compilatore congelato, zoo dei modelli e IP DPU |
| NPU (Versal AI Edge) | VEK280 e altri componenti Versal AI Edge | Vitis AI 6.3 (Docker) | Integrato nel flusso di snapshot | Snapshot | VART-ML | Attivo |
| NPU (Versal AI Edge Gen 2) | VEK385 e altri componenti Gen 2 | Vitis AI 6.3 (Docker) | AMD Quark | .rai | ONNX Runtime Vitis AI EP o VART-ML | Attivo |
Vitis AI 3.5 è l'ultima versione con aggiornamenti al compilatore DPU e allo zoo di modelli. Le versioni successive nel repository Xilinx/Vitis-AI mantengono invariati il compilatore, lo zoo di modelli e l'IP DPU di Zynq UltraScale+, aggiornando al contempo il runtime e la compatibilità con le versioni più recenti degli strumenti AMD (vedi le note di rilascio di Vitis AI 5.0); la documentazione Vitis AI attuale di AMD descrive invece la NPU come sostituta dell'architettura DPU deprecata. I prodotti Zynq UltraScale+ e Kria esistenti possono continuare a essere distribuiti con la DPU, ma il supporto agli operatori non verrà ampliato, quindi le architetture dei modelli più recenti richiedono gli adattamenti descritti in Compatibilità dei modelli YOLO.
Anche i processori AMD Ryzen AI per PC integrano una NPU, ma utilizzano lo stack separato Ryzen AI Software, anziché i flussi Vitis AI embedded descritti in questa guida. Per le GPU AMD Instinct e Radeon, consulta Integrazione delle GPU AMD.
Quale flusso Vitis AI mi serve?#
Scegli il flusso in base al dispositivo presente sulla tua scheda:
Esportazione su AMD Xilinx: convertire il modello YOLO#
Attività supportate#
L'esportazione AMD Xilinx supporta tutti e sette i task Ultralytics. La segmentazione semantica e la stima della profondità sono disponibili solo con YOLO26, l'unica famiglia che include queste teste.
| Attività | YOLOv8 | YOLO11 | YOLO26 |
|---|---|---|---|
| Rilevamento | ✅ | ✅ | ✅ |
| Segmentazione | ✅ | ✅ | ✅ |
| Semantica | ❌ | ❌ | ✅ |
| Profondità | ❌ | ❌ | ✅ |
| Classificazione | ✅ | ✅ | ✅ |
| Stima della posa | ✅ | ✅ | ✅ |
| OBB | ✅ | ✅ | ✅ |
Installazione#
L'esportazione AMD Xilinx funziona su Linux (x86-64 o ARM64) con Python da 3.11 a 3.13, le versioni supportate da AMD Quark. La prima esportazione compila anche gli operatori personalizzati di Quark, per cui serve un compilatore C++, ad esempio g++.
# Install the required package for YOLO
pip install ultralyticsAMD Quark viene installato automaticamente da PyPI alla prima esportazione. Per preinstallare le dipendenze necessarie all'esportazione:
pip install "ultralytics[export-xilinx]"Per installare il repository in modalità modificabile, sostituisci "ultralytics[export-xilinx]" con -e ".[export-base,export-xilinx]". Per riprodurre l'ambiente Python 3.12 e l'esportazione di prova usati da CI, esegui il generatore di ambienti esistente dalla directory principale del repository:
ULTRALYTICS_ISOLATED_VENVS="$PWD/.venvs" python .github/scripts/create-export-env.py --env isolated-xilinxUtilizzo#
Il formato AMD Xilinx supporta le modalità Esporta, Predici e Convalida. Senza AMD Vitis AI Execution Provider, la predizione e la convalida eseguono il modello quantizzato sulla CPU con ONNX Runtime, misurandone la precisione INT8 su qualsiasi host. Quando ONNX Runtime rende disponibile VitisAIExecutionProvider, come su una scheda Versal AI Edge Series Gen 2, Ultralytics lo seleziona automaticamente.
from ultralytics import YOLO
# Carica un modello YOLO26
model = YOLO("yolo26n.pt")
# Esporta nel formato AMD Xilinx per VEK385 (quantize=8 viene applicato automaticamente)
model.export(format="xilinx") # creates 'yolo26n_xilinx_model/'from ultralytics import YOLO
# Carica il modello AMD Xilinx esportato
model = YOLO("yolo26n_xilinx_model")
# Esegui l'inferenza
results = model("https://ultralytics.com/images/bus.jpg")from ultralytics import YOLO
# Carica il modello AMD Xilinx esportato
model = YOLO("yolo26n_xilinx_model")
# Convalida la precisione INT8 sul dataset COCO8
metrics = model.val(data="coco8.yaml")I nomi dei formati vitis, vitisai e versal sono alias di xilinx.
Argomenti di esportazione#
| Argomento | Tipo | Predefinito | Descrizione |
|---|---|---|---|
format | str | 'xilinx' | Formato di destinazione del modello esportato, che ne definisce la compatibilità con le NPU AMD Versal AI Edge Series Gen 2. |
imgsz | int o tuple | 640 | Dimensione desiderata dell'immagine in input del modello, espressa come numero intero per immagini quadrate oppure come tupla (height, width). Il modello esportato ha una dimensione batch fissa pari a 1. |
quantize | int o str | 8/auto | Precisione di quantizzazione. 8 (Vitis AI INT8) è obbligatorio e viene abilitato automaticamente se non specificato. |
data | str | None | File YAML del dataset usato per la calibrazione INT8; per la classificazione, invece, accetta una directory di dataset o il nome di un dataset integrato. Se omesso, Ultralytics usa il dataset di calibrazione del task, ad esempio coco128.yaml per il rilevamento. |
fraction | float | 1.0 | Frazione del dataset di calibrazione da usare. |
name | str | 've2-xc2ve3858' | Dispositivo per il compilatore Vitis AI: 've2-xc2ve3858' (kit di valutazione VEK385), 've2-xc2ve3804', 've2-xc2ve3558', 've2-xc2ve3504', 've2-xc2ve3358' o 've2-xc2ve3304'. |
opset | int | None | Opset ONNX per il grafo intermedio. Il valore predefinito è 17, l'opset convalidato da AMD per YOLO su Vitis AI. |
simplify | bool | True | Semplifica il grafo ONNX intermedio con onnxslim. |
device | str | None | Specifica il dispositivo da usare per l'esportazione: GPU (device=0) o CPU (device=cpu). |
Imposta nms=False per esportare la testa YOLO26 senza NMS. La NMS incorporata (nms=True) non è supportata, perché AMD include NonMaxSuppression tra gli operatori che possono costringere l'intero modello a essere eseguito sulla CPU.
La precisione INT8 dipende da quanto le immagini di calibrazione rappresentano la scena di distribuzione. Passa a data= un file YAML del dataset con almeno 300 immagini rappresentative delle tue telecamere; i dataset di calibrazione predefiniti sono piccoli campioni pubblici.
Per ulteriori dettagli sul processo di esportazione, visita la pagina della documentazione Ultralytics dedicata all'esportazione.
Struttura dell'output#
Dopo un'esportazione riuscita, viene creata una directory del modello con la seguente struttura:
yolo26n_xilinx_model/
├── yolo26n.onnx # AMD Quark VINT8 model with the Ultralytics metadata
└── vitisai_config.json # Vitis AI compiler configuration for the target deviceLa compilazione del modello, descritta di seguito, aggiunge una cache del compilatore yolo26n/ alla stessa directory, contenente il modello NPU yolo26n.rai e i report di compilazione di AMD, come final-vaiml-pass-summary.txt.
Come funziona l'esportazione#
L'esportazione segue il flusso Vitis AI documentato da AMD per Versal AI Edge Series Gen 2:
- Esportazione ONNX con opset 17 e dimensione batch statica pari a 1.
- Quantizzazione AMD Quark con la configurazione
VINT8(INT8 simmetrico con scale basate su potenze di due) e le opzioni richieste da AMD per la compilazione NPU:Int32Bias=False,enable_npu_cnn=True,DedicatedQDQPair=TrueeQuantizeAllOpTypes=True. La calibrazione usa il loader standard di Ultralytics per la calibrazione INT8, con lo stesso letterbox e lo stesso preprocessing RGB e 0–1 usati in inferenza. - Precisione mista: la testa del modello rimane in virgola mobile e il compilatore Vitis AI la esegue sulla NPU in BF16. Quantizzare la testa in INT8 causa gran parte della perdita di precisione; per lo stesso motivo, il tutorial YOLOv8m di AMD lascia la parte finale di post-processing fuori da INT8.
- Configurazione del compilatore:
vitisai_config.jsonseleziona la destinazioneVAIMLe il dispositivo daname.
Precisione#
La tabella confronta il modello INT8 esportato con il modello ONNX FP32 sul set val2017 di COCO (5.000 immagini) a 640, eseguendo entrambi con ONNX Runtime sulla CPU dell'host. I modelli INT8 sono stati calibrati sul dataset predefinito coco128.yaml; calibrare sui tuoi dati di distribuzione in genere riduce il divario.
Questi risultati su host eseguono il modello quantizzato con ONNX Runtime sulla CPU, che è il riferimento usato da metodologia di precisione di AMD per confrontare i risultati sulla NPU. I risultati pubblicati da AMD per YOLOv8m su VEK385 mostrano lo stesso approccio a precisione mista sulla NPU:
| Configurazione YOLOv8m | Hardware | mAP50-95 (COCO) |
|---|---|---|
| ONNX FP32 | CPU host | 49.95 |
| BF16 | NPU VEK385 | 50.29 |
| VINT8 quantizzato, parte finale FP32 | CPU host | 48.75 |
| VINT8 con parte finale BF16 | NPU VEK385 | 48.38 |
Fonte: tutorial di AMD su YOLOv8m per Versal AI Edge Gen 2, che riporta anche un tempo medio di inferenza di 10.69 ms su 100 esecuzioni VART a dp_size=1.
Compilazione ed esecuzione su Versal AI Edge Gen 2#
La directory esportata è pronta per il compilatore Vitis AI di AMD, che crea il modello .rai eseguito sulla NPU.
-
Prepara l'host e la scheda. Compila su un host Linux x86-64 con l'immagine Docker Vitis AI 6.3 per Versal AI Edge Gen 2 di AMD e una licenza del compilatore AMD AI Engine (consulta la pagina delle licenze AMD). Configura VEK385 seguendo la guida di configurazione della scheda di AMD.
-
Compila. Nel container, crea una sessione ONNX Runtime con Vitis AI Execution Provider, come nella guida alla compilazione di AMD. La sessione scrive nella directory di esportazione la cache
yolo26n/conyolo26n.rai:import onnxruntime as ort d = "yolo26n_xilinx_model" options = {"config_file": f"{d}/vitisai_config.json", "cache_dir": d, "cache_key": "yolo26n", "target": "VAIML"} ort.InferenceSession(f"{d}/yolo26n.onnx", providers=["VitisAIExecutionProvider"], provider_options=[options])Controlla
yolo26n_xilinx_model/yolo26n/final-vaiml-pass-summary.txtper sapere quale parte del modello viene eseguita sulla NPU. Per YOLO26n a 640, il compilatore AMD Vitis AI 6.3 colloca il 99,9% degli operatori e dei calcoli sulla NPU VEK385 in un'unica partizione. -
Esegui sulla scheda. Copia la directory di esportazione su VEK385. ONNX Runtime con Vitis AI Execution Provider carica
yolo26n.raicompilato e lo esegue sulla NPU;YOLO("yolo26n_xilinx_model")seleziona automaticamente questo provider quando è disponibile.
Per la compilazione basta ONNX Runtime di AMD: esporta su qualsiasi macchina Linux e copia la directory nel container, invece di installarvi Ultralytics, perché questo potrebbe modificare i pacchetti bloccati del container. Quando Ultralytics è installato insieme alla build AMD onnxruntime-vitisai, come sulla scheda, mantiene quella build invece di sostituirla con onnxruntime standard.
L'esportazione configura la compilazione standard per ONNX Runtime, che esegue direttamente sulla CPU Arm gli operatori incompatibili con la NPU, come la selezione top-k di YOLO26 con nms=False. Il runtime AMD VART-ML esegue un modello solo se tutti gli operatori sono sulla NPU, a meno che tu non aggiunga i passaggi di partizionamento della CPU di AMD a vitisai_config.json; questi artefatti non possono essere eseguiti tramite ONNX Runtime.
Compatibilità dei modelli YOLO e operatori supportati#
Un acceleratore velocizza solo gli operatori implementati nell'hardware. Se un modello contiene un operatore non supportato, il compilatore in genere assegna quella parte della rete alla CPU Arm e ogni passaggio tra acceleratore e CPU aggiunge latenza. Alcuni operatori non possono essere suddivisi: sulla NPU Versal AI Edge Gen 2, AMD indica operatori come NonZero e NonMaxSuppression che possono costringere l'intero modello a essere eseguito sulla CPU. Il supporto degli operatori è il fattore più importante per le prestazioni dei modelli YOLO sull'hardware AMD Xilinx.
La tabella mostra dove viene eseguito ciascun operatore in un modello YOLO26. Un'esportazione ONNX standard di YOLO26n contiene 87 attivazioni SiLU, ognuna esportata come Sigmoid e Mul, oltre a 4 operatori MatMul e 2 operatori Softmax dai suoi due blocchi di attenzione: il blocco C2PSA alla fine del backbone (layer 10) e il blocco C3k2 con attenzione abilitata che produce l'output P5 (layer 22).
| Operatore | Posizione nel modello YOLO | DPU (Zynq UltraScale+, Kria) | NPU (Versal AI Edge Gen 2) |
|---|---|---|---|
| Convoluzione + normalizzazione batch | Ogni blocco Conv | ✅ | ✅ |
| Attivazione SiLU | Ogni blocco Conv (attivazione predefinita) | ❌ Viene eseguito sulla CPU; sostituiscilo con Hard-Swish | ✅ |
| Hard-Swish, ReLU, ReLU6, LeakyReLU | Attivazioni facoltative impostate nel file YAML del modello | ✅ Fuso nella convoluzione | ✅ |
| Sigmoid | Punteggi delle classi nella testa di rilevamento | ❌ Viene eseguito sulla CPU (di solito fa parte della post-elaborazione) | ✅ |
| MatMul tra due attivazioni | Blocchi di attenzione (C2PSA; C3k2 di YOLO26) | ❌ Viene eseguito sulla CPU | ✅ |
| Softmax | Blocchi di attenzione; DFL in YOLOv8 e YOLO11 | ❌ Viene eseguito sulla CPU | ✅ |
| Reshape, Transpose | Blocchi di attenzione | ⚠️ Fuso quando possibile, altrimenti eseguito sulla CPU | ✅ |
| Split, Slice | Blocchi C3k2 e C2f | ⚠️ Convertito in slice; controlla il rapporto del compilatore | ✅ |
| Resize (upsampling nearest) | Upsampling del neck | ✅ | ✅ |
| MaxPool, Concat, Add | Blocco SPPF e fusione delle feature | ✅ | ✅ |
| TopK, GatherElements | Testa YOLO26 senza NMS (nms=False) | ❌ Viene eseguito sulla CPU | ⚠️ Partizione sulla CPU nell'host Arm |
| NonMaxSuppression | Solo se esportato con nms=True | ❌ Viene eseguito sulla CPU | ❌ Può costringere il modello a essere eseguito sulla CPU |
Fonti: operatori supportati UG1414 di AMD, supporto degli operatori PyTorch e gli elenchi degli operatori supportati, partizionati sulla CPU e non supportati di Versal AI Edge Gen 2. Il supporto dipende anche dalla configurazione della DPU e dai pattern del grafo, quindi controlla sempre il rapporto di partizionamento del compilatore.
YOLO26 elimina la Distribution Focal Loss (DFL), quindi, a differenza di YOLO11 e YOLOv8, gli output delle bounding box non richiedono la decodifica softmax. Aggiunge inoltre un secondo blocco di attenzione rispetto a YOLO11, quindi confronta i rapporti del compilatore specifici per il target e i benchmark sul dispositivo prima di scegliere un modello. Le esportazioni con nms non impostato mantengono la testa one-to-many e richiedono NMS sulla CPU, come gli altri modelli YOLO. Esporta con nms=False per usare invece la testa one-to-one senza NMS di YOLO26, che sostituisce NMS con una selezione top-k leggera eseguita sulla CPU.
Rendi YOLO26 compatibile con la DPU usando Hard-Swish#
La DPU fonde nelle convoluzioni solo ReLU, ReLU6, LeakyReLU, Hard-Swish e Hard-Sigmoid. Hard-Swish è un'approssimazione di SiLU adatta all'hardware, perciò è la sostituzione più naturale. I file YAML dei modelli Ultralytics accettano una chiave activation che modifica l'attivazione predefinita dei blocchi Conv (Guida alla configurazione YAML del modello).
Copia yolo26.yaml in yolo26-hswish.yaml e aggiungi una riga sotto i parametri:
# Parameters
nc: 80 # number of classes
activation: nn.Hardswish() # default Conv activation, DPU-native
end2end: True # whether to use end-to-end modeQuindi crea il modello, trasferisci i pesi YOLO26 preaddestrati e esegui il fine-tuning sul tuo dataset:
from ultralytics import YOLO
# # Crea YOLO26n con attivazioni Hard-Swish; la 'n' nel nome indica la scala nano
model = YOLO("yolo26n-hswish.yaml").load("yolo26n.pt") # # trasferisci i pesi preaddestrati
# # Esegui il fine-tuning per adattare la rete a Hard-Swish
model.train(data="coco8.yaml", epochs=100, imgsz=640)Le attivazioni non hanno pesi, quindi tutti i pesi preaddestrati vengono trasferiti. Il grafo ONNX esportato contiene quindi 87 operatori HardSwish e nessun SiLU. Sostituisci coco8.yaml con il tuo dataset e confronta la precisione con quella del modello SiLU usando Val mode prima della distribuzione.
- Sostituzione durante la quantizzazione: imposta
"convert_silu_to_hswish": truenella configurazione JSON del quantizzatore PyTorch di Vitis AI 3.5 per sostituire SiLU durante la quantizzazione. Evita una sessione di addestramento, ma di solito comporta una maggiore perdita di precisione, che il fine-tuning rapido AMD o QAT possono recuperare in parte. Consulta la guida alla configurazione di vai_q_pytorch. - LeakyReLU: la DPU implementa LeakyReLU con una pendenza negativa fissa di 26/256 (circa 0.1). Se usi LeakyReLU, addestra con
activation: nn.LeakyReLU(0.1015625)affinché le pendenze in addestramento e in distribuzione corrispondano.
Gestione dei blocchi di attenzione sulla DPU#
YOLO26 applica l'attenzione alla risoluzione più bassa (una griglia 20×20 con input 640) in due punti: il blocco C2PSA al layer 10 e il blocco C3k2 con attenzione abilitata al layer 22. YOLO11 ha un solo blocco C2PSA. Su una DPU, gli operatori MatMul e Softmax vengono eseguiti sulla CPU, suddividendo il modello in sottografi DPU e CPU alternati. Hai tre opzioni:
-
Accetta i blocchi sulla CPU. Il modello compilato
.xmodelconterrà quindi sottografi CPU: eseguilo con il Graph Runner di AMD, che esegue insieme i sottografi DPU e CPU quando è disponibile un'implementazione CPU per ogni operatore; altrimenti devi implementare e registrare gli operatori mancanti. Con una griglia 20×20, il calcolo dell'attenzione è ridotto, ma ogni trasferimento aggiuntivo tra DPU e CPU introduce latenza, quindi misurala sulla tua scheda. -
Usa un file YAML senza attenzione. Nel tuo file YAML Hard-Swish, sostituisci il layer C2PSA con
nn.Identityaffinché gli indici dei layer usati daConcateDetectrestino validi, quindi disabilita l'attenzione nel 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)Il grafo ONNX esportato non contiene quindi operatori MatMul o Softmax. I pesi dell'attenzione non sono più applicabili (vengono trasferiti 624 dei 666 pesi di YOLO26n), quindi esegui il fine-tuning più a lungo e confronta la precisione con Val mode.
-
Usa un modello senza attenzione, come YOLOv8, che AMD ha utilizzato nei propri esempi DPU.
Su Versal AI Edge Gen 2, gli operatori di attenzione sono elencati tra quelli supportati dalla NPU, quindi di solito queste modifiche non sono necessarie. Verifica il posizionamento nel rapporto del compilatore, perché AMD segnala che gli operatori supportati possono comunque essere eseguiti sulla CPU a causa di vincoli di configurazione o memoria.
Compatibilità dei modelli a colpo d'occhio#
| Modello | DPU (Zynq UltraScale+, Kria) | NPU (Versal AI Edge Gen 2) |
|---|---|---|
| YOLO26 | Addestramento con Hard-Swish; due blocchi di attenzione diventano sottografi CPU; niente DFL | Esportazione nativa format="xilinx"; la testa viene eseguita in BF16 |
| YOLO11 | Addestramento con Hard-Swish; C2PSA e softmax DFL vengono eseguiti sulla CPU | Esportazione nativa format="xilinx"; la testa viene eseguita in BF16 |
| YOLOv8 | Addestramento con Hard-Swish; softmax DFL viene eseguito sulla CPU | Esportazione nativa format="xilinx". Tutorial YOLOv8m di AMD (Vitis AI 6.3, VEK385, INT8 con parte finale BF16): il report del compilatore mostra 1.181 operatori (99,915%) e il 99,994% delle operazioni GOP sulla NPU, senza modifiche al modello |
Distribuzione su altre destinazioni AMD Xilinx#
Le DPU Zynq UltraScale+ e Kria e la NPU Versal AI Edge di prima generazione usano flussi Vitis AI che format="xilinx" non produce. Addestra con Ultralytics, poi crea l'artefatto per la destinazione con gli strumenti AMD nelle rispettive immagini Docker Linux x86-64. Scegli la scheda corrispondente al tuo dispositivo:
-
Avvia l'immagine Docker di AMD Vitis AI 6.3 per Versal AI Edge.
-
Attiva l'ambiente NPU per l'IP NPU sulla tua scheda eseguendo il comando
settings.sh. Passa come argomento il nome dell'IP NPU della tua scheda oppureLISTper visualizzare gli IP disponibili. -
Acquisisci uno snapshot eseguendo un normale script di inferenza su immagini rappresentative, con la variabile d'ambiente
VAISW_SNAPSHOT_DIRECTORYimpostata. Non sono necessarie modifiche al codice:# Activate the NPU environment inside the Vitis AI Docker container source $VITIS_AI_REPO/npu_ip/settings.sh # Capture a mixed INT8/BF16 snapshot, calibrating on 100 images from your inference script VAISW_SNAPSHOT_DIRECTORY=snapshot.yolo26n VAISW_FE_PRECISION=MIXED VAISW_QUANTIZATION_NBIMAGES=100 python3 my_inference.py
VAISW_FE_PRECISION accetta INT8 (predefinito), BF16 o MIXED, mentre VAISW_QUANTIZATION_NBIMAGES è impostato su 4 immagini; imposta quindi un numero più alto e rappresentativo per i modelli di rilevamento. Lo snapshot è associato alla variante IP NPU della tua scheda. Le parti finali di post-elaborazione YOLO vengono eseguite sugli AI Engine solo con precisione BF16 o MIXED. La documentazione di AMD presenta informazioni discordanti su Softmax: la pagina degli esempi afferma che Softmax non viene accelerato e assegna alla CPU la parte finale Softmax di YOLOv8, mentre le note di rilascio di Vitis AI 6.1 riportano l'accelerazione completa di YOLOv8 con precisione mista. Esamina il file wrp_network_iriz.onnx all'interno dello snapshot per verificare quali parti del modello, incluse l'attenzione di YOLO11 e YOLO26, vengono eseguite sulla NPU. Consulta usa il tuo modello.
Prepara la scheda con un progetto hardware e un'immagine Linux che includano la configurazione dell'acceleratore per cui hai compilato, oltre al runtime Vitis AI corrispondente. Consulta le guide di configurazione AMD per le destinazioni DPU Zynq UltraScale+ e Kria e Versal AI Edge (VEK280), quindi copia gli artefatti richiesti dal runtime:
| Flusso | Artefatti da copiare sulla scheda | Runtime della scheda |
|---|---|---|
| DPU (Zynq UltraScale+, Kria) | .xmodel compilato | VART; Graph Runner per i sottografi CPU |
| NPU (Versal AI Edge, VEK280) | Directory dello snapshot | VART-ML |
Sulla DPU, i buffer VART contengono valori INT8 a virgola fissa: recupera la forma e la scala fix_point di ogni tensore, quantizza gli input e dequantizza gli output prima del post-processing. Graph Runner restituisce gli output del grafo completo, mentre un runner limitato alla DPU restituisce gli output intermedi dei sottografi DPU, che il tuo codice deve completare. VART-ML su VEK280 usa per impostazione predefinita viste hardware dei tensori, la cui forma, tipo di dati e layout di memoria possono differire dai layout ONNX; configura quindi i tipi dei tensori di input e output del runner come viste CPU oppure converti tu il formato hardware (consulta la panoramica dell'architettura VART-ML di AMD).
La distribuzione di Ultralytics YOLO all'interno di un prodotto commerciale AMD Xilinx richiede il rispetto della licenza AGPL-3.0 oppure l'ottenimento di una licenza Ultralytics Enterprise.
Applicazioni nel mondo reale#
I dispositivi AMD Xilinx sono comuni in tutti i contesti in cui l'IA visiva deve funzionare in tempo reale, a basso consumo e vicino al sensore:
- Sicurezza industriale e nei cantieri: rileva persone e macchinari intorno ad attrezzature pesanti e monitora le zone di lavoro con il rilevamento di oggetti e il conteggio degli oggetti.
- Visione per il settore automobilistico e i veicoli fuoristrada: esegui la percezione basata su telecamere su componenti qualificati per il settore automobilistico, a supporto dei veicoli autonomi e dei sistemi di assistenza alla guida.
- Telecamere intelligenti e analisi video: combina acquisizione video, codifica e inferenza YOLO su un unico chip per i sistemi di sicurezza e l'analisi video.
- Visione artificiale e controllo qualità: abbina l'acquisizione di immagini ad alta velocità basata su FPGA alla segmentazione delle istanze o alla classificazione YOLO per rilevare difetti in linea.
- Robotica e droni: usa i moduli Kria KR260 o Versal per la stima della posa, il rilevamento di oggetti orientati e la navigazione con latenza deterministica.
Riepilogo#
L'esportazione con format="xilinx" quantizza i modelli Ultralytics YOLO con AMD Quark per le NPU Versal AI Edge Series Gen 2, mantiene la testa in BF16 e salva la configurazione del compilatore Vitis AI accanto al modello. Convalida la precisione INT8 su qualsiasi host, compila il modello .rai nell'immagine Docker Vitis AI di AMD ed eseguilo sulla scheda con ONNX Runtime e Vitis AI Execution Provider.
I dispositivi AMD Xilinx meno recenti usano altri flussi. La DPU su Zynq UltraScale+ e Kria usa la toolchain Vitis AI 3.5, ormai congelata, e i file .xmodel; richiede attivazioni native della DPU, come Hard-Swish, ed esegue l'attenzione sulla CPU. La NPU Versal AI Edge di prima generazione usa il flusso snapshot, con copertura degli operatori che dipende dalla versione e dalla precisione di Vitis AI.
Per altre destinazioni di distribuzione, consulta la guida alle opzioni di distribuzione dei modelli, le best practice per la distribuzione e le integrazioni per acceleratori come Hailo, Rockchip RKNN e Axelera.
Domande frequenti#
Sì. AMD ha completato l'acquisizione di Xilinx nel febbraio 2022 e i prodotti Xilinx sono ora commercializzati come SoC adattivi e FPGA AMD: AMD Zynq, AMD Kria, AMD Versal e AMD Vitis. Gli ingegneri usano ancora ampiamente il nome Xilinx e i codici dei componenti mantengono il prefisso
XC.Sì.
model.export(format="xilinx")quantizza il modello con AMD Quark per le NPU Versal AI Edge Series Gen 2 e crea una directory contenente il modello ONNX quantizzato e la configurazione del compilatore Vitis AI. Compilalo in.raicon gli strumenti Vitis AI di AMD, come mostrato in Compilazione ed esecuzione su Versal AI Edge Gen 2. Per le destinazioni Zynq UltraScale+, Kria e VEK280 usa i flussi descritti in Distribuzione su altre destinazioni AMD Xilinx.La DPU (unità di elaborazione per il deep learning) è il precedente acceleratore INT8 di AMD. È integrata nella logica programmabile dei dispositivi Zynq UltraScale+ e Kria, viene compilata con Vitis AI 3.5 e genera file
.xmodel. Nelle versioni correnti di Vitis AI è stata sostituita dalla NPU. Nei dispositivi Versal AI Edge, la NPU combina AI Engine integrati con logica programmabile, supporta INT8, BF16 e la precisione mista e supporta un maggior numero di operatori, tra cui SiLU e, su Versal AI Edge Gen 2, l'attenzione.Un file
.xmodelè un grafo XIR serializzato usato dalla toolchain AMD DPU. Il quantizzatore scrive un.xmodelquantizzato e il compilatorevai_c_xirlo trasforma in un.xmodelcompilato, che contiene il flusso di istruzioni DPU, i pesi INT8 quantizzati e gli eventuali sottografi da eseguire sulla CPU. Il file compilato è destinato a una specifica configurazione DPU, descritta da un'impronta digitalearch.json, e viene eseguito sulla scheda tramite Vitis AI Runtime (VART) oppure tramite Graph Runner se contiene sottografi CPU.No. La DPU accelera solo le attivazioni ReLU, ReLU6, LeakyReLU, Hard-Swish e Hard-Sigmoid, ed esegue sulla CPU Sigmoid, Softmax e MatMul tra due attivazioni. Addestra YOLO con
activation: nn.Hardswish()nel file YAML del modello per mantenere le convoluzioni sulla DPU e consulta Gestione dei blocchi di attenzione sulla DPU per le opzioni relative all'attenzione. Le NPU Versal AI Edge Gen 2 supportano nativamente SiLU, Softmax e MatMul.La KV260 usa un MPSoC Zynq UltraScale+ con una DPU, quindi segui il flusso DPU. Addestra un modello YOLO26 con Hard-Swish, quantizzalo con
vai_q_pytorchnell'immagine Docker Vitis AI 3.5, compilalo convai_c_xirusandoarch.jsondella KV260 ed esegui sulla scheda il file.xmodelrisultante con VART oppure con Graph Runner se contiene sottografi CPU.No. L'esportazione funziona su qualsiasi host Linux con Python da 3.11 a 3.13 e non richiede un account AMD; il modello esportato viene eseguito sulla CPU per le verifiche di precisione su qualsiasi host. Per compilare il modello
.raiservono l'immagine Docker Vitis AI di AMD e una licenza del compilatore AI Engine; per eseguirlo sulla NPU serve una scheda Versal AI Edge Series Gen 2.Ultralytics usa Vitis AI Execution Provider solo quando ONNX Runtime lo rende disponibile, come nella build AMD
onnxruntime-vitisaisu una scheda Versal o nell'immagine Docker di AMD. Negli altri casi esegue il modello quantizzato sulla CPU con ONNX Runtime standard, così puoi misurare la precisione INT8 prima della distribuzione.Qualsiasi attività può essere eseguita se i relativi operatori vengono compilati per il tuo acceleratore. In genere, gli operatori non supportati vengono eseguiti sulla CPU, ma alcuni possono costringere l'intero modello a essere eseguito sulla CPU o impedire la compilazione. Il rilevamento di oggetti è il carico di lavoro più comune e quello usato negli esempi di AMD. Per la segmentazione, la stima della posa e altre attività, controlla il rapporto di partizionamento del compilatore per verificare che i livelli più pesanti vengano eseguiti sull'acceleratore.