Ultralytics YOLO27:

Implementación de AMD Xilinx para Ultralytics YOLO con Vitis AI#

La exportación nativa de Ultralytics estará disponible próximamente

La compatibilidad con la exportación nativa de Ultralytics para dispositivos AMD Xilinx estará disponible próximamente. Hasta entonces, esta guía explica el panorama de hardware y software de AMD Xilinx y muestra cómo implementar Ultralytics YOLO26 hoy con las herramientas Vitis AI de AMD, partiendo de una exportación ONNX o de un punto de control de PyTorch.

Los dispositivos de AMD Xilinx impulsan muchas de las cámaras industriales, los sistemas de visión para automoción, los robots, los drones y los productos de diagnóstico por imagen del mundo. Combinan procesadores Arm con lógica programable y, en los dispositivos más recientes, motores de AI dedicados, de modo que un solo chip puede capturar vídeo, preprocesarlo, ejecutar la detección de objetos y actuar en función del resultado con una latencia de inferencia baja y predecible.

Esta guía explica qué es cada familia de dispositivos AMD Xilinx, cómo ejecutan la IA, qué operadores de Ultralytics YOLO admite cada acelerador y cuál es el flujo de trabajo paso a paso para implementar modelos YOLO en hardware Zynq UltraScale+, Kria y Versal.

¿Qué es AMD Xilinx?#

Xilinx inventó la matriz de puertas programable en campo (FPGA) en la década de 1980 y se convirtió en uno de los principales proveedores de SoC adaptables y FPGA. AMD completó la adquisición de Xilinx en febrero de 2022, y ahora las líneas de productos se comercializan bajo la marca AMD como AMD Zynq, AMD Kria, AMD Versal y AMD Vitis.

¿Xilinx o AMD?

Ambos nombres se refieren a los mismos productos. AMD los comercializa como «SoC adaptables y FPGA», pero los ingenieros siguen diciendo «Xilinx» habitualmente. Los números de referencia conservan el prefijo XC (por ejemplo, xczu7ev), y el antiguo repositorio Vitis AI y las imágenes de Docker siguen estando en GitHub y Docker Hub con el nombre Xilinx. Esta guía usa «AMD Xilinx» para que puedas encontrarla con cualquiera de los dos nombres.

Términos y conceptos clave#

La implementación en AMD Xilinx utiliza su propio vocabulario. En la siguiente tabla se explica cada término utilizado en esta guía.

