Ultralytics YOLO27: Tham gia danh sách chờ.
Get Started

Export AMD Xilinx cho Ultralytics YOLO bằng Vitis AI#

Export model Ultralytics YOLO26 bằng format="xilinx" sẽ lượng tử hóa model bằng AMD Quark cho NPU trong các SoC thích ứng AMD Versal AI Edge Series Gen 2, sẵn sàng để compiler Vitis AI của AMD tạo model .rai. Quy trình export tương tự cũng xác thực độ chính xác INT8 trên mọi máy chủ trước khi triển khai.

Các thiết bị AMD được hỗ trợ

Quy trình export nhắm đến luồng NPU Vitis AI đang được duy trì tích cực cho các thiết bị Versal AI Edge Series Gen 2, chẳng hạn như bộ kit đánh giá VEK385. DPU Zynq UltraScale+ và Kria, cùng NPU Versal AI Edge thế hệ đầu tiên (VEK280), sử dụng các luồng Vitis AI khác, được mô tả trong Triển khai trên các mục tiêu AMD Xilinx khác.

Các thiết bị AMD Xilinx cung cấp năng lực xử lý cho nhiều camera công nghiệp, hệ thống thị giác ô tô, robot, drone và sản phẩm chẩn đoán hình ảnh y tế trên khắp thế giới. Chúng kết hợp các bộ xử lý Arm với logic có thể lập trình và, trên các thiết bị mới hơn, các AI Engines chuyên dụng, nhờ đó một chip duy nhất có thể thu video, tiền xử lý video, chạy phát hiện đối tượng và thực thi hành động dựa trên kết quả với độ trễ suy luận thấp, dễ dự đoán.

Hướng dẫn này trình bày quy trình export AMD Xilinx, cách biên dịch và chạy trên bo mạch Versal, các dòng thiết bị AMD Xilinx, cách AI hoạt động trên những thiết bị này và các operator Ultralytics YOLO được từng bộ tăng tốc hỗ trợ.

AMD Xilinx là gì?#

Xilinx phát minh ra mảng cổng lập trình được (FPGA) vào thập niên 1980 và trở thành nhà cung cấp hàng đầu về SoC thích ứng và FPGA. AMD hoàn tất thương vụ mua lại Xilinx vào tháng 2 năm 2022, và hiện các dòng sản phẩm được bán dưới thương hiệu AMD với tên AMD Zynq, AMD Kria, AMD Versal và AMD Vitis.

Xilinx hay AMD?

Cả hai tên đều chỉ cùng một nhóm sản phẩm. AMD tiếp thị chúng là “SoC thích ứng và FPGA”, nhưng các kỹ sư vẫn thường gọi là “Xilinx”. Mã sản phẩm giữ tiền tố XC (ví dụ xczu7ev), còn repository Vitis AI cũ và các Docker image vẫn mang tên Xilinx trên GitHub và Docker Hub. Hướng dẫn này dùng tên “AMD Xilinx” để bạn có thể tìm thấy nội dung bằng cả hai tên.

Thuật ngữ và khái niệm chính#

Triển khai AMD Xilinx sử dụng bộ thuật ngữ riêng. Bảng bên dưới giải thích mọi thuật ngữ được dùng trong hướng dẫn này.

