Ultralytics YOLO27:

Vitis AI를 사용한 Ultralytics YOLO용 AMD Xilinx 배포#

Ultralytics 네이티브 내보내기는 곧 지원될 예정입니다

AMD Xilinx 장치에 대한 Ultralytics 네이티브 내보내기 지원은 곧 제공될 예정입니다. 그때까지 이 가이드에서는 AMD Xilinx 하드웨어 및 소프트웨어 환경을 설명하고, ONNX 내보내기 또는 PyTorch 체크포인트에서 시작해 AMD Vitis AI 도구로 Ultralytics YOLO26을 지금 배포하는 방법을 안내합니다.

AMD Xilinx 장치는 전 세계 여러 산업용 카메라, 자동차 비전 시스템, 로봇, 드론 및 의료 영상 제품에 사용됩니다. Arm 프로세서와 프로그래밍 가능한 로직을 결합하고, 최신 장치에서는 전용 AI Engine도 탑재합니다. 따라서 단일 칩으로 비디오를 캡처하고 전처리한 뒤 객체 탐지를 실행하고, 낮고 예측 가능한 추론 지연 시간으로 결과에 따라 동작할 수 있습니다.

이 가이드에서는 각 AMD Xilinx 장치 제품군의 구성, 장치에서 AI를 실행하는 방식, 각 가속기가 지원하는 Ultralytics YOLO 연산자, 그리고 Zynq UltraScale+, Kria 및 Versal 하드웨어에 YOLO 모델을 배포하는 단계별 워크플로를 다룹니다.

AMD Xilinx란 무엇인가요?#

Xilinx는 1980년대에 필드 프로그래머블 게이트 어레이(FPGA) 분야를 개척했으며, 적응형 SoC 및 FPGA의 선도적인 공급업체가 되었습니다. AMD는 2022년 2월 Xilinx 인수를 완료했으며, 현재 제품 라인은 AMD Zynq, AMD Kria, AMD Versal 및 AMD Vitis라는 AMD 브랜드로 판매됩니다.

Xilinx인가요, AMD인가요?

두 이름은 같은 제품을 가리킵니다. AMD는 이를 "적응형 SoC 및 FPGA"로 마케팅하지만, 엔지니어들은 여전히 "Xilinx"라는 이름을 널리 사용합니다. 부품 번호는 XC 접두사를 유지합니다(예: xczu7ev). 이전 Vitis AI 저장소와 Docker 이미지는 GitHub와 Docker Hub에서 여전히 Xilinx라는 이름으로 제공됩니다. 이 가이드에서는 어느 이름으로 검색해도 찾을 수 있도록 "AMD Xilinx"를 사용합니다.

주요 용어 및 개념#

AMD Xilinx 배포에는 고유한 용어가 사용됩니다. 아래 표에서는 이 가이드에 나오는 모든 용어를 설명합니다.

