Ultralytics YOLO27:

Distribuzione di AMD Xilinx per Ultralytics YOLO con Vitis AI#

L'esportazione nativa di Ultralytics sarà disponibile a breve

Il supporto all'esportazione nativa di Ultralytics per i dispositivi AMD Xilinx sarà disponibile a breve. Nel frattempo, questa guida illustra l'hardware e il software AMD Xilinx e mostra come distribuire oggi Ultralytics YOLO26 con gli strumenti Vitis AI di AMD, partendo da un'esportazione ONNX o da un checkpoint PyTorch.

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 spiega cosa sono le diverse famiglie di dispositivi AMD Xilinx, come eseguono l'AI, quali operatori Ultralytics YOLO sono supportati da ciascun acceleratore e qual è il flusso di lavoro dettagliato per distribuire modelli YOLO su hardware Zynq UltraScale+, Kria e Versal.

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.

Xilinx o AMD?

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.

TermineCosa significa
FPGAArray 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 / MPSoCUn 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.
DPUUnità 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 NPUUnità 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 AILa toolchain di AMD per distribuire reti neurali sui dispositivi AMD Xilinx. Include quantizzazione, compilazione, runtime, esempi e ambienti Docker.
AMD QuarkLa 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 QATConversione 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 calibrazioneUn piccolo insieme rappresentativo di immagini elaborato dal modello durante la PTQ per scegliere la scala INT8 di ciascun tensore.
BF16 e precisione mistaBFloat16 è 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.
XIRRappresentazione intermedia Xilinx: il formato del grafo prodotto dal compilatore DPU e letto dal runtime.
.xmodelUn 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 DPUIl file che descrive una specifica configurazione DPU. È necessario al compilatore DPU e un .xmodel compilato per una determinata impronta non funzionerà con un'altra.
SnapshotLa directory del modello compilato prodotta dal flusso NPU Versal AI Edge (VEK280). È vincolata a una variante specifica dell'IP NPU.
.raiIl file del modello compilato prodotto dal flusso NPU Versal AI Edge Gen 2.
VART / VART-MLLe librerie Vitis AI Runtime che caricano i modelli compilati e li eseguono sulla scheda, con API C++ e Python.
ONNX Runtime Vitis AI EPL'VitisAIExecutionProvider per ONNX Runtime, che compila ed esegue modelli ONNX sulle NPU AMD.
Fallback CPU / partizionamento del grafoQuando 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.

FamigliaDescrizioneCPU dell'applicazioneAcceleratore AISchede di esempio
Zynq UltraScale+ MPSoCCPU Arm e logica FPGA su un unico chip, in dimensioni da ZU1 a ZU19Arm Cortex-A53 dual-core o quad-coreDPU integrata nella logica programmabileZCU104, ZCU102, schede personalizzate
System-on-Module Kria K26Modulo pronto per la produzione, basato su un MPSoC Zynq UltraScale+Arm Cortex-A53 quad-coreDPU integrata nella logica programmabileKV260 Vision AI Starter Kit, KR260 Robotics Starter Kit
Serie Versal AI EdgeSoC adattivi; i componenti AIE-ML come VE2302 e VE2802 eseguono la NPUArm Cortex-A72 dual-coreNPU su AI Engine AIE-ML e PLVEK280
Serie Versal AI Edge Gen 2SoC adattivo di nuova generazione con AI Engine AIE-MLv2Fino a otto Arm Cortex-A78AENPU su AI Engine AIE-MLv2 e PLVEK385

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.

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

FlussoHardwareToolchainQuantizzatoreArtefatto compilatoRuntime della schedaStato
DPUZynq UltraScale+, KriaVitis AI 3.5 (Docker)vai_q_pytorch.xmodelVARTCompilatore congelato, zoo dei modelli e IP DPU
NPU (Versal AI Edge)VEK280 e altri componenti Versal AI EdgeVitis AI 6.3 (Docker)Integrato nel flusso di snapshotSnapshotVART-MLAttivo
NPU (Versal AI Edge Gen 2)VEK385 e altri componenti Gen 2Vitis AI 6.3 (Docker)AMD Quark.raiONNX Runtime Vitis AI EP o VART-MLAttivo
Il flusso DPU è congelato

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.

I laptop Ryzen AI utilizzano uno stack diverso

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:

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

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.

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

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