Thuật ngữÝ nghĩa
FPGAMảng cổng lập trình được: một chip có logic số được cấu hình sau khi sản xuất bằng cách nạp một thiết kế gọi là bitstream. Chip có thể triển khai phần cứng tùy chỉnh, chẳng hạn như pipeline video hoặc bộ tăng tốc mạng nơ-ron.
Logic lập trình được (PL)Cấu trúc FPGA bên trong một SoC AMD Xilinx. Trên các thiết bị Zynq và Kria, bộ tăng tốc AI được xây dựng trong PL.
Hệ thống xử lý (PS)Các lõi CPU Arm, bộ điều khiển bộ nhớ và thiết bị ngoại vi tích hợp cứng của SoC. Thành phần này chạy Linux, ứng dụng của bạn và mọi lớp model mà bộ tăng tốc không thể thực thi.
SoC thích ứng / MPSoCMột hệ thống trên chip kết hợp hệ thống xử lý với logic lập trình được, cùng AI Engine trên nhiều thiết bị Versal. MPSoC là viết tắt của hệ thống trên chip đa bộ xử lý.
AI Engine (AIE, AIE-ML, AIE-MLv2)Các mảng bộ xử lý vector tích hợp cứng trên nhiều thiết bị Versal, bao gồm dòng Versal AI Edge được đề cập ở đây, được thiết kế cho machine learning và xử lý tín hiệu.
DPUĐơn vị xử lý học sâu: bộ tăng tốc mạng nơ-ron INT8 hiện hành của AMD, được cung cấp dưới dạng IP tích hợp vào PL (ví dụ DPUCZDX8G trên Zynq UltraScale+ và Kria). Các kích thước như B512 đến B4096 biểu thị số phép toán tối đa trên mỗi chu kỳ xung nhịp.
NPU / NPU IPĐơn vị xử lý nơ-ron: bộ tăng tốc suy luận thế hệ hiện tại của AMD, thay thế DPU trong các bản phát hành Vitis AI gần đây. AMD mô tả NPU IP là bộ tăng tốc mềm kết hợp AI Engine với logic lập trình được, vì vậy cũng cần một thiết kế phần cứng tương ứng. Xem mục thuật ngữ NPU.
Vitis AIToolchain của AMD để triển khai mạng nơ-ron trên các thiết bị AMD Xilinx. Toolchain này bao gồm lượng tử hóa, biên dịch, runtime, ví dụ và môi trường Docker.
AMD QuarkThư viện lượng tử hóa model hiện hành của AMD, được quy trình Versal AI Edge Gen 2 sử dụng để chuyển model ONNX FP32 thành model INT8.
Lượng tử hóa, PTQ và QATChuyển trọng số và activation FP32 sang INT8. Lượng tử hóa sau huấn luyện (PTQ) sử dụng ảnh hiệu chuẩn. Huấn luyện nhận biết lượng tử hóa (QAT) tinh chỉnh model để khôi phục độ chính xác.
Ảnh hiệu chuẩnMột tập ảnh nhỏ mang tính đại diện được đưa qua model trong quá trình PTQ để chọn scale INT8 cho từng tensor.
BF16 và độ chính xác hỗn hợpBFloat16 là định dạng dấu phẩy động 16 bit giữ nguyên phạm vi giá trị của FP32. Độ chính xác hỗn hợp chạy phần lớn mạng ở INT8 và các lớp nhạy cảm ở BF16.
XIRBiểu diễn trung gian Xilinx: định dạng đồ thị do trình biên dịch DPU tạo ra và runtime đọc.
.xmodelĐồ thị XIR được tuần tự hóa. Bộ lượng tử hóa ghi một .xmodel đã lượng tử hóa, còn trình biên dịch DPU chuyển đổi thành .xmodel đã biên dịch, gồm các lệnh DPU, trọng số đã lượng tử hóa và mọi đồ thị con CPU. Model đã biên dịch yêu cầu cấu hình DPU tương ứng.
arch.json / dấu vân tay DPUTệp mô tả một cấu hình DPU cụ thể. Trình biên dịch DPU cần tệp này, và một .xmodel được biên dịch cho một dấu vân tay sẽ không chạy trên dấu vân tay khác.
SnapshotThư mục model đã biên dịch do quy trình NPU Versal AI Edge (VEK280) tạo ra. Model này gắn với một biến thể NPU IP cụ thể.
.raiTệp model đã biên dịch do quy trình NPU Versal AI Edge Gen 2 tạo ra.
VART / VART-MLCác thư viện Vitis AI Runtime tải model đã biên dịch và chạy model trên bo mạch, với API C++ và Python.
ONNX Runtime Vitis AI EPVitisAIExecutionProvider dành cho ONNX Runtime, dùng để biên dịch và chạy model ONNX trên NPU AMD.
Chuyển về CPU / phân vùng đồ thịKhi bộ tăng tốc không thể chạy một toán tử, trình biên dịch thường chia model thành các đồ thị con chạy trên bộ tăng tốc và CPU; mỗi lần chia đều bổ sung một lượt truyền dữ liệu có thể chi phối độ trễ. Một số toán tử khác buộc toàn bộ model chạy trên CPU hoặc khiến quá trình biên dịch thất bại.

Các dòng thiết bị AMD Xilinx dành cho Edge AI#

Các thiết bị AMD Xilinx dành cho edge AI thuộc ba dòng. Zynq và Kria sử dụng DPU trong logic lập trình được, trong khi các thiết bị Versal AI Edge được đề cập ở đây sử dụng NPU trên AI Engine.

Dòng sản phẩmMô tảCPU ứng dụngBộ tăng tốc AIVí dụ bo mạch
Zynq UltraScale+ MPSoCCPU Arm và logic FPGA trên cùng một chip, với các cấu hình từ ZU1 đến ZU19Arm Cortex-A53 lõi kép hoặc lõi tứDPU tích hợp trong logic lập trình đượcZCU104, ZCU102, bo mạch tùy chỉnh
System-on-Module Kria K26Module sẵn sàng cho sản xuất, được xây dựng dựa trên Zynq UltraScale+ MPSoCArm Cortex-A53 lõi tứDPU tích hợp trong logic lập trình đượcKV260 Vision AI Starter Kit, KR260 Robotics Starter Kit
Dòng Versal AI EdgeSoC thích ứng; các linh kiện AIE-ML như VE2302 và VE2802 chạy NPUArm Cortex-A72 lõi képNPU trên AI Engine AIE-ML và PLVEK280
Dòng Versal AI Edge Gen 2SoC thích ứng thế hệ tiếp theo với AI Engine AIE-MLv2Tối đa tám Arm Cortex-A78AENPU trên AI Engine AIE-MLv2 và PLVEK385

Zynq UltraScale+ MPSoC#

Mỗi chip Zynq UltraScale+ kết hợp hệ thống xử lý Arm với lõi Cortex-A53 lõi kép (CG) hoặc lõi tứ (EG và EV), lõi Cortex-R5F thời gian thực và logic FPGA. Các thiết bị EV bổ sung codec video H.264/H.265 tích hợp cứng. Để chạy mạng nơ-ron, nhà thiết kế tích hợp DPU vào logic bên cạnh pipeline camera và video. Trên các thiết bị nhỏ, DPU phải cạnh tranh không gian với các thành phần khác của thiết kế.

System-on-Module Kria#

Module Kria K26 tích hợp Zynq UltraScale+ MPSoC, bộ nhớ và nguồn trên một module sẵn sàng cho sản xuất, giúp bạn không cần tự thiết kế bộ xử lý, bộ nhớ và hệ thống nguồn. Module kết nối với bo mạch carrier, có thể là bo mạch starter kit hoặc thiết kế riêng của bạn. Module cung cấp năng lực cho KV260 Vision AI Starter Kit dành cho camera thông minh và KR260 Robotics Starter Kit dành cho robotics. Vì K26 được xây dựng trên Zynq UltraScale+, module sử dụng cùng quy trình DPU. Danh mục Kria còn có các module khác, vì vậy hãy kiểm tra bộ xử lý mà module của bạn sử dụng trước khi chọn quy trình.

SoC thích ứng Versal#

