Ultralytics YOLO27:

Triển khai AMD Xilinx cho Ultralytics YOLO bằng Vitis AI#

Tính năng xuất native của Ultralytics sắp ra mắt

Hỗ trợ xuất native cho các thiết bị AMD Xilinx của Ultralytics sắp ra mắt. Trong thời gian chờ đợi, hướng dẫn này giải thích hệ sinh thái phần cứng và phần mềm AMD Xilinx, đồng thời trình bày cách triển khai Ultralytics YOLO26 ngay hôm nay bằng công cụ Vitis AI của AMD, bắt đầu từ bản xuất ONNX hoặc checkpoint PyTorch.

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 từng dòng thiết bị AMD Xilinx là gì, cách AI chạy trên các thiết bị đó, các toán tử Ultralytics YOLO mà từng bộ tăng tốc hỗ trợ, và quy trình từng bước để triển khai model YOLO trên phần cứng Zynq UltraScale+, Kria và Versal.

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.

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 đã 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:

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

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.

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

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ó DFLDự kiến chạy được mà không cần thay đổi; xác thực trên bo mạch của bạn
YOLO11Huấn luyện với Hard-Swish; C2PSA và softmax DFL chạy trên CPUDự kiến chạy được mà không cần thay đổi; xác thực trên bo mạch của bạn
YOLOv8Huấn luyện với Hard-Swish; softmax DFL chạy trên CPUHướng dẫn YOLOv8m của AMD (Vitis AI 6.3, VEK385, INT8 với phần đuôi BF16): báo cáo trình biên dịch 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 YOLO26 trên AMD Xilinx ngay hôm nay#

Cho đến khi có tính năng xuất native, quy trình triển khai gồm bốn bước:

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

Bước 1: Huấn luyện hoặc fine-tune model#

Huấn luyện trên dữ liệu của bạn bằng chế độ Train hoặc trên Ultralytics Platform. Với mục tiêu DPU, hãy bắt đầu từ YAML Hard-Swish. Ghi lại kết quả cơ sở bằng chế độ Val để sau này đo mức ảnh hưởng đến độ chính xác của quá trình lượng tử hóa.

Bước 2: Xuất sang ONNX cho các mục tiêu NPU#

ONNX là đầu vào chung cho các quy trình NPU của AMD. Quy trình DPU lượng tử hóa trực tiếp checkpoint PyTorch đã huấn luyện trong image Docker Vitis AI 3.5, vì vậy người dùng DPU có thể bỏ qua bước này. Xuất với batch size cố định là 1 và opset được AMD hỗ trợ; hướng dẫn YOLOv8m của AMD cho Versal AI Edge Gen 2 sử dụng opset 17.

Export
from ultralytics import YOLO

# Tải model bạn đã huấn luyện ở Bước 1
model = YOLO("runs/detect/train/weights/best.pt")

# Xuất sang ONNX với shape tĩnh để dùng cho trình biên dịch AMD
model.export(format="onnx", opset=17, imgsz=640)  # tạo 'best.onnx' bên cạnh 'best.pt'

Xem tích hợp ONNX và các tham số xuất để biết mọi tùy chọn. Khi không đặt nms, hãy chạy NMS trên CPU sau suy luận; với YOLO26, nms=False sẽ chọn head không dùng NMS. Không nhúng NMS bằng nms=True, vì AMD liệt kê NonMaxSuppression trong số các operator có thể buộc toàn bộ model chạy trên CPU.

Giữ lại bản dựng ONNX Runtime của AMD

Các image Docker của AMD đi kèm bản dựng ONNX Runtime riêng có Vitis AI Execution Provider. Ultralytics kiểm tra ONNX Runtime trong quá trình xuất và có thể cài đè gói tiêu chuẩn lên bản này. Hãy xuất trên bất kỳ máy nào rồi sao chép tệp .onnx vào container, hoặc đặt YOLO_AUTOINSTALL=false khi chạy Ultralytics bên trong image Docker của AMD.

Bước 3: Lượng tử hóa và biên dịch bằng Vitis AI#

