Ultralytics YOLO27: Inscreve-te na lista de espera.
Get Started

Exportação AMD Xilinx para Ultralytics YOLO com Vitis AI#

A exportação de modelos Ultralytics YOLO26 com format="xilinx" os quantiza com AMD Quark para a NPU dos SoCs adaptativos AMD Versal AI Edge Series Gen 2, deixando-os prontos para que o compilador Vitis AI da AMD gere um modelo .rai. A mesma exportação valida a precisão INT8 em qualquer host antes da implantação.

Dispositivos AMD compatíveis

A exportação é destinada ao fluxo Vitis AI para NPU com manutenção ativa, voltado a dispositivos Versal AI Edge Series Gen 2, como o kit de avaliação VEK385. As DPUs Zynq UltraScale+ e Kria e a NPU Versal AI Edge de primeira geração (VEK280) usam outros fluxos Vitis AI, descritos em Implantação em outros destinos AMD Xilinx.

Os dispositivos AMD Xilinx estão presentes em muitas câmaras industriais, sistemas de visão automóvel, robôs, drones e produtos de imagiologia médica em todo o mundo. Combinam processadores Arm com lógica programável e, nos dispositivos mais recentes, AI Engines dedicados, para que um único chip possa capturar vídeo, pré-processá-lo, executar deteção de objetos e agir com base no resultado com latência de inferência baixa e previsível.

Este guia aborda a exportação AMD Xilinx, como compilar e executar em uma placa Versal, as famílias de dispositivos AMD Xilinx, como a IA é executada neles e quais operadores Ultralytics YOLO cada acelerador suporta.

O que é AMD Xilinx?#

A Xilinx inventou a matriz de portas programável em campo (FPGA) na década de 1980 e tornou-se um fornecedor líder de SoCs adaptativos e FPGAs. A AMD concluiu a aquisição da Xilinx em fevereiro de 2022, e as linhas de produtos são agora comercializadas sob a marca AMD como AMD Zynq, AMD Kria, AMD Versal e AMD Vitis.

Xilinx ou AMD?

Ambos os nomes referem-se aos mesmos produtos. A AMD comercializa-os como «SoCs adaptativos e FPGAs», mas os engenheiros continuam a dizer «Xilinx». Os números de modelo mantêm o prefixo XC (por exemplo, xczu7ev), e o repositório Vitis AI mais antigo e as imagens Docker continuam disponíveis sob o nome Xilinx no GitHub e Docker Hub. Este guia usa «AMD Xilinx» para que o possas encontrar por qualquer um dos nomes.

Termos e conceitos principais#

A implementação AMD Xilinx utiliza vocabulário próprio. A tabela abaixo explica todos os termos usados neste guia.

TermoO que significa
FPGAMatriz de portas programável em campo: um chip cuja lógica digital é configurada após o fabrico, carregando um design chamado bitstream. Pode implementar hardware personalizado, como pipelines de vídeo ou aceleradores de redes neuronais.
Lógica programável (PL)A estrutura FPGA dentro de um SoC AMD Xilinx. Nos dispositivos Zynq e Kria, o acelerador de IA é construído na PL.
Sistema de processamento (PS)Os núcleos de CPU Arm fixos, os controladores de memória e os periféricos do SoC. Executa Linux, a tua aplicação e quaisquer camadas do modelo que o acelerador não consiga executar.
SoC adaptativo / MPSoCUm sistema num chip que combina um sistema de processamento com lógica programável e, em muitos dispositivos Versal, AI Engines. MPSoC significa sistema multiprocessador num chip.
AI Engine (AIE, AIE-ML, AIE-MLv2)Conjuntos de processadores vetoriais dedicados presentes em muitos dispositivos Versal, incluindo a série Versal AI Edge abordada aqui, concebidos para aprendizagem automática e processamento de sinais.
DPUUnidade de processamento de aprendizagem profunda: o acelerador de redes neuronais INT8 da AMD, fornecido como IP integrado na PL (por exemplo, DPUCZDX8G em Zynq UltraScale+ e Kria). Tamanhos como B512 a B4096 indicam o número máximo de operações por ciclo de relógio.
NPU / IP de NPUUnidade de processamento neural: o acelerador de inferência da geração atual da AMD, que substitui a DPU nas versões recentes do Vitis AI. A AMD descreve o IP de NPU como um acelerador flexível que combina AI Engines com lógica programável, pelo que também requer um design de hardware correspondente. Consulta a entrada do glossário sobre NPU.
Vitis AIA cadeia de ferramentas da AMD para implementar redes neuronais em dispositivos AMD Xilinx. Inclui quantização, compilação, runtimes, exemplos e ambientes Docker.
AMD QuarkA biblioteca atual da AMD para quantização de modelos, usada pelo fluxo Versal AI Edge Gen 2 para converter um modelo ONNX FP32 num modelo INT8.
Quantização, PTQ e QATConversão de pesos e ativações FP32 para INT8. A quantização pós-treino (PTQ) usa imagens de calibração. O treino com reconhecimento de quantização (QAT) ajusta o modelo para recuperar precisão.
Imagens de calibraçãoUm pequeno conjunto representativo de imagens executadas através do modelo durante a PTQ para escolher a escala INT8 de cada tensor.
BF16 e precisão mistaBFloat16 é um formato de vírgula flutuante de 16 bits que mantém o intervalo de FP32. A precisão mista executa a maior parte da rede em INT8 e as camadas sensíveis em BF16.
XIRRepresentação intermédia Xilinx: o formato de grafo produzido pelo compilador DPU e lido pelo runtime.
.xmodelUm grafo XIR serializado. O quantizador grava um .xmodel quantizado, e o compilador DPU converte-o num .xmodel compilado, com instruções DPU, pesos quantizados e quaisquer subgrafos de CPU. O modelo compilado requer a configuração DPU correspondente.
arch.json / impressão digital da DPUO ficheiro que descreve uma configuração específica da DPU. O compilador DPU precisa dele, e um .xmodel compilado para uma impressão digital não será executado noutra.
SnapshotO diretório do modelo compilado produzido pelo fluxo NPU Versal AI Edge (VEK280). Está associado a uma variante específica de IP de NPU.
.raiO ficheiro do modelo compilado produzido pelo fluxo NPU Versal AI Edge Gen 2.
VART / VART-MLAs bibliotecas Vitis AI Runtime que carregam modelos compilados e os executam na placa, com APIs C++ e Python.
ONNX Runtime Vitis AI EPO VitisAIExecutionProvider para ONNX Runtime, que compila e executa modelos ONNX em NPU AMD.
Fallback para CPU / particionamento do grafoQuando o acelerador não consegue executar um operador, o compilador costuma dividir o modelo em subgrafos para o acelerador e para a CPU, e cada divisão acrescenta uma transferência de dados que pode dominar a latência. Alguns operadores, em vez disso, obrigam o modelo inteiro a ser executado na CPU ou fazem a compilação falhar.