용어의미
FPGA필드 프로그래머블 게이트 어레이: 비트스트림이라고 하는 설계를 로드하여 제조 후 디지털 로직을 구성할 수 있는 칩입니다. 비디오 파이프라인이나 신경망 가속기와 같은 맞춤형 하드웨어를 구현할 수 있습니다.
프로그래밍 가능 로직(PL)AMD Xilinx SoC 내부의 FPGA 패브릭입니다. Zynq 및 Kria 장치에서는 AI 가속기가 PL에 구축됩니다.
프로세싱 시스템(PS)SoC의 하드웨어 Arm CPU 코어, 메모리 컨트롤러 및 주변 장치입니다. Linux와 애플리케이션, 그리고 가속기가 실행할 수 없는 모델 레이어를 실행합니다.
적응형 SoC / MPSoC프로세싱 시스템과 프로그래밍 가능 로직을 결합한 시스템 온 칩이며, 여러 Versal 장치에서는 AI Engine도 포함합니다. MPSoC는 멀티프로세서 시스템 온 칩을 의미합니다.
AI Engine(AIE, AIE-ML, AIE-MLv2)여기에서 다루는 Versal AI Edge 시리즈를 비롯한 여러 Versal 장치에 탑재된 하드웨어 벡터 프로세서 배열로, 머신러닝과 신호 처리를 위해 설계되었습니다.
DPU딥러닝 처리 장치: AMD의 INT8 신경망 가속기로, PL에 구축되는 IP 형태로 제공됩니다(예: Zynq UltraScale+ 및 Kria의 DPUCZDX8G). B512부터 B4096까지의 크기는 클록 사이클당 최대 연산 수를 나타냅니다.
NPU / NPU IP신경망 처리 장치: 최신 세대의 추론 가속기로, 최근 Vitis AI 릴리스에서 DPU를 대체합니다. AMD는 NPU IP를 AI Engine과 프로그래밍 가능 로직을 결합한 소프트웨어 방식의 가속기로 설명하므로, 이에 맞는 하드웨어 설계도 필요합니다. NPU 용어집 항목을 참조하세요.
Vitis AIAMD Xilinx 장치에 신경망을 배포하기 위한 AMD의 툴체인입니다. 양자화, 컴파일, 런타임, 예제 및 Docker 환경을 포함합니다.
AMD QuarkVersal AI Edge Gen 2 워크플로에서 FP32 ONNX 모델을 INT8 모델로 변환하는 데 사용하는 AMD의 최신 모델 양자화 라이브러리입니다.
양자화, PTQ 및 QATFP32 가중치와 활성화를 INT8로 변환하는 과정입니다. 학습 후 양자화(PTQ)는 보정 이미지를 사용합니다. 양자화 인식 학습(QAT)은 정확도를 회복하도록 모델을 미세 조정합니다.
보정 이미지PTQ 중 모델에 입력하여 각 텐서의 INT8 스케일을 결정하는 소규모 대표 이미지 세트입니다.
BF16 및 혼합 정밀도BFloat16은 FP32의 범위를 유지하는 16비트 부동 소수점 형식입니다. 혼합 정밀도는 네트워크 대부분을 INT8로 실행하고 민감한 레이어는 BF16으로 실행합니다.
XIRXilinx 중간 표현: DPU 컴파일러가 생성하고 런타임이 읽는 그래프 형식입니다.
.xmodel직렬화된 XIR 그래프입니다. 양자화기는 양자화된 .xmodel을 작성하고, DPU 컴파일러는 이를 DPU 명령, 양자화된 가중치 및 CPU 서브그래프를 포함하는 컴파일된 .xmodel로 변환합니다. 컴파일된 모델을 실행하려면 이에 맞는 DPU 구성이 필요합니다.
arch.json / DPU 핑거프린트특정 DPU 구성을 설명하는 파일입니다. DPU 컴파일러에 필요하며, 한 핑거프린트용으로 컴파일된 .xmodel은 다른 핑거프린트에서 실행되지 않습니다.
스냅샷Versal AI Edge(VEK280) NPU 워크플로에서 생성되는 컴파일된 모델 디렉터리입니다. 하나의 NPU IP 변형에 종속됩니다.
.raiVersal AI Edge Gen 2 NPU 워크플로에서 생성되는 컴파일된 모델 파일입니다.
VART / VART-ML컴파일된 모델을 로드하고 보드에서 실행하는 Vitis AI Runtime 라이브러리이며, C++ 및 Python API를 제공합니다.
ONNX Runtime Vitis AI EPONNX Runtime용 VitisAIExecutionProvider으로, AMD NPU에서 ONNX 모델을 컴파일하고 실행합니다.
CPU 폴백 / 그래프 분할가속기가 연산자를 실행할 수 없으면 컴파일러는 보통 모델을 가속기 서브그래프와 CPU 서브그래프로 나눕니다. 이때 분할이 추가될 때마다 데이터 전송이 발생하며, 이 전송이 지연 시간을 크게 늘릴 수 있습니다. 일부 연산자는 모델 전체를 CPU에서 실행하도록 하거나 컴파일을 실패하게 만들기도 합니다.

엣지 AI용 AMD Xilinx 장치 제품군#

엣지 AI용 AMD Xilinx 장치는 세 가지 제품군으로 나뉩니다. Zynq와 Kria는 프로그래밍 가능 로직에서 DPU를 사용하고, 여기에서 다루는 Versal AI Edge 장치는 AI Engine에서 NPU를 사용합니다.

제품군설명애플리케이션 CPUAI 가속기보드 예시
Zynq UltraScale+ MPSoCZU1부터 ZU19까지 다양한 크기로 제공되며, Arm CPU와 FPGA 로직을 단일 칩에 통합합니다.듀얼 코어 또는 쿼드 코어 Arm Cortex-A53프로그래밍 가능 로직에 구축된 DPUZCU104, ZCU102, 커스텀 보드
Kria K26 시스템 온 모듈Zynq UltraScale+ MPSoC 기반의 생산용 모듈쿼드 코어 Arm Cortex-A53프로그래밍 가능 로직에 구축된 DPUKV260 Vision AI Starter Kit, KR260 Robotics Starter Kit
Versal AI Edge 시리즈적응형 SoC이며, VE2302 및 VE2802 같은 AIE-ML 부품에서 NPU를 실행합니다.듀얼 코어 Arm Cortex-A72AIE-ML AI Engine 및 PL 기반 NPUVEK280
Versal AI Edge 시리즈 Gen 2AIE-MLv2 AI Engine을 탑재한 차세대 적응형 SoC최대 8개의 Arm Cortex-A78AEAIE-MLv2 AI Engine 및 PL 기반 NPUVEK385

Zynq UltraScale+ MPSoC#

각 Zynq UltraScale+ 칩은 듀얼 코어(CG) 또는 쿼드 코어(EG 및 EV) Cortex-A53 코어와 실시간 Cortex-R5F 코어를 갖춘 Arm 프로세싱 시스템을 FPGA 로직과 결합합니다. EV 장치에는 하드웨어 H.264/H.265 비디오 코덱이 추가됩니다. 신경망을 실행하려면 설계자가 카메라 및 비디오 파이프라인 옆의 로직에 DPU를 구축합니다. 소형 장치에서는 DPU가 설계의 다른 구성 요소와 공간을 두고 경쟁합니다.

Kria 시스템 온 모듈#