OperatorePosizione nel modello YOLODPU (Zynq UltraScale+, Kria)NPU (Versal AI Edge Gen 2)
Convoluzione + normalizzazione batchOgni blocco Conv✅✅
Attivazione SiLUOgni blocco Conv (attivazione predefinita)❌ Viene eseguito sulla CPU; sostituiscilo con Hard-Swish✅
Hard-Swish, ReLU, ReLU6, LeakyReLUAttivazioni facoltative impostate nel file YAML del modello✅ Fuso nella convoluzione✅
SigmoidPunteggi delle classi nella testa di rilevamento❌ Viene eseguito sulla CPU (di solito fa parte della post-elaborazione)✅
MatMul tra due attivazioniBlocchi di attenzione (C2PSA; C3k2 di YOLO26)❌ Viene eseguito sulla CPU✅
SoftmaxBlocchi di attenzione; DFL in YOLOv8 e YOLO11❌ Viene eseguito sulla CPU✅
Reshape, TransposeBlocchi di attenzione⚠️ Fuso quando possibile, altrimenti eseguito sulla CPU✅
Split, SliceBlocchi C3k2 e C2f⚠️ Convertito in slice; controlla il rapporto del compilatore✅
Resize (upsampling nearest)Upsampling del neck✅✅
MaxPool, Concat, AddBlocco SPPF e fusione delle feature✅✅
TopK, GatherElementsTesta YOLO26 senza NMS (nms=False)❌ Viene eseguito sulla CPU⚠️ Partizione sulla CPU nell'host Arm
NonMaxSuppressionSolo 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.

Testa YOLO26: niente DFL e output facoltativo senza NMS

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 mode

Quindi crea il modello, trasferisci i pesi YOLO26 preaddestrati e esegui il fine-tuning sul tuo dataset:

Esegui il fine-tuning di un modello YOLO26 con Hard-Swish
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.

Alternative al nuovo addestramento
  • Sostituzione durante la quantizzazione: imposta "convert_silu_to_hswish": true nella 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:

  1. Accetta i blocchi sulla CPU. Il modello compilato .xmodel conterrà 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.

  2. Usa un file YAML senza attenzione. Nel tuo file YAML Hard-Swish, sostituisci il layer C2PSA con nn.Identity affinché gli indici dei layer usati da Concat e Detect restino 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.

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

ModelloDPU (Zynq UltraScale+, Kria)NPU (Versal AI Edge Gen 2)
YOLO26Addestramento con Hard-Swish; due blocchi di attenzione diventano sottografi CPU; niente DFLPrevisto il funzionamento senza modifiche; convalida sulla tua scheda
YOLO11Addestramento con Hard-Swish; C2PSA e softmax DFL vengono eseguiti sulla CPUPrevisto il funzionamento senza modifiche; convalida sulla tua scheda
YOLOv8Addestramento con Hard-Swish; softmax DFL viene eseguito sulla CPUTutorial YOLOv8m di AMD (Vitis AI 6.3, VEK385, INT8 con coda BF16): il rapporto del compilatore mostra 1.181 operatori (99.915%) e il 99.994% dei GOP sulla NPU, senza modifiche al modello

Distribuisci YOLO26 su AMD Xilinx oggi#

Finché non sarà disponibile l'esportazione nativa, la distribuzione prevede quattro passaggi:

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

Passaggio 1: addestra o esegui il fine-tuning del modello#

Addestra sui tuoi dati con Train mode o sulla Ultralytics Platform. Per i target DPU, parti dal file YAML Hard-Swish. Registra una baseline con Val mode, così potrai misurare in seguito l'impatto della quantizzazione sulla precisione.

Passaggio 2: esporta in ONNX per i target NPU#

ONNX è l'input comune ai flussi NPU di AMD. Il flusso DPU quantizza direttamente il checkpoint PyTorch addestrato nell'immagine Docker di Vitis AI 3.5, quindi chi usa una DPU può saltare questo passaggio. Esporta con una dimensione batch fissa pari a 1 e un opset supportato da AMD; il tutorial YOLOv8m di AMD per Versal AI Edge Gen 2 usa opset 17.

Esporta
from ultralytics import YOLO

# # Carica il modello addestrato nel passaggio 1
model = YOLO("runs/detect/train/weights/best.pt")

# # Esporta in ONNX con una forma statica per il compilatore AMD
model.export(format="onnx", opset=17, imgsz=640)  # # crea 'best.onnx' accanto a 'best.pt'