TérminoQué significa
FPGAMatriz de puertas programable en campo: chip cuya lógica digital se configura después de su fabricación al cargar un diseño llamado flujo de bits. Puede implementar hardware personalizado, como canales de procesamiento de vídeo o aceleradores de redes neuronales.
Lógica programable (PL)La estructura FPGA dentro de un SoC AMD Xilinx. En los dispositivos Zynq y Kria, el acelerador de IA se integra en la PL.
Sistema de procesamiento (PS)Los núcleos de CPU Arm físicos, los controladores de memoria y los periféricos del SoC. Ejecuta Linux, tu aplicación y las capas del modelo que el acelerador no puede procesar.
SoC adaptable / MPSoCSistema en chip que combina un sistema de procesamiento con lógica programable, además de motores de IA en muchos dispositivos Versal. MPSoC significa sistema multiprocesador en chip.
Motor de IA (AIE, AIE-ML, AIE-MLv2)Matrices de procesadores vectoriales integrados en muchos dispositivos Versal, incluida la serie Versal AI Edge que se trata aquí, diseñadas para el aprendizaje automático y el procesamiento de señales.
DPUUnidad de procesamiento de aprendizaje profundo: acelerador de redes neuronales INT8 de AMD, distribuido como IP que se integra en la PL (por ejemplo, DPUCZDX8G en Zynq UltraScale+ y Kria). Los tamaños, como B512 y B4096, indican las operaciones máximas por ciclo de reloj.
NPU / IP de NPUUnidad de procesamiento neuronal: el acelerador de inferencia de última generación de AMD, que sustituye a la DPU en las versiones recientes de Vitis AI. AMD describe su IP de NPU como un acelerador lógico que combina motores de IA con lógica programable, por lo que también necesita un diseño de hardware compatible. Consulta la entrada del glosario sobre NPU.
Vitis AICadena de herramientas de AMD para implementar redes neuronales en dispositivos AMD Xilinx. Incluye cuantización, compilación, entornos de ejecución, ejemplos y entornos Docker.
AMD QuarkBiblioteca actual de AMD para la cuantización de modelos, utilizada en el flujo de trabajo de Versal AI Edge Gen 2 para convertir un modelo ONNX FP32 en un modelo INT8.
Cuantización, PTQ y QATConversión de pesos y activaciones FP32 a INT8. La cuantización posterior al entrenamiento (PTQ) utiliza imágenes de calibración. El entrenamiento consciente de la cuantización (QAT) ajusta el modelo para recuperar precisión.
Imágenes de calibraciónPequeño conjunto representativo de imágenes que se procesa con el modelo durante la PTQ para elegir la escala INT8 de cada tensor.
BF16 y precisión mixtaBFloat16 es un formato de coma flotante de 16 bits que conserva el rango de FP32. La precisión mixta ejecuta la mayor parte de la red en INT8 y las capas sensibles en BF16.
XIRRepresentación intermedia de Xilinx: formato de grafo que genera el compilador DPU y lee el entorno de ejecución.
.xmodelGrafo XIR serializado. El cuantizador escribe un .xmodel cuantizado, y el compilador DPU lo convierte en un .xmodel compilado con instrucciones DPU, pesos cuantizados y cualquier subgrafo de CPU. El modelo compilado requiere la configuración DPU correspondiente.
arch.json / huella digital de DPUArchivo que describe una configuración DPU específica. El compilador DPU lo necesita, y un .xmodel compilado para una huella digital no se ejecutará en otra.
InstantáneaDirectorio del modelo compilado que genera el flujo de trabajo de NPU de Versal AI Edge (VEK280). Está vinculado a una variante de IP de NPU específica.
.raiArchivo del modelo compilado que genera el flujo de trabajo de NPU de Versal AI Edge Gen 2.
VART / VART-MLBibliotecas de Vitis AI Runtime que cargan modelos compilados y los ejecutan en la placa, con API de C++ y Python.
ONNX Runtime Vitis AI EPVitisAIExecutionProvider para ONNX Runtime, que compila y ejecuta modelos ONNX en las NPU de AMD.
Recurso alternativo de CPU / particionado del grafoCuando el acelerador no puede ejecutar un operador, el compilador suele dividir el modelo en subgrafos para el acelerador y la CPU, y cada división añade una transferencia de datos que puede dominar la latencia. En cambio, algunos operadores hacen que todo el modelo se ejecute en la CPU o provocan un error de compilación.

Familias de dispositivos AMD Xilinx para IA en el extremo#

Los dispositivos AMD Xilinx para IA en el extremo se dividen en tres familias. Zynq y Kria utilizan la DPU en lógica programable, mientras que los dispositivos Versal AI Edge que se tratan aquí utilizan la NPU en sus motores de IA.

FamiliaQué esCPU de aplicaciónAcelerador de IAPlacas de ejemplo
Zynq UltraScale+ MPSoCCPU Arm y lógica FPGA en un solo chip, con tamaños que van de ZU1 a ZU19Arm Cortex-A53 de doble o cuádruple núcleoDPU integrada en la lógica programableZCU104, ZCU102 y placas personalizadas
Módulo en sistema Kria K26Módulo listo para producción basado en un Zynq UltraScale+ MPSoCArm Cortex-A53 de cuatro núcleosDPU integrada en la lógica programableKit de iniciación KV260 Vision AI, kit de iniciación KR260 Robotics
Serie Versal AI EdgeSoC adaptables; los componentes AIE-ML como VE2302 y VE2802 ejecutan la NPUArm Cortex-A72 de doble núcleoNPU en motores de IA AIE-ML y PLVEK280
Serie Versal AI Edge Gen 2SoC adaptable de última generación con motores de IA AIE-MLv2Hasta ocho Arm Cortex-A78AENPU en motores de IA AIE-MLv2 y PLVEK385

Zynq UltraScale+ MPSoC#

Cada chip Zynq UltraScale+ combina un sistema de procesamiento Arm, con núcleos Cortex-A53 de doble núcleo (CG) o cuádruple núcleo (EG y EV) y núcleos Cortex-R5F en tiempo real, con lógica FPGA. Los dispositivos EV añaden un códec de vídeo H.264/H.265 integrado. Para ejecutar redes neuronales, los diseñadores integran una DPU en la lógica, junto a los canales de procesamiento de vídeo y cámara. En los dispositivos pequeños, la DPU compite por espacio con el resto del diseño.

Módulos en sistema Kria#