Kria K26 모듈은 Zynq UltraScale+ MPSoC, 메모리 및 전원을 생산용 모듈에 통합하므로 프로세서, 메모리 및 전원 하위 시스템을 직접 설계할 필요가 없습니다. 모듈은 스타터 키트 보드나 직접 설계한 캐리어 카드에 연결합니다. 이 모듈은 스마트 카메라용 KV260 Vision AI Starter Kit과 로보틱스용 KR260 Robotics Starter Kit에 사용됩니다. K26은 Zynq UltraScale+ 기반이므로 동일한 DPU 워크플로를 사용합니다. Kria 제품군에는 다른 모듈도 있으므로 워크플로를 선택하기 전에 모듈에 어떤 프로세서가 사용되는지 확인하세요.

Versal 적응형 SoC#

Versal은 AMD의 적응형 SoC 제품군입니다. AI Edge 및 AI Core 시리즈는 Arm 코어와 프로그래밍 가능 로직 옆에 하드웨어 AI Engine을 추가하지만, 다른 Versal 시리즈 중에는 AI Engine이 없는 제품도 있습니다. AMD의 NPU IP는 AI Engine과 프로그래밍 가능 로직을 함께 사용하며, Vitis AI는 VE2302 및 VE2802와 같은 AI Edge 시리즈의 AIE-ML 부품을 대상으로 합니다. Versal AI Edge 시리즈(VEK280 평가 키트)와 Versal AI Edge 시리즈 Gen 2(VEK385 평가 키트)는 AMD의 현재 엣지 AI 대상 제품이며 최신 Vitis AI 릴리스의 중점 대상입니다.

AMD Xilinx 장치에서 AI를 실행하는 방법: DPU와 NPU 비교#

대부분의 AMD Xilinx AI 배포는 동일한 패턴을 따릅니다. 가속기는 지원하는 레이어를 실행하고, Arm CPU는 전처리와 후처리 및 가속기가 실행할 수 없는 레이어를 실행하며, 보드의 런타임이 두 장치의 동작을 조정합니다.

graph LR
    A[Camera / video input]:::start --> B[Arm CPU<br>Linux, preprocessing,<br>post-processing]:::proc
    B <--> C[AI accelerator<br>DPU in programmable logic<br>or NPU on AI Engines + PL]:::out
    B --> D[Application<br>alerts, control, display]:::start

    classDef start fill:#4CAF50,color:#fff
    classDef proc fill:#2196F3,color:#fff
    classDef out fill:#9C27B0,color:#fff

AMD는 각기 고유한 툴체인과 컴파일된 모델 파일을 사용하는 두 세대의 가속기를 출시했습니다. 이 가이드에서는 DPU에 Vitis AI 3.5를, NPU에 Vitis AI 6.3을 사용합니다. 이후 릴리스는 AMD의 최신 문서를 확인하세요.

워크플로하드웨어툴체인양자화기컴파일된 산출물보드 런타임상태
DPUZynq UltraScale+, KriaVitis AI 3.5(Docker)vai_q_pytorch.xmodelVART고정된 컴파일러, 모델 동물원 및 DPU IP
NPU(Versal AI Edge)VEK280 및 기타 Versal AI Edge 부품Vitis AI 6.3 (Docker)스냅샷 흐름에 내장됨스냅샷VART-ML활성
NPU (Versal AI Edge Gen 2)VEK385 및 기타 Gen 2 부품Vitis AI 6.3 (Docker)AMD Quark.raiONNX Runtime Vitis AI EP 또는 VART-ML활성
DPU 흐름은 변경이 중단되었습니다

Vitis AI 3.5는 DPU 컴파일러와 모델 저장소 업데이트가 포함된 마지막 릴리스입니다. 이후 Xilinx/Vitis-AI 저장소의 릴리스에서는 컴파일러, 모델 저장소, Zynq UltraScale+ DPU IP를 변경하지 않은 채 런타임과 최신 AMD 도구 버전과의 호환성을 업데이트합니다(Vitis AI 5.0 릴리스 노트 참조). 또한 AMD의 최신 Vitis AI 문서에서는 NPU를 더 이상 사용되지 않는 DPU 아키텍처의 대체 기술로 설명합니다. 기존 Zynq UltraScale+ 및 Kria 제품은 DPU를 계속 사용해 출시할 수 있지만, DPU의 연산자 지원 범위는 확장되지 않으므로 최신 모델 아키텍처에는 YOLO 모델 호환성에 설명된 조정이 필요합니다.

Ryzen AI 노트북은 다른 스택을 사용합니다

PC용 AMD Ryzen AI 프로세서에도 NPU가 포함되어 있지만, 이 가이드의 임베디드 Vitis AI 흐름이 아닌 별도의 Ryzen AI Software 스택을 사용합니다. AMD Instinct 및 Radeon GPU에 대해서는 AMD GPU 통합을 참조하세요.

어떤 Vitis AI 흐름을 사용해야 하나요?#

보드에 탑재된 장치에 따라 흐름을 선택하세요:

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

YOLO 모델 호환성 및 지원되는 연산자#

가속기는 하드웨어에서 구현하는 연산자만 빠르게 처리합니다. 모델에 지원되지 않는 연산자가 포함되면 컴파일러는 일반적으로 해당 네트워크 부분을 Arm CPU로 보내며, 가속기와 CPU 사이를 오갈 때마다 지연 시간이 추가됩니다. 일부 연산자는 분할할 수 없습니다. Versal AI Edge Gen 2 NPU의 경우 AMD가 NonZero 및 NonMaxSuppression 등의 연산자를 열거하며, 이러한 연산자는 전체 모델을 CPU에서 실행하게 만들 수 있습니다. AMD Xilinx 하드웨어에서 YOLO 모델의 성능을 좌우하는 가장 중요한 요소는 연산자 지원입니다.

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

