想象一家跨国服务集团「ORT 集团」:总部设在瑞士,向全球几十个国家的分公司下发同一份标准工作流程图。可每个国家的基础设施、语言习惯、资源条件都不同,总部不会亲自下场干活——它把任务交给各地的本地执行团队。这些团队把总部通用的流程图,翻译成本地工人看得懂的工序,再安排人手高效完成。在 ONNX Runtime 这家「集团」里,这样的本地执行团队就叫执行提供者(Execution Provider,简称 EP)。 NVIDIA 芯片的领地里有名为 CUDA EP 的精英团队;而在 AMD 芯片的领地里,王牌团队就是本文的主角 ROCm Provider。它深谙 AMD GPU 的「方言」ROCm,手边还备着一本常用任务速查手册 MIOpen,能把 ONNX Runtime 交办的每一个算子任务,快速翻译成 AMD GPU 上的高效内核程序。这篇文章,我们就跟着这支 AMD 本地团队走一遍:看它们如何接单、如何分派任务、如何让模型在 AMD GPU 上跑得又快又稳。

岗位关联

掌握 ROCm Provider,你就能在企业 AI 推理部署中为 AMD GPU 平台完成选型、会话配置与性能调优,在 AMD 生态里做到「一次导出、稳定加速」。

目录
  1. 可视化演示
  2. EP 基本概念
  3. ROCm 平台基础
  4. 算子映射机制
  5. MIOpen 加速库
  6. 推理部署流程
  7. AMD 生态优势
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

通过EP架构、算子映射与显存池机制,直观展示ONNX Runtime借助ROCm平台在AMD GPU上的推理加速。

本节配有交互动效(进入视口后自动加载,约 3KB)。

EP执行架构 模型分发到各后端 ROCm适配AMD GPU op → EP(hardware) EP机制统一多硬件推理接口。

EP 基本概念

ORT 集团的瑞士总部最清楚一件事:再完美的流程图,也得有人在地面上把它干出来。于是总部设计了「执行提供者」制度——每一项任务(算子)最终由哪个本地团队执行,都在这个框架下决定。本地团队不必关心总部如何制定流程,总部也不必关心每个国家的砂石水泥——这种双向解耦,就是执行提供者的核心价值。

把目光落到技术上:ONNX Runtime 是一个跨平台推理引擎,它接收 ONNX 格式的模型(即一张计算图),然后交给不同的后端执行。这个「后端」在 ORT 中就叫 Execution Provider。每个 EP 实现统一的接口,负责把图上的算子映射到自己的硬件上。CPU EP 是哪里都能干的通用后勤队,CUDA EP 是 NVIDIA 领地的精英队,而 ROCm Provider 则是 AMD 领地的王牌队。

EP 采用插件化机制,多个 EP 可以在同一个会话中共存。ORT 为每个算子挑选「最合适」的 EP:优先队列里排在前面的 EP 先尝试,若某个算子不支持,就自动落到下一个 EP。这就像一个跨国项目同时雇佣了好几家本地承包商,各家的专长不同,总部按任务类型和优先级灵活分派。

Execute(opi)=EPj(opi),EPj∈{CPU, CUDA, ROCm}\text{Execute}(op_i) = \text{EP}_j(op_i), \quad \text{EP}_j \in \{ \text{CPU},\ \text{CUDA},\ \text{ROCm} \}

1. 算子任务 \(op_i\):计算图中编号为 \(i\) 的算子,是流程表里的一个具体任务步骤。

opi\text{op}_i

2. 执行函数 Execute:ORT 集团决定「这个任务由谁来干」的调度器。

Execute(⋅)\text{Execute}(\cdot)

3. EP 接管:把第 \(j\) 个执行提供者套在算子上,表示任务被交给第 \(j\) 个本地团队。

EPj(opi)\text{EP}_j(\text{op}_i)

4. 候选集合:EP 的候选范围,通常包括 CPU 兜底、NVIDIA 的 CUDA 和 AMD 的 ROCm。

EPj∈{CPU, CUDA, ROCm}\text{EP}_j \in \{ \text{CPU},\ \text{CUDA},\ \text{ROCm} \}

