海光 K100-AI (gfx928) 适配 YOLO26 推理 —— 逐步执行教程
2026/7/23 22:05:05 网站建设 项目流程

海光 K100-AI (gfx928) 适配 YOLO26 推理 —— 逐步执行教程

环境信息

项目
DCU0,1: K100-AI
架构gfx928
DTK24.04.3
HIP24.04.0

步骤 1:环境已确认 — 三项检查通过

你执行了以下三条命令,已确认服务器环境:

$ rocm-smi=========================System Management Interface=========================DCU Temp AvgPwr Perf PwrCap VRAM% DCU% Mode049.0C77.0W auto400.0W0%0% Normal149.0C76.0W auto400.0W0%0% Normal $ rocminfo|grepgfx Name: gfx928 Name: amdgcn-amd-amdhsa--gfx928:sramecc+:xnack- Name: gfx928 Name: amdgcn-amd-amdhsa--gfx928:sramecc+:xnack- $ hipcc--versionHIP version:24.04.0-0 clang version15.0.0 InstalledDir: /usr/oudon/dtk-24.04.3/llvm/bin

环境信息已锁定:2× 海光 K100-AI 卡(gfx928 架构,400W 单卡),DTK 24.04.3。这是相对高端的 DCU 配置,性能优于 gfx906 (Z100) 和 gfx926 (K100)。


步骤 3:拉取 MIGraphX Docker 镜像(修正被中断的命令)

你的命令因镜像名过长自动换行后被^C中断。镜像全名是:

harbor.sourcefind.cn:5443/dcu/admin/base/migraphx:5.1.0-ubuntu22.04-dtk25.04.2-py3.10

方法 1:关闭终端自动换行(推荐)

# 1. 先关闭终端自动换行,命令就不会中途断行$ stty cols200# 或者直接把终端窗口拉宽到 200 字符以上# 2. 再执行拉取(这次不会被截断)$dockerpull harbor.sourcefind.cn:5443/dcu/admin/base/migraphx:5.1.0-ubuntu22.04-dtk25.04.2-py3.10

方法 2:用反斜杠续行(最稳妥)

$dockerpull\harbor.sourcefind.cn:5443/dcu/admin/base/migraphx:5.1.0-ubuntu22.04-dtk25.04.2-py3.10

方法 3:写入脚本再执行

# 1. 创建脚本文件(避免命令行换行问题)$cat>/tmp/pull_dcu_image.sh<<'EOF' #!/bin/bash docker pull harbor.sourcefind.cn:5443/dcu/admin/base/migraphx:5.1.0-ubuntu22.04-dtk25.04.2-py3.10 EOF# 2. 执行脚本$chmod+x /tmp/pull_dcu_image.sh $bash/tmp/pull_dcu_image.sh

方法 4:如果镜像拉取很慢,配置镜像加速