이 표는 YOLO26 모델의 각 연산자가 어디에서 실행되는지 보여줍니다. 기본 YOLO26n ONNX 내보내기에는 87개의 SiLU 활성화가 포함되며, 각 활성화는 Sigmoid와 Mul로 내보내집니다. 또한 두 개의 어텐션 블록에서 MatMul 연산자 4개와 Softmax 연산자 2개가 포함됩니다. 두 어텐션 블록은 백본 끝의 C2PSA 블록(레이어 10)과 P5 출력을 생성하는 어텐션이 활성화된 C3k2 블록(레이어 22)입니다.

연산자YOLO에서 나타나는 위치DPU (Zynq UltraScale+, Kria)NPU (Versal AI Edge Gen 2)
컨볼루션 + 배치 정규화모든 Conv 블록✅✅
SiLU 활성화모든 Conv 블록(기본 활성화)❌ CPU에서 실행됩니다. Hard-Swish로 대체하세요✅
Hard-Swish, ReLU, ReLU6, LeakyReLU모델 YAML에서 설정하는 선택적 활성화✅ 컨볼루션에 융합됩니다✅
Sigmoid검출 헤드의 클래스 점수❌ CPU에서 실행됩니다(일반적으로 후처리의 일부)✅
두 활성화 간 MatMul어텐션 블록(C2PSA; YOLO26 C3k2)❌ CPU에서 실행됩니다✅
Softmax어텐션 블록; YOLOv8 및 YOLO11의 DFL❌ CPU에서 실행됩니다✅
Reshape, Transpose어텐션 블록⚠️ 가능한 경우 융합되고, 그렇지 않으면 CPU에서 실행됩니다✅
Split, SliceC3k2 및 C2f 블록⚠️ 슬라이스로 변환됩니다. 컴파일러 보고서를 확인하세요✅
Resize (최근접 이웃 업샘플링)넥 업샘플링✅✅
MaxPool, Concat, AddSPPF 블록 및 특성 융합✅✅
TopK, GatherElementsYOLO26 NMS-free 헤드 (nms=False)❌ CPU에서 실행됩니다⚠️ Arm 호스트에서 CPU 파티션으로 실행됩니다
NonMaxSuppressionnms=True으로 내보낸 경우에만 해당합니다❌ CPU에서 실행됩니다❌ 모델 전체를 CPU에서 실행하게 만들 수 있습니다

출처: AMD UG1414 지원 연산자, PyTorch 연산자 지원, Versal AI Edge Gen 2의 지원 연산자, CPU 파티션 및 미지원 연산자 목록입니다. 지원 여부는 DPU 구성과 그래프 패턴에도 영향을 받으므로 항상 컴파일러의 파티션 보고서를 확인하세요.

YOLO26 헤드: DFL이 없고 NMS-free 출력을 선택할 수 있습니다

YOLO26은 Distribution Focal Loss(DFL)를 제거하므로 YOLO11 및 YOLOv8과 달리 박스 출력을 디코딩할 때 softmax가 필요하지 않습니다. 또한 YOLO11과 비교해 두 번째 어텐션 블록이 추가되므로 모델을 선택하기 전에 대상별 컴파일러 보고서와 장치 내 벤치마크를 비교하세요. nms을 설정하지 않고 내보내면 one-to-many 헤드가 유지되며, 다른 YOLO 모델과 마찬가지로 CPU에서 NMS를 실행해야 합니다. 대신 nms=False로 내보내 YOLO26의 NMS-free one-to-one 헤드를 사용하면, NMS가 CPU에서 실행되는 경량 top-k 선택으로 대체됩니다.

Hard-Swish로 YOLO26을 DPU에 맞게 준비하기#

DPU는 ReLU, ReLU6, LeakyReLU, Hard-Swish 및 Hard-Sigmoid만 컨볼루션에 융합합니다. Hard-Swish는 SiLU를 하드웨어 친화적으로 근사한 함수이므로 자연스러운 대체 활성화입니다. Ultralytics 모델 YAML 파일은 activation 키를 지원하며, 이 키로 Conv 블록의 기본 활성화를 변경할 수 있습니다(모델 YAML 구성 가이드).

yolo26.yaml을 yolo26-hswish.yaml로 복사하고 매개변수 아래에 한 줄을 추가하세요:

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

그런 다음 모델을 빌드하고, 사전 학습된 YOLO26 가중치를 전이한 뒤 데이터셋에서 파인튜닝하세요:

Hard-Swish YOLO26 모델 파인튜닝
from ultralytics import YOLO

# Hard-Swish 활성화를 사용해 YOLO26n을 빌드합니다. 이름의 'n'은 nano 규모를 선택합니다
model = YOLO("yolo26n-hswish.yaml").load("yolo26n.pt")  # 사전 학습된 가중치 전이

# 네트워크가 Hard-Swish에 적응하도록 파인튜닝
model.train(data="coco8.yaml", epochs=100, imgsz=640)