El módulo Kria K26 integra un Zynq UltraScale+ MPSoC, memoria y alimentación en un módulo listo para producción, para que no tengas que diseñar por tu cuenta el procesador, la memoria ni el subsistema de alimentación. El módulo se conecta a una placa portadora, ya sea la placa de un kit de iniciación o un diseño propio. Es la base del kit de iniciación KV260 Vision AI para cámaras inteligentes y del kit de iniciación KR260 Robotics para robótica. Como el K26 se basa en Zynq UltraScale+, utiliza el mismo flujo de trabajo DPU. La gama Kria también incluye otros módulos, así que comprueba qué procesador utiliza tu módulo antes de elegir un flujo de trabajo.

SoC adaptables Versal#

Versal es la familia de SoC adaptables de AMD. Las series AI Edge y AI Core incorporan motores de IA integrados junto a los núcleos Arm y la lógica programable, mientras que algunas otras series Versal no tienen motores de IA. La IP de NPU de AMD se ejecuta conjuntamente en los motores de IA y la lógica programable, y Vitis AI está dirigido a los componentes AIE-ML de la serie AI Edge, como VE2302 y VE2802. La serie Versal AI Edge (kit de evaluación VEK280) y la serie Versal AI Edge Gen 2 (kit de evaluación VEK385) son los destinos actuales de AMD para la IA en el extremo y el foco de las versiones actuales de Vitis AI.

Cómo se ejecuta la IA en los dispositivos AMD Xilinx: DPU frente a NPU#

La mayoría de las implementaciones de IA en AMD Xilinx siguen el mismo patrón. El acelerador ejecuta las capas que admite; la CPU Arm se encarga del preprocesamiento, el posprocesamiento y las capas que el acelerador no puede ejecutar; y un entorno de ejecución en la placa coordina ambos.

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 lanzado dos generaciones de aceleradores, cada una con su propia cadena de herramientas y archivo de modelo compilado. Esta guía utiliza Vitis AI 3.5 para la DPU y Vitis AI 6.3 para la NPU; consulta la documentación actual de AMD para las versiones posteriores.

Flujo de trabajoHardwareCadena de herramientasCuantizadorArtefacto compiladoEntorno de ejecución en la placaEstado
DPUZynq UltraScale+, KriaVitis AI 3.5 (Docker)vai_q_pytorch.xmodelVARTCompilador congelado, zoo de modelos e IP de DPU
NPU (Versal AI Edge)VEK280 y otras piezas Versal AI EdgeVitis AI 6.3 (Docker)Integrado en el flujo de instantáneasInstantáneaVART-MLActivo
NPU (Versal AI Edge Gen 2)VEK385 y otras piezas Gen 2Vitis AI 6.3 (Docker)AMD Quark.raiONNX Runtime Vitis AI EP o VART-MLActivo
El flujo de DPU está congelado

Vitis AI 3.5 es la última versión con actualizaciones del compilador de DPU y del catálogo de modelos. Las versiones posteriores del repositorio Xilinx/Vitis-AI mantienen sin cambios el compilador, el catálogo de modelos y la IP de DPU de Zynq UltraScale+, mientras actualizan el entorno de ejecución y la compatibilidad con versiones más recientes de las herramientas de AMD (consulta las notas de la versión Vitis AI 5.0); además, la documentación actual de Vitis AI de AMD describe la NPU como sustituta de la arquitectura DPU obsoleta. Los productos Zynq UltraScale+ y Kria existentes pueden seguir comercializándose con la DPU, pero su compatibilidad con operadores no aumentará, por lo que las arquitecturas de modelos más recientes necesitan las adaptaciones descritas en Compatibilidad de modelos YOLO.

Los portátiles Ryzen AI usan una pila diferente

Los procesadores AMD Ryzen AI de los PC también incluyen una NPU, pero usan la pila independiente Ryzen AI Software en lugar de los flujos Vitis AI integrados de esta guía. Para las GPU AMD Instinct y Radeon, consulta la integración de GPU AMD.

¿Qué flujo de Vitis AI necesito?#

Elige el flujo según el dispositivo de tu placa:

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

Compatibilidad de modelos YOLO y operadores compatibles#

