Ultralytics YOLO27:

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

A exportação nativa do Ultralytics estará disponível em breve

O suporte à exportação nativa do Ultralytics para dispositivos AMD Xilinx estará disponível em breve. Até lá, este guia explica o panorama de hardware e software AMD Xilinx e mostra como implementar hoje o Ultralytics YOLO26 com as ferramentas AMD Vitis AI, começando por uma exportação ONNX ou por um checkpoint PyTorch.

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 explica o que é cada família de dispositivos AMD Xilinx, como a IA é executada nesses dispositivos, que operadores Ultralytics YOLO são suportados por cada acelerador e o fluxo de trabalho passo a passo para implementar modelos YOLO em hardware Zynq UltraScale+, Kria e Versal.

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.

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

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:

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

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.

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

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 DFLEspera-se que funcione sem alterações; valida na tua placa
YOLO11Treina com Hard-Swish; C2PSA e softmax de DFL são executados na CPUEspera-se que funcione sem alterações; valida na tua placa
YOLOv8Treina com Hard-Swish; softmax de DFL é executado na CPUTutorial YOLOv8m da AMD (Vitis AI 6.3, VEK385, INT8 com cauda BF16): o relatório do compilador mostra 1.181 operadores (99.915%) e 99.994% dos GOPs na NPU, sem alterações no modelo

Implementa o YOLO26 hoje no AMD Xilinx#

Até que a exportação nativa esteja disponível, a implementação segue quatro etapas:

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

Etapa 1: treina ou faz ajuste fino do modelo#

Treina com os teus próprios dados usando o modo Train ou na Ultralytics Platform. Para alvos DPU, começa pelo YAML Hard-Swish. Registra uma linha de base com o modo Val para medir mais tarde o impacto da quantização na precisão.

Etapa 2: exporta para ONNX para alvos NPU#

ONNX é a entrada comum aos fluxos NPU da AMD. O fluxo DPU quantiza diretamente o checkpoint PyTorch treinado na imagem Docker Vitis AI 3.5, então utilizadores de DPU podem ignorar esta etapa. Exporta com um tamanho de lote fixo de 1 e um opset compatível com a AMD; o tutorial YOLOv8m da AMD para Versal AI Edge Gen 2 usa o opset 17.

Exportar
from ultralytics import YOLO

# # Carrega o modelo que treinaste na Etapa 1
model = YOLO("runs/detect/train/weights/best.pt")

# # Exporta para ONNX com uma forma estática para o compilador AMD
model.export(format="onnx", opset=17, imgsz=640)  # # cria 'best.onnx' ao lado de 'best.pt'

Consulta a integração ONNX e os argumentos de exportação para ver todas as opções. Com nms não definido, executa NMS na CPU após a inferência; para YOLO26, nms=False seleciona a cabeça sem NMS. Não incorpores NMS com nms=True, porque a AMD lista NonMaxSuppression entre os operadores que podem forçar a execução do modelo inteiro na CPU.

Mantém a versão do ONNX Runtime da AMD

As imagens Docker da AMD incluem a própria versão do ONNX Runtime com o Vitis AI Execution Provider. O Ultralytics verifica se o ONNX Runtime está disponível durante a exportação e pode instalar o pacote padrão por cima dele. Exporta em qualquer máquina e copia o ficheiro .onnx para o contentor, ou define YOLO_AUTOINSTALL=false ao executar o Ultralytics na imagem Docker da AMD.

Etapa 3: quantifica e compila com o Vitis AI#

Os fluxos abaixo usam as imagens Docker da AMD num host Linux x86-64. Não precisas da placa nesta etapa. Seleciona o separador correspondente ao teu dispositivo:

  1. Inicia a imagem Docker Vitis AI 6.3 da AMD para Versal AI Edge Gen 2. Consulta os requisitos do sistema.
  2. Quantiza o modelo ONNX para INT8 com o AMD Quark, usando a configuração VINT8. A configuração mínima da AMD também exige Int32Bias=False, enable_npu_cnn=True, DedicatedQDQPair=True e QuantizeAllOpTypes=True. O Quark lê os dados de calibração por meio de um leitor de dados que tens de escrever, então aplica o mesmo pré-processamento usado na inferência: redimensionamento letterbox para o tamanho de exportação, ordem de canais RGB, escala de 0–1 e formato NCHW, usando imagens representativas do teu conjunto de dados.
  3. Exclui o subgrafo de pós-processamento da quantização. O tutorial de YOLOv8m da AMD alerta que quantizá-lo causa deteções perdidas. Nesse exemplo de YOLOv8m, o compilador executa então a parte final em BF16 na NPU; os operadores não suportados nessa parte, como a seleção top-k do YOLO26, continuam a ser executados na CPU.
  4. Escolhe o runtime da placa antes de compilar. A compilação padrão funciona com o ONNX Runtime, que executa na própria CPU os operadores incompatíveis com a NPU, como a seleção top-k do YOLO26, e com o VART-ML apenas quando todos os operadores são executados na NPU. Para executar um modelo que mantém operadores na CPU com o VART-ML, adiciona os passes de partição para CPU da AMD a vitisai_config.json. Esses artefactos não podem ser executados através do ONNX Runtime.
  5. Compila criando uma sessão do ONNX Runtime com VitisAIExecutionProvider e um vitisai_config.json que indica o dispositivo de destino. A compilação grava um ficheiro .rai no diretório de cache. Consulta como compilar um modelo.