활성화 함수에는 가중치가 없으므로 사전 학습된 가중치가 모두 전이됩니다. 그러면 내보낸 ONNX 그래프에는 HardSwish 연산자 87개가 포함되고 SiLU는 포함되지 않습니다. coco8.yaml을 자체 데이터셋으로 바꾸고, 배포 전에 Val 모드로 SiLU 모델과 정확도를 비교하세요.

재학습을 대체하는 방법
  • 양자화 시점에 교체: Vitis AI 3.5 PyTorch 양자화기의 JSON 구성에서 "convert_silu_to_hswish": true을 설정해 양자화 중 SiLU를 교체합니다. 학습을 한 번 생략할 수 있지만 일반적으로 정확도가 더 크게 떨어지며, AMD의 빠른 파인튜닝이나 QAT로 일부 회복할 수 있습니다. vai_q_pytorch 구성 가이드를 참조하세요.
  • LeakyReLU: DPU는 음수 기울기가 26/256(약 0.1)으로 고정된 LeakyReLU를 구현합니다. LeakyReLU를 사용한다면 학습된 기울기와 배포 시 기울기가 일치하도록 activation: nn.LeakyReLU(0.1015625)으로 학습하세요.

DPU에서 어텐션 블록 처리하기#

YOLO26은 최저 해상도(입력 크기 640에서 20×20 그리드)의 두 위치에 어텐션을 적용합니다. 레이어 10의 C2PSA 블록과 레이어 22의 어텐션이 활성화된 C3k2 블록입니다. YOLO11에는 C2PSA 블록이 하나 있습니다. DPU에서는 MatMul 및 Softmax 연산자가 CPU에서 실행되므로 모델이 DPU 및 CPU 하위 그래프로 번갈아 분할됩니다. 다음 세 가지 방법을 사용할 수 있습니다:

  1. CPU 블록을 그대로 사용합니다. 그러면 컴파일된 .xmodel에 CPU 하위 그래프가 포함됩니다. 모든 연산자에 CPU 구현이 있는 경우 DPU 및 CPU 하위 그래프를 함께 실행하는 AMD의 Graph Runner를 사용하세요. CPU 구현이 없는 연산자는 직접 구현하고 등록해야 합니다. 20×20에서는 어텐션 연산량이 적지만, DPU와 CPU 사이에 데이터가 추가로 전송될 때마다 지연 시간이 늘어나므로 보드에서 측정하세요.

  2. 어텐션 없는 YAML을 사용합니다. Hard-Swish YAML에서 C2PSA 레이어를 nn.Identity으로 바꾸어 Concat 및 Detect에서 사용하는 레이어 인덱스가 유효하게 유지되도록 하고, 레이어 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)

    그러면 내보낸 ONNX 그래프에 MatMul 또는 Softmax 연산자가 포함되지 않습니다. 어텐션 가중치는 더 이상 적용되지 않으므로(YOLO26n 가중치 666개 중 624개가 전이됨) 더 오래 파인튜닝하고 Val 모드로 정확도를 비교하세요.

  3. YOLOv8과 같이 어텐션 없는 모델을 사용합니다. AMD는 자체 DPU 예제에서 YOLOv8을 사용했습니다.

Versal AI Edge Gen 2에서는 어텐션 연산자가 NPU 지원 항목으로 나열되어 있으므로 일반적으로 이러한 변경이 필요하지 않습니다. AMD는 구성이나 메모리 제약으로 인해 지원되는 연산자도 CPU로 폴백될 수 있다고 안내하므로, 컴파일러 보고서에서 배치 위치를 확인하세요.

모델 호환성 한눈에 보기#

모델DPU (Zynq UltraScale+, Kria)NPU (Versal AI Edge Gen 2)
YOLO26Hard-Swish로 학습합니다. 어텐션 블록 2개가 CPU 하위 그래프가 되며 DFL은 없습니다변경 없이 실행될 것으로 예상됩니다. 보드에서 검증하세요
YOLO11Hard-Swish로 학습합니다. C2PSA 및 DFL softmax가 CPU에서 실행됩니다변경 없이 실행될 것으로 예상됩니다. 보드에서 검증하세요
YOLOv8Hard-Swish로 학습합니다. DFL softmax가 CPU에서 실행됩니다AMD YOLOv8m 튜토리얼(Vitis AI 6.3, VEK385, BF16 tail을 사용한 INT8): 컴파일러 보고서에 1,181개 연산자(99.915%)와 GOP의 99.994%가 NPU에서 실행되는 것으로 표시되며, 모델 변경은 필요하지 않습니다

지금 AMD Xilinx에 YOLO26 배포하기#

네이티브 내보내기를 사용할 수 있을 때까지 배포는 네 단계로 진행됩니다:

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

1단계: 모델 학습 또는 파인튜닝#

학습 모드 또는 Ultralytics Platform에서 자체 데이터로 학습하세요. DPU 대상의 경우 Hard-Swish YAML에서 시작하세요. 나중에 양자화의 정확도 영향을 측정할 수 있도록 Val 모드로 기준 성능을 기록하세요.

2단계: NPU 대상용 ONNX 내보내기#

ONNX는 AMD NPU 흐름에서 공통 입력으로 사용됩니다. DPU 흐름은 Vitis AI 3.5 Docker 이미지에서 학습된 PyTorch 체크포인트를 직접 양자화하므로 DPU 사용자는 이 단계를 건너뛸 수 있습니다. 고정 배치 크기 1과 AMD가 지원하는 opset으로 내보내세요. Versal AI Edge Gen 2용 AMD YOLOv8m 튜토리얼에서는 opset 17을 사용합니다.