Un acelerador solo acelera los operadores que implementa en el hardware. Cuando un modelo contiene un operador no compatible, el compilador suele enviar esa parte de la red a la CPU Arm, y cada ida y vuelta entre el acelerador y la CPU añade latencia. Algunos operadores no se pueden particionar: en la NPU Versal AI Edge Gen 2, AMD enumera operadores como NonZero y NonMaxSuppression que pueden obligar a ejecutar todo el modelo en la CPU. La compatibilidad con operadores es el factor más importante para el rendimiento de un modelo YOLO en el 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 tabla muestra dónde se ejecuta cada operador de un modelo YOLO26. Una exportación estándar de YOLO26n a ONNX contiene 87 activaciones SiLU, cada una exportada como Sigmoid y Mul, además de 4 operadores MatMul y 2 operadores Softmax de sus dos bloques de atención: el bloque C2PSA al final del backbone (capa 10) y el bloque C3k2 con atención que genera la salida P5 (capa 22).

OperadorDónde aparece en YOLODPU (Zynq UltraScale+, Kria)NPU (Versal AI Edge Gen 2)
Convolución + normalización por lotesCada bloque Conv✅✅
Activación SiLUCada bloque Conv (activación predeterminada)❌ Se ejecuta en la CPU; sustitúyela por Hard-Swish✅
Hard-Swish, ReLU, ReLU6, LeakyReLUActivaciones opcionales definidas en el YAML del modelo✅ Fusionado con la convolución✅
SigmoidPuntuaciones de clase en la cabeza de detección❌ Se ejecuta en la CPU (normalmente como parte del posprocesamiento)✅
MatMul entre dos activacionesBloques de atención (C2PSA; YOLO26 C3k2)❌ Se ejecuta en la CPU✅
SoftmaxBloques de atención; DFL en YOLOv8 y YOLO11❌ Se ejecuta en la CPU✅
Reshape, TransposeBloques de atención⚠️ Fusionado cuando es posible; si no, se ejecuta en la CPU✅
Split, SliceBloques C3k2 y C2f⚠️ Se convierte en segmentos; comprueba el informe del compilador✅
Resize (ampliación por vecino más cercano)Ampliación del cuello✅✅
MaxPool, Concat, AddBloque SPPF y fusión de características✅✅
TopK, GatherElementsCabeza sin NMS de YOLO26 (nms=False)❌ Se ejecuta en la CPU⚠️ Partición en la CPU del host Arm
NonMaxSuppressionSolo cuando se exporta con nms=True❌ Se ejecuta en la CPU❌ Puede obligar a ejecutar el modelo en la CPU

Fuentes: operadores compatibles según UG1414 de AMD, compatibilidad con operadores de PyTorch y listas de operadores compatibles, particionados en la CPU y no compatibles de Versal AI Edge Gen 2. La compatibilidad también depende de la configuración de la DPU y de los patrones del grafo, así que consulta siempre el informe de particiones del compilador.

Cabeza de YOLO26: sin DFL y con salida opcional sin NMS

YOLO26 elimina la pérdida focal de distribución (DFL), por lo que, a diferencia de YOLO11 y YOLOv8, sus salidas de cajas no necesitan decodificación softmax. También añade un segundo bloque de atención respecto a YOLO11, así que compara los informes del compilador específicos del destino y las pruebas de rendimiento en el dispositivo antes de elegir un modelo. Las exportaciones con nms sin definir mantienen la cabeza de uno a muchos y necesitan NMS en la CPU, como otros modelos YOLO. Exporta con nms=False para usar en su lugar la cabeza de uno a uno sin NMS de YOLO26, que sustituye NMS por una selección top-k ligera que se ejecuta en la CPU.

Prepara YOLO26 para la DPU con Hard-Swish#

La DPU solo fusiona ReLU, ReLU6, LeakyReLU, Hard-Swish y Hard-Sigmoid con sus convoluciones. Hard-Swish es una aproximación de SiLU adaptada al hardware, por lo que es el sustituto natural. Los archivos YAML de modelo de Ultralytics aceptan una clave activation que cambia la activación predeterminada de los bloques Conv (Guía de configuración de YAML de modelos).

Copia yolo26.yaml en yolo26-hswish.yaml y añade una línea bajo los parámetros:

# Parameters
nc: 80 # number of classes
activation: nn.Hardswish() # default Conv activation, DPU-native
end2end: True # whether to use end-to-end mode

A continuación, crea el modelo, transfiere los pesos preentrenados de YOLO26 y ajústalo con tu conjunto de datos:

Ajustar un modelo YOLO26 con Hard-Swish
from ultralytics import YOLO