Consulta l'integrazione ONNX e gli argomenti di esportazione per tutte le opzioni. Se nms non è impostato, esegui NMS sulla CPU dopo l'inferenza; per YOLO26, nms=False seleziona invece la testa senza NMS. Non incorporare NMS con nms=True, perché AMD include NonMaxSuppression tra gli operatori che possono costringere l'intero modello a essere eseguito sulla CPU.

Mantieni la versione di ONNX Runtime di AMD

Le immagini Docker di AMD includono una propria versione di ONNX Runtime con Vitis AI Execution Provider. Durante l'esportazione, Ultralytics verifica la presenza di ONNX Runtime e potrebbe installare il pacchetto standard al suo posto. Esporta su una macchina qualsiasi e copia il file .onnx nel container, oppure imposta YOLO_AUTOINSTALL=false quando esegui Ultralytics nell'immagine Docker di AMD.

Passaggio 3: quantizza e compila con Vitis AI#

I flussi seguenti utilizzano le immagini Docker di AMD su un host Linux x86-64. Per questo passaggio non ti serve la scheda. Scegli la scheda corrispondente al tuo dispositivo:

  1. Avvia l'immagine Docker Vitis AI 6.3 di AMD per Versal AI Edge Gen 2. Consulta i requisiti di sistema.
  2. Quantizza il modello ONNX in INT8 con AMD Quark usando la configurazione VINT8. La configurazione minima di AMD richiede anche Int32Bias=False, enable_npu_cnn=True, DedicatedQDQPair=True e QuantizeAllOpTypes=True. Quark legge i dati di calibrazione tramite un lettore di dati che devi scrivere, quindi applica la stessa pre-elaborazione usata per l'inferenza: ridimensionamento letterbox alla dimensione di esportazione, ordine dei canali RGB, ridimensionamento 0–1 e layout NCHW, utilizzando immagini rappresentative del tuo dataset.
  3. Escludi il sottografo di post-elaborazione dalla quantizzazione. Il tutorial di AMD su YOLOv8m avverte che quantizzarlo causa rilevamenti mancati. In quell'esempio di YOLOv8m, il compilatore esegue quindi la parte finale in BF16 sulla NPU; gli operatori finali non supportati, come la selezione top-k di YOLO26, vengono comunque eseguiti sulla CPU.
  4. Scegli il runtime della scheda prima di compilare. La compilazione standard funziona con ONNX Runtime, che esegue sulla CPU gli operatori incompatibili con la NPU, come la selezione top-k di YOLO26, e con VART-ML solo quando tutti gli operatori vengono eseguiti sulla NPU. Per eseguire con VART-ML un modello che mantiene operatori sulla CPU, aggiungi i passaggi di partizionamento CPU di AMD a vitisai_config.json. Questi artefatti non possono essere eseguiti tramite ONNX Runtime.
  5. Compila creando una sessione ONNX Runtime con VitisAIExecutionProvider e un vitisai_config.json che specifica il dispositivo di destinazione. La compilazione scrive un file .rai nella directory della cache. Consulta compilazione di un modello.

Per saltare la quantizzazione, compila direttamente il modello ONNX FP32: il compilatore lo converte in BF16. La compilazione richiede una licenza del compilatore AMD AI Engine; consulta la pagina delle licenze AMD.

Passaggio 4: esegui e convalida sulla scheda#

Prepara prima la scheda. Deve eseguire 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 i target DPU Zynq UltraScale+ e Kria, Versal AI Edge (VEK280) e Versal AI Edge Gen 2 (VEK385).

Quindi copia gli artefatti richiesti dal runtime:

FlussoArtefatti da copiare sulla schedaRuntime della scheda
DPU (Zynq UltraScale+, Kria).xmodel compilatoVART; Graph Runner per i sottografi CPU
NPU (Versal AI Edge, VEK280)Directory dello snapshotVART-ML
NPU (Versal AI Edge Gen 2), ORTModello ONNX FP32 o quantizzato usato per la compilazione, vitisai_config.json e directory della cache compilataONNX Runtime con Vitis AI EP
NPU (Versal AI Edge Gen 2), VART-MLFile .rai (con passaggi di partizionamento CPU se qualche operatore viene eseguito sulla CPU), oltre a una configurazione del runner VART-MLVART-ML