내보내기
from ultralytics import YOLO

# 1단계에서 학습한 모델을 불러옵니다
model = YOLO("runs/detect/train/weights/best.pt")

# AMD 컴파일러용으로 정적 형태를 지정해 ONNX로 내보냅니다
model.export(format="onnx", opset=17, imgsz=640)  # 'best.pt'와 같은 위치에 'best.onnx'를 생성합니다

모든 옵션은 ONNX 통합 및 내보내기 인수를 참조하세요. nms를 설정하지 않으면 추론 후 CPU에서 NMS를 실행합니다. YOLO26의 경우 nms=False을 설정하면 대신 NMS-free 헤드가 선택됩니다. AMD는 NonMaxSuppression이 모델 전체를 CPU에서 실행하게 만들 수 있는 연산자라고 안내하므로 nms=True로 NMS를 포함하지 마세요.

AMD의 ONNX Runtime 빌드를 유지하세요

AMD Docker 이미지에는 Vitis AI Execution Provider가 포함된 자체 ONNX Runtime 빌드가 제공됩니다. Ultralytics는 내보내기 중 ONNX Runtime을 확인하며 기본 패키지를 설치해 기존 빌드를 덮어쓸 수 있습니다. 다른 시스템에서 내보낸 뒤 .onnx 파일을 컨테이너에 복사하거나, AMD Docker 이미지 내에서 Ultralytics를 실행할 때 YOLO_AUTOINSTALL=false을 설정하세요.

3단계: Vitis AI로 양자화 및 컴파일#

아래 워크플로에서는 x86-64 Linux 호스트에서 AMD Docker 이미지를 사용합니다. 이 단계에서는 보드가 필요하지 않습니다. 장치에 해당하는 탭을 선택하세요:

  1. Versal AI Edge Gen 2용 AMD Vitis AI 6.3 Docker 이미지를 시작하세요. 시스템 요구 사항을 참조하세요.
  2. ONNX 모델을 AMD Quark와 VINT8 구성을 사용해 INT8로 양자화하세요. AMD의 최소 구성에는 Int32Bias=False, enable_npu_cnn=True, DedicatedQDQPair=True 및 QuantizeAllOpTypes=True도 필요합니다. Quark는 직접 작성한 데이터 리더를 통해 보정 데이터를 읽으므로, 데이터셋의 대표 이미지에 추론 시와 동일하게 내보내기 크기로 레터박스 리사이즈하고 RGB 채널 순서, 0–1 스케일링 및 NCHW 레이아웃을 적용하세요.
  3. 후처리 서브그래프는 양자화에서 제외합니다. AMD의 YOLOv8m 튜토리얼에서는 이를 양자화하면 탐지 누락이 발생한다고 경고합니다. 해당 YOLOv8m 예제에서 컴파일러는 나머지 부분을 NPU에서 BF16으로 실행합니다. YOLO26의 top-k 선택과 같이 지원되지 않는 나머지 연산자는 CPU에서 실행됩니다.
  4. 컴파일 전에 보드 런타임을 선택합니다. 표준 컴파일은 ONNX Runtime과 함께 사용할 수 있으며, ONNX Runtime은 YOLO26의 top-k 선택과 같이 NPU에서 지원되지 않는 연산자를 CPU에서 직접 실행합니다. 또한 모든 연산자가 NPU에서 실행되는 경우에만 VART-ML을 사용할 수 있습니다. VART-ML에서 CPU 연산이 포함된 모델을 실행하려면 AMD의 CPU 파티션 패스를 vitisai_config.json에 추가합니다. 이러한 아티팩트는 ONNX Runtime으로 실행할 수 없습니다.
  5. VitisAIExecutionProvider과 대상 디바이스를 지정하는 vitisai_config.json을 사용하여 ONNX Runtime 세션을 생성한 뒤 컴파일합니다. 컴파일하면 캐시 디렉터리에 .rai 파일이 생성됩니다. 모델 컴파일을 참조하세요.

양자화를 건너뛰려면 FP32 ONNX 모델을 직접 컴파일하면 컴파일러가 BF16으로 변환합니다. 컴파일하려면 AMD AI Engine 컴파일러 라이선스가 필요합니다. AMD 라이선스 페이지를 참조하세요.

4단계: 보드에서 실행 및 검증#

먼저 보드를 준비합니다. 보드에는 컴파일 대상 가속기 구성이 포함된 하드웨어 설계와 Linux 이미지, 그리고 이에 맞는 Vitis AI 런타임이 설치되어 있어야 합니다. AMD 설정 가이드에서 Zynq UltraScale+ 및 Kria DPU 대상, Versal AI Edge (VEK280), Versal AI Edge Gen 2 (VEK385)을 참조하세요.

그런 다음 런타임에 필요한 아티팩트를 복사합니다.

워크플로보드에 복사할 아티팩트보드 런타임
DPU (Zynq UltraScale+, Kria)컴파일된 .xmodelVART; CPU 서브그래프용 Graph Runner
NPU (Versal AI Edge, VEK280)스냅샷 디렉터리VART-ML
NPU (Versal AI Edge Gen 2), ORT컴파일에 사용한 FP32 또는 양자화된 ONNX 모델, vitisai_config.json, 컴파일된 캐시 디렉터리Vitis AI EP가 포함된 ONNX Runtime
NPU (Versal AI Edge Gen 2), VART-ML.rai 파일(CPU에서 실행되는 연산자가 있으면 CPU 파티션 패스 포함)과 VART-ML 실행기 구성VART-ML