Versal là dòng SoC thích ứng của AMD. Các dòng AI Edge và AI Core bổ sung AI Engine tích hợp cứng bên cạnh lõi Arm và logic lập trình được, trong khi một số dòng Versal khác không có AI Engine. NPU IP của AMD chạy đồng thời trên AI Engine và logic lập trình được, còn Vitis AI nhắm đến các linh kiện AIE-ML thuộc dòng AI Edge, chẳng hạn VE2302 và VE2802. Dòng Versal AI Edge (bộ kit đánh giá VEK280) và Dòng Versal AI Edge Gen 2 (bộ kit đánh giá VEK385) là các mục tiêu hiện hành của AMD cho edge AI và là trọng tâm của các bản phát hành Vitis AI hiện tại.

Cách AI chạy trên thiết bị AMD Xilinx: DPU so với NPU#

Hầu hết các triển khai AI trên AMD Xilinx đều tuân theo cùng một mô hình. Bộ tăng tốc chạy các lớp được hỗ trợ, CPU Arm chạy tiền xử lý, hậu xử lý và mọi lớp mà bộ tăng tốc không thể thực thi; runtime trên bo mạch điều phối hai thành phần này.

AMD đã phát hành hai thế hệ bộ tăng tốc, mỗi thế hệ có toolchain và tệp model đã biên dịch riêng. Hướng dẫn này sử dụng Vitis AI 3.5 cho DPU và Vitis AI 6.3 cho NPU; hãy xem tài liệu hiện hành của AMD để biết các bản phát hành mới hơn.

Quy trìnhPhần cứngToolchainBộ lượng tử hóaArtifact đã biên dịchRuntime trên bo mạchTrạng thái
DPUZynq UltraScale+, KriaVitis AI 3.5 (Docker)vai_q_pytorch.xmodelVARTTrình biên dịch, model zoo và IP DPU đã đóng băng
NPU (Versal AI Edge)VEK280 và các linh kiện Versal AI Edge khácVitis AI 6.3 (Docker)Tích hợp trong quy trình snapshotSnapshotVART-MLĐang hoạt động
NPU (Versal AI Edge Gen 2)VEK385 và các linh kiện Gen 2 khácVitis AI 6.3 (Docker)AMD Quark.raiONNX Runtime Vitis AI EP hoặc VART-MLĐang hoạt động
Quy trình DPU đã đóng băng

Vitis AI 3.5 là phiên bản cuối cùng có trình biên dịch DPU và các bản cập nhật model zoo. Các phiên bản sau này trong repository Xilinx/Vitis-AI giữ nguyên trình biên dịch, model zoo và IP DPU của Zynq UltraScale+, đồng thời cập nhật runtime và khả năng tương thích với các phiên bản công cụ AMD mới hơn (xem ghi chú phát hành Vitis AI 5.0); tài liệu Vitis AI hiện tại của AMD mô tả NPU là phần thay thế cho kiến trúc DPU đã lỗi thời. Các sản phẩm Zynq UltraScale+ và Kria hiện có vẫn có thể tiếp tục xuất xưởng với DPU, nhưng khả năng hỗ trợ operator sẽ không được mở rộng, vì vậy các kiến trúc model mới cần những điều chỉnh được mô tả trong Khả năng tương thích của model YOLO.

Laptop Ryzen AI sử dụng stack khác

Các bộ xử lý AMD Ryzen AI trên PC cũng tích hợp NPU, nhưng chúng sử dụng stack Ryzen AI Software riêng thay vì các quy trình Vitis AI nhúng trong hướng dẫn này. Với GPU AMD Instinct và Radeon, hãy xem tích hợp GPU AMD.

Tôi cần quy trình Vitis AI nào?#

Chọn quy trình dựa trên thiết bị trên bo mạch của bạn:

Export sang AMD Xilinx: Chuyển đổi model YOLO#

Các tác vụ được hỗ trợ#

AMD Xilinx hỗ trợ export cả bảy tác vụ Ultralytics. Semantic segmentation và depth estimation chỉ khả dụng với YOLO26, dòng duy nhất có các head này.

Tác vụYOLOv8YOLO11YOLO26
Phát hiện✅✅✅
Phân đoạn✅✅✅
Ngữ nghĩa❌❌✅
Độ sâu❌❌✅
Phân loại✅✅✅
Tư thế✅✅✅
OBB✅✅✅

Cài đặt#

AMD Xilinx hỗ trợ export trên Linux (x86-64 hoặc ARM64) với Python 3.11 đến 3.13, các phiên bản được AMD Quark hỗ trợ. Lần export đầu tiên cũng biên dịch các operator tùy chỉnh của Quark, cần một compiler C++ như g++.

Cài đặt
# Install the required package for YOLO
pip install ultralytics

AMD Quark được tự động cài đặt từ PyPI trong lần export đầu tiên. Để cài đặt trước các dependency của quá trình export:

pip install "ultralytics[export-xilinx]"

Để cài đặt repository ở chế độ có thể chỉnh sửa, hãy thay "ultralytics[export-xilinx]" bằng -e ".[export-base,export-xilinx]". Để tái tạo môi trường Python 3.12 và chạy smoke test export như CI, hãy chạy công cụ tạo môi trường hiện có từ thư mục gốc của repository:

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

Cách sử dụng#

Format AMD Xilinx hỗ trợ các mode Export, Predict và Validate. Khi không có Vitis AI Execution Provider của AMD, predict và validate chạy model đã lượng tử hóa bằng ONNX Runtime trên CPU để đo độ chính xác INT8 trên mọi máy chủ. Khi ONNX Runtime cung cấp VitisAIExecutionProvider, chẳng hạn trên bo mạch Versal AI Edge Series Gen 2, Ultralytics sẽ tự động chọn provider này.

Export
from ultralytics import YOLO

# Nạp model YOLO26
model = YOLO("yolo26n.pt")