# Crea YOLO26n con activaciones Hard-Swish; la «n» del nombre selecciona la escala nano
model = YOLO("yolo26n-hswish.yaml").load("yolo26n.pt")  # transferir pesos preentrenados

# Ajusta el modelo para que la red se adapte a Hard-Swish
model.train(data="coco8.yaml", epochs=100, imgsz=640)

Las activaciones no tienen pesos, así que se transfieren todos los pesos preentrenados. El grafo ONNX exportado contiene entonces 87 operadores HardSwish y ningún SiLU. Sustituye coco8.yaml por tu propio conjunto de datos y compara la precisión con la del modelo SiLU mediante el modo Val antes de implementarlo.

Alternativas al reentrenamiento
  • Sustitución durante la cuantización: define "convert_silu_to_hswish": true en la configuración JSON del cuantizador PyTorch de Vitis AI 3.5 para sustituir SiLU durante la cuantización. Así evitas una ejecución de entrenamiento, pero normalmente se pierde más precisión; el ajuste rápido o QAT de AMD puede recuperar parte de ella. Consulta la guía de configuración de vai_q_pytorch.
  • LeakyReLU: la DPU implementa LeakyReLU con una pendiente negativa fija de 26/256 (aproximadamente 0,1). Si usas LeakyReLU, entrena con activation: nn.LeakyReLU(0.1015625) para que las pendientes del entrenamiento y de la implementación coincidan.

Gestión de los bloques de atención en la DPU#

YOLO26 aplica atención en la resolución más baja (una cuadrícula de 20×20 con una entrada de 640) en dos ubicaciones: el bloque C2PSA de la capa 10 y el bloque C3k2 con atención de la capa 22. YOLO11 tiene un bloque C2PSA. En una DPU, sus operadores MatMul y Softmax se ejecutan en la CPU, lo que divide el modelo en subgrafos alternos de DPU y CPU. Tienes tres opciones:

  1. Acepta los bloques de CPU. El .xmodel compilado contendrá subgrafos de CPU, así que ejecútalo con Graph Runner de AMD, que ejecuta juntos los subgrafos de DPU y CPU cuando existe una implementación en CPU para todos los operadores; de lo contrario, tendrás que implementar y registrar los operadores que falten. Con 20×20, el cálculo de atención es pequeño, pero cada transferencia adicional entre la DPU y la CPU añade latencia, así que mídelo en tu placa.

  2. Usa un YAML sin atención. En tu YAML de Hard-Swish, sustituye la capa C2PSA por nn.Identity para que los índices de capa usados por Concat y Detect sigan siendo válidos, y desactiva la atención en la capa 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)

    El grafo ONNX exportado no contiene entonces operadores MatMul ni Softmax. Los pesos de atención dejan de ser aplicables (se transfieren 624 de los 666 pesos de YOLO26n), así que ajusta el modelo durante más tiempo y compara la precisión con el modo Val.

  3. Usa un modelo sin atención, como YOLOv8, que AMD ha utilizado en sus propios ejemplos de DPU.

En Versal AI Edge Gen 2, los operadores de atención aparecen como compatibles con la NPU, por lo que estos cambios suelen ser innecesarios. Confirma su ubicación en el informe del compilador, ya que AMD advierte que los operadores compatibles pueden seguir ejecutándose en la CPU debido a restricciones de configuración o memoria.

Compatibilidad de modelos de un vistazo#

ModeloDPU (Zynq UltraScale+, Kria)NPU (Versal AI Edge Gen 2)
YOLO26Entrena con Hard-Swish; los dos bloques de atención se convierten en subgrafos de CPU; sin DFLSe espera que se ejecute sin cambios; valídalo en tu placa
YOLO11Entrena con Hard-Swish; C2PSA y Softmax de DFL se ejecutan en la CPUSe espera que se ejecute sin cambios; valídalo en tu placa
YOLOv8Entrena con Hard-Swish; Softmax de DFL se ejecuta en la CPUTutorial de YOLOv8m de AMD (Vitis AI 6.3, VEK385, INT8 con cola BF16): el informe del compilador muestra 1.181 operadores (99,915 %) y el 99,994 % de las GOP en la NPU, sin cambios en el modelo

Implementa YOLO26 hoy mismo en AMD Xilinx#

Hasta que esté disponible la exportación nativa, la implementación consta de cuatro pasos:

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

Paso 1: entrena o ajusta tu modelo#