这套机制的妙处在于:模型作者只面对 ONNX 这一套「国际标准流程」,完全不用关心 AMD 还是 NVIDIA;而各家 EP 团队专注把自己的硬件潜能榨干。就像总部只管下发通用流程,巴黎团队和东京团队各自优化本地的执行细节,最终交付的成品质量都由 ORT 统一验收。

ROCm 平台基础

AMD 团队再厉害,也离不开当地的基础设施。AMD GPU 的领地里,这套基础设施有一个总名字——ROCm。它是 AMD 开源的 GPU 计算平台,相当于「AMD 版 CUDA」:既提供编程语言(HIP)、编译器,也提供 runtime、驱动和性能工具,是 ROCm Provider 赖以生存的水电管网。

ROCm 中的 HIP 编程框架是一套「官方方言」,程序员可以用它写出同时兼容 NVIDIA 与 AMD 的代码;编译器负责把 HIP 代码翻译成 AMD GPU 能执行的机器指令;runtime 与驱动则负责运行时调度、显存管理和设备交互;再往上还有 rocprof、rocm-smi 等体检工具,帮工程师测量 GPU 温度、利用率与 kernel 耗时。

如果把 ROCm 的层次拆开看,可以这样理解它:

ROCm Stack=HIP⏟语言+Compiler⏟翻译+Runtime⏟调度+Tools⏟体检\text{ROCm Stack} = \underbrace{\text{HIP}}_{\text{语言}} + \underbrace{\text{Compiler}}_{\text{翻译}} + \underbrace{\text{Runtime}}_{\text{调度}} + \underbrace{\text{Tools}}_{\text{体检}}

1. ROCm Stack:AMD 领地的全套公共基础设施,统称 ROCm 软件栈。

ROCm Stack\text{ROCm Stack}

2. HIP 语言:当地官方语言,一种可移植的 C++ 风格 GPU 编程框架。

HIP\text{HIP}

3. 编译与调度:编译器和运行时配合,把代码转译成 GPU 指令并排队上卡执行。

Compiler+Runtime\text{Compiler} + \text{Runtime}

4. 性能工具:工程验收用的体检设备,用于定位瓶颈与验证加速效果。

Tools\text{Tools}

ROCm Provider 正是踩在 ROCm 平台之上的「土著团队」。没有这层水电管网,EP 就是巧妇难为无米之炊。我们可以这样对比:CUDA 是 NVIDIA 封闭自建的豪华园区,而 ROCm 是 AMD 开源共建的公共新区——基础设施架构不同,但目的都是一样的:让 GPU 高效跑起来。

算子映射机制

总部下发的流程图里包含几百项任务,AMD 团队拿到手后的第一件事,就是逐项核对「这活儿我能不能干、要怎么干」。这个过程在技术上叫算子映射:把 ONNX 标准算子对应到 ROCm 平台上具体可执行的 kernel(内核程序)。

ORT 内部维护着一张「算子注册表」,相当于团队的能力清单表。每个 EP 会声明自己支持哪些算子、每个算子支持哪些数据类型和版本。当模型加载时,ORT 遍历计算图,通过这张表给每个算子匹配 EP;遇到 ROCm EP 不支持的算子,就自动回退到 CPU EP,避免整个任务卡死。这便是多团队协作的兜底机制。

除了逐算子匹配,EP 还会做图编译优化:把相邻的多个算子合并成一个融合算子,减少 kernel 启动次数和数据搬移;把 NCHW 布局转换成 ROCm 更高效的 NHWC 布局。这些操作就像本地团队把「搬砖—砌墙—抹灰」三个工序合并成一支队伍一口气干完,省去中间交接时间。

M:OpONNX→MIOpenKernelROCm\mathcal{M}: \text{Op}_{\text{ONNX}} \xrightarrow{\text{MIOpen}} \text{Kernel}_{\text{ROCm}}

1. ONNX 算子:总部标准流程表中的任务类型,比如卷积、矩阵乘法、归一化。

OpONNX\text{Op}_{\text{ONNX}}