Famílias de dispositivos AMD Xilinx para IA de periferia#

Os dispositivos AMD Xilinx para IA de periferia dividem-se em três famílias. Zynq e Kria usam a DPU na lógica programável, enquanto os dispositivos Versal AI Edge aqui abordados usam a NPU nos seus AI Engines.

FamíliaO que éCPU da aplicaçãoAcelerador de IAPlacas de exemplo
Zynq UltraScale+ MPSoCCPUs Arm e lógica FPGA num único chip, em configurações de ZU1 a ZU19Arm Cortex-A53 de núcleo duplo ou quádruploDPU integrada na lógica programávelZCU104, ZCU102, placas personalizadas
Módulo de sistema Kria K26Módulo pronto para produção, baseado num Zynq UltraScale+ MPSoCArm Cortex-A53 de quatro núcleosDPU integrada na lógica programávelKV260 Vision AI Starter Kit, KR260 Robotics Starter Kit
Série Versal AI EdgeSoCs adaptativos; componentes AIE-ML como VE2302 e VE2802 executam a NPUArm Cortex-A72 de núcleo duploNPU em AI Engines AIE-ML e PLVEK280
Série Versal AI Edge Gen 2SoC adaptativo de nova geração com AI Engines AIE-MLv2Até oito Arm Cortex-A78AENPU em AI Engines AIE-MLv2 e PLVEK385

Zynq UltraScale+ MPSoC#

Cada chip Zynq UltraScale+ combina um sistema de processamento Arm, com núcleos Cortex-A53 de núcleo duplo (CG) ou quádruplo (EG e EV) e núcleos Cortex-R5F em tempo real, com lógica FPGA. Os dispositivos EV acrescentam um codec de vídeo H.264/H.265 dedicado. Para executar redes neuronais, os designers integram uma DPU na lógica, junto dos pipelines de câmara e vídeo. Em dispositivos pequenos, a DPU compete por espaço com o resto do design.

Módulos de sistema Kria#

O módulo Kria K26 integra um Zynq UltraScale+ MPSoC, memória e alimentação num módulo pronto para produção, para não precisares de conceber por conta própria o processador, a memória e o subsistema de alimentação. O módulo liga-se a uma placa transportadora, seja a placa de um kit inicial ou um design teu. Alimenta o KV260 Vision AI Starter Kit para câmaras inteligentes e o KR260 Robotics Starter Kit para robótica. Como o K26 é baseado em Zynq UltraScale+, usa o mesmo fluxo DPU. O portefólio Kria também inclui outros módulos, por isso verifica que processador o teu módulo utiliza antes de escolheres um fluxo.

SoCs adaptativos Versal#

Versal é a família de SoCs adaptativos da AMD. As séries AI Edge e AI Core incluem AI Engines dedicados junto dos núcleos Arm e da lógica programável, enquanto algumas outras séries Versal não têm AI Engines. O IP de NPU da AMD é executado em conjunto nos AI Engines e na lógica programável, e o Vitis AI destina-se aos componentes AIE-ML da série AI Edge, como o VE2302 e o VE2802. A Série Versal AI Edge (kit de avaliação VEK280) e a Série Versal AI Edge Gen 2 (kit de avaliação VEK385) são os destinos atuais da AMD para IA de periferia e o foco das versões atuais do Vitis AI.