Các quy trình bên dưới sử dụng image Docker của AMD trên host Linux x86-64. Bạn không cần bo mạch cho bước này. Chọn tab tương ứng với thiết bị của bạn:

  1. Khởi chạy image Docker Vitis AI 6.3 của AMD dành cho Versal AI Edge Gen 2. Xem yêu cầu hệ thống.
  2. Lượng tử hóa model ONNX sang INT8 bằng AMD Quark với cấu hình VINT8. Cấu hình tối thiểu của AMD cũng yêu cầu Int32Bias=False, enable_npu_cnn=True, DedicatedQDQPair=True và QuantizeAllOpTypes=True. Quark đọc dữ liệu hiệu chuẩn thông qua data reader do bạn viết, vì vậy hãy áp dụng cùng quy trình tiền xử lý như khi suy luận: resize letterbox về kích thước xuất, thứ tự kênh RGB, scale 0–1 và bố cục NCHW, sử dụng các ảnh đại diện từ dataset của bạn.
  3. Loại trừ subgraph hậu xử lý khỏi quá trình lượng tử hóa. Hướng dẫn YOLOv8m của AMD cảnh báo rằng lượng tử hóa subgraph này sẽ khiến mô hình bỏ sót các đối tượng được phát hiện. Trong ví dụ YOLOv8m đó, compiler sau đó chạy phần cuối bằng BF16 trên NPU; các toán tử ở phần cuối không được hỗ trợ, chẳng hạn như bước chọn top-k của YOLO26, vẫn chạy trên CPU.
  4. Chọn runtime của bo mạch trước khi biên dịch. Quy trình biên dịch tiêu chuẩn hoạt động với ONNX Runtime, vốn tự chạy các toán tử không tương thích với NPU, chẳng hạn như bước chọn top-k của YOLO26, trên CPU; quy trình này cũng hoạt động với VART-ML chỉ khi mọi toán tử đều chạy trên NPU. Để chạy model có các toán tử chạy trên CPU bằng VART-ML, hãy thêm các bước phân vùng CPU của AMD vào vitisai_config.json. Các artifact đó không thể chạy qua ONNX Runtime.
  5. Biên dịch bằng cách tạo một session ONNX Runtime với VitisAIExecutionProvider và một vitisai_config.json chỉ định thiết bị đích. Quá trình biên dịch ghi một file .rai vào thư mục cache. Xem biên dịch model.

Để bỏ qua bước lượng tử hóa, hãy biên dịch trực tiếp model ONNX FP32; compiler sẽ chuyển model sang BF16. Quá trình biên dịch yêu cầu giấy phép compiler AMD AI Engine; xem trang cấp phép của AMD.

Bước 4: Chạy và xác thực trên bo mạch#

Trước tiên, hãy chuẩn bị bo mạch. Bo mạch phải chạy thiết kế phần cứng và image Linux có cấu hình accelerator mà bạn đã biên dịch cho, cùng với runtime Vitis AI tương ứng. Xem hướng dẫn thiết lập của AMD dành cho các đích DPU Zynq UltraScale+ và Kria, Versal AI Edge (VEK280) và Versal AI Edge Gen 2 (VEK385).

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
NPU (Versal AI Edge Gen 2), ORTModel ONNX FP32 hoặc đã lượng tử hóa dùng để biên dịch, vitisai_config.json và thư mục cache đã biên dịchONNX Runtime với Vitis AI EP
NPU (Versal AI Edge Gen 2), VART-MLFile .rai (kèm các bước phân vùng CPU nếu có toán tử chạy trên CPU), cùng với cấu hình runner VART-MLVART-ML