# Export sang format AMD Xilinx cho VEK385 (quantize=8 được tự động áp dụng)
model.export(format="xilinx")  # creates 'yolo26n_xilinx_model/'
Dự đoán
from ultralytics import YOLO

# Tải model AMD Xilinx đã export
model = YOLO("yolo26n_xilinx_model")

# Chạy suy luận
results = model("https://ultralytics.com/images/bus.jpg")
Xác thực
from ultralytics import YOLO

# Tải model AMD Xilinx đã export
model = YOLO("yolo26n_xilinx_model")

# Xác thực độ chính xác INT8 trên dataset COCO8
metrics = model.val(data="coco8.yaml")

Tên format vitis, vitisai và versal là các alias của xilinx.

Các tham số xuất model#

Đối sốKiểuMặc địnhMô tả
formatstr'xilinx'Format mục tiêu cho model đã export, xác định khả năng tương thích với NPU AMD Versal AI Edge Series Gen 2.
imgszint hoặc tuple640Kích thước ảnh đầu vào mong muốn của model, được chỉ định dưới dạng số nguyên cho ảnh vuông hoặc tuple (height, width). Model đã export có batch size cố định là 1.
quantizeint hoặc str8/autoĐộ chính xác lượng tử hóa. 8 (Vitis AI INT8) là bắt buộc và sẽ tự động được bật nếu không được chỉ định.
datastrNoneFile YAML dataset dùng để hiệu chuẩn INT8; với classification, thay vào đó cần chỉ định thư mục dataset hoặc tên dataset dựng sẵn. Nếu bỏ qua, Ultralytics sẽ sử dụng dataset hiệu chuẩn của tác vụ, chẳng hạn coco128.yaml cho detection.
fractionfloat1.0Tỷ lệ dataset hiệu chuẩn sẽ được sử dụng.
namestr've2-xc2ve3858'Thiết bị compiler Vitis AI: 've2-xc2ve3858' (bộ kit đánh giá VEK385), 've2-xc2ve3804', 've2-xc2ve3558', 've2-xc2ve3504', 've2-xc2ve3358' hoặc 've2-xc2ve3304'.
opsetintNoneONNX opset cho graph trung gian. Mặc định là 17, opset mà AMD xác thực cho YOLO trên Vitis AI.
simplifyboolTrueĐơn giản hóa đồ thị ONNX trung gian bằng onnxslim.
devicestrNoneChỉ định thiết bị dùng để export: GPU (device=0) hoặc CPU (device=cpu).

Đặt nms=False để export head NMS-free của YOLO26. NMS tích hợp (nms=True) không được hỗ trợ vì AMD liệt kê NonMaxSuppression trong số các operator có thể buộc toàn bộ model chạy trên CPU.

Hiệu chuẩn bằng dữ liệu của bạn

Độ chính xác INT8 phụ thuộc vào mức độ ảnh hiệu chuẩn đại diện cho bối cảnh triển khai. Truyền cho data= một file YAML dataset có ít nhất 300 ảnh đại diện từ camera của bạn; các dataset hiệu chuẩn mặc định là những mẫu công khai có quy mô nhỏ.

Để biết thêm chi tiết về quy trình xuất, hãy truy cập trang tài liệu Ultralytics về xuất model.

Cấu trúc đầu ra#

Sau khi export thành công, một thư mục model sẽ được tạo với cấu trúc sau:

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

Việc biên dịch model như mô tả bên dưới sẽ tạo thêm cache compiler yolo26n/ trong cùng thư mục, chứa model NPU yolo26n.rai và các báo cáo biên dịch của AMD như final-vaiml-pass-summary.txt.

Quy trình export hoạt động như thế nào#

Quy trình export tuân theo luồng Vitis AI do AMD tài liệu hóa cho Versal AI Edge Series Gen 2:

  1. Export ONNX với opset 17 và batch size tĩnh bằng 1.
  2. Lượng tử hóa AMD Quark bằng cấu hình VINT8 (INT8 đối xứng với scale lũy thừa của hai) và các tùy chọn AMD yêu cầu để biên dịch cho NPU: Int32Bias=False, enable_npu_cnn=True, DedicatedQDQPair=True và QuantizeAllOpTypes=True. Quá trình hiệu chuẩn sử dụng data loader hiệu chuẩn INT8 tiêu chuẩn của Ultralytics, với cùng cách tiền xử lý letterbox, RGB và 0–1 như khi inference.
  3. Độ chính xác hỗn hợp: head của model vẫn ở dạng dấu phẩy động, còn compiler Vitis AI chạy head này trên NPU bằng BF16. Lượng tử hóa head sang INT8 gây mất phần lớn độ chính xác; tutorial YOLOv8m của AMD cũng giữ phần hậu xử lý ngoài INT8 vì lý do tương tự.
  4. Cấu hình compiler: vitisai_config.json chọn mục tiêu VAIML và thiết bị từ name.

Độ chính xác#

Bảng so sánh model INT8 đã export với model ONNX FP32 trên tập val2017 của COCO (5.000 ảnh) ở kích thước 640; cả hai đều chạy bằng ONNX Runtime trên CPU máy chủ. Các model INT8 được hiệu chuẩn trên dataset mặc định coco128.yaml; hiệu chuẩn bằng ảnh triển khai của bạn thường giúp thu hẹp khoảng cách.

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

Các kết quả trên máy chủ này chạy model đã lượng tử hóa bằng ONNX Runtime trên CPU; đây là mức cơ sở mà phương pháp đánh giá độ chính xác của AMD dùng để so sánh kết quả NPU. Kết quả YOLOv8m do AMD công bố trên VEK385 sử dụng cách tiếp cận độ chính xác hỗn hợp tương tự trên NPU:

Cấu hình YOLOv8mPhần cứngmAP50-95 (COCO)
ONNX FP32CPU host49.95
BF16NPU VEK38550.29
VINT8, phần cuối FP32CPU host48.75
VINT8, phần cuối BF16NPU VEK38548.38

Nguồn: Hướng dẫn YOLOv8m cho Versal AI Edge Gen 2 của AMD, cũng báo cáo thời gian inference trung bình 10.69 ms qua 100 lượt chạy VART ở dp_size=1.

Biên dịch và chạy trên Versal AI Edge Gen 2#

Thư mục đã export sẵn sàng cho compiler Vitis AI của AMD, công cụ này tạo model .rai để chạy trên NPU.

  1. Chuẩn bị máy chủ và bo mạch. Biên dịch trên máy chủ Linux x86-64 bằng Docker image Vitis AI 6.3 cho Versal AI Edge Gen 2 của AMD và license compiler AMD AI Engine (xem trang cấp phép của AMD). Thiết lập VEK385 theo hướng dẫn thiết lập bo mạch của AMD.

  2. Biên dịch. Bên trong container, tạo một session ONNX Runtime với Vitis AI Execution Provider theo cách gọi trong hướng dẫn biên dịch của AMD. Thao tác này ghi cache yolo26n/ cùng yolo26n.rai vào thư mục export:

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

    Kiểm tra yolo26n_xilinx_model/yolo26n/final-vaiml-pass-summary.txt để biết phần nào của model chạy trên NPU. Với YOLO26n ở kích thước 640, compiler Vitis AI 6.3 của AMD đưa 99,9% operator và phép tính lên NPU VEK385 trong một partition duy nhất.

  3. Chạy trên bo mạch. Sao chép thư mục export sang VEK385. ONNX Runtime với Vitis AI Execution Provider tải yolo26n.rai đã biên dịch và chạy model trên NPU; YOLO("yolo26n_xilinx_model") sẽ tự động chọn provider này khi có sẵn.

Quá trình biên dịch chỉ cần ONNX Runtime của AMD, vì vậy hãy export trên bất kỳ máy Linux nào rồi sao chép thư mục vào container thay vì cài Ultralytics trong container, việc này có thể làm thay đổi các package đã được cố định phiên bản. Khi Ultralytics được cài cùng bản dựng onnxruntime-vitisai của AMD, như trên bo mạch, Ultralytics sẽ giữ nguyên bản dựng đó thay vì thay thế bằng onnxruntime tiêu chuẩn.

ONNX Runtime và VART-ML

Quy trình export cấu hình biên dịch tiêu chuẩn cho ONNX Runtime, runtime này chạy mọi operator không tương thích với NPU, chẳng hạn thao tác chọn top-k của YOLO26 bằng nms=False, trực tiếp trên CPU Arm. Runtime VART-ML của AMD chỉ chạy model khi mọi operator đều nằm trên NPU, trừ khi bạn thêm các pass phân vùng CPU của AMD vào vitisai_config.json; các artifact đó không thể chạy qua ONNX Runtime.

Khả năng tương thích của model YOLO và các operator được hỗ trợ#

Bộ tăng tốc chỉ tăng tốc các operator được triển khai bằng phần cứng. Khi model chứa operator không được hỗ trợ, trình biên dịch thường chuyển phần đó của mạng sang CPU Arm; mỗi lần truyền dữ liệu qua lại giữa bộ tăng tốc và CPU đều làm tăng độ trễ. Một số operator không thể được phân vùng: trên NPU Versal AI Edge Gen 2, AMD liệt kê các operator như NonZero và NonMaxSuppression có thể buộc toàn bộ model chạy trên CPU. Khả năng hỗ trợ operator là yếu tố quan trọng nhất quyết định hiệu năng của model YOLO trên phần cứng AMD Xilinx.

Bảng cho biết từng operator trong model YOLO26 chạy ở đâu. Một bản xuất ONNX YOLO26n nguyên bản chứa 87 phép kích hoạt SiLU, mỗi phép được xuất thành một Sigmoid và một Mul, cùng với 4 operator MatMul và 2 operator Softmax từ hai khối attention: khối C2PSA ở cuối backbone (layer 10) và khối C3k2 có bật attention tạo đầu ra P5 (layer 22).

OperatorVị trí xuất hiện trong YOLODPU (Zynq UltraScale+, Kria)NPU (Versal AI Edge Gen 2)
Convolution + batch normalizationMọi khối Conv✅✅
Phép kích hoạt SiLUMọi khối Conv (phép kích hoạt mặc định)❌ Chạy trên CPU; thay bằng Hard-Swish✅
Hard-Swish, ReLU, ReLU6, LeakyReLUCác phép kích hoạt tùy chọn được đặt trong YAML của model✅ Được hợp nhất vào convolution✅
SigmoidĐiểm số lớp trong detection head❌ Chạy trên CPU (thường là một phần của hậu xử lý)✅
MatMul giữa hai phép kích hoạtCác khối attention (C2PSA; YOLO26 C3k2)❌ Chạy trên CPU✅
SoftmaxCác khối attention; DFL trong YOLOv8 và YOLO11❌ Chạy trên CPU✅
Reshape, TransposeCác khối attention⚠️ Được hợp nhất khi có thể, nếu không sẽ chạy trên CPU✅
Split, SliceCác khối C3k2 và C2f⚠️ Được chuyển đổi thành các lát; kiểm tra báo cáo của trình biên dịch✅
Resize (upsample gần nhất)Upsample ở neck✅✅
MaxPool, Concat, AddKhối SPPF và hợp nhất feature✅✅
TopK, GatherElementsHead không dùng NMS của YOLO26 (nms=False)❌ Chạy trên CPU⚠️ Phân vùng chạy trên CPU trên host Arm
NonMaxSuppressionChỉ khi xuất với nms=True❌ Chạy trên CPU❌ Có thể buộc model chạy trên CPU

