Ultralytics YOLO27: 加入候补名单。
Get Started

使用 Ultralytics YOLO、ROCm 和 MIGraphX 在 AMD GPU 上训练和推理#

仅限 Linux x86_64

本指南面向已安装 AMD GPU 内核驱动程序(amdgpu)的 Linux x86_64 主机,以下所有命令均适用于 Linux shell。MIGraphX 执行提供程序仅以适用于 Python 3.11 或更高版本的 Linux x86_64 wheel 形式发布,因此不支持原生 Windows,Windows Subsystem for Linux (WSL2) 也尚未经过验证。

Ultralytics YOLO 可通过 AMD 的开放 GPU 计算栈 ROCm 在 AMD Instinct 和受支持的 Radeon GPU 上运行。使用 ROCm 版 PyTorch 后,你可以像在其他任何 GPU 上一样,使用相同的 device=0 参数对 .pt 模型进行训练、验证和预测,无需更改代码。

部署时,将训练好的模型导出为 ONNX,并通过 AMD 的计算图优化和推理引擎 MIGraphX 运行。Ultralytics ONNX 后端会检测 ROCm,并自动选择 ONNX Runtime MIGraphXExecutionProvider,因此在 NVIDIA GPU 上运行的同一个 predict 调用也能在 AMD GPU 上运行。Ultralytics 定期运行的持续集成会在 AMD GPU 硬件上针对每个任务执行 ONNX 导出和 MIGraphX 推理。

安装#

Python 技术栈完全通过 pip 从 AMD 的 ROCm wheel 索引安装,因此无需 apt 软件包或 root 权限即可安装 PyTorch、插件或 ROCm 运行时库,前提是主机已安装 AMD GPU 内核驱动程序(amdgpu / /dev/kfd)。

安装

检测 GPU 架构(例如 Strix Halo 上的 gfx1151),并仅安装所需的 PyTorch 内核:

# Read the GPU architecture from the amdgpu driver, e.g. device-gfx1151
GPU_ARCH=$(grep -rhs '^gfx_target_version' /sys/class/kfd/kfd/topology/nodes | awk '$2 {printf "device-gfx%d%d%x\n", int($2/10000), int($2/100)%100, $2%100}' | sort -u | paste -sd, -)

# ROCm PyTorch + torchvision for the detected architecture
pip install "torch[${GPU_ARCH:?No AMD GPU found}]" "torchvision[$GPU_ARCH]" --index-url https://stable.repo.amd.com/rocm/whl-next/

# Ultralytics
pip install ultralytics

Ultralytics 会在首次导出 ONNX 时自动安装 onnx。在 ROCm 系统上首次进行 ONNX 推理时,它还会安装 MIGraphX 执行提供程序插件(onnxruntime-ep-migraphx)及其加载的 MIGraphX 运行时库(migraphx-libs),并固定为经过组合测试的版本。该插件仅面向 Linux x86_64 上的 Python 3.11 或更高版本发布;在其他 Python 版本或架构上,或者使用 YOLO_AUTOINSTALL=false 且未安装插件时,ONNX 推理会发出警告并回退到 CPU。详细说明和最佳实践请参阅 YOLO26 安装指南;如果遇到任何问题,请查阅常见问题指南。

训练或导出前,请确认 PyTorch 能检测到 AMD GPU:

import torch

print(torch.cuda.is_available())  # 正常运行的 ROCm 安装会返回 True
print(torch.cuda.get_device_name(0))  # AMD GPU 名称,例如 AMD Radeon 8060S
print(torch.version.hip)  # ROCm PyTorch 版本的 HIP 版本;CUDA 或 CPU 版本则为 None

使用 PyTorch ROCm 在 AMD GPU 上训练#

基于 .pt 模型的原生训练、验证和预测通过 PyTorch ROCm 在 AMD GPU 上运行,与下文介绍的 MIGraphX 推理路径无关。按照安装指南安装 ROCm 版 PyTorch,然后像运行其他任何 Ultralytics 训练任务一样使用相同的设备参数:

为什么 AMD GPU 在 Ultralytics 中显示为 CUDA

ROCm 版 PyTorch 在内部使用 HIP,但有意复用 torch.cuda 接口,因此 torch.cuda.is_available() 会返回 True,AMD GPU 也使用标准 CUDA 风格的 ID 指定。AMD GPU 请使用 device=0 或 device=cuda:0;rocm 不是 PyTorch 设备类型。详情请参阅 PyTorch HIP 语义。

ROCm 训练
from ultralytics import YOLO

model = YOLO("yolo26n.pt")

# 使用 PyTorch ROCm 检测到的第一块 AMD GPU 进行训练
results = model.train(data="coco8.yaml", epochs=100, imgsz=640, device=0)

# 使用两块 AMD GPU 进行训练
results = model.train(data="coco8.yaml", epochs=100, imgsz=640, device=[0, 1])

.pt 模型的验证和预测使用相同的设备选择方式:

yolo detect val model=path/to/best.pt data=coco8.yaml device=0
yolo predict model=path/to/best.pt source=path/to/image.jpg device=0
ROCm 混合精度

Ultralytics 默认启用 AMP;如果预训练检查发现混合精度结果与全精度结果存在偏差,则会自动禁用 AMP。ROCm 上的 AMP 行为可能随 PyTorch 和 ROCm 版本而变化,因此如果运行仍然产生 NaN 损失或 mAP 为零,请使用 amp=False 进行训练:

yolo detect train data=coco8.yaml model=yolo26n.pt device=0 amp=False

使用 MIGraphX 导出和推理#

ONNX Runtime 是一个跨平台推理引擎,可通过可插拔的执行提供程序 (EP) 在多种硬件后端上运行同一个 ONNX 模型。每个 EP 都会将 ONNX 计算图映射到特定加速器上:NVIDIA GPU 使用 CUDA,Apple silicon 使用 CoreML,而 ROCm 上的 AMD GPU 使用 MIGraphX。MIGraphX 以 onnxruntime-ep-migraphx 插件形式提供,并会将计算图编译为针对你的 GPU 调优的程序。

MIGraphX 推理使用标准的 ONNX 导出。将模型导出为 ONNX(format="onnx")后,Ultralytics 推理会自动使用 MIGraphXExecutionProvider 后端,在 AMD GPU 上运行 ONNX 模型。

MIGraphX 推理的主要功能#

  • 自动选择提供程序:在 ROCm 主机上,ONNX 后端会注册插件并选择 MIGraphXExecutionProvider,无需更改代码。如果插件缺失或加载失败,推理会发出警告并回退到 CPU。
  • 计算图优化:MIGraphX 会执行算子融合、内存规划和内核选择,并针对 AMD GPU 架构进行调优。
  • 零拷贝 IO 绑定:通过 DLPack 协议将输入和输出直接绑定到 GPU 张量,避免推理期间与主机之间的数据往返传输。
  • 精度选项:使用 FP32 运行,或导出 FP16 ONNX 模型以进行低精度推理。
  • 可移植的产物:单个 .onnx 文件即可在 CPU、NVIDIA GPU 和 AMD GPU 上运行,让你通过一次导出面向多个平台。
  • 可复现的部署:完整技术栈(ROCm PyTorch、MIGraphX 插件及其库)均通过 pip 从 AMD 的 ROCm wheel 索引安装。

支持的任务#

MIGraphX 推理支持 Ultralytics 的全部七项任务。语义分割和深度估计仅适用于 YOLO26,这是唯一提供这些任务头的系列。

任务YOLOv8YOLO11YOLO26
检测✅✅✅
分割✅✅✅
语义分割❌❌✅
深度估计❌❌✅
分类✅✅✅
姿态✅✅✅
OBB✅✅✅

用法#

开始阅读使用说明前,请务必了解 Ultralytics 提供的 YOLO26 模型,以便根据项目需求选择最合适的模型。