Como a IA é executada em dispositivos AMD Xilinx: DPU vs NPU#

A maioria das implementações de IA AMD Xilinx segue o mesmo padrão. O acelerador executa as camadas que suporta, a CPU Arm executa o pré-processamento, o pós-processamento e quaisquer camadas que o acelerador não consiga executar, e um runtime na placa coordena ambos.

A AMD lançou duas gerações de aceleradores, cada uma com a sua própria cadeia de ferramentas e ficheiro de modelo compilado. Este guia aborda o Vitis AI 3.5 para a DPU e o Vitis AI 6.3 para a NPU; consulta a documentação atual da AMD para versões posteriores.

FluxoHardwareCadeia de ferramentasQuantizadorArtefacto compiladoRuntime da placaStatus
DPUZynq UltraScale+, KriaVitis AI 3.5 (Docker)vai_q_pytorch.xmodelVARTCompilador congelado, zoo de modelos e IP DPU
NPU (Versal AI Edge)VEK280 e outras peças Versal AI EdgeVitis AI 6.3 (Docker)Integrado ao fluxo de snapshotSnapshotVART-MLAtivo
NPU (Versal AI Edge Gen 2)VEK385 e outras peças Gen 2Vitis AI 6.3 (Docker)AMD Quark.raiONNX Runtime Vitis AI EP ou VART-MLAtivo
O fluxo de DPU está congelado

Vitis AI 3.5 é a última versão com atualizações do compilador de DPU e do zoológico de modelos. As versões posteriores no repositório Xilinx/Vitis-AI mantêm inalterados o compilador, o zoológico de modelos e o IP de DPU do Zynq UltraScale+, enquanto atualizam o runtime e a compatibilidade com versões mais recentes das ferramentas AMD (consulte as notas de lançamento do Vitis AI 5.0); a documentação atual do Vitis AI da AMD descreve a NPU como substituta da arquitetura DPU obsoleta. Os produtos Zynq UltraScale+ e Kria existentes podem continuar sendo enviados com a DPU, mas o suporte a operadores não será ampliado, então arquiteturas de modelos mais recentes precisam das adaptações descritas em Compatibilidade de modelos YOLO.

Os laptops Ryzen AI usam uma pilha diferente

Os processadores AMD Ryzen AI em PCs também contêm uma NPU, mas usam a pilha separada Ryzen AI Software, em vez dos fluxos Vitis AI integrados descritos neste guia. Para GPUs AMD Instinct e Radeon, consulte a integração de GPU AMD.

De qual fluxo do Vitis AI preciso?#

Escolhe o fluxo de acordo com o dispositivo da tua placa:

Exportação para AMD Xilinx: convertendo seu modelo YOLO#

Tarefas suportadas#

A exportação AMD Xilinx é compatível com todas as sete tarefas Ultralytics. A segmentação semântica e a estimativa de profundidade estão disponíveis apenas com YOLO26, a única família que inclui essas cabeças.

TarefaYOLOv8YOLO11YOLO26
Detetar✅✅✅
Segmentar✅✅✅
Semântica❌❌✅
Profundidade❌❌✅
Classificar✅✅✅
Pose✅✅✅
OBB✅✅✅

Instalação#

A exportação AMD Xilinx é executada em Linux (x86-64 ou ARM64) com Python 3.11 a 3.13, as versões compatíveis com AMD Quark. A primeira exportação também compila os operadores personalizados do Quark, o que requer um compilador C++, como g++.

Instalação
# Install the required package for YOLO
pip install ultralytics

O AMD Quark é instalado automaticamente do PyPI na primeira exportação. Para pré-instalar as dependências de exportação:

pip install "ultralytics[export-xilinx]"

Para instalar o repositório em modo editável, substitua "ultralytics[export-xilinx]" por -e ".[export-base,export-xilinx]". Para reproduzir o ambiente Python 3.12 e o teste rápido de exportação usados pela CI, execute o construtor de ambiente existente a partir da raiz do repositório:

ULTRALYTICS_ISOLATED_VENVS="$PWD/.venvs" python .github/scripts/create-export-env.py --env isolated-xilinx

Uso#

O formato AMD Xilinx é compatível com os modos Export, Predict e Validate. Sem o Vitis AI Execution Provider da AMD, predict e validate executam o modelo quantizado com ONNX Runtime na CPU, medindo sua precisão INT8 em qualquer host. Quando o ONNX Runtime disponibiliza o VitisAIExecutionProvider, como em uma placa Versal AI Edge Series Gen 2, o Ultralytics o seleciona automaticamente.

Exportar
from ultralytics import YOLO

# Carrega um modelo YOLO26
model = YOLO("yolo26n.pt")

# Exportar para o formato AMD Xilinx para VEK385 (quantize=8 é aplicado automaticamente)
model.export(format="xilinx")  # creates 'yolo26n_xilinx_model/'
Prever
from ultralytics import YOLO

# Carregar o modelo AMD Xilinx exportado
model = YOLO("yolo26n_xilinx_model")