2. 映射函数:AMD 团队的分工决策器,把每个标准任务指派成具体环节。

M:⋅↦⋅\mathcal{M}: \cdot \mapsto \cdot

3. MIOpen 加速:常见任务直接查速查手册,由 MIOpen 提供预制的高效内核。

→MIOpen\xrightarrow{\text{MIOpen}}

4. ROCm 内核:最终在 AMD GPU 上执行的程序片段,也就是落地后的具体工序。

KernelROCm\text{Kernel}_{\text{ROCm}}

这套映射机制决定了加速的上限:能被 ROCm EP「认领」的算子越多,GPU 参与度越高,整体就越快;无法认领的算子则落到 CPU 上,形成整个流程里相对较慢的环节。就像团队里某些特殊工种必须外包,外包越多,整体工期就越不可控。

MIOpen 加速库

AMD 团队手里有一本厚厚的「常用任务速查手册」——这就是 MIOpen,AMD 官方的深度学习加速库。它专门为 GPU 上的常见算子提供高度优化的实现,尤其是卷积、池化、归一化、RNN 这类神经网络里的高频操作。ROCm Provider 在映射算子时,会优先查这本手册,而不是现场即兴写 kernel。

为什么手册里的方案更快?因为 MIOpen 针对不同 AMD GPU 架构(如 CDNA、RDNA)预先实现了多种算法变体,并内置自动调优机制:在首次调用某个算子时,它会自动运行若干候选算法、逐一计时,选出当前 GPU 上最快的那一个,并把结果缓存下来。这相当于本地老师傅拿着秒表,把从仓库到工地的几条路线都走一遍,然后记住最短路。

MIOpen 还负责内存管理:通过缓存分配器复用显存块,减少反复申请释放的开销。对 ROCm Provider 而言,MIOpen 就是最核心的加速引擎,卷积类算子的绝大多数性能优势都来自这本手册。

S=TbaselineTMIOpenS = \frac{T_{\text{baseline}}}{T_{\text{MIOpen}}}

1. 普通基线耗时:不用手册、现场写通用实现所需的总时间。

TbaselineT_{\text{baseline}}

2. MIOpen 耗时:查手册使用预制优化方案所需的总时间。

TMIOpenT_{\text{MIOpen}}

3. 相除求比值:两者相除得到加速比,衡量手册的「含金量」。

S=TbaselineTMIOpenS = \frac{T_{\text{baseline}}}{T_{\text{MIOpen}}}

MIOpen 的自动调优第一次运行会多花一些时间,但之后就会把最优方案缓存下来,后续推理直接走捷径。前面动画里那些落入 ROCm EP 的绿色小球,之所以比紫色小球跑得更顺畅,靠的就是这本手册在背后发力。

推理部署流程

新店开张,AMD 团队要完整走一遍「接单—备料—施工—验收」的流程。在 ONNX Runtime 中启用 ROCm Provider 也一样:创建推理会话、配置会话选项、指定 providers 优先级、加载模型、运行推理、验证性能。

首先,模型文件通过 InferenceSession 加载,ORT 会解析 ONNX 模型并构建计算图。然后进入图优化阶段:ORT 可以执行常量折叠、算子融合等优化;如果配置了 optimized_model_filepath,还会把优化后的模型导出,方便下次直接加载。随后是 EP 分配:ORT 根据用户传入的 providers 顺序,把每个算子分派给首个支持的 EP——我们把 "ROCmExecutionProvider" 放在最前,CPU 殿后兜底。

设备分配策略也很关键:输入数据是 CPU 侧的内存,要送入 GPU 就需要先拷贝到显存;推理结束后,输出又要拷回主机。数据搬运的时长被计入端到端延迟。因此,实际工程中常通过「热身运行」让显存池与调优缓存先就绪,再开始正式计时,得到更接近稳态的推理性能数据。

Ttotal=Tparse+Topt+Texec+TcopyT_{\text{total}} = T_{\text{parse}} + T_{\text{opt}} + T_{\text{exec}} + T_{\text{copy}}

1. 模型解析耗时:接单后拆解流程表(解析 ONNX 模型结构)的耗时。

