Exportación de AMD Xilinx para Ultralytics YOLO con Vitis AI#
Al exportar modelos Ultralytics YOLO26 con format="xilinx", se cuantizan con AMD Quark para la NPU de los SoC adaptativos AMD Versal AI Edge Series Gen 2, listos para que el compilador Vitis AI de AMD genere un modelo .rai. La misma exportación valida la precisión INT8 en cualquier equipo antes de la implementación.
La exportación está dirigida al flujo de NPU Vitis AI con mantenimiento activo para dispositivos Versal AI Edge Series Gen 2, como el kit de evaluación VEK385. Las DPU Zynq UltraScale+ y Kria y la NPU Versal AI Edge de primera generación (VEK280) usan otros flujos de Vitis AI, descritos en Implementación en otros destinos AMD Xilinx.
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 la exportación de AMD Xilinx, cómo compilarla y ejecutarla en una placa Versal, qué es cada familia de dispositivos AMD Xilinx, cómo se ejecuta la IA en ellos y qué operadores de Ultralytics YOLO admite cada acelerador.
¿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.
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érmino | Qué significa |
|---|---|
| FPGA | Matriz 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 / MPSoC | Sistema 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. |
| DPU | Unidad 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 NPU | Unidad 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 AI | Cadena 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 Quark | Biblioteca 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 QAT | Conversió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ón | Pequeñ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 mixta | BFloat16 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. |
| XIR | Representación intermedia de Xilinx: formato de grafo que genera el compilador DPU y lee el entorno de ejecución. |
.xmodel | Grafo 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 DPU | Archivo 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ánea | Directorio 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. |
.rai | Archivo del modelo compilado que genera el flujo de trabajo de NPU de Versal AI Edge Gen 2. |
| VART / VART-ML | Bibliotecas de Vitis AI Runtime que cargan modelos compilados y los ejecutan en la placa, con API de C++ y Python. |
| ONNX Runtime Vitis AI EP | VitisAIExecutionProvider para ONNX Runtime, que compila y ejecuta modelos ONNX en las NPU de AMD. |
| Recurso alternativo de CPU / particionado del grafo | Cuando 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.
| Familia | Qué es | CPU de aplicación | Acelerador de IA | Placas de ejemplo |
|---|---|---|---|---|
| Zynq UltraScale+ MPSoC | CPU Arm y lógica FPGA en un solo chip, con tamaños que van de ZU1 a ZU19 | Arm Cortex-A53 de doble o cuádruple núcleo | DPU integrada en la lógica programable | ZCU104, ZCU102 y placas personalizadas |
| Módulo en sistema Kria K26 | Módulo listo para producción basado en un Zynq UltraScale+ MPSoC | Arm Cortex-A53 de cuatro núcleos | DPU integrada en la lógica programable | Kit de iniciación KV260 Vision AI, kit de iniciación KR260 Robotics |
| Serie Versal AI Edge | SoC adaptables; los componentes AIE-ML como VE2302 y VE2802 ejecutan la NPU | Arm Cortex-A72 de doble núcleo | NPU en motores de IA AIE-ML y PL | VEK280 |
| Serie Versal AI Edge Gen 2 | SoC adaptable de última generación con motores de IA AIE-MLv2 | Hasta ocho Arm Cortex-A78AE | NPU en motores de IA AIE-MLv2 y PL | VEK385 |
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.
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 trabajo | Hardware | Cadena de herramientas | Cuantizador | Artefacto compilado | Entorno de ejecución en la placa | Estado |
|---|---|---|---|---|---|---|
| DPU | Zynq UltraScale+, Kria | Vitis AI 3.5 (Docker) | vai_q_pytorch | .xmodel | VART | Compilador congelado, zoo de modelos e IP de DPU |
| NPU (Versal AI Edge) | VEK280 y otras piezas Versal AI Edge | Vitis AI 6.3 (Docker) | Integrado en el flujo de instantáneas | Instantánea | VART-ML | Activo |
| NPU (Versal AI Edge Gen 2) | VEK385 y otras piezas Gen 2 | Vitis AI 6.3 (Docker) | AMD Quark | .rai | ONNX Runtime Vitis AI EP o VART-ML | Activo |
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 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:
Exportación a AMD Xilinx: conversión de tu modelo YOLO#
Tareas compatibles#
La exportación de AMD Xilinx admite las siete tareas de Ultralytics. La segmentación semántica y la estimación de profundidad solo están disponibles con YOLO26, la única familia que incluye esos cabezales.
| Tarea | YOLOv8 | YOLO11 | YOLO26 |
|---|---|---|---|
| Detectar | ✅ | ✅ | ✅ |
| Segmentar | ✅ | ✅ | ✅ |
| Semántica | ❌ | ❌ | ✅ |
| Profundidad | ❌ | ❌ | ✅ |
| Clasificar | ✅ | ✅ | ✅ |
| Pose | ✅ | ✅ | ✅ |
| OBB | ✅ | ✅ | ✅ |
Instalación#
La exportación de AMD Xilinx se ejecuta en Linux (x86-64 o ARM64) con Python 3.11 a 3.13, las versiones compatibles con AMD Quark. La primera exportación también compila los operadores personalizados de Quark, para lo que se necesita un compilador de C++, como g++.
# Install the required package for YOLO
pip install ultralyticsAMD Quark se instala automáticamente desde PyPI durante la primera exportación. Para instalar previamente las dependencias de exportación:
pip install "ultralytics[export-xilinx]"Para instalar el repositorio en modo editable, sustituye "ultralytics[export-xilinx]" por -e ".[export-base,export-xilinx]". Para reproducir el entorno de Python 3.12 y la exportación de prueba utilizados por CI, ejecuta el generador de entornos existente desde la raíz del repositorio:
ULTRALYTICS_ISOLATED_VENVS="$PWD/.venvs" python .github/scripts/create-export-env.py --env isolated-xilinxUso#
El formato AMD Xilinx admite los modos Exportar, Predecir y Validar. Sin el proveedor de ejecución Vitis AI de AMD, los modos de predicción y validación ejecutan el modelo cuantizado con ONNX Runtime en la CPU, lo que permite medir su precisión INT8 en cualquier equipo. Cuando ONNX Runtime proporciona VitisAIExecutionProvider, como ocurre en una placa Versal AI Edge Series Gen 2, Ultralytics lo selecciona automáticamente.
from ultralytics import YOLO
# Carga un modelo YOLO26
model = YOLO("yolo26n.pt")
# Exportar al formato AMD Xilinx para VEK385 (quantize=8 se aplica automáticamente)
model.export(format="xilinx") # creates 'yolo26n_xilinx_model/'from ultralytics import YOLO
# Cargar el modelo AMD Xilinx exportado
model = YOLO("yolo26n_xilinx_model")
# Ejecutar inferencia
results = model("https://ultralytics.com/images/bus.jpg")from ultralytics import YOLO
# Cargar el modelo AMD Xilinx exportado
model = YOLO("yolo26n_xilinx_model")
# Validar la precisión INT8 con el conjunto de datos COCO8
metrics = model.val(data="coco8.yaml")Los nombres de formato vitis, vitisai y versal son alias de xilinx.
Argumentos de exportación#
| Argumento | Tipo | Predeterminado | Descripción |
|---|---|---|---|
format | str | 'xilinx' | Formato de destino del modelo exportado, que define la compatibilidad con las NPU AMD Versal AI Edge Series Gen 2. |
imgsz | int o tuple | 640 | Tamaño de imagen deseado para la entrada del modelo, como un entero para imágenes cuadradas o una tupla (height, width). El modelo exportado tiene un tamaño de lote fijo de 1. |
quantize | int o str | 8/auto | Precisión de cuantización. Se requiere 8 (Vitis AI INT8) y se activa automáticamente si no se especifica. |
data | str | None | Archivo YAML del conjunto de datos usado para la calibración INT8; en clasificación, se acepta en su lugar un directorio de conjunto de datos o el nombre de uno integrado. Si no se especifica, Ultralytics usa el conjunto de datos de calibración de la tarea, como coco128.yaml para detección. |
fraction | float | 1.0 | Fracción del conjunto de datos de calibración que se utilizará. |
name | str | 've2-xc2ve3858' | Dispositivo del compilador Vitis AI: 've2-xc2ve3858' (kit de evaluación VEK385), 've2-xc2ve3804', 've2-xc2ve3558', 've2-xc2ve3504', 've2-xc2ve3358' o 've2-xc2ve3304'. |
opset | int | None | Versión de ONNX opset para el grafo intermedio. De forma predeterminada, 17, la versión de opset que AMD valida para YOLO en Vitis AI. |
simplify | bool | True | Simplifica el grafo ONNX intermedio con onnxslim. |
device | str | None | Especifica el dispositivo para la exportación: GPU (device=0) o CPU (device=cpu). |
Establece nms=False para exportar el cabezal YOLO26 sin NMS. NMS integrado (nms=True) no es compatible porque AMD incluye NonMaxSuppression entre los operadores que pueden hacer que todo el modelo se ejecute en la CPU.
La precisión INT8 depende de lo bien que las imágenes de calibración representen la escena de implementación. Pasa a data= un archivo YAML de conjunto de datos con al menos 300 imágenes representativas de tus propias cámaras; los conjuntos de datos de calibración predeterminados son pequeñas muestras públicas.
Para obtener más información sobre el proceso de exportación, visita la página de documentación de Ultralytics sobre exportación.
Estructura de salida#
Tras una exportación correcta, se crea un directorio del modelo con la siguiente estructura:
yolo26n_xilinx_model/
├── yolo26n.onnx # AMD Quark VINT8 model with the Ultralytics metadata
└── vitisai_config.json # Vitis AI compiler configuration for the target deviceAl compilar el modelo, tal como se describe a continuación, se añade una caché del compilador yolo26n/ al mismo directorio, que contiene el modelo NPU yolo26n.rai y los informes de compilación de AMD, como final-vaiml-pass-summary.txt.
Cómo funciona la exportación#
La exportación sigue el flujo Vitis AI documentado por AMD para Versal AI Edge Series Gen 2:
- Exportación ONNX con opset 17 y un tamaño de lote estático de 1.
- Cuantización con AMD Quark mediante la configuración
VINT8(INT8 simétrico con escalas de potencias de dos) y las opciones que AMD requiere para compilar en la NPU:Int32Bias=False,enable_npu_cnn=True,DedicatedQDQPair=TrueyQuantizeAllOpTypes=True. La calibración usa el cargador estándar de calibración INT8 de Ultralytics, con el mismo letterbox y el mismo preprocesamiento RGB y de 0–1 que la inferencia. - Precisión mixta: el cabezal del modelo se mantiene en coma flotante y el compilador Vitis AI lo ejecuta en BF16 en la NPU. Cuantizar el cabezal a INT8 provoca la mayor parte de la pérdida de precisión, y el tutorial de YOLOv8m de AMD mantiene su etapa de posprocesamiento fuera de INT8 por el mismo motivo.
- Configuración del compilador:
vitisai_config.jsonselecciona el destinoVAIMLy el dispositivo dename.
Precisión#
La tabla compara el modelo INT8 exportado con el modelo ONNX FP32 en COCO val2017 (5000 imágenes) a 640; ambos se ejecutan con ONNX Runtime en la CPU del equipo. Los modelos INT8 se calibraron con el conjunto de datos predeterminado coco128.yaml; calibrar con tus propias imágenes de implementación suele reducir la diferencia.
Estos resultados en el equipo ejecutan el modelo cuantizado con ONNX Runtime en la CPU, que es la referencia frente a la que AMD compara los resultados de su metodología de precisión en la NPU. Los resultados publicados por AMD para YOLOv8m en VEK385 muestran el mismo enfoque de precisión mixta en la NPU:
| Configuración de YOLOv8m | Hardware | mAP50-95 (COCO) |
|---|---|---|
| ONNX FP32 | CPU del host | 49.95 |
| BF16 | NPU VEK385 | 50.29 |
| VINT8 cuantizado, parte final FP32 | CPU del host | 48.75 |
| VINT8 con parte final BF16 | NPU VEK385 | 48.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.
Compilar y ejecutar en Versal AI Edge Gen 2#
El directorio exportado está listo para el compilador Vitis AI de AMD, que genera el modelo .rai que se ejecuta en la NPU.
-
Prepara el equipo y la placa. Compila en un equipo host Linux x86-64 con la imagen Docker Vitis AI 6.3 para Versal AI Edge Gen 2 de AMD y una licencia del compilador AMD AI Engine (consulta la página de licencias de AMD). Configura el VEK385 con la guía de configuración de la placa de AMD.
-
Compila. Dentro del contenedor, crea una sesión de ONNX Runtime con el proveedor de ejecución Vitis AI, usando la misma llamada que en la guía de compilación de AMD. Escribe la caché
yolo26n/conyolo26n.raien el directorio de exportación: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])Comprueba
yolo26n_xilinx_model/yolo26n/final-vaiml-pass-summary.txtpara ver qué parte del modelo se ejecuta en la NPU. Para YOLO26n a 640, el compilador Vitis AI 6.3 de AMD coloca el 99,9 % de los operadores y del cálculo en la NPU VEK385, en una sola partición. -
Ejecuta en la placa. Copia el directorio de exportación al VEK385. ONNX Runtime con el proveedor de ejecución Vitis AI carga el
yolo26n.raicompilado y lo ejecuta en la NPU;YOLO("yolo26n_xilinx_model")selecciona automáticamente este proveedor cuando está disponible.
La compilación solo necesita ONNX Runtime de AMD, así que puedes exportar en cualquier máquina Linux y copiar el directorio al contenedor en lugar de instalar allí Ultralytics, lo que podría cambiar los paquetes fijados del contenedor. Cuando Ultralytics está instalado junto a la versión onnxruntime-vitisai de AMD, como en la placa, conserva esa versión en lugar de sustituirla por la versión estándar onnxruntime.
La exportación configura la compilación estándar para ONNX Runtime, que ejecuta en la propia CPU Arm los operadores no compatibles con la NPU, como la selección top-k de YOLO26 con nms=False. El entorno de ejecución VART-ML ejecuta un modelo solo si todos los operadores están en la NPU, a menos que añadas los pases de partición de CPU de AMD a vitisai_config.json; esos artefactos no se pueden ejecutar mediante ONNX Runtime.
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.
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).
| Operador | Dónde aparece en YOLO | DPU (Zynq UltraScale+, Kria) | NPU (Versal AI Edge Gen 2) |
|---|---|---|---|
| Convolución + normalización por lotes | Cada bloque Conv | ✅ | ✅ |
| Activación SiLU | Cada bloque Conv (activación predeterminada) | ❌ Se ejecuta en la CPU; sustitúyela por Hard-Swish | ✅ |
| Hard-Swish, ReLU, ReLU6, LeakyReLU | Activaciones opcionales definidas en el YAML del modelo | ✅ Fusionado con la convolución | ✅ |
| Sigmoid | Puntuaciones de clase en la cabeza de detección | ❌ Se ejecuta en la CPU (normalmente como parte del posprocesamiento) | ✅ |
| MatMul entre dos activaciones | Bloques de atención (C2PSA; YOLO26 C3k2) | ❌ Se ejecuta en la CPU | ✅ |
| Softmax | Bloques de atención; DFL en YOLOv8 y YOLO11 | ❌ Se ejecuta en la CPU | ✅ |
| Reshape, Transpose | Bloques de atención | ⚠️ Fusionado cuando es posible; si no, se ejecuta en la CPU | ✅ |
| Split, Slice | Bloques 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, Add | Bloque SPPF y fusión de características | ✅ | ✅ |
| TopK, GatherElements | Cabeza sin NMS de YOLO26 (nms=False) | ❌ Se ejecuta en la CPU | ⚠️ Partición en la CPU del host Arm |
| NonMaxSuppression | Solo 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.
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 modeA continuación, crea el modelo, transfiere los pesos preentrenados de YOLO26 y ajústalo con tu conjunto de datos:
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.
- Sustitución durante la cuantización: define
"convert_silu_to_hswish": trueen 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:
-
Acepta los bloques de CPU. El
.xmodelcompilado 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. -
Usa un YAML sin atención. En tu YAML de Hard-Swish, sustituye la capa C2PSA por
nn.Identitypara que los índices de capa usados porConcatyDetectsigan 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.
-
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#
| Modelo | DPU (Zynq UltraScale+, Kria) | NPU (Versal AI Edge Gen 2) |
|---|---|---|
| YOLO26 | Entrena con Hard-Swish; los dos bloques de atención se convierten en subgrafos de CPU; sin DFL | Exportación nativa format="xilinx"; el cabezal se ejecuta en BF16 |
| YOLO11 | Entrena con Hard-Swish; C2PSA y Softmax de DFL se ejecutan en la CPU | Exportación nativa format="xilinx"; el cabezal se ejecuta en BF16 |
| YOLOv8 | Entrena con Hard-Swish; Softmax de DFL se ejecuta en la CPU | Exportación nativa format="xilinx". Tutorial de YOLOv8m de AMD (Vitis AI 6.3, VEK385, INT8 con etapa final BF16): el informe del compilador muestra 1181 operadores (99,915 %) y el 99,994 % de los GOP en la NPU, sin cambios en el modelo |
Implementación en otros destinos AMD Xilinx#
Las DPU Zynq UltraScale+ y Kria y la NPU Versal AI Edge de primera generación usan flujos Vitis AI que format="xilinx" no genera. Entrena con Ultralytics y, después, genera el artefacto del destino con las herramientas de AMD en sus imágenes Docker Linux x86-64. Elige la pestaña correspondiente a tu dispositivo:
-
Inicia la imagen Docker Vitis AI 6.3 de AMD para Versal AI Edge.
-
Activa el entorno de la NPU para la IP de NPU de tu placa ejecutando
settings.shcon source. Pasa como argumento el nombre de la IP de NPU de tu placa o ejecutaLISTpara ver las IP disponibles. -
Captura una instantánea ejecutando un script de inferencia normal con imágenes representativas y la variable de entorno
VAISW_SNAPSHOT_DIRECTORYdefinida. No hace falta cambiar el código:# 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 acepta INT8 (valor predeterminado), BF16 o MIXED, y VAISW_QUANTIZATION_NBIMAGES tiene 4 imágenes como valor predeterminado, así que establece un número mayor y representativo para los modelos de detección. La instantánea está vinculada a la variante de IP de NPU de tu placa. Las partes finales del posprocesamiento de YOLO se ejecutan en los AI Engines solo con precisión BF16 o MIXED. La documentación de AMD difiere en lo que respecta a Softmax: la página de ejemplos indica que Softmax no se acelera y asigna a la CPU la parte final Softmax de YOLOv8, mientras que las notas de la versión de Vitis AI 6.1 informan de una aceleración completa de YOLOv8 con precisión mixta. Inspecciona el archivo wrp_network_iriz.onnx dentro de la instantánea para confirmar qué partes de tu modelo, incluida la atención de YOLO11 y YOLO26, se ejecutan en la NPU. Consulta trae tu propio modelo.
Prepara la placa con un diseño de hardware y una imagen Linux que incluyan la configuración del acelerador para la que has compilado, además del entorno de ejecución Vitis AI correspondiente. Consulta las guías de configuración de AMD para los destinos DPU Zynq UltraScale+ y Kria y Versal AI Edge (VEK280); después, copia los artefactos que necesita tu entorno de ejecución:
| Flujo de trabajo | Artefactos que debes copiar a la placa | Entorno de ejecución en la placa |
|---|---|---|
| DPU (Zynq UltraScale+, Kria) | .xmodel compilado | VART; Graph Runner para subgrafos de CPU |
| NPU (Versal AI Edge, VEK280) | Directorio de la instantánea | VART-ML |
En la DPU, los búferes 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 del posprocesamiento. Graph Runner devuelve las salidas del grafo completo, mientras que un ejecutor que solo use la DPU devuelve salidas intermedias de subgrafos de la DPU cuyo cálculo debe completar tu código. VART-ML en VEK280 usa de forma predeterminada vistas de tensores de hardware, cuya forma, tipo de datos y disposición en memoria pueden diferir de los formatos ONNX; por eso, 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 VART-ML de AMD).
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:
- Seguridad industrial y en la construcción: detecta personas y máquinas alrededor de equipos pesados y supervisa zonas de trabajo con la detección de objetos y el recuento de objetos.
- Visión para automoción y vehículos todoterreno: ejecuta percepción basada en cámaras en componentes homologados para automoción, compatible con los vehículos autónomos y la asistencia al conductor.
- Cámaras inteligentes y analítica de vídeo: combina la captura y codificación de vídeo con la inferencia de YOLO en un solo chip para sistemas de seguridad y analítica de vídeo.
- Visión artificial e inspección de calidad: combina la captura de imágenes de alta velocidad basada en FPGA con la segmentación de instancias o la clasificación de YOLO para detectar defectos en línea.
- Robótica y drones: utiliza módulos Kria KR260 o Versal para la estimación de pose, la detección de objetos orientados y la navegación con latencia determinista.
Resumen#
Al exportar con format="xilinx", los modelos Ultralytics YOLO se cuantizan con AMD Quark para las NPU AMD Versal AI Edge Series Gen 2, el cabezal se mantiene en BF16 y la configuración del compilador Vitis AI se guarda junto al modelo. Valida la precisión INT8 en cualquier equipo, compila el modelo .rai en la imagen Docker Vitis AI de AMD y ejecútalo en la placa con ONNX Runtime y el proveedor de ejecución Vitis AI.
Los dispositivos AMD Xilinx antiguos usan otros flujos. La DPU de Zynq UltraScale+ y Kria usa la cadena de herramientas Vitis AI 3.5, ya obsoleta, y archivos .xmodel; necesita activaciones nativas de la DPU, como Hard-Swish, y ejecuta la atención en la CPU. La NPU Versal AI Edge de primera generación usa el flujo snapshot, cuya cobertura de operadores depende de la versión de Vitis AI y de la precisión.
Para otros destinos de implementación, consulta la guía de opciones de implementación de modelos, las prácticas recomendadas de implementación y las integraciones de 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.Sí.
model.export(format="xilinx")cuantiza el modelo con AMD Quark para las NPU Versal AI Edge Series Gen 2 y genera un directorio con el modelo ONNX cuantizado y su configuración del compilador Vitis AI. Compílalo a.raicon las herramientas Vitis AI de AMD, tal como se muestra en Compilar y ejecutar en Versal AI Edge Gen 2. Los destinos Zynq UltraScale+, Kria y VEK280 usan los flujos de Implementación en otros destinos AMD Xilinx.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
.xmodeles un grafo XIR serializado que utiliza la cadena de herramientas de DPU de AMD. El cuantizador escribe un.xmodelcuantizado y el compiladorvai_c_xirlo convierte en un.xmodelcompilado 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 huellaarch.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_pytorchen la imagen Docker Vitis AI 3.5, compílalo convai_c_xirusandoarch.jsonde la KV260 y ejecuta en la placa el.xmodelresultante con VART o con Graph Runner si contiene subgrafos de CPU.No. La exportación se ejecuta en cualquier equipo Linux con Python 3.11 a 3.13 y no requiere una cuenta de AMD; además, el modelo exportado se ejecuta en la CPU para comprobar la precisión en cualquier equipo. Para compilar el modelo
.raise necesita la imagen Docker Vitis AI de AMD y una licencia del compilador AI Engine; para ejecutarlo en la NPU se necesita una placa Versal AI Edge Series Gen 2.Ultralytics solo usa el proveedor de ejecución Vitis AI cuando ONNX Runtime lo proporciona, como sucede con la versión
onnxruntime-vitisaide AMD en una placa Versal o en la imagen Docker de AMD. En otros entornos, ejecuta el modelo cuantizado con la versión estándar de ONNX Runtime en la CPU, que es la forma de medir la precisión INT8 antes de la implementación.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.