# Executar inferência
results = model("https://ultralytics.com/images/bus.jpg")
Validar
from ultralytics import YOLO

# Carregar o modelo AMD Xilinx exportado
model = YOLO("yolo26n_xilinx_model")

# Validar a precisão INT8 no conjunto de dados COCO8
metrics = model.val(data="coco8.yaml")

Os nomes de formato vitis, vitisai e versal são aliases de xilinx.

Argumentos de exportação#

ArgumentoTipoPadrãoDescrição
formatstr'xilinx'Formato de destino do modelo exportado, que define a compatibilidade com NPUs AMD Versal AI Edge Series Gen 2.
imgszint ou tuple640Tamanho de imagem desejado para a entrada do modelo, como um inteiro para imagens quadradas ou uma tupla (height, width). O modelo exportado tem tamanho de lote fixo igual a 1.
quantizeint ou str8/autoPrecisão da quantização. 8 (Vitis AI INT8) é obrigatório e ativado automaticamente se não for especificado.
datastrNoneArquivo YAML do conjunto de dados usado para a calibração INT8; para classificação, em vez disso, aceita um diretório de conjunto de dados ou o nome de um conjunto de dados integrado. Se omitido, o Ultralytics usa o conjunto de dados de calibração da tarefa, como coco128.yaml para detecção.
fractionfloat1.0Fração do conjunto de dados de calibração a ser usada.
namestr've2-xc2ve3858'Dispositivo do compilador Vitis AI: 've2-xc2ve3858' (kit de avaliação VEK385), 've2-xc2ve3804', 've2-xc2ve3558', 've2-xc2ve3504', 've2-xc2ve3358' ou 've2-xc2ve3304'.
opsetintNoneVersão do opset ONNX para o grafo intermediário. O padrão é 17, o opset que a AMD valida para YOLO no Vitis AI.
simplifyboolTrueSimplifica o grafo ONNX intermediário com onnxslim.
devicestrNoneEspecifica o dispositivo para a exportação: GPU (device=0) ou CPU (device=cpu).

Defina nms=False para exportar a cabeça YOLO26 sem NMS YOLO26. A NMS integrada (nms=True) não é compatível, pois a AMD lista NonMaxSuppression entre os operadores que podem forçar a execução do modelo inteiro na CPU.

Calibre com seus próprios dados

A precisão INT8 depende de quão bem as imagens de calibração representam a cena de implantação. Passe a data= um arquivo YAML de conjunto de dados com pelo menos 300 imagens representativas das suas próprias câmeras; os conjuntos de dados padrão de calibração são pequenas amostras públicas.

Para mais detalhes sobre o processo de exportação, visita a página da documentação da Ultralytics sobre exportação.

Estrutura de saída#

Após uma exportação bem-sucedida, é criado um diretório do modelo com a seguinte estrutura:

yolo26n_xilinx_model/
├── yolo26n.onnx          # AMD Quark VINT8 model with the Ultralytics metadata
└── vitisai_config.json   # Vitis AI compiler configuration for the target device

A compilação do modelo, descrita abaixo, adiciona um cache do compilador yolo26n/ ao mesmo diretório, contendo o modelo NPU yolo26n.rai e relatórios de compilação da AMD, como final-vaiml-pass-summary.txt.

Como funciona a exportação#

A exportação segue o fluxo Vitis AI documentado pela AMD para Versal AI Edge Series Gen 2:

  1. Exportação ONNX com opset 17 e tamanho de lote estático igual a 1.
  2. Quantização AMD Quark com a configuração VINT8 (INT8 simétrico com escalas de potência de dois) e as opções exigidas pela AMD para compilação em NPU: Int32Bias=False, enable_npu_cnn=True, DedicatedQDQPair=True e QuantizeAllOpTypes=True. A calibração usa o carregador padrão de calibração INT8 do Ultralytics, com o mesmo pré-processamento letterbox, RGB e 0–1 da inferência.
  3. Precisão mista: a cabeça do modelo permanece em ponto flutuante, e o compilador Vitis AI a executa em BF16 na NPU. Quantizar a cabeça para INT8 causa a maior parte da perda de precisão, e o tutorial YOLOv8m da AMD mantém sua etapa de pós-processamento fora do INT8 pelo mesmo motivo.
  4. Configuração do compilador: vitisai_config.json seleciona o destino VAIML e o dispositivo de name.

Precisão#

A tabela compara o modelo INT8 exportado com o modelo ONNX FP32 no val2017 do COCO (5.000 imagens) em 640, ambos executados com ONNX Runtime na CPU do host. Os modelos INT8 foram calibrados no conjunto de dados padrão coco128.yaml; calibrar com suas próprias imagens de implantação geralmente reduz a diferença.

ModelomAP50-95 FP32mAP50-95 INT8 AMD Xilinx
YOLO26n40.336.7
YOLO26s47.942.5
YOLO11n38.835.5