Entrena con tus propios datos mediante el modo Train o en la plataforma Ultralytics. Para los destinos DPU, empieza con el YAML de Hard-Swish. Registra una referencia con el modo Val para poder medir más adelante el impacto de la cuantización en la precisión.

Paso 2: exporta a ONNX para destinos NPU#

ONNX es la entrada común de los flujos NPU de AMD. El flujo DPU cuantiza directamente el punto de control PyTorch entrenado en la imagen Docker de Vitis AI 3.5, así que quienes usen DPU pueden omitir este paso. Exporta con un tamaño de lote fijo de 1 y un opset compatible con AMD; el tutorial de YOLOv8m de AMD para Versal AI Edge Gen 2 usa opset 17.

Exportar
from ultralytics import YOLO

# Carga el modelo que has entrenado en el paso 1
model = YOLO("runs/detect/train/weights/best.pt")

# Exporta a ONNX con una forma estática para el compilador de AMD
model.export(format="onnx", opset=17, imgsz=640)  # crea 'best.onnx' junto a 'best.pt'

Consulta la integración de ONNX y los argumentos de exportación para ver todas las opciones. Si nms no está definido, ejecuta NMS en la CPU después de la inferencia; para YOLO26, nms=False selecciona en su lugar la cabeza sin NMS. No integres NMS con nms=True, porque AMD incluye NonMaxSuppression entre los operadores que pueden obligar a ejecutar todo el modelo en la CPU.

Conserva la compilación de ONNX Runtime de AMD

Las imágenes Docker de AMD incluyen su propia compilación de ONNX Runtime con el proveedor de ejecución Vitis AI. Ultralytics comprueba si ONNX Runtime está instalado durante la exportación y puede sustituirlo por el paquete estándar. Exporta desde cualquier equipo y copia el archivo .onnx al contenedor, o define YOLO_AUTOINSTALL=false cuando ejecutes Ultralytics dentro de la imagen Docker de AMD.

Paso 3: cuantiza y compila con Vitis AI#

Los flujos siguientes usan las imágenes Docker de AMD en un host Linux x86-64. No necesitas la placa para este paso. Elige la pestaña correspondiente a tu dispositivo:

  1. Inicia la imagen Docker Vitis AI 6.3 de AMD para Versal AI Edge Gen 2. Consulta los requisitos del sistema.
  2. Cuantiza el modelo ONNX a INT8 con AMD Quark usando la configuración VINT8. La configuración mínima de AMD también requiere Int32Bias=False, enable_npu_cnn=True, DedicatedQDQPair=True y QuantizeAllOpTypes=True. Quark lee los datos de calibración mediante un lector de datos que tú escribes, así que aplica el mismo preprocesamiento que durante la inferencia: redimensionamiento con letterbox al tamaño de exportación, orden de canales RGB, escalado de 0–1 y disposición NCHW, usando imágenes representativas de tu conjunto de datos.
  3. Excluye el subgrafo de posprocesamiento de la cuantización. El tutorial de YOLOv8m de AMD advierte de que cuantificarlo provoca detecciones omitidas. En ese ejemplo de YOLOv8m, el compilador ejecuta después la parte final en BF16 en la NPU; los operadores finales no compatibles, como la selección top-k de YOLO26, siguen ejecutándose en la CPU.
  4. Elige el entorno de ejecución de la placa antes de compilar. La compilación estándar funciona con ONNX Runtime, que ejecuta en la propia CPU los operadores incompatibles con la NPU, como la selección top-k de YOLO26, y con VART-ML solo cuando todos los operadores se ejecutan en la NPU. Para ejecutar con VART-ML un modelo que conserva operadores en la CPU, añade los pases de partición de CPU de AMD a vitisai_config.json. Esos artefactos no se pueden ejecutar con ONNX Runtime.
  5. Compila creando una sesión de ONNX Runtime con VitisAIExecutionProvider y un vitisai_config.json que indique el dispositivo de destino. La compilación escribe un archivo .rai en el directorio de caché. Consulta cómo compilar un modelo.

Para omitir la cuantización, compila directamente el modelo ONNX FP32 y el compilador lo convertirá a BF16. La compilación requiere una licencia del compilador AMD AI Engine; consulta la página de licencias de AMD.

Paso 4: ejecutar y validar en la placa#

Prepara primero la placa. Debe ejecutar un diseño de hardware y una imagen de Linux que incluyan la configuración del acelerador para la que has compilado, además del entorno de ejecución de Vitis AI correspondiente. Consulta las guías de configuración de AMD para los destinos DPU de Zynq UltraScale+ y Kria, Versal AI Edge (VEK280) y Versal AI Edge Gen 2 (VEK385).