Para ignorar a quantização, compila diretamente o modelo ONNX FP32 e o compilador converte-o para BF16. A compilação requer uma licença do compilador AMD AI Engine; consulta a página de licenciamento da AMD.

Passo 4: Executar e validar na placa#

Prepara primeiro a placa. Tem de executar um design de hardware e uma imagem Linux que incluam a configuração do acelerador para a qual compilaste, além do runtime Vitis AI correspondente. Consulta os guias de configuração da AMD para os destinos DPU Zynq UltraScale+ e Kria, Versal AI Edge (VEK280) e Versal AI Edge Gen 2 (VEK385).

Em seguida, copia os artefactos necessários para o teu runtime:

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
NPU (Versal AI Edge Gen 2), ORTModelo ONNX FP32 ou quantizado usado na compilação, vitisai_config.json e diretório de cache compiladoONNX Runtime com o Vitis AI EP
NPU (Versal AI Edge Gen 2), VART-MLFicheiro .rai (com passes de partição para CPU se algum operador for executado na CPU), além de uma configuração do executor VART-MLVART-ML

Nos fluxos da NPU, o grafo ONNX exportado já descodifica as caixas e aplica a função sigmoide às pontuações das classes, pelo que o anfitrião apenas interpreta o resultado:

  • nms não definido: os modelos de deteção geram um tensor (1, 4 + nc, anchors) com caixas xywh e pontuações por classe. Seleciona a melhor classe por âncora, converte as caixas em coordenadas dos cantos, filtra por confiança e executa NMS; a função non_max_suppression do Ultralytics executa todos estes passos.
  • nms=False (YOLO26): o modelo gera um tensor (1, max_det, 6) com [x1, y1, x2, y2, score, class] linhas, que apenas requerem um limiar de confiança.

Em ambos os casos, redimensiona as caixas da entrada com letterbox para as dimensões da imagem original. Apenas os grafos interrompidos antes da etapa de descodificação precisam de descodificação das caixas no anfitrião. Na DPU, os buffers VART contêm valores INT8 de ponto fixo: consulta a forma e a escala fix_point de cada tensor, quantiza as entradas e desquantiza as saídas antes de aplicares os passos acima. O Graph Runner devolve as saídas do grafo completo, enquanto um executor apenas da DPU devolve saídas intermédias dos subgrafos da DPU que o teu código tem de terminar de calcular. Os formatos acima são os formatos ONNX (vista da CPU): o VART-ML usa por predefinição vistas de tensores do hardware, cuja forma, tipo de dados e disposição de memória podem ser diferentes; por isso, configura os tipos de tensores de entrada e saída do executor como vistas da CPU ou converte tu próprio o formato de hardware (consulta a visão geral da arquitetura VART-ML da AMD).

Compara a precisão no dispositivo com a referência FP32 do Passo 1, usando o teu próprio conjunto de validação e as mesmas métricas de desempenho, como mAP. Os resultados publicados pela AMD para YOLOv8m na VEK385 mostram o custo de precisão da implementação INT8:

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.

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#

Os dispositivos AMD Xilinx executam modelos YOLO através de duas gerações de aceleradores. A DPU do Zynq UltraScale+ e do Kria usa o fluxo Vitis AI 3.5, que já não evolui, e produz ficheiros .xmodel. Requer ativações nativas da DPU, como Hard-Swish, e executa a atenção na CPU. A NPU do Versal AI Edge e do Versal AI Edge Gen 2 usa as versões atuais do Vitis AI. A NPU Gen 2 suporta operadores SiLU e de atenção, e executa o exemplo YOLOv8m da AMD na VEK385 quase inteiramente na NPU, enquanto a cobertura de operadores na NPU VEK280, mais antiga, depende da versão e da precisão do Vitis AI.

A exportação nativa do Ultralytics para dispositivos AMD Xilinx estará disponível em breve. Até lá, treina com o Ultralytics, exporta para ONNX para destinos NPU Versal ou mantém o checkpoint PyTorch para destinos DPU, e compila com o Vitis AI conforme descrito acima. Para outros destinos de implementação, consulta o guia de opções de implementação de modelos, as melhores práticas de implementação e integrações de 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.

  • Ainda não. A exportação nativa do Ultralytics para dispositivos AMD Xilinx estará disponível em breve. Atualmente, exporta para ONNX com model.export(format="onnx") para destinos NPU Versal, ou quantiza o checkpoint PyTorch treinado com vai_q_pytorch para destinos DPU Zynq UltraScale+ e Kria; em seguida, compila com as ferramentas Vitis AI da AMD, conforme explicado em Implementa hoje o YOLO26 em 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 quantização e a compilação são executadas nas imagens Docker Vitis AI da AMD num anfitrião Linux x86-64. Só precisas da placa para executar o modelo compilado e medir a latência e a precisão no dispositivo.

  • 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