Estes resultados no host executam o modelo quantizado com ONNX Runtime na CPU, a referência com a qual a metodologia de precisão da AMD compara os resultados da NPU. Os resultados publicados pela AMD para YOLOv8m no VEK385 mostram a mesma abordagem de precisão mista na NPU:

Configuração de YOLOv8mHardwaremAP50-95 (COCO)
ONNX FP32CPU do anfitrião49.95
BF16NPU VEK38550.29
VINT8 quantizado, parte final FP32CPU do anfitrião48.75
VINT8 com parte final BF16NPU VEK38548.38

Fonte: tutorial de YOLOv8m para Versal AI Edge Gen 2 da AMD, que também indica um tempo médio de inferência de 10,69 ms em 100 execuções VART com dp_size=1.

Compilar e executar no Versal AI Edge Gen 2#

O diretório exportado está pronto para o compilador Vitis AI da AMD, que gera o modelo .rai executado na NPU.

  1. Prepare o host e a placa. Faça a compilação em um host Linux x86-64 com a imagem Docker Vitis AI 6.3 da AMD para Versal AI Edge Gen 2 e uma licença do compilador AMD AI Engine (consulte a página de licenciamento da AMD). Configure o VEK385 usando o guia de configuração da placa da AMD.

  2. Compile. Dentro do contêiner, crie uma sessão do ONNX Runtime com o Vitis AI Execution Provider, usando a mesma chamada do guia de compilação da AMD. Isso grava o cache yolo26n/ com yolo26n.rai no diretório de exportação:

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

    Confira yolo26n_xilinx_model/yolo26n/final-vaiml-pass-summary.txt para saber quanto do modelo é executado na NPU. Para YOLO26n em 640, o compilador AMD Vitis AI 6.3 coloca 99,9% dos operadores e do cálculo na NPU VEK385 em uma única partição.

  3. Execute na placa. Copie o diretório de exportação para o VEK385. O ONNX Runtime com o Vitis AI Execution Provider carrega o yolo26n.rai compilado e o executa na NPU; YOLO("yolo26n_xilinx_model") seleciona automaticamente esse provedor quando ele está disponível.

A compilação requer apenas o ONNX Runtime da AMD. Portanto, exporte em qualquer máquina Linux e copie o diretório para o contêiner, em vez de instalar o Ultralytics nele, o que pode alterar os pacotes fixados do contêiner. Quando o Ultralytics está instalado junto com a compilação AMD onnxruntime-vitisai, como na placa, ele mantém essa compilação em vez de substituí-la pelo onnxruntime padrão.

ONNX Runtime e VART-ML

A exportação configura a compilação padrão para ONNX Runtime, que executa na própria CPU Arm quaisquer operadores incompatíveis com a NPU, como a seleção top-k do YOLO26 com nms=False. O ambiente de execução VART-ML executa um modelo somente quando todos os operadores estão na NPU, a menos que você adicione os passes de particionamento de CPU da AMD a vitisai_config.json; esses artefatos não podem ser executados com ONNX Runtime.

Compatibilidade de modelos YOLO e operadores compatíveis#

Um acelerador só acelera os operadores que implementa em hardware. Quando um modelo contém um operador sem suporte, o compilador geralmente envia essa parte da rede para a CPU Arm, e cada ida e volta entre o acelerador e a CPU acrescenta latência. Alguns operadores não podem ser particionados: na NPU Versal AI Edge Gen 2, a AMD lista operadores como NonZero e NonMaxSuppression, que podem forçar a execução do modelo inteiro na CPU. O suporte a operadores é o fator mais importante para o desempenho de um modelo YOLO no hardware AMD Xilinx.

A tabela mostra onde cada operador de um modelo YOLO26 é executado. Uma exportação ONNX padrão de YOLO26n contém 87 ativações SiLU, cada uma exportada como Sigmoid e Mul, além de 4 operadores MatMul e 2 Softmax provenientes dos dois blocos de atenção: o bloco C2PSA no fim do backbone (camada 10) e o bloco C3k2 com atenção ativada, que produz a saída P5 (camada 22).

OperadorOnde aparece no YOLODPU (Zynq UltraScale+, Kria)NPU (Versal AI Edge Gen 2)
Convolução + normalização em loteCada bloco Conv✅✅
Ativação SiLUCada bloco Conv (ativação padrão)❌ Executado na CPU; substitui por Hard-Swish✅
Hard-Swish, ReLU, ReLU6, LeakyReLUAtivações opcionais definidas no YAML do modelo✅ Fundido à convolução✅
SigmoidPontuações de classe na cabeça de detecção❌ Executado na CPU (geralmente como parte do pós-processamento)✅
MatMul entre duas ativaçõesBlocos de atenção (C2PSA; YOLO26 C3k2)❌ Executado na CPU✅
SoftmaxBlocos de atenção; DFL no YOLOv8 e YOLO11❌ Executado na CPU✅
Reshape, TransposeBlocos de atenção⚠️ Fundido quando possível; caso contrário, executado na CPU✅
Split, SliceBlocos C3k2 e C2f⚠️ Convertido em slices; verifica o relatório do compilador✅
Resize (upsampling pelo vizinho mais próximo)Upsampling do neck✅✅
MaxPool, Concat, AddBloco SPPF e fusão de características✅✅
TopK, GatherElementsCabeça YOLO26 sem NMS (nms=False)❌ Executado na CPU⚠️ Partição na CPU do host Arm
NonMaxSuppressionApenas quando exportado com nms=True❌ Executado na CPU❌ Pode forçar a execução do modelo na CPU