Nguồn: các operator được hỗ trợ theo UG1414 của AMD, hỗ trợ operator PyTorch, cùng các danh sách operator được hỗ trợ, phân vùng CPU và không được hỗ trợ của Versal AI Edge Gen 2. Khả năng hỗ trợ cũng phụ thuộc vào cấu hình DPU và các mẫu graph, vì vậy hãy luôn kiểm tra báo cáo phân vùng của trình biên dịch.

Head YOLO26: không có DFL và đầu ra tùy chọn không dùng NMS

YOLO26 loại bỏ Distribution Focal Loss (DFL), vì vậy, khác với YOLO11 và YOLOv8, đầu ra bbox không cần giải mã softmax. Model cũng bổ sung khối attention thứ hai so với YOLO11, vì vậy hãy so sánh báo cáo trình biên dịch dành riêng cho mục tiêu và benchmark trên thiết bị trước khi chọn model. Các bản xuất khi không đặt nms vẫn giữ head one-to-many và cần NMS trên CPU như các model YOLO khác. Hãy xuất với nms=False để thay vào đó sử dụng head one-to-one không dùng NMS của YOLO26, head này thay NMS bằng thao tác chọn top-k nhẹ chạy trên CPU.

Chuẩn bị YOLO26 sẵn sàng cho DPU bằng Hard-Swish#

DPU chỉ hợp nhất ReLU, ReLU6, LeakyReLU, Hard-Swish và Hard-Sigmoid vào các convolution. Hard-Swish là phép xấp xỉ SiLU thân thiện với phần cứng, nên đây là lựa chọn thay thế tự nhiên. Các tệp YAML của model Ultralytics chấp nhận khóa activation để thay đổi phép kích hoạt mặc định của các khối Conv (Hướng dẫn cấu hình YAML của model).

Sao chép yolo26.yaml sang yolo26-hswish.yaml rồi thêm một dòng bên dưới phần tham số:

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

Sau đó, tạo model, chuyển trọng số YOLO26 đã tiền huấn luyện và fine-tune trên dataset của bạn:

Fine-tune model YOLO26 dùng Hard-Swish
from ultralytics import YOLO

# Tạo YOLO26n với các phép kích hoạt Hard-Swish; chữ 'n' trong tên chỉ định biến thể nano
model = YOLO("yolo26n-hswish.yaml").load("yolo26n.pt")  # Chuyển trọng số đã tiền huấn luyện

# Fine-tune để mạng thích ứng với Hard-Swish
model.train(data="coco8.yaml", epochs=100, imgsz=640)

Các phép kích hoạt không có trọng số, vì vậy toàn bộ trọng số đã tiền huấn luyện đều được chuyển sang. Sau đó, graph ONNX đã xuất chứa 87 operator HardSwish và không có SiLU. Thay coco8.yaml bằng dataset của bạn, rồi so sánh độ chính xác với model SiLU bằng chế độ Val trước khi triển khai.

Các lựa chọn thay thế cho việc huấn luyện lại
  • Thay thế tại thời điểm lượng tử hóa: đặt "convert_silu_to_hswish": true trong cấu hình JSON của bộ lượng tử hóa PyTorch Vitis AI 3.5 để thay SiLU trong quá trình lượng tử hóa. Cách này giúp bỏ qua một lượt huấn luyện nhưng thường làm giảm độ chính xác nhiều hơn; AMD có thể khôi phục một phần bằng fine-tuning nhanh hoặc QAT. Xem hướng dẫn cấu hình vai_q_pytorch.
  • LeakyReLU: DPU triển khai LeakyReLU với độ dốc âm cố định là 26/256 (khoảng 0.1). Nếu dùng LeakyReLU, hãy huấn luyện với activation: nn.LeakyReLU(0.1015625) để độ dốc khi huấn luyện và triển khai khớp nhau.

Xử lý các khối attention trên DPU#

YOLO26 áp dụng attention ở độ phân giải thấp nhất (lưới 20×20 với đầu vào 640) tại hai vị trí: khối C2PSA ở layer 10 và khối C3k2 có bật attention ở layer 22. YOLO11 có một khối C2PSA. Trên DPU, các operator MatMul và Softmax của chúng chạy trên CPU, chia model thành các đồ thị con DPU và CPU xen kẽ. Bạn có ba lựa chọn:

  1. Chấp nhận các khối CPU. Khi đó, .xmodel đã biên dịch sẽ chứa các đồ thị con CPU, vì vậy hãy chạy bằng Graph Runner của AMD; công cụ này thực thi đồng thời các đồ thị con DPU và CPU khi có phần triển khai CPU cho mọi operator. Nếu không, bạn phải tự triển khai và đăng ký các operator còn thiếu. Ở kích thước 20×20, phép tính attention khá nhỏ, nhưng mỗi lần truyền dữ liệu bổ sung giữa DPU và CPU đều làm tăng độ trễ, vì vậy hãy đo trên bo mạch của bạn.

  2. Dùng YAML không có attention. Trong YAML Hard-Swish, thay layer C2PSA bằng nn.Identity để các chỉ số layer được Concat và Detect sử dụng vẫn hợp lệ, đồng thời tắt attention ở layer 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)

    Khi đó, graph ONNX đã xuất không chứa operator MatMul hoặc Softmax. Các trọng số attention không còn được áp dụng (666 trọng số YOLO26n thì chuyển được 624), vì vậy hãy fine-tune lâu hơn và so sánh độ chính xác bằng chế độ Val.

  3. Dùng model không có attention như YOLOv8, model AMD đã sử dụng trong các ví dụ DPU của mình.