TparseT_{\text{parse}}

2. 图优化耗时:流程编排优化(算子融合、布局转换)的耗时。

ToptT_{\text{opt}}

3. 执行耗时:真正在 ROCm EP 上执行算子的 GPU 计算耗时。

TexecT_{\text{exec}}

4. 拷贝耗时:输入输出数据在主机内存与 GPU 显存间搬运的耗时。

TcopyT_{\text{copy}}

部署完成后,工程师通常会对比 CPU EP 与 ROCm EP 的延迟,验证加速比是否达标。值得提醒的是:小模型或 IO 密集场景下,数据拷贝与 kernel 启动开销可能压倒计算收益,这时 GPU 未必比 CPU 快。所以部署流程的最后一步永远是「实测验收」,而不是拍脑袋。

AMD 生态优势

ROCm Provider 之所以是 AMD 平台的首选方案,不只是因为它自带 MIOpen,更因为它身处整个 AMD 生态的中心。AMD 选择了开源路线:ROCm 的多个核心组件在 GitHub 上公开维护,开发者可以查看源码、提交 issue、参与贡献。相比闭源的 CUDA 生态,这更像一座透明开放的公共园区。

原生代码路径是另一大优势:ROCm Provider 不经过任何转译或兼容层,直接调用 ROCm 底层的 HIP 与 MIOpen 接口,避免了中间翻译的开销。随着 AMD 持续迭代 ROCm 版本,EP 也会同步升级算子支持列表、引入新的图优化策略,让老模型在新生代 GPU 上继续受益。

选型建议可以这样概括:如果企业的推理服务器选用 AMD GPU,ROCm Provider 就是第一选择;如果模型算子覆盖率高、计算密集,加速收益尤其明显;如果模型非常小或算子很冷门,则要结合 CPU EP 兜底策略综合评估。

Coverage=∣{op∈模型:op∈EP 支持表}∣∣{op∈模型}∣\text{Coverage} = \frac{|\{ op \in \text{模型} : op \in \text{EP 支持表} \}|}{|\{ op \in \text{模型} \}|}

1. 分子——被支持算子数:模型中能被 ROCm EP 直接认领的算子总个数。

∣{op∈模型:op∈EP 支持表}∣|\{ op \in \text{模型} : op \in \text{EP 支持表} \}|

2. 分母——全部算子数:模型中所有算子的总个数。

∣{op∈模型}∣|\{ op \in \text{模型} \}|

3. 覆盖率比值:两者相除,得到 0 到 1 之间的覆盖率数值。

Coverage=支持数总数\text{Coverage} = \frac{\text{支持数}}{\text{总数}}

把 ROCm Provider 放在 AMD 生态的大棋盘上看:它是 ONNX Runtime 与 AMD GPU 之间最短的那座桥。桥面越宽(算子覆盖越全)、桥墩越稳(ROCm 平台越成熟),模型在 AMD 上跑得就越快。对于 AI 基础设施工程师来说,理解这座桥的建造原理,才能在 AMD 平台上做出有底气的部署决策。

AI 应用场景

医学影像诊断的 AMD 服务器部署

阶段:模型部署与推理

解决的问题:医院采购了基于 AMD EPYC 处理器与 Radeon PRO GPU 的推理服务器,传统 CUDA 方案完全无法使用,需要一种能在 AMD 硬件上高效运行 ONNX 模型的方式。ROCm Provider 让团队无需更换硬件,直接完成 GPU 推理加速。

具体案例:某医疗 AI 公司把肺部 CT 结节分割模型导出为 ONNX 格式,在 AMD 服务器上配置 providers=["ROCmExecutionProvider", "CPUExecutionProvider"],启用 MIOpen 自动调优后,单张 CT 切片推理延迟从 CPU 的 820ms 降至 65ms,满足临床实时辅助诊断要求。

云端 AMD 实例上的内容审核服务

阶段:在线服务推理

解决的问题:云厂商提供价格更低的 AMD GPU 实例,但传统部署方案默认面向 NVIDIA。ROCm Provider 使团队可以在 AMD 实例上复用已有 ONNX 模型,把推理成本降低约 30%。