Fontes: operadores compatíveis UG1414 da AMD, suporte a operadores do PyTorch e listas de operadores compatíveis, de partição na CPU e não compatíveis da Versal AI Edge Gen 2. O suporte também depende da configuração da DPU e dos padrões do grafo, então verifica sempre o relatório de particionamento do compilador.

Cabeça YOLO26: sem DFL e com saída opcional sem NMS

YOLO26 elimina Distribution Focal Loss (DFL), por isso, ao contrário do YOLO11 e do YOLOv8, as saídas das caixas não precisam de decodificação softmax. Também adiciona um segundo bloco de atenção em comparação com o YOLO11, então compara os relatórios do compilador específicos para o alvo e os benchmarks no dispositivo antes de escolher um modelo. As exportações com nms não definido mantêm a cabeça one-to-many e precisam de NMS na CPU, como outros modelos YOLO. Exporta com nms=False para usar a cabeça one-to-one sem NMS do YOLO26, que substitui NMS por uma seleção top-k leve executada na CPU.

Prepara o YOLO26 para DPU com Hard-Swish#

A DPU funde nas convoluções apenas ReLU, ReLU6, LeakyReLU, Hard-Swish e Hard-Sigmoid. Hard-Swish é uma aproximação de SiLU compatível com hardware, o que a torna a substituição natural. Os ficheiros YAML dos modelos Ultralytics aceitam uma chave activation que altera a ativação padrão dos blocos Conv (Guia de configuração YAML do modelo).

Copia yolo26.yaml para yolo26-hswish.yaml e adiciona uma linha sob os 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

Em seguida, cria o modelo, transfere os pesos YOLO26 pré-treinados e faz ajuste fino com o teu conjunto de dados:

Faz ajuste fino de um modelo YOLO26 com Hard-Swish
from ultralytics import YOLO

# # Cria YOLO26n com ativações Hard-Swish; o 'n' no nome seleciona a escala nano
model = YOLO("yolo26n-hswish.yaml").load("yolo26n.pt")  # # transfere os pesos pré-treinados

# # Faz ajuste fino para adaptar a rede a Hard-Swish
model.train(data="coco8.yaml", epochs=100, imgsz=640)

As ativações não têm pesos, então todos os pesos pré-treinados são transferidos. O grafo ONNX exportado contém então 87 operadores HardSwish e nenhum SiLU. Substitui coco8.yaml pelo teu próprio conjunto de dados e compara a precisão com o modelo SiLU usando o modo Val antes da implementação.

Alternativas ao novo treinamento
  • Substituir durante a quantização: define "convert_silu_to_hswish": true na configuração JSON do quantizador PyTorch do Vitis AI 3.5 para substituir SiLU durante a quantização. Isso evita uma rodada de treinamento, mas geralmente reduz mais a precisão; o ajuste fino rápido ou QAT da AMD pode recuperar parte dela. Consulta o guia de configuração do vai_q_pytorch.
  • LeakyReLU: a DPU implementa LeakyReLU com uma inclinação negativa fixa de 26/256 (cerca de 0.1). Se usares LeakyReLU, treina com activation: nn.LeakyReLU(0.1015625) para que as inclinações durante o treinamento e a implementação coincidam.

Como lidar com blocos de atenção na DPU#

O YOLO26 aplica atenção na resolução mais baixa (uma grelha de 20×20 com entrada 640) em dois pontos: no bloco C2PSA da camada 10 e no bloco C3k2 com atenção ativada da camada 22. O YOLO11 tem um bloco C2PSA. Numa DPU, os operadores MatMul e Softmax são executados na CPU, dividindo o modelo em subgrafos alternados de DPU e CPU. Tens três opções:

  1. Aceitar os blocos de CPU. O .xmodel compilado contém então subgrafos de CPU, por isso executa-o com o Graph Runner da AMD, que executa em conjunto os subgrafos de DPU e CPU quando existe uma implementação de CPU para cada operador; caso contrário, tens de implementar e registrar os operadores em falta. Com 20×20, o cálculo da atenção é pequeno, mas cada transferência adicional entre a DPU e a CPU acrescenta latência, então mede o desempenho na tua placa.

  2. Usar um YAML sem atenção. No teu YAML de Hard-Swish, substitui a camada C2PSA por nn.Identity para manter válidos os índices de camada usados por Concat e Detect, e desativa a atenção na camada 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)

    O grafo ONNX exportado não contém então operadores MatMul nem Softmax. Os pesos de atenção deixam de ser aplicáveis (624 dos 666 pesos do YOLO26n são transferidos), então faz um ajuste fino mais longo e compara a precisão com o modo Val.

  3. Usar um modelo sem atenção, como o YOLOv8, que a AMD já usou nos próprios exemplos de DPU.

