Vitis AI를 사용한 Ultralytics YOLO용 AMD Xilinx 내보내기#
format="xilinx"로 Ultralytics YOLO26 모델을 내보내면 AMD Versal AI Edge Series Gen 2 적응형 SoC의 NPU에 맞게 AMD Quark로 양자화됩니다. 이후 AMD의 Vitis AI 컴파일러를 사용해 .rai 모델을 빌드할 수 있습니다. 같은 내보내기 단계에서 배포 전에 모든 호스트에서 INT8 정확도를 검증할 수 있습니다.
이 내보내기는 VEK385 평가 키트와 같은 Versal AI Edge Series Gen 2 디바이스용으로 유지 관리되는 Vitis AI NPU 워크플로를 대상으로 합니다. Zynq UltraScale+ 및 Kria DPU와 1세대 Versal AI Edge NPU(VEK280)는 다른 Vitis AI 워크플로를 사용하며, 자세한 내용은 다른 AMD Xilinx 타깃에 배포하기를 참조하세요.
AMD Xilinx 장치는 전 세계 여러 산업용 카메라, 자동차 비전 시스템, 로봇, 드론 및 의료 영상 제품에 사용됩니다. Arm 프로세서와 프로그래밍 가능한 로직을 결합하고, 최신 장치에서는 전용 AI Engine도 탑재합니다. 따라서 단일 칩으로 비디오를 캡처하고 전처리한 뒤 객체 탐지를 실행하고, 낮고 예측 가능한 추론 지연 시간으로 결과에 따라 동작할 수 있습니다.
이 가이드에서는 AMD Xilinx 내보내기, Versal 보드에서의 컴파일 및 실행 방법, 각 AMD Xilinx 디바이스 제품군의 특징, 해당 디바이스에서 AI가 실행되는 방식, 그리고 각 가속기가 지원하는 Ultralytics YOLO 연산자를 설명합니다.
AMD Xilinx란 무엇인가요?#
Xilinx는 1980년대에 필드 프로그래머블 게이트 어레이(FPGA) 분야를 개척했으며, 적응형 SoC 및 FPGA의 선도적인 공급업체가 되었습니다. AMD는 2022년 2월 Xilinx 인수를 완료했으며, 현재 제품 라인은 AMD Zynq, AMD Kria, AMD Versal 및 AMD Vitis라는 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 AI | AMD Xilinx 장치에 신경망을 배포하기 위한 AMD의 툴체인입니다. 양자화, 컴파일, 런타임, 예제 및 Docker 환경을 포함합니다. |
| AMD Quark | Versal AI Edge Gen 2 워크플로에서 FP32 ONNX 모델을 INT8 모델로 변환하는 데 사용하는 AMD의 최신 모델 양자화 라이브러리입니다. |
| 양자화, PTQ 및 QAT | FP32 가중치와 활성화를 INT8로 변환하는 과정입니다. 학습 후 양자화(PTQ)는 보정 이미지를 사용합니다. 양자화 인식 학습(QAT)은 정확도를 회복하도록 모델을 미세 조정합니다. |
| 보정 이미지 | PTQ 중 모델에 입력하여 각 텐서의 INT8 스케일을 결정하는 소규모 대표 이미지 세트입니다. |
| BF16 및 혼합 정밀도 | BFloat16은 FP32의 범위를 유지하는 16비트 부동 소수점 형식입니다. 혼합 정밀도는 네트워크 대부분을 INT8로 실행하고 민감한 레이어는 BF16으로 실행합니다. |
| XIR | Xilinx 중간 표현: DPU 컴파일러가 생성하고 런타임이 읽는 그래프 형식입니다. |
.xmodel | 직렬화된 XIR 그래프입니다. 양자화기는 양자화된 .xmodel을 작성하고, DPU 컴파일러는 이를 DPU 명령, 양자화된 가중치 및 CPU 서브그래프를 포함하는 컴파일된 .xmodel로 변환합니다. 컴파일된 모델을 실행하려면 이에 맞는 DPU 구성이 필요합니다. |
arch.json / DPU 핑거프린트 | 특정 DPU 구성을 설명하는 파일입니다. DPU 컴파일러에 필요하며, 한 핑거프린트용으로 컴파일된 .xmodel은 다른 핑거프린트에서 실행되지 않습니다. |
| 스냅샷 | Versal AI Edge(VEK280) NPU 워크플로에서 생성되는 컴파일된 모델 디렉터리입니다. 하나의 NPU IP 변형에 종속됩니다. |
.rai | Versal AI Edge Gen 2 NPU 워크플로에서 생성되는 컴파일된 모델 파일입니다. |
| VART / VART-ML | 컴파일된 모델을 로드하고 보드에서 실행하는 Vitis AI Runtime 라이브러리이며, C++ 및 Python API를 제공합니다. |
| ONNX Runtime Vitis AI EP | ONNX Runtime용 VitisAIExecutionProvider으로, AMD NPU에서 ONNX 모델을 컴파일하고 실행합니다. |
| CPU 폴백 / 그래프 분할 | 가속기가 연산자를 실행할 수 없으면 컴파일러는 보통 모델을 가속기 서브그래프와 CPU 서브그래프로 나눕니다. 이때 분할이 추가될 때마다 데이터 전송이 발생하며, 이 전송이 지연 시간을 크게 늘릴 수 있습니다. 일부 연산자는 모델 전체를 CPU에서 실행하도록 하거나 컴파일을 실패하게 만들기도 합니다. |
엣지 AI용 AMD Xilinx 장치 제품군#
엣지 AI용 AMD Xilinx 장치는 세 가지 제품군으로 나뉩니다. Zynq와 Kria는 프로그래밍 가능 로직에서 DPU를 사용하고, 여기에서 다루는 Versal AI Edge 장치는 AI Engine에서 NPU를 사용합니다.
| 제품군 | 설명 | 애플리케이션 CPU | AI 가속기 | 보드 예시 |
|---|---|---|---|---|
| Zynq UltraScale+ MPSoC | ZU1부터 ZU19까지 다양한 크기로 제공되며, Arm CPU와 FPGA 로직을 단일 칩에 통합합니다. | 듀얼 코어 또는 쿼드 코어 Arm Cortex-A53 | 프로그래밍 가능 로직에 구축된 DPU | ZCU104, ZCU102, 커스텀 보드 |
| Kria K26 시스템 온 모듈 | Zynq UltraScale+ MPSoC 기반의 생산용 모듈 | 쿼드 코어 Arm Cortex-A53 | 프로그래밍 가능 로직에 구축된 DPU | KV260 Vision AI Starter Kit, KR260 Robotics Starter Kit |
| Versal AI Edge 시리즈 | 적응형 SoC이며, VE2302 및 VE2802 같은 AIE-ML 부품에서 NPU를 실행합니다. | 듀얼 코어 Arm Cortex-A72 | AIE-ML AI Engine 및 PL 기반 NPU | VEK280 |
| Versal AI Edge 시리즈 Gen 2 | AIE-MLv2 AI Engine을 탑재한 차세대 적응형 SoC | 최대 8개의 Arm Cortex-A78AE | AIE-MLv2 AI Engine 및 PL 기반 NPU | VEK385 |
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는 전처리와 후처리 및 가속기가 실행할 수 없는 레이어를 실행하며, 보드의 런타임이 두 장치의 동작을 조정합니다.
AMD는 각기 고유한 툴체인과 컴파일된 모델 파일을 사용하는 두 세대의 가속기를 출시했습니다. 이 가이드에서는 DPU에 Vitis AI 3.5를, NPU에 Vitis AI 6.3을 사용합니다. 이후 릴리스는 AMD의 최신 문서를 확인하세요.
| 워크플로 | 하드웨어 | 툴체인 | 양자화기 | 컴파일된 산출물 | 보드 런타임 | 상태 |
|---|---|---|---|---|---|---|
| DPU | Zynq UltraScale+, Kria | Vitis AI 3.5(Docker) | vai_q_pytorch | .xmodel | VART | 고정된 컴파일러, 모델 동물원 및 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 | .rai | ONNX Runtime Vitis AI EP 또는 VART-ML | 활성 |
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 모델 호환성에 설명된 조정이 필요합니다.
PC용 AMD Ryzen AI 프로세서에도 NPU가 포함되어 있지만, 이 가이드의 임베디드 Vitis AI 흐름이 아닌 별도의 Ryzen AI Software 스택을 사용합니다. AMD Instinct 및 Radeon GPU에 대해서는 AMD GPU 통합을 참조하세요.
어떤 Vitis AI 흐름을 사용해야 하나요?#
보드에 탑재된 장치에 따라 흐름을 선택하세요:
AMD Xilinx로 내보내기: YOLO 모델 변환#
지원 작업#
AMD Xilinx 내보내기는 Ultralytics의 7가지 작업을 모두 지원합니다. 시맨틱 분할과 깊이 추정은 해당 헤드가 포함된 유일한 제품군인 YOLO26에서만 사용할 수 있습니다.
설치#
AMD Xilinx 내보내기는 Linux(x86-64 또는 ARM64)와 Python 3.11~3.13에서 실행되며, 이는 AMD Quark이 지원하는 버전입니다. 첫 내보내기에서는 Quark의 사용자 지정 연산자도 컴파일하는데, 이 작업에는 g++과 같은 C++ 컴파일러가 필요합니다.
# Install the required package for YOLO
pip install ultralytics첫 내보내기 시 PyPI에서 AMD Quark를 자동으로 설치합니다. 내보내기 종속성을 미리 설치하려면 다음을 실행하세요:
pip install "ultralytics[export-xilinx]"저장소를 편집 가능한 상태로 설치하려면 "ultralytics[export-xilinx]"을 -e ".[export-base,export-xilinx]"로 바꿉니다. Python 3.12 환경과 CI에서 사용하는 간단한 내보내기 테스트를 재현하려면 저장소 루트에서 기존 환경 빌더를 실행합니다:
ULTRALYTICS_ISOLATED_VENVS="$PWD/.venvs" python .github/scripts/create-export-env.py --env isolated-xilinx사용법#
AMD Xilinx 형식은 내보내기, 예측, 검증 모드를 지원합니다. AMD의 Vitis AI Execution Provider가 없으면 예측 및 검증 시 ONNX Runtime을 사용해 양자화된 모델을 CPU에서 실행하며, 이를 통해 모든 호스트에서 INT8 정확도를 측정할 수 있습니다. Versal AI Edge Series Gen 2 보드처럼 ONNX Runtime에서 VitisAIExecutionProvider을 제공하는 경우 Ultralytics가 이를 자동으로 선택합니다.
from ultralytics import YOLO
# YOLO26 모델 로드
model = YOLO("yolo26n.pt")
# VEK385용 AMD Xilinx 형식으로 내보내기(quantize=8이 자동으로 적용됨)
model.export(format="xilinx") # creates 'yolo26n_xilinx_model/'from ultralytics import YOLO
# 내보낸 AMD Xilinx 모델 로드
model = YOLO("yolo26n_xilinx_model")
# 추론 실행
results = model("https://ultralytics.com/images/bus.jpg")from ultralytics import YOLO
# 내보낸 AMD Xilinx 모델 로드
model = YOLO("yolo26n_xilinx_model")
# COCO8 데이터셋에서 INT8 정확도 검증
metrics = model.val(data="coco8.yaml")vitis, vitisai, versal 형식 이름은 xilinx의 별칭입니다.
내보내기 인수#
| 인수 | 유형 | 기본값 | 설명 |
|---|---|---|---|
format | str | 'xilinx' | 내보낸 모델의 타깃 형식으로, AMD Versal AI Edge Series Gen 2 NPU와의 호환성을 정의합니다. |
imgsz | int 또는 tuple | 640 | 모델 입력의 이미지 크기입니다. 정사각형 이미지는 정수로, 그 외에는 (height, width) 튜플로 지정합니다. 내보낸 모델의 배치 크기는 1로 고정됩니다. |
quantize | int 또는 str | 8/auto | 양자화 정밀도입니다. 8(Vitis AI INT8)이 필수이며, 지정하지 않으면 자동으로 활성화됩니다. |
data | str | None | INT8 보정에 사용하는 데이터셋 YAML입니다. 분류 작업에는 데이터셋 디렉터리 또는 내장 데이터셋 이름을 사용합니다. 생략하면 Ultralytics가 작업별 보정 데이터셋을 사용합니다. 예를 들어 탐지에는 coco128.yaml을 사용합니다. |
fraction | float | 1.0 | 사용할 보정 데이터셋의 비율입니다. |
name | str | 've2-xc2ve3858' | Vitis AI 컴파일러 디바이스: 've2-xc2ve3858'(VEK385 평가 키트), 've2-xc2ve3804', 've2-xc2ve3558', 've2-xc2ve3504', 've2-xc2ve3358' 또는 've2-xc2ve3304'입니다. |
opset | int | None | 중간 그래프의 ONNX opset입니다. 기본값은 17이며, AMD가 Vitis AI에서 YOLO용으로 검증한 opset입니다. |
simplify | bool | True | onnxslim을 사용하여 중간 ONNX 그래프를 간소화합니다. |
device | str | None | 내보내기에 사용할 장치를 지정합니다. GPU(device=0) 또는 CPU(device=cpu)를 선택할 수 있습니다. |
nms=False을 설정하면 YOLO26의 NMS 없는 헤드를 내보냅니다. AMD가 NonMaxSuppression을 모델 전체가 CPU에서 실행되도록 할 수 있는 연산자 중 하나로 지정했으므로 임베디드 NMS(nms=True)는 지원되지 않습니다.
INT8 정확도는 보정 이미지가 배포 환경을 얼마나 잘 대표하는지에 따라 달라집니다. 자체 카메라에서 촬영한 대표 이미지 300장 이상을 포함하는 데이터셋 YAML을 data=에 전달하세요. 기본 보정 데이터셋은 규모가 작은 공개 샘플입니다.
내보내기 프로세스에 관한 자세한 내용은 내보내기에 관한 Ultralytics 문서 페이지를 참조하세요.
출력 구조#
내보내기가 성공하면 다음과 같은 구조의 모델 디렉터리가 생성됩니다:
yolo26n_xilinx_model/
├── yolo26n.onnx # AMD Quark VINT8 model with the Ultralytics metadata
└── vitisai_config.json # Vitis AI compiler configuration for the target device아래 설명과 같이 모델을 컴파일하면 같은 디렉터리에 yolo26n/ 컴파일러 캐시가 추가됩니다. 여기에는 yolo26n.rai NPU 모델과 final-vaiml-pass-summary.txt와 같은 AMD 컴파일 보고서가 포함됩니다.
내보내기 작동 방식#
이 내보내기는 Versal AI Edge Series Gen 2에 대해 AMD가 문서화한 Vitis AI 워크플로를 따릅니다:
- ONNX 내보내기: opset 17과 배치 크기 1 고정 설정을 사용합니다.
- AMD Quark 양자화:
VINT8구성(2의 거듭제곱 스케일을 사용하는 대칭 INT8)과 NPU 컴파일에 AMD가 요구하는 옵션인Int32Bias=False,enable_npu_cnn=True,DedicatedQDQPair=True,QuantizeAllOpTypes=True를 사용합니다. 보정에는 표준 Ultralytics INT8 보정 로더를 사용하며, 추론과 동일하게 letterbox, RGB 및 0~1 전처리를 적용합니다. - 혼합 정밀도: 모델 헤드는 부동소수점으로 유지되고 Vitis AI 컴파일러는 NPU에서 BF16으로 실행합니다. 헤드를 INT8로 양자화하면 대부분의 정확도 손실이 발생하며, AMD의 YOLOv8m 튜토리얼에서도 같은 이유로 후처리 부분을 INT8에서 제외합니다.
- 컴파일러 구성:
vitisai_config.json은name에서VAIML타깃과 디바이스를 선택합니다.
정확도#
표는 COCO val2017(이미지 5,000장)에서 640 해상도로 측정한 내보낸 INT8 모델과 FP32 ONNX 모델의 결과를 비교합니다. 두 모델 모두 호스트 CPU에서 ONNX Runtime으로 실행했습니다. INT8 모델은 기본 coco128.yaml 데이터셋으로 보정했습니다. 자체 배포 이미지로 보정하면 일반적으로 성능 차이가 줄어듭니다.
이 호스트 결과는 양자화된 모델을 CPU에서 ONNX Runtime으로 실행한 결과이며, AMD의 정확도 측정 방법론에서 NPU 결과를 비교하는 기준으로 사용합니다. VEK385에서 공개한 AMD YOLOv8m 결과도 NPU에서 동일한 혼합 정밀도 방식을 사용합니다:
| YOLOv8m 구성 | 하드웨어 | mAP50-95 (COCO) |
|---|---|---|
| FP32 ONNX | 호스트 CPU | 49.95 |
| BF16 | VEK385 NPU | 50.29 |
| VINT8 양자화, FP32 테일 | 호스트 CPU | 48.75 |
| BF16 테일을 적용한 VINT8 | VEK385 NPU | 48.38 |
출처: AMD Versal AI Edge Gen 2용 YOLOv8m 튜토리얼. 이 튜토리얼에는 dp_size=1에서 VART를 100회 실행했을 때의 평균 추론 시간 10.69ms도 보고되어 있습니다.
Versal AI Edge Gen 2에서 컴파일 및 실행#
내보낸 디렉터리는 AMD Vitis AI 컴파일러에서 사용할 준비가 되어 있습니다. 이 컴파일러는 NPU에서 실행되는 .rai 모델을 빌드합니다.
-
호스트와 보드를 준비합니다. AMD의 Versal AI Edge Gen 2용 Vitis AI 6.3 Docker 이미지와 AMD AI Engine 컴파일러 라이선스를 사용하여 x86-64 Linux 호스트에서 컴파일합니다(AMD 라이선스 페이지 참조). AMD의 보드 설정 가이드에 따라 VEK385를 설정합니다.
-
컴파일합니다. 컨테이너 안에서 Vitis AI Execution Provider를 사용해 ONNX Runtime 세션을 생성합니다. AMD의 컴파일 가이드에서도 같은 호출을 사용합니다. 그러면 내보내기 디렉터리에
yolo26n.rai가 포함된yolo26n/캐시가 생성됩니다: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])모델에서 NPU로 실행되는 비율은
yolo26n_xilinx_model/yolo26n/final-vaiml-pass-summary.txt을 확인하세요. 640 해상도의 YOLO26n에서 AMD Vitis AI 6.3 컴파일러는 VEK385 NPU의 단일 파티션에 연산자의 99.9%와 연산량의 99.9%를 배치합니다. -
보드에서 실행합니다. 내보내기 디렉터리를 VEK385로 복사합니다. Vitis AI Execution Provider를 사용하는 ONNX Runtime은 컴파일된
yolo26n.rai을 로드해 NPU에서 실행하며,YOLO("yolo26n_xilinx_model")은 해당 프로바이더를 사용할 수 있을 때 자동으로 선택합니다.
컴파일에는 AMD의 ONNX Runtime만 필요하므로, 어떤 Linux 머신에서든 내보내기를 수행한 뒤 Ultralytics를 설치하지 않고 디렉터리를 컨테이너에 복사하세요. Ultralytics를 컨테이너에 설치하면 고정된 컨테이너 패키지가 변경될 수 있습니다. 보드처럼 Ultralytics가 AMD의 onnxruntime-vitisai 빌드와 함께 설치된 환경에서는 기본 onnxruntime로 대체하지 않고 해당 빌드를 유지합니다.
이 내보내기는 ONNX Runtime용 표준 컴파일을 구성합니다. 이 런타임은 nms=False을 사용하는 YOLO26의 top-k 선택과 같이 NPU와 호환되지 않는 연산자를 Arm CPU에서 실행합니다. AMD의 VART-ML 런타임은 모든 연산자가 NPU에서 실행될 때만 모델을 실행합니다. 이를 위해 vitisai_config.json에 AMD의 CPU 파티션 패스를 추가할 수 있지만, 이렇게 생성된 아티팩트는 ONNX Runtime에서 실행할 수 없습니다.
YOLO 모델 호환성 및 지원되는 연산자#
가속기는 하드웨어에서 구현하는 연산자만 빠르게 처리합니다. 모델에 지원되지 않는 연산자가 포함되면 컴파일러는 일반적으로 해당 네트워크 부분을 Arm CPU로 보내며, 가속기와 CPU 사이를 오갈 때마다 지연 시간이 추가됩니다. 일부 연산자는 분할할 수 없습니다. Versal AI Edge Gen 2 NPU의 경우 AMD가 NonZero 및 NonMaxSuppression 등의 연산자를 열거하며, 이러한 연산자는 전체 모델을 CPU에서 실행하게 만들 수 있습니다. AMD Xilinx 하드웨어에서 YOLO 모델의 성능을 좌우하는 가장 중요한 요소는 연산자 지원입니다.
이 표는 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, Slice | C3k2 및 C2f 블록 | ⚠️ 슬라이스로 변환됩니다. 컴파일러 보고서를 확인하세요 | ✅ |
| Resize (최근접 이웃 업샘플링) | 넥 업샘플링 | ✅ | ✅ |
| MaxPool, Concat, Add | SPPF 블록 및 특성 융합 | ✅ | ✅ |
| TopK, GatherElements | YOLO26 NMS-free 헤드 (nms=False) | ❌ CPU에서 실행됩니다 | ⚠️ Arm 호스트에서 CPU 파티션으로 실행됩니다 |
| NonMaxSuppression | nms=True으로 내보낸 경우에만 해당합니다 | ❌ CPU에서 실행됩니다 | ❌ 모델 전체를 CPU에서 실행하게 만들 수 있습니다 |
출처: AMD UG1414 지원 연산자, PyTorch 연산자 지원, Versal AI Edge Gen 2의 지원 연산자, CPU 파티션 및 미지원 연산자 목록입니다. 지원 여부는 DPU 구성과 그래프 패턴에도 영향을 받으므로 항상 컴파일러의 파티션 보고서를 확인하세요.
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 가중치를 전이한 뒤 데이터셋에서 파인튜닝하세요:
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 하위 그래프로 번갈아 분할됩니다. 다음 세 가지 방법을 사용할 수 있습니다:
-
CPU 블록을 그대로 사용합니다. 그러면 컴파일된
.xmodel에 CPU 하위 그래프가 포함됩니다. 모든 연산자에 CPU 구현이 있는 경우 DPU 및 CPU 하위 그래프를 함께 실행하는 AMD의 Graph Runner를 사용하세요. CPU 구현이 없는 연산자는 직접 구현하고 등록해야 합니다. 20×20에서는 어텐션 연산량이 적지만, DPU와 CPU 사이에 데이터가 추가로 전송될 때마다 지연 시간이 늘어나므로 보드에서 측정하세요. -
어텐션 없는 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 모드로 정확도를 비교하세요.
-
YOLOv8과 같이 어텐션 없는 모델을 사용합니다. AMD는 자체 DPU 예제에서 YOLOv8을 사용했습니다.
Versal AI Edge Gen 2에서는 어텐션 연산자가 NPU 지원 항목으로 나열되어 있으므로 일반적으로 이러한 변경이 필요하지 않습니다. AMD는 구성이나 메모리 제약으로 인해 지원되는 연산자도 CPU로 폴백될 수 있다고 안내하므로, 컴파일러 보고서에서 배치 위치를 확인하세요.
모델 호환성 한눈에 보기#
| 모델 | DPU (Zynq UltraScale+, Kria) | NPU (Versal AI Edge Gen 2) |
|---|---|---|
| YOLO26 | Hard-Swish로 학습합니다. 어텐션 블록 2개가 CPU 하위 그래프가 되며 DFL은 없습니다 | 네이티브 format="xilinx" 내보내기, 헤드는 BF16으로 실행 |
| YOLO11 | Hard-Swish로 학습합니다. C2PSA 및 DFL softmax가 CPU에서 실행됩니다 | 네이티브 format="xilinx" 내보내기, 헤드는 BF16으로 실행 |
| YOLOv8 | Hard-Swish로 학습합니다. DFL softmax가 CPU에서 실행됩니다 | 네이티브 format="xilinx" 내보내기. AMD YOLOv8m 튜토리얼(Vitis AI 6.3, VEK385, BF16 후처리 부분을 적용한 INT8): 컴파일러 보고서에 따르면 모델을 변경하지 않고 NPU에서 연산자 1,181개(99.915%)와 GOP의 99.994%를 실행합니다. |
다른 AMD Xilinx 타깃에 배포하기#
Zynq UltraScale+ 및 Kria DPU와 1세대 Versal AI Edge NPU는 format="xilinx"에서 생성할 수 없는 Vitis AI 워크플로를 사용합니다. Ultralytics로 학습한 다음 x86-64 Linux Docker 이미지에서 AMD 도구를 사용해 타깃별 아티팩트를 빌드하세요. 사용 중인 디바이스에 해당하는 탭을 선택하세요:
-
Versal AI Edge용 AMD Vitis AI 6.3 Docker 이미지를 시작합니다.
-
보드의 NPU IP에 맞는 NPU 환경을 활성화하려면
settings.sh을 source로 불러옵니다. 보드의 NPU IP 이름을 인수로 전달하거나, 사용 가능한 IP를 확인하려면LIST을 전달합니다. -
VAISW_SNAPSHOT_DIRECTORY환경 변수를 설정한 상태에서 대표 이미지에 일반 추론 스크립트를 실행하여 스냅샷을 캡처합니다. 코드를 변경할 필요가 없습니다.# 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은 INT8(기본값), BF16 또는 MIXED을 허용합니다. VAISW_QUANTIZATION_NBIMAGES의 기본값은 이미지 4개이므로 탐지 모델에는 더 크고 대표성 있는 수를 설정합니다. 스냅샷은 보드의 NPU IP 변형에 따라 달라집니다. YOLO 후처리 테일은 BF16 또는 MIXED 정밀도에서만 AI Engines에서 실행됩니다. Softmax에 관한 AMD 문서는 서로 다릅니다. 샘플 페이지에서는 Softmax가 가속되지 않으며 YOLOv8의 Softmax 테일을 CPU에 매핑한다고 설명하지만, Vitis AI 6.1 릴리스 노트에서는 혼합 정밀도로 YOLOv8을 완전히 가속한다고 보고합니다. 스냅샷 내부의 wrp_network_iriz.onnx 파일을 검사하여 YOLO11 및 YOLO26 attention을 포함한 모델의 어느 부분이 NPU에서 실행되는지 확인합니다. 사용자 모델 가져오기를 참조하세요.
컴파일한 가속기 구성이 포함된 하드웨어 설계와 Linux 이미지, 그리고 이에 맞는 Vitis AI 런타임을 사용해 보드를 준비합니다. AMD의 Zynq UltraScale+ 및 Kria DPU 타깃 설정 가이드와 Versal AI Edge(VEK280) 설정 가이드를 참조한 다음, 런타임에 필요한 아티팩트를 복사하세요:
| 워크플로 | 보드에 복사할 아티팩트 | 보드 런타임 |
|---|---|---|
| DPU (Zynq UltraScale+, Kria) | 컴파일된 .xmodel | VART; CPU 서브그래프용 Graph Runner |
| NPU (Versal AI Edge, VEK280) | 스냅샷 디렉터리 | VART-ML |
DPU에서 VART 버퍼는 고정소수점 INT8 값을 저장합니다. 각 텐서의 shape와 fix_point 스케일을 확인하고, 후처리 전에 입력을 양자화하고 출력을 역양자화하세요. Graph Runner는 전체 그래프의 출력을 반환하지만, DPU 전용 runner는 DPU 서브그래프의 중간 출력을 반환하므로 코드에서 나머지 계산을 완료해야 합니다. VEK280의 VART-ML은 기본적으로 ONNX 레이아웃과 shape, 데이터 타입, 메모리 레이아웃이 다를 수 있는 하드웨어 텐서 뷰를 사용합니다. 따라서 runner의 입력 및 출력 텐서 유형을 CPU 뷰로 설정하거나 하드웨어 형식을 직접 변환하세요(AMD의 VART-ML 아키텍처 개요 참조).
상용 AMD Xilinx 제품에 Ultralytics YOLO를 탑재하려면 AGPL-3.0 라이선스를 준수하거나 Ultralytics Enterprise 라이선스를 취득해야 합니다.
실제 애플리케이션#
AMD Xilinx 디바이스는 비전 AI를 센서 가까이에서 저전력으로 실시간 실행해야 하는 다양한 분야에서 널리 사용됩니다.
- 산업 및 건설 현장 안전: 중장비 주변의 사람과 기계를 탐지하고, 객체 탐지 및 객체 카운팅을 통해 작업 구역을 모니터링합니다.
- 자동차 및 오프하이웨이 비전: 인증된 자동차 등급 부품에서 카메라 기반 인식을 실행하여 자율주행 차량과 운전자 보조 기능을 지원합니다.
- 스마트 카메라 및 비디오 분석: 비디오 캡처, 인코딩, YOLO 추론을 단일 칩에 결합하여 보안 시스템과 비디오 분석에 활용합니다.
- 머신 비전 및 품질 검사: FPGA 기반 고속 이미지 캡처와 YOLO 인스턴스 분할 또는 분류를 결합하여 생산 라인에서 결함을 탐지합니다.
- 로보틱스 및 드론: Kria KR260 또는 Versal 모듈을 사용하여 포즈 추정, 방향성 객체 탐지, 내비게이션을 결정론적 지연 시간으로 수행합니다.
요약#
format="xilinx"을 사용해 내보내면 AMD Quark가 Ultralytics YOLO 모델을 Versal AI Edge Series Gen 2 NPU용으로 양자화하고, 헤드는 BF16으로 유지하며, Vitis AI 컴파일러 구성을 모델과 함께 저장합니다. 모든 호스트에서 INT8 정확도를 검증하고 AMD Vitis AI Docker 이미지에서 .rai 모델을 컴파일한 다음, ONNX Runtime과 Vitis AI Execution Provider를 사용해 보드에서 실행하세요.
구형 AMD Xilinx 디바이스는 다른 워크플로를 사용합니다. Zynq UltraScale+ 및 Kria의 DPU는 동결된 Vitis AI 3.5 툴체인과 .xmodel 파일을 사용하며, Hard-Swish와 같은 DPU 네이티브 활성화 함수가 필요하고 어텐션은 CPU에서 실행합니다. 1세대 Versal AI Edge NPU는 스냅샷 워크플로를 사용하며, 연산자 지원 범위는 Vitis AI 버전과 정밀도에 따라 달라집니다.
다른 배포 타깃은 모델 배포 옵션 가이드, 배포 모범 사례, 그리고 Hailo, Rockchip RKNN, Axelera와 같은 가속기 통합을 참조하세요.
자주 묻는 질문#
예. AMD는 2022년 2월 Xilinx 인수를 완료했으며, Xilinx 제품은 현재 AMD 적응형 SoC 및 FPGA인 AMD Zynq, AMD Kria, AMD Versal, AMD Vitis로 판매됩니다. 엔지니어들은 여전히 Xilinx라는 이름을 널리 사용하며, 부품 번호에도
XC접두사가 유지됩니다.예.
model.export(format="xilinx")은 AMD Quark로 Versal AI Edge Series Gen 2 NPU용 모델을 양자화하고, 양자화된 ONNX 모델과 Vitis AI 컴파일러 구성이 포함된 디렉터리를 저장합니다. Versal AI Edge Gen 2에서 컴파일 및 실행에 설명된 대로 AMD Vitis AI 도구를 사용해.rai로 컴파일하세요. Zynq UltraScale+, Kria, VEK280 타깃에는 다른 AMD Xilinx 타깃에 배포하기에 설명된 워크플로를 사용합니다.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를 사용하여 보드에서 실행합니다.아니요. 내보내기는 Python 3.11~3.13을 사용하는 모든 Linux 호스트에서 실행되며 AMD 계정이 필요하지 않습니다. 내보낸 모델은 모든 호스트의 CPU에서 실행해 정확도를 확인할 수 있습니다.
.rai모델을 컴파일하려면 AMD Vitis AI Docker 이미지와 AI Engine 컴파일러 라이선스가 필요하며, NPU에서 실행하려면 Versal AI Edge Series Gen 2 보드가 필요합니다.Ultralytics는 ONNX Runtime에서 Vitis AI Execution Provider를 제공할 때만 이를 사용합니다. 예를 들어 Versal 보드 또는 AMD Docker 이미지에서 AMD의
onnxruntime-vitisai빌드를 사용할 때입니다. 그 외 환경에서는 기본 ONNX Runtime을 사용해 CPU에서 양자화된 모델을 실행하며, 이를 통해 배포 전에 INT8 정확도를 측정합니다.