具体案例:某电商平台在 AMD GPU 云实例上部署违规图片分类模型,使用 ONNX Runtime 的 ROCm EP 处理峰值每秒数百张图片的审核请求,并通过 graph_optimization_level=ORT_ENABLE_ALL 开启全量图优化,进一步降低单次推理耗时。

工业质检的 AMD 边缘盒子

阶段:边缘推理

解决的问题:工业现场部署小型 AMD APU 边缘设备做实时缺陷检测,资源受限、不能依赖云端 GPU。ROCm Provider 的轻量原生路径让 YOLO 类检测模型在边缘端也能吃到 GPU 加速红利。

具体案例:某制造企业用内置 Radeon 核显的 AMD 工控机运行零件表面缺陷检测模型,ROCm EP 将推理帧率从 CPU 的 3 FPS 提升到 28 FPS,实现在线全检。

Python 演示

python31 行
import onnxruntime as ortimport numpy as npimport time # 1. 检查当前环境可用的执行提供者print("可用 EP:", ort.get_available_providers()) # 2. 配置会话,打开全量图优化so = ort.SessionOptions()so.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALLso.optimized_model_filepath = "optimized_model.onnx" # 3. 创建会话:优先使用 ROCm EP,CPU 兜底sess = ort.InferenceSession(    "resnet50.onnx",    sess_options=so,    providers=["ROCmExecutionProvider", "CPUExecutionProvider"]) # 4. 构造模拟输入并热身input_name = sess.get_inputs()[0].namex = np.random.randn(1, 3, 224, 224).astype(np.float32)for _ in range(5):    sess.run(None, {input_name: x}) # 5. 正式计时,计算平均推理耗时t0 = time.perf_counter()for _ in range(50):    sess.run(None, {input_name: x})dt = (time.perf_counter() - t0) / 50print("平均推理耗时: {:.2f} ms".format(dt * 1000))
目的:这段代码演示了如何检查环境中的可用执行提供者、配置 ONNX Runtime 会话、优先启用 ROCm EP 并在 AMD GPU 上完成一次完整的模型推理与耗时统计。
  1. print("可用 EP:", ort.get_available_providers())打印当前环境支持哪些执行提供者,确认 ROCm 是否就位
  2. so.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL开启全量图优化,让 ORT 做算子融合与布局优化
  3. so.optimized_model_filepath = "optimized_model.onnx"导出优化后的模型,下次可直接复用
  4. providers=["ROCmExecutionProvider", "CPUExecutionProvider"]把 ROCm EP 放在最前面,CPU EP 作为不支持算子的兜底
  5. sess.get_inputs()[0].name获取模型的输入张量名,用于构造推理输入
  6. np.random.randn(1, 3, 224, 224).astype(np.float32)生成一张符合 ResNet 输入的随机图片数据
  7. for _ in range(5): sess.run(...)热身循环,触发 MIOpen 自动调优与显存池初始化
  8. time.perf_counter()使用高精度计时器统计推理耗时
  9. sess.run(None, {input_name: x})执行一次端到端推理,返回模型输出列表

常见误区

误区我只要在 ONNX Runtime 里把 `ROCmExecutionProvider` 加到 providers 列表里,模型就能在 AMD GPU 上跑起来,其他什么都不用装。

正解ROCm Provider 只是 ONNX Runtime 里的「本地执行团队」,它必须站在 ROCm 平台之上——GPU 驱动、ROCm runtime、MIOpen 库都得预先安装配置好,EP 才有工具可用。就像新店挂了牌,但水电管道还没通,一样没法营业。实践中的正确顺序是:先装好 ROCm 全套软件栈,再确认 ort.get_available_providers() 中出现 ROCm,最后才谈得上加速。

为何常见:EP 名字里带「ROCm」,容易让人以为装上它就自带了 AMD 的整套软件栈,实际上 EP 只是 ROCm 的使用者。

误区ROCm 是 AMD 的专有闭源软件,里面实现细节用户根本看不到,性能好坏只能听官方宣传。