Na Versal AI Edge Gen 2, os operadores de atenção aparecem como compatíveis com a NPU, então essas alterações geralmente são desnecessárias. Confirma a atribuição no relatório do compilador, pois a AMD observa que operadores compatíveis ainda podem ser executados na CPU devido a restrições de configuração ou memória.

Compatibilidade de modelos em resumo#

ModeloDPU (Zynq UltraScale+, Kria)NPU (Versal AI Edge Gen 2)
YOLO26Treina com Hard-Swish; dois blocos de atenção tornam-se subgrafos de CPU; sem DFLExportação nativa format="xilinx"; a cabeça é executada em BF16
YOLO11Treina com Hard-Swish; C2PSA e softmax de DFL são executados na CPUExportação nativa format="xilinx"; a cabeça é executada em BF16
YOLOv8Treina com Hard-Swish; softmax de DFL é executado na CPUExportação nativa format="xilinx". Tutorial YOLOv8m da AMD (Vitis AI 6.3, VEK385, INT8 com etapa final BF16): o relatório do compilador mostra 1.181 operadores (99,915%) e 99,994% dos GOPs na NPU, sem alterações no modelo

Implantação em outros destinos AMD Xilinx#

As DPUs Zynq UltraScale+ e Kria e a NPU Versal AI Edge de primeira geração usam fluxos Vitis AI que format="xilinx" não gera. Treine com o Ultralytics e, em seguida, gere o artefato do destino com as ferramentas da AMD em suas imagens Docker Linux x86-64. Selecione a aba correspondente ao seu dispositivo:

  1. Inicia a imagem Docker Vitis AI 6.3 da AMD para Versal AI Edge.

  2. Ativa o ambiente da NPU para o IP da NPU na tua placa executando settings.sh como origem. Passa o nome do IP da NPU da tua placa como argumento ou usa LIST para ver os IPs disponíveis.

  3. Captura um instantâneo executando um script de inferência normal em imagens representativas com a variável de ambiente VAISW_SNAPSHOT_DIRECTORY definida. Não são necessárias alterações ao 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 aceita INT8 (predefinição), BF16 ou MIXED, e VAISW_QUANTIZATION_NBIMAGES tem como predefinição 4 imagens; por isso, define um número maior e representativo para modelos de deteção. O instantâneo está associado à variante do IP da NPU da tua placa. As partes finais do pós-processamento YOLO são executadas nos AI Engines apenas com precisão BF16 ou MIXED. A documentação da AMD diverge quanto ao Softmax: a página de exemplos diz que o Softmax não é acelerado e associa a parte final do Softmax do YOLOv8 à CPU, enquanto as notas de lançamento do Vitis AI 6.1 indicam aceleração completa do YOLOv8 com precisão mista. Inspeciona o ficheiro wrp_network_iriz.onnx dentro do instantâneo para confirmares que partes do teu modelo, incluindo a atenção do YOLO11 e do YOLO26, são executadas na NPU. Consulta traz o teu próprio modelo.

Prepare a placa com um projeto de hardware e uma imagem Linux que contenham a configuração do acelerador para a qual você compilou, além do ambiente de execução Vitis AI correspondente. Consulte os guias de configuração da AMD para os destinos DPU Zynq UltraScale+ e Kria e Versal AI Edge (VEK280) e, em seguida, copie os artefatos necessários para o ambiente de execução:

FluxoArtefactos a copiar para a placaRuntime da placa
DPU (Zynq UltraScale+, Kria).xmodel compiladoVART; Graph Runner para subgrafos da CPU
NPU (Versal AI Edge, VEK280)Diretório do instantâneoVART-ML

Na DPU, os buffers VART armazenam valores INT8 de ponto fixo: consulte o formato de cada tensor e a escala fix_point, quantize as entradas e desquantize as saídas antes do pós-processamento. O Graph Runner retorna as saídas do grafo completo, enquanto um executor somente para DPU retorna as saídas intermediárias do subgrafo DPU, cujo cálculo restante deve ser concluído pelo seu código. O VART-ML no VEK280 usa por padrão visualizações de tensor de hardware, cujo formato, tipo de dados e disposição de memória podem diferir dos formatos ONNX. Portanto, configure os tipos de tensor de entrada e saída do executor como visualizações de CPU ou converta o formato de hardware por conta própria (consulte a visão geral da arquitetura VART-ML da AMD).

Licenciamento para produtos comerciais

A comercialização do Ultralytics YOLO integrado num produto comercial AMD Xilinx exige o cumprimento da licença AGPL-3.0 ou uma Licença Enterprise Ultralytics.

Aplicações no mundo real#

Os dispositivos AMD Xilinx são comuns sempre que a IA de visão tem de funcionar em tempo real, com baixo consumo de energia e perto do sensor:

Resumo#

A exportação com format="xilinx" quantiza modelos Ultralytics YOLO com AMD Quark para NPUs Versal AI Edge Series Gen 2, mantém a cabeça em BF16 e grava a configuração do compilador Vitis AI junto ao modelo. Valide a precisão INT8 em qualquer host, compile o modelo .rai na imagem Docker Vitis AI da AMD e execute-o na placa com ONNX Runtime e Vitis AI Execution Provider.