Después, copia los artefactos que necesita tu entorno de ejecución:

Flujo de trabajoArtefactos que debes copiar a la placaEntorno de ejecución en la placa
DPU (Zynq UltraScale+, Kria).xmodel compiladoVART; Graph Runner para subgrafos de CPU
NPU (Versal AI Edge, VEK280)Directorio de la instantáneaVART-ML
NPU (Versal AI Edge Gen 2), ORTModelo ONNX FP32 o cuantizado utilizado para la compilación, vitisai_config.json y el directorio de caché compiladoONNX Runtime con Vitis AI EP
NPU (Versal AI Edge Gen 2), VART-MLArchivo .rai (con pases de partición de CPU si algún operador se ejecuta en la CPU) y una configuración del ejecutor de VART-MLVART-ML

En los flujos de la NPU, el grafo ONNX exportado ya decodifica las cajas y aplica la sigmoide a las puntuaciones de clase, así que el host solo interpreta la salida:

  • nms sin definir: los modelos de detección generan un tensor (1, 4 + nc, anchors) con xywh cajas y puntuaciones por clase. Selecciona la mejor clase por ancla, convierte las cajas a esquinas, filtra por confianza y ejecuta NMS; la función non_max_suppression de Ultralytics realiza todos estos pasos.
  • nms=False (YOLO26): el modelo genera un tensor (1, max_det, 6) con [x1, y1, x2, y2, score, class] filas, que solo requieren un umbral de confianza.

En ambos casos, reajusta la escala de las cajas de la entrada con letterboxing a la imagen original. Solo los grafos divididos antes del paso de decodificación requieren decodificar las cajas en el host. En la DPU, los búferes de VART contienen valores INT8 de punto fijo: consulta la forma y la escala fix_point de cada tensor, cuantiza las entradas y des cuantiza las salidas antes de aplicar los pasos anteriores. Graph Runner devuelve las salidas del grafo completo, mientras que un ejecutor solo para DPU devuelve las salidas intermedias de los subgrafos de DPU, cuyo cálculo debe completar tu código. Las disposiciones anteriores son las de ONNX (vista de CPU): VART-ML usa de forma predeterminada vistas de tensores de hardware cuya forma, tipo de datos y disposición de memoria pueden ser distintos. Por tanto, configura los tipos de tensores de entrada y salida del ejecutor como vistas de CPU o convierte tú mismo el formato de hardware (consulta la descripción general de la arquitectura de VART-ML de AMD).

Compara la precisión en el dispositivo con la referencia FP32 del paso 1 usando tu propio conjunto de validación y las mismas métricas de rendimiento, como mAP. Los resultados publicados por AMD para YOLOv8m en la VEK385 muestran el coste en precisión del despliegue INT8:

Configuración de YOLOv8mHardwaremAP50-95 (COCO)
ONNX FP32CPU del host49.95
BF16NPU VEK38550.29
VINT8 cuantizado, parte final FP32CPU del host48.75
VINT8 con parte final BF16NPU VEK38548.38

Fuente: tutorial de YOLOv8m para Versal AI Edge Gen 2 de AMD, que también informa de un tiempo medio de inferencia de 10,69 ms en 100 ejecuciones de VART con dp_size=1.

Licencias para productos comerciales

Distribuir Ultralytics YOLO como parte de un producto comercial de AMD Xilinx requiere cumplir la licencia AGPL-3.0 o disponer de una licencia empresarial de Ultralytics.

Aplicaciones en el mundo real#

Los dispositivos AMD Xilinx son habituales cuando la IA de visión debe ejecutarse en tiempo real, con bajo consumo y cerca del sensor:

Resumen#

Los dispositivos AMD Xilinx ejecutan modelos YOLO mediante dos generaciones de aceleradores. La DPU de Zynq UltraScale+ y Kria utiliza el flujo Vitis AI 3.5, que ya no evoluciona, y genera archivos .xmodel. Necesita activaciones nativas de DPU, como Hard-Swish, y ejecuta la atención en la CPU. La NPU de Versal AI Edge y Versal AI Edge Gen 2 utiliza las versiones actuales de Vitis AI. La NPU de Gen 2 es compatible con SiLU y los operadores de atención, y ejecuta el ejemplo YOLOv8m de AMD casi por completo en la NPU de la VEK385; la compatibilidad de operadores de la NPU anterior de la VEK280 depende de la versión y la precisión de Vitis AI.