正解恰恰相反,ROCm 的核心组件(ROCclr、HIP、编译器前端等)都是开源的,AMD 在 GitHub 上公开维护整个仓库群。开发者完全可以去翻阅源码,理解底层 kernel 的调度逻辑,甚至参与贡献。它不是神秘黑盒,而是贴着施工图的透明工地。

为何常见:大家习惯拿 ROCm 与 CUDA 对比,而 CUDA 长期闭源,容易凭印象把「AMD 版 CUDA」也想象成闭源黑盒。

误区ROCm Provider 的职责就是一个「翻译官」,把 ONNX 算子名对应成 AMD kernel 名而已,没什么技术含量。

正解远不止翻译。EP 内部要做算子注册检查、图优化(算子融合、布局转换)、内存策划、执行流调度,还要调 MIOpen 做自动调优。翻译只是万里长征第一步,后面整套「本地化深耕」才是加速效果的大头。一个算子在 GPU 上能不能快,取决于 kernel 是否融合、显存是否复用、算法是否经过自动调优。

为何常见:EP 的名字叫「执行提供者」,字面意思容易让人以为它只是提供一个执行入口,忽略了背后复杂的适配工程。

误区我的机器是 AMD 显卡,那推理只能在 ROCm EP 上跑,其他 EP 全都用不了。

正解EP 是插件化机制,多个 EP 可以在同一个会话中共存。AMD GPU 机器上同样有 CPU EP 兜底,也可以注册其他专有 EP。ROCm Provider 只是把 AMD GPU 用起来的首选方案,而不是唯一方案。就像一家公司可以同时有多家供应商,本地王牌团队是首选,但不代表其他团队不能干活。

为何常见:介绍 ROCm Provider 时总强调它是「AMD 平台首选」,读者容易在潜意识里把它理解成「唯一」。

误区只要启用了 ROCm EP,任何模型在 AMD GPU 上都会获得巨大加速,比如轻松十倍速。

正解加速幅度取决于三个前提:算子覆盖率、计算强度和数据搬运占比。小模型、算子大量不支持、或 IO 密集场景下,GPU 可能跑不过 CPU——因为每次 kernel 启动和数据搬运都有固定开销。就像让王牌团队去干一单「打个电话就完事」的小活,反而比跑腿更慢。正确的姿势是:实测对比,用数据说话。

为何常见:厂商宣传材料都在晒大模型加速倍数,读者很难意识到「加速是有前提条件的」。

面试题

Q1. ONNX Runtime 中「执行提供者(EP)」的核心职责是什么?

单选题 · easy

  • A.把计算图算子落到底层硬件上执行← 正确答案
  • B.负责模型训练阶段的数据增强
  • C.编译 ONNX 模型的源代码文件
  • D.存储训练好的模型权重参数

答案:A。EP 就是「本地执行团队」,负责把 ONNX 计算图上的算子映射到具体硬件上执行。B 是训练流程的事,C 和 D 都属于模型构建与存储环节,都不是 EP 的职责。

Q2. ROCm Provider 主要服务于哪一类硬件平台?

单选题 · easy

  • A.英特尔 CPU 平台
  • B.NVIDIA GPU 平台
  • C.AMD GPU 平台← 正确答案
  • D.华为昇腾 NPU 平台

答案:C。ROCm Provider 是 AMD 领地的本地执行团队,底层依赖 ROCm 平台,面向 AMD GPU 提供推理加速。NVIDIA 平台对应 CUDA EP,昇腾平台则对应专门的 Ascend EP。

Q3. MIOpen 在 ROCm Provider 中扮演的角色类似于下列哪一项?

单选题 · easy

  • A.芯片厂商的显卡驱动
  • B.深度学习的算子加速库← 正确答案
  • C.操作系统内核组件
  • D.模型训练的损失函数

答案:B。MIOpen 是 AMD 的深度学习加速库,相当于「常用任务速查手册」,为卷积等算子提供调优后的高效实现,类似 NVIDIA 生态中的 cuDNN。显卡驱动是 ROCm 的更底层组件,与 MIOpen 不是一回事。