Trên Versal AI Edge Gen 2, các operator attention được liệt kê là được NPU hỗ trợ, vì vậy thường không cần những thay đổi này. Hãy xác nhận vị trí thực thi trong báo cáo của trình biên dịch, vì AMD lưu ý rằng operator được hỗ trợ vẫn có thể chuyển sang CPU do các ràng buộc về cấu hình hoặc bộ nhớ.

Tổng quan nhanh về khả năng tương thích của model#

ModelDPU (Zynq UltraScale+, Kria)NPU (Versal AI Edge Gen 2)
YOLO26Huấn luyện với Hard-Swish; hai khối attention trở thành đồ thị con CPU; không có DFLExport gốc format="xilinx"; head chạy bằng BF16
YOLO11Huấn luyện với Hard-Swish; C2PSA và softmax DFL chạy trên CPUExport gốc format="xilinx"; head chạy bằng BF16
YOLOv8Huấn luyện với Hard-Swish; softmax DFL chạy trên CPUExport gốc format="xilinx". Tutorial YOLOv8m của AMD (Vitis AI 6.3, VEK385, INT8 với phần đuôi BF16): báo cáo compiler cho thấy 1.181 operator (99,915%) và 99,994% GOP chạy trên NPU, không cần thay đổi model

Triển khai trên các mục tiêu AMD Xilinx khác#

DPU Zynq UltraScale+ và Kria, cùng NPU Versal AI Edge thế hệ đầu tiên, sử dụng các luồng Vitis AI mà format="xilinx" không tạo ra. Huấn luyện bằng Ultralytics, sau đó tạo artifact cho mục tiêu bằng công cụ AMD trong Docker image Linux x86-64. Chọn tab tương ứng với thiết bị của bạn:

  1. Khởi chạy Docker image Vitis AI 6.3 của AMD dành cho Versal AI Edge.

  2. Kích hoạt môi trường NPU cho NPU IP trên bo mạch bằng cách source settings.sh. Truyền tên NPU IP của bo mạch làm đối số, hoặc dùng LIST để xem các IP hiện có.

  3. Chụp snapshot bằng cách chạy script inference thông thường trên các hình ảnh đại diện, với biến môi trường VAISW_SNAPSHOT_DIRECTORY được thiết lập. Không cần thay đổi mã:

    # 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 chấp nhận INT8 (mặc định), BF16 hoặc MIXED; VAISW_QUANTIZATION_NBIMAGES mặc định là 4 hình ảnh, vì vậy hãy đặt số lượng lớn hơn và mang tính đại diện cho các model detection. Snapshot gắn với biến thể NPU IP trên bo mạch của bạn. Các phần hậu xử lý của YOLO chỉ chạy trên AI Engines ở độ chính xác BF16 hoặc MIXED. Tài liệu AMD đưa ra thông tin khác nhau về Softmax: trang mẫu cho biết Softmax không được tăng tốc và ánh xạ phần Softmax cuối của YOLOv8 sang CPU, trong khi ghi chú phát hành Vitis AI 6.1 báo cáo YOLOv8 được tăng tốc hoàn toàn với độ chính xác hỗn hợp. Kiểm tra file wrp_network_iriz.onnx bên trong snapshot để xác nhận những phần nào của model, bao gồm attention của YOLO11 và YOLO26, chạy trên NPU. Xem sử dụng model của riêng bạn.

Chuẩn bị bo mạch bằng thiết kế phần cứng và image Linux có cấu hình bộ tăng tốc mà bạn đã biên dịch, cùng runtime Vitis AI phù hợp. Xem hướng dẫn thiết lập của AMD cho các mục tiêu DPU Zynq UltraScale+ và Kria và Versal AI Edge (VEK280), sau đó sao chép các artifact mà runtime cần:

Quy trìnhArtifact cần sao chép sang bo mạchRuntime trên bo mạch
DPU (Zynq UltraScale+, Kria).xmodel đã biên dịchVART; Graph Runner dành cho các subgraph CPU
NPU (Versal AI Edge, VEK280)Thư mục snapshotVART-ML

Trên DPU, buffer VART chứa các giá trị INT8 dấu phẩy cố định: truy vấn shape và scale fix_point của từng tensor, lượng tử hóa input và giải lượng tử hóa output trước khi hậu xử lý. Graph Runner trả về output của toàn graph, trong khi runner chỉ chạy DPU trả về output của các subgraph DPU trung gian mà code của bạn phải tiếp tục tính toán. VART-ML trên VEK280 mặc định sử dụng các view tensor phần cứng có shape, kiểu dữ liệu và bố cục bộ nhớ có thể khác bố cục ONNX; do đó, hãy cấu hình kiểu tensor input và output của runner thành CPU view hoặc tự chuyển đổi format phần cứng (xem tổng quan kiến trúc VART-ML của AMD).

Cấp phép cho sản phẩm thương mại

Phân phối Ultralytics YOLO trong một sản phẩm AMD Xilinx thương mại yêu cầu tuân thủ giấy phép AGPL-3.0 hoặc có Giấy phép Ultralytics Enterprise.

Ứng dụng thực tế#

Thiết bị AMD Xilinx thường được sử dụng trong các ứng dụng cần AI thị giác chạy theo thời gian thực, tiêu thụ ít điện năng và đặt gần cảm biến:

Tóm tắt#

Export bằng format="xilinx" sẽ lượng tử hóa model Ultralytics YOLO bằng AMD Quark cho NPU dòng Versal AI Edge Series Gen 2, giữ head ở BF16 và ghi cấu hình compiler Vitis AI bên cạnh model. Xác thực độ chính xác INT8 trên mọi máy chủ, biên dịch model .rai trong Docker image Vitis AI của AMD, rồi chạy trên bo mạch bằng ONNX Runtime và Vitis AI Execution Provider.