NPU 워크플로의 경우, 내보낸 ONNX 그래프가 이미 박스를 디코딩하고 클래스 점수에 sigmoid를 적용하므로 호스트는 출력만 해석하면 됩니다.

  • nms이 설정되지 않은 경우: 탐지 모델은 xywh개의 박스와 클래스별 점수가 포함된 (1, 4 + nc, anchors) 텐서를 출력합니다. 각 앵커에서 가장 높은 클래스를 선택하고, 박스를 모서리 좌표로 변환한 뒤, 신뢰도 기준으로 필터링하고 NMS를 실행합니다. Ultralytics의 non_max_suppression 함수가 이 모든 단계를 수행합니다.
  • nms=False(YOLO26): 모델은 [x1, y1, x2, y2, score, class]개 행으로 구성된 (1, max_det, 6) 텐서를 출력하며, 신뢰도 임계값만 적용하면 됩니다.

두 경우 모두 letterbox 처리된 입력의 박스를 원본 이미지에 맞게 재조정합니다. 디코드 단계 전에 분할된 그래프만 호스트에서 박스를 디코딩해야 합니다. DPU에서 VART 버퍼는 고정소수점 INT8 값을 저장합니다. 각 텐서의 shape과 fix_point 스케일을 조회하고, 입력을 양자화한 뒤 출력을 역양자화하고 위 단계를 적용합니다. Graph Runner는 전체 그래프의 출력을 반환하지만, DPU 전용 실행기는 DPU 서브그래프의 중간 출력을 반환하므로 코드에서 나머지 계산을 완료해야 합니다. 위 레이아웃은 ONNX(CPU 뷰) 레이아웃입니다. VART-ML은 기본적으로 shape, 데이터 유형, 메모리 레이아웃이 다를 수 있는 하드웨어 텐서 뷰를 사용하므로 실행기의 입력 및 출력 텐서 유형을 CPU 뷰로 설정하거나 하드웨어 형식을 직접 변환합니다(AMD의 VART-ML 아키텍처 개요 참조).

자체 검증 세트와 동일한 성능 지표(예: mAP)를 사용하여 디바이스에서 측정한 정확도를 1단계의 FP32 기준선과 비교합니다. AMD가 공개한 VEK385의 YOLOv8m 결과는 INT8 배포에 따른 정확도 저하를 보여줍니다.

YOLOv8m 구성하드웨어mAP50-95 (COCO)
FP32 ONNX호스트 CPU49.95
BF16VEK385 NPU50.29
VINT8 양자화, FP32 테일호스트 CPU48.75
BF16 테일을 적용한 VINT8VEK385 NPU48.38

출처: AMD Versal AI Edge Gen 2용 YOLOv8m 튜토리얼. 이 튜토리얼에는 dp_size=1에서 VART를 100회 실행했을 때의 평균 추론 시간 10.69ms도 보고되어 있습니다.

상용 제품 라이선스

상용 AMD Xilinx 제품에 Ultralytics YOLO를 탑재하려면 AGPL-3.0 라이선스를 준수하거나 Ultralytics Enterprise 라이선스를 취득해야 합니다.

실제 애플리케이션#

AMD Xilinx 디바이스는 비전 AI를 센서 가까이에서 저전력으로 실시간 실행해야 하는 다양한 분야에서 널리 사용됩니다.

  • 산업 및 건설 현장 안전: 중장비 주변의 사람과 기계를 탐지하고, 객체 탐지 및 객체 카운팅을 통해 작업 구역을 모니터링합니다.
  • 자동차 및 오프하이웨이 비전: 인증된 자동차 등급 부품에서 카메라 기반 인식을 실행하여 자율주행 차량과 운전자 보조 기능을 지원합니다.
  • 스마트 카메라 및 비디오 분석: 비디오 캡처, 인코딩, YOLO 추론을 단일 칩에 결합하여 보안 시스템과 비디오 분석에 활용합니다.
  • 머신 비전 및 품질 검사: FPGA 기반 고속 이미지 캡처와 YOLO 인스턴스 분할 또는 분류를 결합하여 생산 라인에서 결함을 탐지합니다.
  • 로보틱스 및 드론: Kria KR260 또는 Versal 모듈을 사용하여 포즈 추정, 방향성 객체 탐지, 내비게이션을 결정론적 지연 시간으로 수행합니다.

요약#

AMD Xilinx 디바이스는 두 세대의 가속기를 통해 YOLO 모델을 실행합니다. Zynq UltraScale+ 및 Kria의 DPU는 고정된 Vitis AI 3.5 워크플로를 사용하며 .xmodel 파일을 생성합니다. DPU에는 Hard-Swish와 같은 DPU 네이티브 활성화 함수가 필요하며 attention은 CPU에서 실행됩니다. Versal AI Edge 및 Versal AI Edge Gen 2의 NPU는 최신 Vitis AI 릴리스를 사용합니다. Gen 2 NPU는 SiLU 및 attention 연산자를 지원하며, VEK385에서 AMD의 YOLOv8m 예제를 거의 전부 NPU에서 실행합니다. 반면 초기 VEK280 NPU의 연산자 지원 범위는 Vitis AI 버전과 정밀도에 따라 달라집니다.