Q4. 在 ONNX Runtime 中启用 ROCm EP 并允许 CPU 兜底的正确代码是?

单选题 · mid

  • A.providers 传 ROCm 优先列表← 正确答案
  • B.providers 传 CUDA 优先列表
  • C.device 参数指定为 AMD 平台
  • D.使用 CUDA EP 再自动回退

答案:A。正确写法是 providers=["ROCmExecutionProvider", "CPUExecutionProvider"],把 ROCm 放最前、CPU 殿后。CUDA 优先列表针对 NVIDIA 平台,device 参数和 CUDA 回退都不是 ONNX Runtime 的标准用法。

Q5. 当模型中某个算子在 ROCm EP 中不受支持时,ONNX Runtime 通常会怎么处理?

单选题 · mid

  • A.直接报错并终止整个推理
  • B.自动回退到其他可用 EP 执行← 正确答案
  • C.跳过该算子不执行该计算
  • D.用随机数替代该算子的输出

答案:B。ORT 的多 EP 协作机制会按 providers 顺序逐个尝试,当前 EP 不支持的算子会自动落到下一个 EP(通常是 CPU EP),保证推理流程不中断。直接报错会让部署太脆弱,跳过或随机替代则会破坏计算结果。

Q6. 下列哪一项正确描述了 ROCm 平台的核心组成?

单选题 · mid

  • A.CUDA 工具包加 TensorRT 引擎
  • B.HIP 编程模型与编译器运行时← 正确答案
  • C.cuDNN 库加 NCCL 通信库
  • D.TensorFlow 加 PyTorch 框架

答案:B。ROCm 软件栈由 HIP 语言、编译器、Runtime 和工具链组成。A 和 C 都是 NVIDIA 生态组件,D 是上层深度学习框架,不属于 ROCm 平台本身。

Q7. 算子融合(Op Fusion)在 ROCm EP 中能带来性能提升的根本原因是什么?

单选题 · hard

  • A.减少多次 kernel 的启动开销← 正确答案
  • B.压缩模型权重以减小体积
  • C.让算子在不同 EP 间自动迁移
  • D.把多个模型合并成一个模型

答案:A。每次 kernel 启动都有固定开销,融合把多个连续算子合并成一个 kernel,减少启动次数与中间数据落盘。B 属于模型压缩,C 属于 EP 调度,D 是模型合并,都与算子融合无关。

Q8. 关于 ROCm Provider,下列说法正确的是哪些?

多选题 · mid

  • A.是运行时插件式组件← 正确答案
  • B.需要底层平台依赖支持← 正确答案
  • C.是 AMD 平台专用方案← 正确答案
  • D.只能安装在 Windows 系统上

答案:ABC。ROCm Provider 是 ONNX Runtime 的插件式 EP,需要底层 ROCm 平台(驱动、Runtime、MIOpen)支持,面向 AMD GPU 专用。D 错误:ROCm 的主流支持平台是 Linux,Windows 支持有限。

Q9. 启用 ROCm EP 后,哪些因素会明显影响最终推理加速效果?

多选题 · hard

  • A.算子是否全部被 EP 支持← 正确答案
  • B.主机与设备间的数据搬运次数← 正确答案
  • C.模型算子的融合机会多少← 正确答案
  • D.训练数据集的规模大小

答案:ABC。算子覆盖率决定 GPU 参与度,数据搬运决定 IO 开销,融合机会决定 kernel 启动次数,三者直接决定加速效果。训练集规模属于训练阶段因素,与推理部署性能无关。

Q10. 关于 MIOpen 的自动调优机制,下列说法正确的是哪些?

多选题 · extreme

  • A.运行多种算法变体并逐测速← 正确答案
  • B.为 GPU 型号选择最优卷积实现← 正确答案
  • C.调优结果可以缓存复用← 正确答案
  • D.调优过程不占用额外显存

答案:ABC。MIOpen 自动调优会运行候选算法并测速,选出当前 GPU 上最快的实现并缓存。D 错误:调优时多个算法变体同时常驻显存,会占用额外显存,因此通常只在首次运行时触发。