Các thiết bị AMD Xilinx đời cũ sử dụng quy trình khác. DPU trên Zynq UltraScale+ và Kria dùng toolchain Vitis AI 3.5 đã ngừng phát triển cùng các file .xmodel, yêu cầu các activation gốc của DPU như Hard-Swish và chạy attention trên CPU. NPU Versal AI Edge thế hệ đầu tiên sử dụng quy trình snapshot, với phạm vi operator được hỗ trợ tùy thuộc vào phiên bản và độ chính xác của Vitis AI.

Để tìm hiểu các mục tiêu triển khai khác, hãy xem hướng dẫn về các tùy chọn triển khai model, các phương pháp tốt nhất khi triển khai và các tích hợp bộ tăng tốc như Hailo, Rockchip RKNN và Axelera.

Câu hỏi thường gặp#

  • Có. AMD hoàn tất việc mua lại Xilinx vào tháng 2 năm 2022; các sản phẩm Xilinx hiện được bán dưới dạng SoC thích ứng và FPGA của AMD: AMD Zynq, AMD Kria, AMD Versal và AMD Vitis. Các kỹ sư vẫn thường dùng tên Xilinx, và mã sản phẩm vẫn giữ tiền tố XC.

  • Có. model.export(format="xilinx") lượng tử hóa model bằng AMD Quark cho NPU dòng Versal AI Edge Series Gen 2 và ghi một thư mục chứa model ONNX đã lượng tử hóa cùng cấu hình compiler Vitis AI. Biên dịch thành .rai bằng công cụ Vitis AI của AMD như trình bày trong Biên dịch và chạy trên Versal AI Edge Gen 2. Các mục tiêu Zynq UltraScale+, Kria và VEK280 sử dụng quy trình trong Triển khai trên các mục tiêu AMD Xilinx khác.

  • DPU (Đơn vị xử lý học sâu) là accelerator INT8 đời trước của AMD. DPU được tích hợp vào logic lập trình được của thiết bị Zynq UltraScale+ và Kria, biên dịch bằng Vitis AI 3.5 và tạo ra các file .xmodel. NPU là sản phẩm thay thế trong các bản Vitis AI hiện hành. Trên thiết bị Versal AI Edge, NPU kết hợp AI Engines chuyên dụng với logic lập trình được, hỗ trợ INT8, BF16 và độ chính xác hỗn hợp, đồng thời hỗ trợ nhiều toán tử hơn, bao gồm SiLU và attention trên Versal AI Edge Gen 2.

  • .xmodel là đồ thị XIR được tuần tự hóa, dùng trong toolchain AMD DPU. Bộ lượng tử hóa ghi một .xmodel đã lượng tử hóa, rồi compiler vai_c_xir chuyển đổi thành .xmodel đã biên dịch, chứa luồng lệnh DPU, trọng số INT8 đã lượng tử hóa và mọi subgraph phải chạy trên CPU. File đã biên dịch nhắm đến một cấu hình DPU cụ thể, được mô tả bằng fingerprint arch.json, và chạy trên bo mạch thông qua Vitis AI Runtime (VART), hoặc thông qua Graph Runner nếu file có chứa subgraph CPU.

  • Không. DPU chỉ tăng tốc các activation ReLU, ReLU6, LeakyReLU, Hard-Swish và Hard-Sigmoid; DPU chạy Sigmoid, Softmax và MatMul nằm giữa hai activation trên CPU. Huấn luyện YOLO với activation: nn.Hardswish() trong YAML của model để giữ các phép tích chập trên DPU, và xem Xử lý các khối Attention trên DPU để biết các tùy chọn attention. NPU Versal AI Edge Gen 2 hỗ trợ SiLU, Softmax và MatMul nguyên bản.

  • KV260 sử dụng Zynq UltraScale+ MPSoC với DPU, vì vậy hãy làm theo luồng DPU. Huấn luyện model YOLO26 dùng Hard-Swish, lượng tử hóa bằng vai_q_pytorch trong Docker image Vitis AI 3.5, biên dịch bằng vai_c_xir với arch.json của KV260, rồi chạy .xmodel thu được trên bo mạch bằng VART, hoặc dùng Graph Runner nếu model có chứa subgraph CPU.

  • Không. Quá trình export chạy trên mọi máy chủ Linux có Python 3.11 đến 3.13, không cần tài khoản AMD; model đã export có thể chạy trên CPU để kiểm tra độ chính xác trên mọi máy chủ. Biên dịch model .rai cần Docker image Vitis AI và license compiler AI Engine của AMD; để chạy model trên NPU cần bo mạch Versal AI Edge Series Gen 2.

  • Ultralytics chỉ sử dụng Vitis AI Execution Provider khi ONNX Runtime cung cấp provider này, chẳng hạn trong bản dựng onnxruntime-vitisai của AMD trên bo mạch Versal hoặc trong Docker image của AMD. Ở nơi khác, Ultralytics chạy model đã lượng tử hóa bằng ONNX Runtime tiêu chuẩn trên CPU; đây là cách đo độ chính xác INT8 trước khi triển khai.

  • Bất kỳ tác vụ nào cũng có thể chạy nếu các toán tử của tác vụ đó biên dịch được cho accelerator của bạn. Các toán tử không được hỗ trợ thường chạy trên CPU, nhưng một số có thể buộc toàn bộ model chạy trên CPU hoặc khiến quá trình biên dịch thất bại. Phát hiện đối tượng là workload phổ biến nhất và là workload được dùng trong các ví dụ của AMD. Với phân đoạn, ước lượng tư thế và các tác vụ khác, hãy kiểm tra báo cáo phân vùng của compiler để xác nhận các layer nặng chạy trên accelerator.

Người đóng góp

Bình luận