La exportación nativa de Ultralytics para dispositivos AMD Xilinx estará disponible próximamente. Hasta entonces, entrena con Ultralytics, exporta a ONNX para destinos con NPU Versal o conserva el punto de control de PyTorch para destinos con DPU, y compila con Vitis AI como se describe arriba. Para otros destinos de despliegue, consulta la guía de opciones de despliegue de modelos, las prácticas recomendadas para el despliegue y las integraciones con aceleradores, como Hailo, Rockchip RKNN y Axelera.

Preguntas frecuentes#

  • Sí. AMD completó la adquisición de Xilinx en febrero de 2022 y ahora vende sus productos como SoC adaptativos y FPGA de AMD: AMD Zynq, AMD Kria, AMD Versal y AMD Vitis. Los ingenieros siguen utilizando ampliamente el nombre Xilinx, y las referencias de producto mantienen el prefijo XC.

  • Todavía no. La exportación nativa de Ultralytics para dispositivos AMD Xilinx estará disponible próximamente. Por ahora, exporta a ONNX con model.export(format="onnx") para destinos con NPU Versal, o cuantiza el punto de control de PyTorch entrenado con vai_q_pytorch para destinos con DPU Zynq UltraScale+ y Kria; después, compila con las herramientas Vitis AI de AMD, como se muestra en Despliega YOLO26 en AMD Xilinx hoy.

  • La DPU (unidad de procesamiento de aprendizaje profundo) es el acelerador INT8 anterior de AMD. Está integrada en la lógica programable de los dispositivos Zynq UltraScale+ y Kria, se compila con Vitis AI 3.5 y genera archivos .xmodel. La NPU la sustituye en las versiones actuales de Vitis AI. En los dispositivos Versal AI Edge combina AI Engines endurecidos con lógica programable, admite INT8, BF16 y precisión mixta, y es compatible con más operadores, incluidos SiLU y, en Versal AI Edge Gen 2, la atención.

  • Un .xmodel es un grafo XIR serializado que utiliza la cadena de herramientas de DPU de AMD. El cuantizador escribe un .xmodel cuantizado y el compilador vai_c_xir lo convierte en un .xmodel compilado que contiene el flujo de instrucciones de la DPU, los pesos INT8 cuantizados y los subgrafos que deben ejecutarse en la CPU. El archivo compilado está dirigido a una configuración específica de DPU, descrita mediante una huella arch.json, y se ejecuta en la placa con Vitis AI Runtime (VART), o con Graph Runner si contiene subgrafos de CPU.

  • No. La DPU solo acelera las activaciones ReLU, ReLU6, LeakyReLU, Hard-Swish y Hard-Sigmoid, y ejecuta en la CPU Sigmoid, Softmax y MatMul entre dos activaciones. Entrena YOLO con activation: nn.Hardswish() en el YAML del modelo para mantener las convoluciones en la DPU y consulta Cómo gestionar los bloques de atención en la DPU para ver las opciones de atención. Las NPU de Versal AI Edge Gen 2 admiten SiLU, Softmax y MatMul de forma nativa.

  • La KV260 utiliza un MPSoC Zynq UltraScale+ con DPU, así que sigue el flujo de DPU. Entrena un modelo YOLO26 con Hard-Swish, cuantízalo con vai_q_pytorch en la imagen Docker Vitis AI 3.5, compílalo con vai_c_xir usando arch.json de la KV260 y ejecuta en la placa el .xmodel resultante con VART o con Graph Runner si contiene subgrafos de CPU.

  • No. La cuantización y la compilación se ejecutan en las imágenes Docker Vitis AI de AMD en un host Linux x86-64. Solo necesitas la placa para ejecutar el modelo compilado y medir la latencia y la precisión en el dispositivo.

  • Se puede ejecutar cualquier tarea si sus operadores se compilan para tu acelerador. Los operadores no compatibles suelen ejecutarse en la CPU, aunque algunos pueden hacer que todo el modelo se ejecute en la CPU o provocar un error de compilación. La detección de objetos es la carga de trabajo más habitual y la que utilizan los propios ejemplos de AMD. Para la segmentación, la estimación de pose y otras tareas, consulta el informe de partición del compilador para confirmar que las capas más exigentes se ejecutan en el acelerador.

Colaboradores

Comentarios