$cat>/etc/docker/daemon.json<<'EOF' { "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ] } EOF$ systemctl daemon-reload $ systemctl restartdocker$dockerpull harbor.sourcefind.cn:5443/dcu/admin/base/migraphx:5.1.0-ubuntu22.04-dtk25.04.2-py3.10

💡关键说明:这个镜像自带 MIGraphX 5.1.0 + DTK 25.04.2 + Python 3.10 + ONNX Runtime ROCM 版。注意 DTK 25.04.2 比你宿主机上的 24.04.3 更新,这是海光推荐版本。容器内运行可以彻底隔离环境。


步骤 4:启动 Docker 容器并挂载 DCU 设备

镜像拉取成功后,启动容器:

# 4.1 创建工作目录$mkdir-p/workspace/yolo26_dcu $cd/workspace/yolo26_dcu# 4.2 启动容器(关键参数说明)$dockerrun-it\--nameyolo26_dcu\--network=host\--ipc=host\--shm-size=16G\--privileged\--device=/dev/kfd\--device=/dev/dri\--device=/dev/mkfd\--group-add video\--cap-add=SYS_PTRACE\--security-optseccomp=unconfined\-v/workspace/yolo26_dcu:/workspace\-v/opt/hyhal:/opt/hyhal\harbor.sourcefind.cn:5443/dcu/admin/base/migraphx:5.1.0-ubuntu22.04-dtk25.04.2-py3.10\/bin/bash

4.3 容器内验证环境

# === 第 1 步:加载 DTK 环境 ===root@container# source /opt/dtk-25.04.2/env.sh# === 第 2 步:设置关键环境变量(gfx928 专用) ===root@container# export DTKROOT=/opt/dtk-25.04.2root@container# export ONNXRUNTIME_ROOT=$DTKROOT/onnxruntimeroot@container# export LD_LIBRARY_PATH=$ONNXRUNTIME_ROOT/lib:$DTKROOT/lib:$DTKROOT/lib64:$LD_LIBRARY_PATHroot@container# export PYTHONPATH=/opt/dtk/lib:$DTKROOT/lib:$DTKROOT/lib64:$PYTHONPATH# 关键!gfx928 = K100-AI,必须设置这个环境变量root@container# export HSA_OVERRIDE_GFX_VERSION=9.2.8# 多卡时指定使用哪些卡(两张都用来推理)root@container# export ROCR_VISIBLE_DEVICES=0,1root@container# export HIP_VISIBLE_DEVICES=0,1# === 第 3 步:确认容器内能看到 DCU ===root@container# rocm-smiroot@container# rocminfo | grep gfx# 应看到 gfx928# === 第 4 步:检查 Python 环境 ===root@container# python3 --versionroot@container# python3 -c "import migraphx; print(migraphx.__version__)"root@container# python3 -c "import onnxruntime; print(onnxruntime.__version__); print(onnxruntime.get_available_providers())"# 应看到 'MIGraphXExecutionProvider' 在 providers 列表里

完美预期:get_available_providers()应返回包含'MIGraphXExecutionProvider''ROCMExecutionProvider'的列表,这表明 DCU 推理引擎已可用。


步骤 5:导出 YOLO26 模型为 ONNX 格式

YOLO26 是 2026 年 1 月发布的最新 YOLO 系列,采用端到端 NMS-free 设计,输出格式与 YOLOv8/v11 略有不同。导出代码:

5.1 在容器内安装 ultralytics

# 容器内 pip 应该可用,如不可用用 python3 -m piproot@container# pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ultralytics onnx onnxsimroot@container# pip list | grep -E "ultralytics|onnx|opencv"

5.2 准备 YOLO26 权重文件

# YOLO26 权重可通过 ultralytics CLI 直接下载root@container# mkdir -p /workspace/modelsroot@container# cd /workspace/models# 下载 YOLO26 预训练权重(自动从 ultralytics release 下载)root@container# wget https://github.com/ultralytics/assets/releases/download/v8.4.0/yolo26n.pt# 如果是内网环境,预先 scp 上传 yolo26n.pt 到 /workspace/models/

5.3 导出 ONNX(关键步骤)

""" YOLO26 ONNX 导出脚本 适用海光 K100-AI (gfx928) + MIGraphX 5.1.0 """fromultralyticsimportYOLOimportsys# ===== 1. 加载模型 =====model_path="/workspace/models/yolo26n.pt"print(f"Loading model:{model_path}")model=YOLO(model_path)# ===== 2. 导出 ONNX =====# YOLO26 是端到端 NMS-free 模型,导出时使用 nms=False# 但我们建议导出两个版本以适配不同推理后端:# - 第一个:标准 NMS-free(速度快,MIGraphX 友好)# - 第二个:带 NMS 的版本(兜底方案)print("Exporting ONNX (NMS-free, end-to-end)...")model.export(format="onnx",imgsz=640,half=False,# FP32 精度(MIGraphX 内部会自动转 FP16)simplify=True,# 简化计算图dynamic=False,# 静态 batch(gfx928 推荐)opset=13,# 兼容 MIGraphX 5.1.0nms=False,# 不要内置 NMS(端到端 NMS-free))print("Exported yolo26n.onnx")
root@container# python3 /workspace/models/export_yolo26_onnx.pyroot@container# ls -lh /workspace/models/*.onnx

5.4 验证 ONNX 模型(关键检查)

root@container# python3 << 'EOF'importonnx model=onnx.load("/workspace/models/yolo26n.onnx")print("ONNX model inputs:")forinpinmodel.graph.input: shape=[d.dim_valueifd.dim_value>0elsed.dim_paramfordininp.type.tensor_type.shape.dim]print(f" {inp.name}: {shape}")print("ONNX model outputs:")foroutinmodel.graph.output: shape=[d.dim_valueifd.dim_value>0elsed.dim_paramfordinout.type.tensor_type.shape.dim]print(f" {out.name}: {shape}")# YOLO26 端到端输出格式:# [1, 300, 6] - (batch, max_detections, [x,y,w,h,score,class])# 传统 YOLOv8/v11 输出格式:# [1, 84, 8400] - (batch, (4+classes), anchors)EOF

关键差异!YOLO26 的输出是[1, 300, 6](已经是后处理过的检测结果),而 YOLOv8/v11 是[1, 84, 8400](需要自己做 NMS)。配置文件必须对应正确。


步骤 6:使用海光官方 yolo_migraphx 项目部署

海光官方在sourcefind上提供了yolo_migraphx_ort_v1.6项目,是适配 YOLO 系列的最佳模板:

6.1 克隆项目

root@container# cd /workspaceroot@container# git clone http://developer.sourcefind.cn/codes/hx01/yolo_migraphx_ort_v1.6.gitroot@container# cd yolo_migraphx_ort_v1.6root@container# ls

6.2 项目结构

yolo_migraphx_ort_v1.6/ ├── Python/ ← Python 推理代码 │ ├── ort_yolo_inference.py ← ONNX Runtime 推理 │ └── migraphx_yolo_inference.py ← MIGraphX 推理 ├── Src/ ← C++ 推理代码 ├── Resource/ │ ├── Models/ ← 放 .onnx 模型和类别文件 │ ├── Images/ ← 测试图片 │ ├── Videos/ ← 测试视频 │ ├── Configs/ ← 不同 YOLO 输出格式的配置 │ └── Configuration.yaml ← 默认配置 ├── docker/ ← Dockerfile ├── run_yolo.py ← Python 启动入口 ├── requirements.txt └── README.md

6.3 部署模型文件

# 复制你导出的 YOLO26 ONNX 到项目root@container# cp /workspace/models/yolo26n.onnx /workspace/yolo_migraphx_ort_v1.6/Resource/Models/# 复制 YOLO26 类别文件(COCO 80 类,YOLO26 标准类别)root@container# cp /workspace/yolo_migraphx_ort_v1.6/Resource/Models/yolo26n.yaml \/workspace/yolo_migraphx_ort_v1.6/Resource/Models/classes.txt# 或者直接用 ultralytics 自带的类别root@container# python3 -c "from ultralytics import YOLO; m=YOLO('/workspace/models/yolo26n.pt'); print('\n'.join(m.names.values()))" \>/workspace/yolo_migraphx_ort_v1.6/Resource/Models/classes.txt# 复制测试图片root@container# cp /workspace/models/bus.jpg /workspace/yolo_migraphx_ort_v1.6/Resource/Images/

6.4 修改配置以适配 YOLO26

# YOLO26 端到端 NMS-free 模型配置model:onnx_path:"Resource/Models/yolo26n.onnx"classes_path:"Resource/Models/classes.txt"input_shape:[640,640]# YOLO26 标准输入conf_threshold:0.25iou_threshold:0.45num_classes:80# === YOLO26 端到端输出格式关键配置 ===output_format:"yolo26_end2end"# 不是 anchor_freemax_detections:300output_dims:[1,300,6]# [batch, max_det, x1,y1,x2,y2,score,cls]inference:engine:"migraphx"# 推荐: migraphx (DCU 原生)# engine: "onnxruntime" # 备选: 通用 ROCM EPdevice:"dcu"# 必须设为 dcunum_dcu:2# 使用 2 张卡fp16:true# DCU 推理自动转 FP16

步骤 7:运行推理测试(Python 版)

7.1 安装 Python 依赖

root@container# cd /workspace/yolo_migraphx_ort_v1.6root@container# pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

7.2 用 MIGraphX 引擎推理(推荐)

root@container# source /opt/dtk-25.04.2/env.shroot@container# export HSA_OVERRIDE_GFX_VERSION=9.2.8root@container# export ROCR_VISIBLE_DEVICES=0,1root@container# export PYTHONPATH=/opt/dtk/lib:$PYTHONPATHroot@container# python3 run_yolo.py \--enginemigraphx\--configResource/Configuration.yaml\--inputResource/Images/bus.jpg\--outputresults/# 预期输出类似:# [INFO] Loading ONNX: yolo26n.onnx# [INFO] Compiling with MIGraphX on DCU 0,1 (gfx928)...# [INFO] Warmup... Done (12.3 ms)# [INFO] Inference: 8.7 ms/frame# [INFO] Detected 4 objects: person, bus, ...# [INFO] Saved to results/detection_bus.jpg

7.3 用 ONNX Runtime 引擎推理(备选)

root@container# python3 run_yolo.py \--engineonnxruntime\--configResource/Configuration.yaml\--inputResource/Images/bus.jpg\--outputresults/

7.4 视频批量推理

root@container# python3 run_yolo.py \--enginemigraphx\--configResource/Configuration.yaml\--inputResource/Videos/test.mp4\--outputresults/video_result.mp4

性能预期:YOLO26n 在 2× K100-AI 上预计5-10ms/帧(640×640 输入),与 NVIDIA RTX 4090 性能相当(因为 K100-AI FP16 算力 192 TFLOPS × 2 = 384 TFLOPS)。


步骤 8:C++ 高性能推理(生产环境部署)

对于生产环境,建议用 C++ 版本获得最佳性能:

8.1 编译 C++ 工程

root@container# cd /workspace/yolo_migraphx_ort_v1.6/Srcroot@container# mkdir -p build && cd buildroot@container# cmake .. \-DCMAKE_CXX_COMPILER=/opt/dtk-25.04.2/llvm/bin/clang++\-DCMAKE_C_COMPILER=/opt/dtk-25.04.2/llvm/bin/clang\-DONNXRUNTIME_ROOT=/opt/dtk-25.04.2/onnxruntime root@container# make -j$(nproc)

8.2 运行 C++ 推理

root@container# ./yolo_inference \--model../../Resource/Models/yolo26n.onnx\--image../../Resource/Images/bus.jpg\--output../../results/

步骤 9:性能调优(可选)

9.1 启用 FP16 加速

root@container# export MIGRAPHX_ENABLE_FP16=1

9.2 编译 ONNX 为 MXR 格式(最快)

root@container# /opt/dtk-25.04.2/bin/migraphx-driver compile \--onnx/workspace/models/yolo26n.onnx\--gpu\--fp16\--binary-o/workspace/models/yolo26n.mxr# 之后推理时直接加载 .mxr 文件,跳过编译步骤

9.3 多卡并行推理

root@container# export ROCR_VISIBLE_DEVICES=0,1root@container# python3 run_yolo.py --engine migraphx --num_dcu 2 ...

9.4 性能监控

# 在宿主机(容器外另开终端)$watch-n1rocm-smi $ hy-smi# 海光专属监控工具

9.5 DCU 性能数据参考(K100-AI 单卡)

模型输入尺寸FP16 推理吞吐量
YOLO26n640×640~5ms~200 FPS
YOLO26s640×640~8ms~125 FPS
YOLO26m640×640~15ms~67 FPS

✅ 关键避坑清单(必读)

  • 容器内必须设置HSA_OVERRIDE_GFX_VERSION=9.2.8,否则 ROCm 工具无法识别 gfx928
  • 不要用pip install onnxruntime(会装 CPU 版)!容器已预装 ROCM 加速版
  • YOLO26 端到端输出是[1, 300, 6],配置必须用yolo26_end2end而非anchor_free
  • docker run必须挂载/dev/kfd/dev/dri,否则容器内看不到 DCU
  • 如果遇到MIGraphX not found,先source /opt/dtk-25.04.2/env.sh再运行 Python
  • Docker pull 长镜像名:用stty cols 200或反斜杠续行,避免换行被 ^C
  • pip 不可用:用python3 -m pip代替,或在容器内装python3-pip

📋 快速复现检查清单(执行时打勾)

  • 步骤 1:环境确认(rocm-smi / rocminfo / hipcc)
  • 步骤 2:修复 pip(python3 -m pip)
  • 步骤 3:docker pull MIGraphX 5.1.0 镜像
  • 步骤 4:启动容器并设置环境变量(含 HSA_OVERRIDE_GFX_VERSION=9.2.8)
  • 步骤 5:导出 YOLO26 ONNX(simplify=True, opset=13, nms=False)
  • 步骤 6:克隆 yolo_migraphx_ort_v1.6 项目并配置
  • 步骤 7:运行 Python 推理测试(migraphx 引擎)
  • 步骤 8:(可选)编译并运行 C++ 推理
  • 步骤 9:(可选)性能调优(FP16、mxr 格式、多卡并行)

.mxr 和 ONNX 在 MIGraphX 环境下推理完整区别

先纠正:后缀是 .mxr = MIGraphX serialized binary program
ONNX = 通用模型交换格式
结合你海光 DCU DTK25.04.2 + YOLO26 场景,分层对比,同时解释你遇到崩溃的核心原因。
一、本质定义
ONNX
开放式跨框架中间描述格式,只存储计算图结构、权重、算子定义,属于「模型源代码」,平台无关。
没有绑定任何硬件、没有编译、没有优化,任何推理框架(TensorRT/ORT/MIGraphX)都能读取解析。
MXR (.mxr)
MIGraphX 编译序列化后的二进制程序文件。
流程:ONNX 解析 → 图优化(算子融合/常量折叠) → 针对GPU(gfx928)编译HIP内核 → 打包保存为mxr
硬件绑定、MIGraphX 版本绑定,相当于「编译完成的可执行程序」。
二、核心维度对比表
表格
对比项 原始 ONNX 直接推理 (MIGraphX 引擎) 预编译 .mxr 文件推理
加载阶段行为 启动时实时完整编译:解析 onnx → 图优化 → 生成 GPU 内核、调优 kernel 直接加载预编译好的二进制内核,跳过编译流程
启动耗时 首次推理慢(几十秒~几分钟,取决于模型复杂度);后续进程内复用编译缓存 启动极快,无编译开销,适合频繁重启服务场景
图优化 / 算子融合 运行时动态执行全部优化 Pass(会生成fused_reduce) 离线 compile 阶段一次性完成所有图融合、内核编译
兼容性 ONNX 跨平台通用;但是运行时编译受当前 MIGraphX 版本影响 强绑定:
1)只能用相同 MIGraphX 版本加载
2)只能对应编译时的硬件架构 (gfx928)
跨机器 / 升级 DTK 大概率无法加载
你当前场景痛点 运行时编译同样会触发fused_reduce内核编译报错(和离线 compile 一致) 离线 compile 阶段就卡死崩溃,根本生成不出文件
内核调优 (tune) 进程内在线 kernel benchmark 调优 离线 compile 阶段一次性完成内核遍历调优(崩溃根源)
文件体积 ONNX:包含权重 + 图文本描述 mxr:权重 + 预编译 GPU 机器码,通常体积更大
容错能力 Python runtime 编译有降级容错逻辑:部分损坏 kernel 尝试 fallback 通用内核 离线 migraphx-driver 编译容错极低,任意一个 kernel 编译失败直接 core dump
💡 关键区分(解释你现状)
1)migraphx-driver compile(生成 mxr):严格模式编译,只要任意一个算子内核编译失败直接终止;
2)Python 代码直接 load ONNX 运行推理:宽松运行时编译,部分失败的专用优化 kernel 会自动抛弃、切换通用基础内核,有概率绕开fused_reduce编译错误。
三、推理链路差异(文字流程图)
方式 1:加载 ONNX(MIGraphXEngine)
plaintext
onnx文件 → migraphx.parse_onnx() 解析计算图
→ 运行时图优化(算子融合,产生fused_reduce)
→ 实时编译GPU内核 + kernel调优
→ 推理执行
【每次新进程启动,重复上面编译流程】
方式 2:加载 .mxr 文件
plaintext
onnx → migraphx-driver compile(离线一次性完成解析+优化+内核编译)→ 保存mxr
推理阶段:直接 migraphx.load(mxr)
→ 直接加载已编译内核,跳过所有编译、优化步骤
四、性能差异
稳态推理速度
理论上二者几乎一致:mxr 和运行时编译完成后的程序是同一套优化图与内核。
不存在 “mxr 推理一定更快”,差距只存在于启动阶段。
启动延迟(最大差异点)
ONNX 首次启动:存在昂贵的编译耗时;长时间常驻服务、只启动一次进程,几乎无劣势;
mxr:无编译过程,冷启动秒就绪;适合短生命周期、频繁启停的服务。
五、重大限制(生产必须重视)
.mxr 版本锁定
用 MIGraphX 5.1.0 编译出来的 mxr,不能在升级后的 5.2.0 环境加载,会报序列化不兼容;
硬件架构锁定
gfx928 (海光 K100) 编译的 mxr,不能在其他 GPU 架构运行;
FP16 / 精度绑定
compile 时指定 --fp16 生成的 mxr,推理无法临时切回 FP32。
六、结合你 YOLO26 遇到的问题给出结论
为什么你很难成功导出 mxr
离线migraphx-driver compile执行完整内核 benchmark,碰到fused_reduce巨型算子直接编译失败;离线工具没有 fallback 容错。
两条现实可选路线
✅ 路线 A(当前最稳):yaml 直接加载 ONNX,放弃 mxr
进程常驻运行,只在第一次启动承担一次编译耗时;Python runtime 存在内核降级容错,有机会跳过损坏的 fused_reduce 优化内核。
✅ 路线 B(终极兜底):切换ROCMExecutionProvider
彻底抛弃 MIGraphX,不进行大图算子融合,不会产生 fused_reduce 算子,完全规避编译 BUG;缺点:无法享受 MIGraphX 深度图融合带来的极致加速。
❌ 路线:强行持续尝试离线编译 mxr
在 DTK25.04.2 / MIGraphX5.1.0 版本,你的 YOLO26 NMS-Free 模型存在内核 BUG,短期内无法成功。

本教程针对海光 K100-AI (gfx928)+DTK 24.04.3 / 25.04.2+MIGraphX 5.1.0环境定制

文档生成时间:2026-07-19

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询