Dispositivos AMD Xilinx mais antigos usam outros fluxos. A DPU do Zynq UltraScale+ e do Kria usa a toolchain Vitis AI 3.5 congelada e arquivos .xmodel, requer ativações nativas da DPU, como Hard-Swish, e executa a atenção na CPU. A NPU Versal AI Edge de primeira geração usa o fluxo snapshot, com cobertura de operadores que depende da versão e da precisão do Vitis AI.

Para outros destinos de implantação, consulte o guia de opções de implantação de modelos, as práticas recomendadas de implantação e integrações com aceleradores, como Hailo, Rockchip RKNN e Axelera.

Perguntas frequentes#

  • Sim. A AMD concluiu a aquisição da Xilinx em fevereiro de 2022, e os produtos Xilinx são agora vendidos como SoCs adaptativos e FPGAs da AMD: AMD Zynq, AMD Kria, AMD Versal e AMD Vitis. Os engenheiros continuam a usar amplamente o nome Xilinx, e os números de peça mantêm o prefixo XC.

  • Sim. model.export(format="xilinx") quantiza o modelo com AMD Quark para NPUs Versal AI Edge Series Gen 2 e grava um diretório com o modelo ONNX quantizado e sua configuração de compilador Vitis AI. Compile-o para .rai com as ferramentas Vitis AI da AMD, conforme mostrado em Compilar e executar no Versal AI Edge Gen 2. Os destinos Zynq UltraScale+, Kria e VEK280 usam os fluxos descritos em Implantação em outros destinos AMD Xilinx.

  • A DPU (unidade de processamento de aprendizagem profunda) é o acelerador INT8 anterior da AMD. Está integrada na lógica programável dos dispositivos Zynq UltraScale+ e Kria, é compilada com o Vitis AI 3.5 e produz ficheiros .xmodel. A NPU substitui-a nas versões atuais do Vitis AI. Nos dispositivos Versal AI Edge, combina AI Engines dedicados com lógica programável, suporta INT8, BF16 e precisão mista, e suporta mais operadores, incluindo SiLU e, no Versal AI Edge Gen 2, atenção.

  • Um .xmodel é um grafo XIR serializado utilizado pelo conjunto de ferramentas DPU da AMD. O quantizador grava um .xmodel quantizado, e o compilador vai_c_xir converte-o num .xmodel compilado que contém o fluxo de instruções da DPU, pesos INT8 quantizados e quaisquer subgrafos que tenham de ser executados na CPU. O ficheiro compilado destina-se a uma configuração específica da DPU, descrita por uma impressão digital arch.json, e é executado na placa através do Vitis AI Runtime (VART) ou através do Graph Runner quando contém subgrafos da CPU.

  • Não. A DPU acelera apenas as ativações ReLU, ReLU6, LeakyReLU, Hard-Swish e Hard-Sigmoid, e executa na CPU Sigmoid, Softmax e MatMul entre duas ativações. Treina YOLO com activation: nn.Hardswish() no YAML do modelo para manter as convoluções na DPU e consulta Como lidar com blocos de atenção na DPU para conhecer as opções de atenção. As NPUs Versal AI Edge Gen 2 suportam SiLU, Softmax e MatMul nativamente.

  • A KV260 usa um MPSoC Zynq UltraScale+ com uma DPU, por isso segue o fluxo da DPU. Treina um modelo YOLO26 com Hard-Swish, quantiza-o com vai_q_pytorch na imagem Docker Vitis AI 3.5, compila-o com vai_c_xir usando arch.json da KV260 e executa o .xmodel resultante na placa com VART ou com o Graph Runner se contiver subgrafos da CPU.

  • Não. A exportação é executada em qualquer host Linux com Python 3.11 a 3.13 e não requer uma conta AMD; o modelo exportado também é executado na CPU para verificações de precisão em qualquer host. A compilação do modelo .rai requer a imagem Docker Vitis AI da AMD e uma licença do compilador AI Engine; para executá-lo na NPU, é necessária uma placa Versal AI Edge Series Gen 2.

  • O Ultralytics usa o Vitis AI Execution Provider somente quando o ONNX Runtime o disponibiliza, como na compilação AMD onnxruntime-vitisai em uma placa Versal ou na imagem Docker da AMD. Em outros ambientes, ele executa o modelo quantizado com o ONNX Runtime padrão na CPU, que é como você mede a precisão INT8 antes da implantação.

  • Qualquer tarefa pode ser executada se os respetivos operadores forem compilados para o teu acelerador. Os operadores não suportados são normalmente executados na CPU, mas alguns podem obrigar o modelo inteiro a ser executado na CPU ou impedir a compilação. A deteção de objetos é a carga de trabalho mais comum e utilizada nos próprios exemplos da AMD. Para segmentação, pose e outras tarefas, consulta o relatório de partição do compilador para confirmares que as camadas mais exigentes são executadas no acelerador.

Colaboradores

Comentários