ONNX 格式支持导出、预测和验证模式。要在 AMD GPU 上进行推理和验证,需要 ROCm 系统并安装 MIGraphX 插件。导出模型后,加载导出的模型,即可在 device=0 上运行推理或验证模型精度。

与 onnxruntime-gpu 冲突

onnxruntime-gpu 和标准的 onnxruntime 包会安装到同一个 onnxruntime Python 模块中,因此后安装的包会覆盖先安装的包。只卸载其中一个会导致模块无法正常工作,而较旧的 onnxruntime-gpu 版本可能会导致 MIGraphX 推理崩溃。如果之前的配置安装了 onnxruntime-gpu,请运行 pip uninstall -y onnxruntime-gpu onnxruntime,Ultralytics 会在下一次 ONNX 推理时重新安装标准的 onnxruntime。

导出
from ultralytics import YOLO

# 加载 YOLO26 模型
model = YOLO("yolo26n.pt")

# 将模型导出为 ONNX 格式
model.export(format="onnx")  # 创建 'yolo26n.onnx'
预测
from ultralytics import YOLO

# 加载导出的 ONNX 模型,并在 AMD GPU 上运行推理
model = YOLO("yolo26n.onnx")

# 在 ROCm 上会自动选择 MIGraphX 执行提供程序
results = model.predict("https://ultralytics.com/images/bus.jpg", device=0)
验证
from ultralytics import YOLO

# 加载导出的 ONNX 模型
model = YOLO("yolo26n.onnx")

# 在 AMD GPU 上使用 COCO8 数据集验证准确率
metrics = model.val(data="coco8.yaml", device=0)

导出参数#

MIGraphX 推理会复用 ONNX 导出参数。AMD GPU 部署最相关的选项包括:

参数类型默认值说明
formatstr'onnx'导出模型的目标格式。使用 onnx 进行 MIGraphX EP 推理。
imgszint 或 tuple640模型输入所需的图像尺寸。可以是表示正方形图像的整数,也可以是元组 (height, width)。
quantizeint 或 strNone导出 ONNX 模型的精度:16 (FP16) 用于低精度推理;32/未设置时为 FP32。
dynamicboolFalse允许动态输入尺寸。静态形状可让 MIGraphX 编译专用程序,并支持零拷贝 IO 绑定。
simplifyboolTrue使用 onnxslim 简化模型图,可能提升性能和兼容性。
opsetintNone用于兼容不同运行时的 ONNX opset 版本。如果未设置,则使用最新的受支持版本。
nmsbool,可选None选择原始输出(None,默认)、嵌入式 NMS(True)或无 NMS 检测头(False)。MIGraphX EP 目前尚不支持嵌入式 NMS(True)(ROCm/AMDMIGraphX#5246)。
batchint1导出批次大小,即 predict 模式下导出模型可并发处理的最大图像数。
devicestrNone导出设备:GPU(device=0)、CPU(device=cpu)。

完整的导出参数列表请参阅 ONNX 集成和 Ultralytics 导出文档页面。

使用 MIGraphX 在 AMD GPU 上部署#

编译程序缓存

MIGraphX EP 会在首次会话时编译计算图,这会显著增加初始加载时间。Ultralytics 会在 Ultralytics 配置目录下按模型缓存编译后的程序,因此之后加载同一模型时无需重新编译。缓存最多保留最近使用的 8 个模型,并淘汰较旧的模型,因此缓存大小不会无限增长。设置 ORT_MIGRAPHX_CACHE_DIR 可覆盖缓存位置;升级 ROCm 或 MIGraphX 后,删除缓存目录即可强制重新编译。

编译时间

默认情况下,Ultralytics 会禁用 MIGraphX Winograd 卷积内核(MIGRAPHX_DISABLE_WINOGRAD=1),以缩短没有可测量推理性能变化的 YOLO 计算图的首次编译时间(ROCm/AMDMIGraphX#5234);设置 MIGRAPHX_DISABLE_WINOGRAD=0 可重新启用这些内核。

如需开箱即用的环境,Dockerfile-amd 会构建预装 ROCm PyTorch 和 MIGraphX EP 的 ultralytics/ultralytics:latest-amd 镜像。请参阅 Docker 快速入门中的使用 GPU,了解用于向容器开放 AMD GPU 的 docker run 标志。

基准测试#

以下 YOLO26 基准测试由 Ultralytics 团队在 AMD Radeon 8060S GPU (Ryzen AI Max+ PRO 395) 上运行,对比了 PyTorch 与 ONNX 在 MIGraphX 执行提供程序上的速度和准确率。两种格式都以 FP32 精度在 GPU 上运行:PyTorch 使用 ROCm,ONNX 使用 MIGraphX。

性能
模型格式状态大小 (MB)metrics/mAP50-95(B)推理时间 (ms/im)
YOLO26nPyTorch✅5.30.40894.1
YOLO26nONNX (MIGraphX)✅9.50.40892.1
YOLO26sPyTorch✅19.50.48507.2
YOLO26sONNX (MIGraphX)✅36.50.48504.7
YOLO26mPyTorch✅42.20.532314.6
YOLO26mONNX (MIGraphX)✅78.20.532310.9
YOLO26lPyTorch✅50.70.548918.5
YOLO26lONNX (MIGraphX)✅95.00.548915.0
YOLO26xPyTorch✅113.20.574837.4
YOLO26xONNX (MIGraphX)✅212.90.574827.1

使用 Ultralytics 8.4.165 基准测试(深度估计使用 8.4.172)

注意

上述基准测试均在批量大小为 1 的条件下,使用完整验证集完成:目标检测、分割和姿态估计的输入尺寸为 640,语义分割为 2048,深度估计为 768,分类为 224,OBB 为 1024。推理时间不包括预处理、后处理或一次性 MIGraphX 编译。

支持情况一览#

支持某一种 AMD 产品或运行时,并不代表支持所有 AMD 加速器。此表汇总了 Ultralytics Python 包当前的支持状态。

AMD 产品或运行时支持情况用法或状态
搭载 ROCm 的 AMD Instinct 和受支持的 Radeon GPU✅使用 device=0 或 device=cuda:0 训练、验证并运行原生 PyTorch 模型。
MIGraphX 推理✅通过 MIGraphX EP 在 AMD GPU 上运行导出的 ONNX 模型。支持所有 YOLO26 任务。
ROCm 多 GPU✅使用 device=0,1 或 device=[0, 1];分布式执行由已安装的 PyTorch ROCm 技术栈提供支持。
ROCm 自动混合精度 (AMP)⚠️已安装的 PyTorch 和 ROCm 版本通过 Ultralytics AMP 检查后即可使用;如果不兼容,请使用 amp=False。
AMD Docker 镜像✅latest-amd 随附预装 MIGraphX EP 的 ROCm PyTorch。
原生 MIGraphX 导出❌导出为 ONNX(format="onnx"),然后在 MIGraphX EP 上运行,以便在 AMD GPU 上进行推理。
Windows DirectML❌Python 包中没有 DirectML 训练或预测后端。
Ryzen AI NPU❌没有原生 NPU 集成;外部 ONNX/Vitis AI 工作流由社区维护。
AMD Xilinx Versal AI Edge Gen 2 NPU✅使用 format="xilinx" 导出;请参阅 AMD Xilinx 指南。
AMD Xilinx Zynq、Kria、Versal AI Edge Gen 1❌不支持原生导出;请使用 AMD Xilinx 指南中的 AMD Vitis AI 工作流。
AMD CPU✅ CPU使用 device=cpu;这是标准 CPU 执行方式,并非 AMD 专用加速后端。
先检查 AMD 与 PyTorch 的兼容性

ROCm 是否可用取决于具体 GPU、操作系统、ROCm 版本和 PyTorch 构建版本。安装前,请在 AMD 的 ROCm 兼容性矩阵中确认你的硬件是否受支持。

总结#

在本指南中,你学习了如何使用标准的 device=0 参数,通过 PyTorch ROCm 在 AMD GPU 上训练 Ultralytics YOLO26 模型,然后将模型导出为 ONNX,以便通过 ONNX Runtime MIGraphX 执行提供程序加速推理。ONNX 后端会自动选择 MIGraphXExecutionProvider,缓存编译后的程序以加快后续加载,并且无需修改代码即可支持所有 YOLO26 任务。

如需了解其他部署目标,请浏览集成指南页面,并通过基准测试模式比较导出格式。

常见问题#

  • 可以。按照安装中的说明安装 ROCm 版 PyTorch,然后使用 device=0 训练 .pt 模型;使用 device=0,1 可在多块 GPU 上训练。训练通过 PyTorch ROCm 运行,不使用 MIGraphX 或 ONNX 插件。示例请参阅使用 PyTorch ROCm 在 AMD GPU 上训练。

  • 将模型导出为 ONNX,然后在 ROCm 系统上使用 device=0 运行。Ultralytics 会在首次 ONNX 推理时安装 MIGraphX 插件:

    用法
    from ultralytics import YOLO
    
    # 导出为 ONNX
    model = YOLO("yolo26n.pt")
    model.export(format="onnx")  # 创建 'yolo26n.onnx'
    
    # 在 AMD GPU 上运行推理(自动选择 MIGraphX EP)
    onnx_model = YOLO("yolo26n.onnx")
    results = onnx_model.predict("https://ultralytics.com/images/bus.jpg", device=0)
  • 不需要。在 ROCm 系统上,Ultralytics ONNX 后端会检测 HIP、安装并注册 onnxruntime-ep-migraphx 插件,并自动选择 MIGraphXExecutionProvider。如果无法安装或加载插件(例如 Python 版本低于 3.11,或在 ARM64 上),推理会回退到 CPU 并发出警告。

  • MIGraphX 会在首次会话时将 ONNX 计算图编译为优化程序,这会显著增加初始加载时间。Ultralytics 会缓存编译后的程序,因此之后加载同一模型时无需重新编译。有关缓存位置和大小限制,请参阅编译程序缓存说明。

  • 已安装的 PyTorch 软件包可能是 CPU 或 CUDA 版本,而不是 ROCm 版本;也可能是当前 ROCm 软件栈不支持该 GPU。请按照 安装指南中的说明,从 AMD 的 ROCm wheel 索引重新安装 PyTorch,检查 torch.version.hip 是否为 None,并在 AMD 的 ROCm 兼容性矩阵中确认该 GPU。还要确保用户可以访问 /dev/kfd 和 /dev/dri,通常需要加入 video 和 render 组。

  • 这是预期行为。PyTorch ROCm 为了兼容 Python,会有意复用 torch.cuda API 和 CUDA 风格的设备字符串。请使用 device=0 或 device=cuda:0;模型仍会通过 HIP 和 ROCm 在 AMD GPU 上运行。

  • 无法通过 Python 包使用。DirectML 没有训练或预测后端,Ryzen AI NPU 也未通过 PyTorch ROCm 暴露。社区工作流可能会导出为 ONNX,并使用 AMD 外部的 Ryzen AI 或 Vitis AI 工具运行,但这些运行时不属于 Ultralytics 支持的执行路径。对于嵌入式 AMD Xilinx Versal AI Edge Series Gen 2 NPU,请使用 format="xilinx" 导出;对于 Zynq、Kria 和第一代 Versal AI Edge 设备,请参阅 AMD Xilinx 指南。

  • 直接传入 GPU 索引即可,例如,对 PyTorch 和 MIGraphX EP 推理,使用 device=1 选择第二块 GPU。若要限制进程或容器可用的 GPU,请设置 HIP_VISIBLE_DEVICES(容器使用 ROCR_VISIBLE_DEVICES),例如 HIP_VISIBLE_DEVICES=2;之后,可见 GPU 的编号会从 device=0 开始重新排列。

贡献者

评论