Nei flussi NPU, il grafo ONNX esportato decodifica già i riquadri e applica la funzione sigmoide ai punteggi delle classi; all'host spetta quindi solo interpretare l'output:

  • nms non impostato: i modelli di rilevamento producono un tensore (1, 4 + nc, anchors) con xywh riquadri e punteggi per classe. Seleziona la classe migliore per ogni ancora, converti i riquadri in coordinate degli angoli, filtra in base alla confidenza ed esegui NMS; la funzione Ultralytics non_max_suppression esegue tutti questi passaggi.
  • nms=False (YOLO26): il modello produce un tensore (1, max_det, 6) con [x1, y1, x2, y2, score, class] righe, per cui è sufficiente applicare una soglia di confidenza.

In entrambi i casi, riporta i riquadri dall'immagine di input con letterboxing alle dimensioni dell'immagine originale. Solo i grafi interrotti prima del passaggio di decodifica richiedono la decodifica dei riquadri sull'host. Sulla DPU, i buffer VART contengono valori INT8 in virgola fissa: interroga la forma e la scala fix_point di ogni tensore, quantizza gli input e dequantizza gli output prima di applicare i passaggi descritti sopra. Graph Runner restituisce gli output del grafo completo, mentre un runner solo DPU restituisce gli output intermedi dei sottografi DPU che il tuo codice deve completare. I layout descritti sopra sono quelli ONNX (vista CPU): per impostazione predefinita VART-ML usa viste dei tensori hardware, la cui forma, tipo di dati e layout di memoria possono essere diversi; configura quindi i tipi dei tensori di input e output del runner come viste CPU oppure converti autonomamente il formato hardware (consulta la panoramica dell'architettura VART-ML di AMD).

Confronta la precisione sul dispositivo con la baseline FP32 del Passaggio 1 usando il tuo set di convalida e le stesse metriche di prestazione, ad esempio mAP. I risultati pubblicati da AMD per YOLOv8m su VEK385 mostrano il costo in termini di precisione della distribuzione INT8:

Configurazione YOLOv8mHardwaremAP50-95 (COCO)
ONNX FP32CPU host49.95
BF16NPU VEK38550.29
VINT8 quantizzato, parte finale FP32CPU host48.75
VINT8 con parte finale BF16NPU VEK38548.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.

Licenze per prodotti commerciali

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#

I dispositivi AMD Xilinx eseguono i modelli YOLO tramite due generazioni di acceleratori. La DPU di Zynq UltraScale+ e Kria usa il flusso Vitis AI 3.5, ormai congelato, e genera file .xmodel. Richiede attivazioni native DPU, come Hard-Swish, ed esegue l'attenzione sulla CPU. La NPU di Versal AI Edge e Versal AI Edge Gen 2 usa le versioni correnti di Vitis AI. La NPU Gen 2 supporta SiLU e gli operatori di attenzione ed esegue l'esempio AMD di YOLOv8m su VEK385 quasi interamente sulla NPU, mentre la copertura degli operatori sulla precedente NPU VEK280 dipende dalla versione di Vitis AI e dalla precisione.

L'esportazione nativa di Ultralytics per i dispositivi AMD Xilinx sarà disponibile a breve. Nel frattempo, addestra con Ultralytics, esporta in ONNX per i target NPU Versal oppure conserva il checkpoint PyTorch per i target DPU, quindi compila con Vitis AI come descritto sopra. Per altri target di distribuzione, consulta la guida alle opzioni di distribuzione dei modelli, le best practice per la distribuzione e le integrazioni con 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.

  • Non ancora. L'esportazione nativa di Ultralytics per i dispositivi AMD Xilinx sarà disponibile a breve. Al momento, esporta in ONNX con model.export(format="onnx") per i target NPU Versal oppure quantizza il checkpoint PyTorch addestrato con vai_q_pytorch per i target DPU Zynq UltraScale+ e Kria, quindi compila con gli strumenti Vitis AI di AMD come mostrato in Distribuisci oggi YOLO26 su 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 .xmodel quantizzato e il compilatore vai_c_xir lo trasforma in un .xmodel compilato, 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 digitale arch.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_pytorch nell'immagine Docker Vitis AI 3.5, compilalo con vai_c_xir usando arch.json della KV260 ed esegui sulla scheda il file .xmodel risultante con VART oppure con Graph Runner se contiene sottografi CPU.

  • No. La quantizzazione e la compilazione vengono eseguite nelle immagini Docker Vitis AI di AMD su un host Linux x86-64. La scheda serve solo per eseguire il modello compilato e misurare la latenza e la precisione sul dispositivo.

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

Collaboratori

Commenti