Với các luồng NPU, đồ thị ONNX đã xuất vốn đã giải mã các box và áp dụng sigmoid cho điểm số lớp, vì vậy phía host chỉ cần diễn giải đầu ra:

  • Chưa đặt nms: các model detection xuất tensor (1, 4 + nc, anchors) gồm các box xywh và điểm số theo từng lớp. Chọn lớp có điểm cao nhất cho mỗi anchor, chuyển box sang dạng tọa độ góc, lọc theo confidence và chạy NMS; hàm non_max_suppression của Ultralytics thực hiện tất cả các bước này.
  • nms=False (YOLO26): model xuất tensor (1, max_det, 6) gồm các hàng [x1, y1, x2, y2, score, class], chỉ cần áp dụng ngưỡng confidence.

Trong cả hai trường hợp, hãy đưa các box từ ảnh đầu vào đã letterbox về kích thước của ảnh gốc. Chỉ những đồ thị bị cắt trước bước giải mã mới cần giải mã box trên host. Trên DPU, các buffer VART lưu giá trị INT8 dạng fixed-point: truy vấn shape và scale fix_point của từng tensor, lượng tử hóa đầu vào và giải lượng tử hóa đầu ra trước khi áp dụng các bước trên. Graph Runner trả về đầu ra của toàn bộ đồ thị, trong khi runner chỉ chạy DPU trả về đầu ra trung gian của subgraph DPU mà mã của bạn phải tính tiếp. Các layout ở trên là layout ONNX (góc nhìn CPU): VART-ML mặc định dùng các góc nhìn tensor phần cứng, trong đó shape, kiểu dữ liệu và layout bộ nhớ có thể khác nhau; do đó, hãy cấu hình kiểu tensor đầu vào và đầu ra của runner thành góc nhìn CPU hoặc tự chuyển đổi định dạng phần cứng (xem tổng quan kiến trúc VART-ML của AMD).

So sánh độ chính xác trên thiết bị với baseline FP32 ở Bước 1 bằng tập validation của bạn và cùng các metric hiệu năng, chẳng hạn như mAP. Kết quả YOLOv8m do AMD công bố trên VEK385 cho thấy mức suy giảm độ chính xác khi triển khai INT8:

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.

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#

Thiết bị AMD Xilinx chạy model YOLO qua hai thế hệ accelerator. DPU trên Zynq UltraScale+ và Kria sử dụng luồng Vitis AI 3.5 cố định và tạo ra các file .xmodel. DPU cần các activation tương thích nguyên bản như Hard-Swish và chạy attention trên CPU. NPU trên Versal AI Edge và Versal AI Edge Gen 2 sử dụng các bản Vitis AI hiện hành. NPU Gen 2 hỗ trợ SiLU và các toán tử attention, đồng thời chạy gần như toàn bộ ví dụ YOLOv8m của AMD trên VEK385 bằng NPU; mức hỗ trợ toán tử trên NPU VEK280 đời trước phụ thuộc vào phiên bản Vitis AI và độ chính xác.

Tính năng export nguyên bản của Ultralytics cho thiết bị AMD Xilinx sẽ sớm ra mắt. Trong thời gian chờ đợi, hãy huấn luyện bằng Ultralytics, export sang ONNX cho các đích NPU Versal hoặc giữ checkpoint PyTorch cho các đích DPU, rồi biên dịch bằng Vitis AI như mô tả ở trên. Với các đích triển khai khác, xem hướng dẫn các tùy chọn triển khai model, các phương pháp triển khai tốt nhất và các tích hợp accelerator 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.

  • Chưa. Tính năng export nguyên bản của Ultralytics cho thiết bị AMD Xilinx sẽ sớm ra mắt. Hiện tại, hãy export sang ONNX bằng model.export(format="onnx") cho các đích NPU Versal, hoặc lượng tử hóa checkpoint PyTorch đã huấn luyện bằng vai_q_pytorch cho các đích DPU Zynq UltraScale+ và Kria, sau đó biên dịch bằng công cụ Vitis AI của AMD như trình bày trong Triển khai YOLO26 trên AMD Xilinx ngay hôm nay.

  • 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 lượng tử hóa và biên dịch chạy trong Docker image Vitis AI của AMD trên host Linux x86-64. Bạn chỉ cần bo mạch để chạy model đã biên dịch và đo độ trễ cũng như độ chính xác trên thiết bị.

  • 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