AMD Xilinx 디바이스용 Ultralytics 네이티브 내보내기 기능은 곧 제공될 예정입니다. 그때까지 Ultralytics로 학습한 다음, Versal NPU 대상은 ONNX로 내보내고, DPU 대상은 PyTorch 체크포인트를 유지한 뒤, 위에 설명된 대로 Vitis AI로 컴파일합니다. 다른 배포 대상은 모델 배포 옵션 가이드, 배포 모범 사례, Hailo, Rockchip RKNN, Axelera 등의 가속기 통합을 참조하세요.

자주 묻는 질문#

  • 예. AMD는 2022년 2월 Xilinx 인수를 완료했으며, Xilinx 제품은 현재 AMD 적응형 SoC 및 FPGA인 AMD Zynq, AMD Kria, AMD Versal, AMD Vitis로 판매됩니다. 엔지니어들은 여전히 Xilinx라는 이름을 널리 사용하며, 부품 번호에도 XC 접두사가 유지됩니다.

  • 아직은 불가능합니다. AMD Xilinx 디바이스용 Ultralytics 네이티브 내보내기 기능은 곧 제공될 예정입니다. 현재는 Versal NPU 대상의 경우 model.export(format="onnx")으로 ONNX를 내보내고, Zynq UltraScale+ 및 Kria DPU 대상의 경우 학습된 PyTorch 체크포인트를 vai_q_pytorch로 양자화한 다음, 지금 AMD Xilinx에 YOLO26 배포하기에 설명된 대로 AMD Vitis AI 도구를 사용하여 컴파일합니다.

  • DPU(심층 학습 처리 장치)는 AMD의 이전 INT8 가속기입니다. Zynq UltraScale+ 및 Kria 디바이스의 프로그래머블 로직에 내장되어 있으며, Vitis AI 3.5로 컴파일하고 .xmodel 파일을 생성합니다. 최신 Vitis AI 릴리스에서는 NPU가 DPU를 대체합니다. Versal AI Edge 디바이스의 NPU는 하드웨어로 구현된 AI Engines와 프로그래머블 로직을 결합하고 INT8, BF16 및 혼합 정밀도를 지원하며, 더 많은 연산자를 지원합니다. 여기에는 SiLU와 Versal AI Edge Gen 2의 attention도 포함됩니다.

  • .xmodel은 AMD DPU 도구 체인에서 사용하는 직렬화된 XIR 그래프입니다. 양자화기는 양자화된 .xmodel을 생성하고, vai_c_xir 컴파일러는 이를 DPU 명령 스트림, 양자화된 INT8 가중치, CPU에서 실행해야 하는 서브그래프가 포함된 컴파일된 .xmodel으로 변환합니다. 컴파일된 파일은 arch.json 지문으로 지정되는 하나의 특정 DPU 구성에 맞춰져 있습니다. 파일에 CPU 서브그래프가 포함된 경우 Vitis AI Runtime(VART) 또는 Graph Runner를 통해 보드에서 실행됩니다.

  • 아니요. DPU는 ReLU, ReLU6, LeakyReLU, Hard-Swish, Hard-Sigmoid 활성화 함수만 가속하며, 두 활성화 함수 사이의 Sigmoid, Softmax, MatMul은 CPU에서 실행합니다. 컨볼루션을 DPU에서 실행하려면 모델 YAML에서 activation: nn.Hardswish()을 사용하여 YOLO를 학습합니다. attention 옵션은 DPU에서 Attention 블록 처리하기를 참조하세요. Versal AI Edge Gen 2 NPU는 SiLU, Softmax, MatMul을 네이티브로 지원합니다.

  • KV260은 DPU가 탑재된 Zynq UltraScale+ MPSoC를 사용하므로 DPU 워크플로를 따릅니다. Hard-Swish YOLO26 모델을 학습하고, Vitis AI 3.5 Docker 이미지에서 vai_q_pytorch을 사용하여 양자화한 뒤, KV260의 arch.json에 맞는 vai_c_xir로 컴파일합니다. 그런 다음 결과 .xmodel을 VART 또는 CPU 서브그래프가 포함된 경우 Graph Runner를 사용하여 보드에서 실행합니다.

  • 아니요. 양자화와 컴파일은 x86-64 Linux 호스트의 AMD Vitis AI Docker 이미지에서 실행됩니다. 컴파일된 모델을 실행하고 디바이스에서 지연 시간과 정확도를 측정할 때만 보드가 필요합니다.

  • 가속기용으로 연산자를 컴파일할 수 있다면 모든 작업을 실행할 수 있습니다. 지원되지 않는 연산자는 대개 CPU에서 실행되지만, 일부 연산자는 모델 전체가 CPU에서 실행되도록 하거나 컴파일을 실패하게 할 수 있습니다. 객체 탐지는 가장 일반적인 워크로드이며 AMD 자체 예제에서도 사용됩니다. 분할, 포즈 및 기타 작업의 경우 컴파일러의 파티션 보고서를 확인하여 주요 레이어가 가속기에서 실행되는지 검증합니다.

댓글