假设你是一家城市货运公司的调度总监。每天清晨,系统里会涌入一批“AI 包裹”——它们不是普通货物,而是一张张送货路线图(也就是神经网络模型)。你的职责,是决定每一段路派哪支车队去跑:有的路适合高速电车(GPU),有的路只能靠灵活的小三轮(CPU),还有的路必须交给特种车队才能发挥极致速度。选对了,整批货几分钟送完;选错了,车队堵在路上,客户怨声载道。 在 AI 世界里,ONNX Runtime 就是那位调度中枢,计算图是送货路线图,而“执行提供者”(Execution Provider,简称 EP)就是一支支风格迥异的车队。CUDA 是 NVIDIA 芯片专属的高速车队,TensorRT 是经过深度改装的专业车队,CoreML 擅长在苹果设备上穿梭,DirectML 则是 Windows 平台上的全地形车。本文要讲的“EP 选择策略”,就是调度总监的选车智慧:如何根据硬件环境、算子支持情况、精度要求和部署限制,为推理任务挑选最合适的执行阵容,让模型在每一个客户现场都跑得又快又稳。

岗位关联

掌握 EP 选择策略,是 AI 部署工程师的必修课:你能让同一个模型在不同硬件上自动匹配最优执行后端,推理性能提升数倍到数十倍,这是从“能跑”到“跑得快”的关键一跃。

目录
  1. 可视化演示
  2. EP机制认知:分派单背后的规则
  3. 主流EP盘点:认识你的四支车队
  4. 性能对比基准:给车队掐秒表
  5. 选择决策因素:调度决策手册
  6. 回退策略设计:应急预案不能少
  7. 最佳实践流程:调度总监的作战手册
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

交互式展示ONNX Runtime执行提供者(EP)选择机制:路由模式展示算子如何分配到CUDA/TensorRT/CPU等EP执行,性能模式对比各EP的推理延迟和吞吐量,切换模式查看EP回退策略与混合执行。

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

EP算子路由机制 ONNX模型算子按EP优先级分配,TensorRT优先于CUDA优先于CPU 不支持的算子自动回退到下一级EP,保证模型完整执行 EP_priority: TRT > CUDA > CPU EP按优先级分配算子

EP机制认知:分派单背后的规则

调度中心墙上贴着一张巨大的城市送货路线图,每条街、每个路口都画得清清楚楚。你手下有十几支车队,但每一支车队能跑的路段各不相同:有的只上高速,有的只能在老城区小巷里穿行。每天收到新包裹时,你的第一项工作不是急着发车,而是对着路线图做“路段切分”——把一整条送货路线拆成一段段,再标注每段路适合哪支车队。

这就是 ONNX Runtime 里 EP 机制的核心。模型被表示成一张计算图(Computation Graph),每个运算(卷积、矩阵乘法、激活函数)就像路线图上的一个路段节点。ONNX Runtime 负责把整张计算图切分成若干子图,然后为每个子图分配一个执行提供者——也就是一段路的承运车队。这个“切分 + 分配”的过程叫作图分区(Graph Partitioning),它是整个 EP 机制的地基。

在实际代码里,我们创建推理会话(InferenceSession)时传入 providers 参数,列表的顺序就是车队的优先级:排得越靠前的 EP 越先承接子图,剩下的算子自动交给 CPU 兜底。比如 providers=['TensorrtExecutionProvider', 'CUDAExecutionProvider', 'CPUExecutionProvider'],表示优先让 TensorRT 接单,接不了的路段给 CUDA,最后剩余路段全部交给 CPU。会话注册 API 就是这张派单表的填写入口。

这张派单表一旦确定,调度中心就按表发车:能上高速的绝不堵在小巷,能抄近道的绝不绕远路。而你要做的,就是把这张派单表排得足够聪明——这正是后面几节要讲的选车学问。

f:G→EP,G={n1,n2,…,nk}f: G \rightarrow EP, \quad G = \{n_1, n_2, \ldots, n_k\}
这个公式说的是:把整张计算图 G 中的每个算子节点 n\_j,映射到某一个执行提供者 EP 上执行。
  1. 计算图 G 的构成模型被拆解成的算子节点集合,好比送货路线图上所有路段的总和。
    G={n1,n2,…,nk}G = \{n_1, n_2, \ldots, n_k\}
  2. 分配函数 f 的定义把每个算子节点映射到某个执行提供者的派单规则。
    f:G→EPf: G \rightarrow EP
  3. 目标集合 EP所有可用的执行提供者组成的集合。某个 EP 能承接的算子越多,它分走的路段就越多。
    EP∈{CUDA,TensorRT,CoreML,DirectML,CPU}EP \in \{\text{CUDA}, \text{TensorRT}, \text{CoreML}, \text{DirectML}, \text{CPU}\}

主流EP盘点:认识你的四支车队

你手下的车队各有性格。第一支是 NVIDIA 专属的“高速电车车队”(CUDA),只要显卡是 N 家的,它就能把大部分路段跑得飞快;第二支是“赛道改装车队”(TensorRT),同样只服务 NVIDIA 显卡,但经过深度调校,能把弯道、坡道都优化到极致;第三支是“苹果园区小三轮”(CoreML),在 iPhone、Mac 上灵巧穿梭;第四支是“Windows 全地形越野车”(DirectML),不挑路况,只要是 Windows 系统的显卡它都能跑。

对应到 ONNX Runtime,这四个名字分别是 CUDAExecutionProvider、TensorrtExecutionProvider、CoreMLExecutionProvider、DirectMLExecutionProvider。每一个 EP 都是一个独立的执行后端,它实现了针对特定硬件优化过的算子内核,把 ONNX 模型的计算真正映射到硬件上跑起来。它们的存在让“一份模型,多端运行”成为可能。

四种 EP 的定位差异很大:CUDA EP 覆盖面广、上手快,是 NVIDIA GPU 上的通用选择;TensorRT EP 在 CUDA 基础上做了层融合、内核自动调优、FP16/INT8 量化,推理延迟通常最低,但构建引擎需要额外时间,算子兼容范围也更严格;CoreML EP 在苹果生态内调用神经引擎(ANE)和 GPU,是 iOS/macOS 部署的首选;DirectML 是 Windows 平台上跨厂商(NVIDIA/AMD/Intel)的通用方案,兼容性最强,但单点性能通常不如专属 EP。

四支车队各有所长,但要在实战中选谁,不能听销售吹牛,得拉出来实际跑一跑、测一测——这正是调度总监的“赛车计时器”要做的事。

S=TCPUTEPS = \frac{T_{\text{CPU}}}{T_{\text{EP}}}
加速比 S 表示某个 EP 相对 CPU 的提速倍数。数值越大,说明这支车队相对普通货车快得越多。
  1. 基准耗时同一模型只在 CPU 上推理的平均延迟,相当于普通货车的标准送货时间。
    TCPUT_{\text{CPU}}
  2. EP 推理耗时同一模型仅挂在某个执行提供者上推理的平均延迟。
    TEPT_{\text{EP}}
  3. 加速比计算两者相除,得到“快了几倍”的量化结果。
    S=TCPU/TEPS = T_{\text{CPU}} / T_{\text{EP}}

性能对比基准:给车队掐秒表

车队到底谁快,调度总监从不听宣传册,而是亲自拿秒表在封闭路段计时。同一批货、同一条路线,让每支车队分别跑一趟,记录送达时间;再让它们在高峰期连续跑一小时,数一数各自送了多少单。有了这些数字,选谁不选谁就有了底气。

在 AI 部署里,这个“掐秒表”就是基准测试(Benchmark)。两个最核心的指标是延迟(Latency)和吞吐量(Throughput)。延迟是单次推理从输入到输出的毫秒耗时,对应单趟送货时间;吞吐量是单位时间内能完成的推理次数(比如每秒处理多少张图片),对应高峰期的送货单量。

性能对比不能只看一两次数据,因为 GPU 有冷启动、CPU 有频率波动,单次测量噪声很大。行业惯例是先预热几次再计时,然后跑多轮取中位数或平均值。另外要区分同步推理和批量推理:批量推理把多张输入打包一起送,GPU 利用率更高、吞吐量显著提升,但单次延迟可能略有增加。加速比 S 是直观参考,但最终判断必须以真实业务负载的实测数据为准。

有了秒表数据,你就能把四支车队的能力画成一张对比表,谁适合单件快送、谁适合批量搬运,一目了然。但“快”不是唯一标准,接下来还得看任务本身的要求。

TPS=NTtotalTPS = \frac{N}{T_{\text{total}}}
吞吐量 TPS 表示在总时长 T\_total 内完成了 N 次推理,衡量的是车队的批量送货能力。
  1. 推理次数 N一次基准测试中完成的推理总次数,相当于数清楚车队一共送了多少单。
    NN
  2. 总耗时从第一次推理开始到最后一次结束的总时长,通常不含预热阶段。
    TtotalT_{\text{total}}
  3. 相除得到吞吐量每秒能完成的推理次数,数值越高说明批量处理能力越强。
    TPS=N/TtotalTPS = N / T_{\text{total}}

选择决策因素:调度决策手册

选车队不能只看快。如果客户的目的地在老城区,赛道改装车再快也进不去;如果客户要求货物不能颠簸(对精度敏感),那些爱抄近道、急刹车的车队就得慎重;如果客户现场连充电桩都没有,纯电车再环保也白搭。每个场景都有自己的约束条件。

对应到 EP 选择,四个核心决策因素是:硬件类型、算子支持度、精度要求、部署限制。硬件类型决定了可选 EP 的集合——NVIDIA 显卡才能用 CUDA/TensorRT,苹果设备才有 CoreML;算子支持度决定了模型能否完整交给某个 EP——如果某个算子不在 TensorRT 的实现清单里,相关子图就只能整体回退或换用 CUDA。

精度要求影响你能否启用 FP16/INT8 等低精度优化:TensorRT 的 INT8 需要专门的校准数据集,精度可能轻微下降,视觉模型尚且可接受,但在医疗、金融等场景必须谨慎评估。部署限制包括安装包体积、驱动依赖、离线环境等:TensorRT 引擎构建需要 GPU 环境,有些客户现场不允许;DirectML 则几乎没有额外依赖。实践中最科学的做法,是把这些维度量化打分、乘以权重后求和。

这份加权评分表,就是调度总监的“选车决策手册”。手册在手,任何新情况来了都能快速算出最优解。不过,最优方案也有临时掉链子的时候,应急预案同样不能少。

Score(EP)=∑i=1nwi×si\text{Score}(EP) = \sum_{i=1}^{n} w_i \times s_i
把性能、兼容性、精度、部署成本等维度各自打分,再按业务权重加权求和,得分最高的 EP 胜出。
  1. 评分维度 s\_i给某个 EP 在当前场景下的表现打分,比如性能 90 分、兼容性 60 分。
    sis_i
  2. 权重 w\_i每个维度对业务的重要程度,所有权重加起来等于 1。
    wiw_i
  3. 加权求和把所有维度的得分与权重相乘后累加,得到一个可排序的综合得分。
    Score(EP)=∑i=1nwi×si\text{Score}(EP) = \sum_{i=1}^{n} w_i \times s_i

回退策略设计:应急预案不能少

再靠谱的车队也有抛锚的时候。某个暴雨天,赛道临时封闭,你立刻掏出应急预案:能跑的路段继续让改装车送,被封的路段马上转给高速电车,电车也进不去的小巷就交给三轮车队。整批货没有停摆,只是部分路段换了个承运方。

这就是 EP 的回退策略(Fallback)。ONNX Runtime 的图分区机制天然支持回退:当某个算子不被首选 EP 支持时,该算子连同它所在的子图会回退到下一个 EP,最终兜底的一定是 CPU。这个过程对上层业务完全透明,模型不会因此报错,但性能会有变化——回退比例越高,加速效果越差。

好的回退策略要分层设计:首选快 EP 承接大部分算子,第二优 EP 承接边缘算子,CPU 只兜底剩余部分。用 providers 列表的顺序就能控制回退层级。需要特别留意的是混合执行时的数据拷贝:GPU 上的算子输出要拷贝回 CPU,才能喂给 CPU 算子,这个拷贝开销在算子频繁交替时会显著拉高延迟。因此应当尽量让回退的子图保持连续,避免“快-慢-快”的碎片化切分。

应急预案的意义不是让每段路都跑得最快,而是让整批货稳妥送达。回退策略设计得越精细,模型在真实环境中的表现就越稳定。

Ltotal=∑nj∈GEPLEP(nj)+∑nj∈GCPULCPU(nj)+LcopyL_{\text{total}} = \sum_{n_j \in G_{\text{EP}}} L_{\text{EP}}(n_j) + \sum_{n_j \in G_{\text{CPU}}} L_{\text{CPU}}(n_j) + L_{\text{copy}}
混合执行的总延迟,等于快 EP 子图的耗时、CPU 回退子图的耗时,再加上两者之间的数据拷贝开销。
  1. 快 EP 子图集合成功分配给首选 EP 的算子集合,这部分跑得最快。
    GEPG_{\text{EP}}
  2. 回退子图集合落到 CPU 兜底的算子集合,这部分速度较慢。
    GCPUG_{\text{CPU}}
  3. 数据拷贝开销算子在 EP 与 CPU 之间传递中间结果的通信成本,是混合执行中隐藏的“时间小偷”。
    LcopyL_{\text{copy}}

最佳实践流程:调度总监的作战手册

一位成熟的调度总监不会等到客户投诉才调整方案,而是有一套固定作战流程:新车队引进后先试跑(基准测试),根据数据定排班(配置优化),运营中持续看监控(监控调优)。这套三步流程,是 EP 选型的通用方法论。

第一步,在目标硬件上用代表性模型和数据跑基准测试,得到各 EP 的延迟、吞吐量数据;第二步,结合决策因素选出最合适的 EP 组合,配置 providers 顺序和 SessionOptions 的图优化级别;第三步,上线后持续监控推理耗时和回退比例,定期复测模型版本与依赖更新带来的性能变化。

实际项目中有两个典型取舍:TensorRT 引擎构建时间长(几分钟到十几分钟),适合服务器端长期驻留的场景,模型频繁更新时 CUDA EP 的部署成本更低;移动端优先选择 CoreML,但要处理模型转换时的算子兼容问题。每一次优化调整,都应当记录基准数据,用可量化的收益说话,而不是凭感觉拍脑袋。

三步流程走下来,你的调度中心就形成了一套可复制的选车方法论。每次新模型进门,不再手忙脚乱,而是胸有成竹地翻开数据、排好车队、持续跟进。

ΔL=Lbefore−LafterLbefore×100%\Delta L = \frac{L_{\text{before}} - L_{\text{after}}}{L_{\text{before}}} \times 100\%
性能收益 ΔL 表示优化前后延迟下降的百分比,用来评估某次 EP 调整是否值得。
  1. 优化前延迟当前方案的推理延迟,比如换 EP 之前是 80ms。
    LbeforeL_{\text{before}}
  2. 优化后延迟更换 EP 组合之后的推理延迟,比如换完变成 30ms。
    LafterL_{\text{after}}
  3. 下降比例二者之差除以原延迟,得到相对收益,方便横向比较不同优化方案。
    ΔL=(Lbefore−Lafter)/Lbefore×100%\Delta L = (L_{\text{before}} - L_{\text{after}}) / L_{\text{before}} \times 100\%

AI 应用场景

云上推理服务自动选型

阶段:模型部署与推理优化

解决的问题:云平台同一套模型要服务不同规格的 GPU 实例,手工调 EP 费时且容易出错。AI 方案在服务启动时自动探测硬件与可用 EP,跑一轮迷你基准测试,按加权得分自动注册最优 EP 组合,并配置 CPU 兜底,全程无需人工干预。

具体案例:某图像识别 SaaS 在 T4 与 A10 混部集群上部署,部署脚本通过 get_available_providers 探测每台实例的能力:T4 实例自动启用 TensorRT 引擎,兼容性要求高的客户实例降级到 CUDA,整体 P99 延迟下降 62%。

移动端多端适配

阶段:端侧推理适配

解决的问题:iOS 和 Android 设备硬件差异大,单一 EP 无法通吃。通过判断运行平台注册对应 EP:iOS 用 CoreML 调用神经引擎,Android 用 CPU 线程池兜底,一套 ONNX 模型覆盖两端。

具体案例:某美颜 App 的实时人像分割模型,在 iPhone 上启用 CoreML EP 后延迟从 45ms 降到 18ms;在 Android 中端机上回退到 CPU 多线程执行,保证可用性的同时不牺牲过多速度。

Python 演示

python57 行
import timeimport numpy as npimport onnxruntime as ort  def probe_providers(model_path, input_data, runs=20):    """探测可用 EP 并对比推理延迟"""    available = ort.get_available_providers()    print('本机可用执行提供者:', available)     # 按优先级排列候选 EP, 只保留当前环境支持的    preference = [        'TensorrtExecutionProvider',        'CUDAExecutionProvider',        'CoreMLExecutionProvider',        'DirectMLExecutionProvider',        'CPUExecutionProvider',    ]    candidates = [ep for ep in preference if ep in available]    if not candidates:        candidates = available     session_options = ort.SessionOptions()    session_options.graph_optimization_level = (        ort.GraphOptimizationLevel.ORT_ENABLE_ALL    )     results = {}    for ep in candidates:        providers = [ep]        if ep != 'CPUExecutionProvider':            providers.append('CPUExecutionProvider')        session = ort.InferenceSession(model_path, session_options,                                       providers=providers)        feed = {session.get_inputs()[0].name: input_data}        # 预热 5 次, 让 GPU 完成初始化        for _ in range(5):            session.run(None, feed)        times = []        for _ in range(runs):            t0 = time.perf_counter()            session.run(None, feed)            times.append((time.perf_counter() - t0) * 1000)        results[ep] = float(np.median(times))        print('  {}: {:.2f} ms'.format(ep, results[ep]))     best = min(results, key=results.get)    cpu_ms = results.get('CPUExecutionProvider', max(results.values()))    speedup = cpu_ms / results[best]    print('推荐 EP: {}, 相对 CPU 加速比: {:.1f}x'.format(best, speedup))    return best  if __name__ == '__main__':    # 将 model.onnx 替换为你自己的模型文件    dummy_input = np.random.rand(1, 3, 224, 224).astype(np.float32)    probe_providers('model.onnx', dummy_input)
目的:在任意机器上自动探测可用 EP,对同一个 ONNX 模型逐个跑基准测试,选出延迟最低的执行提供者并给出相对 CPU 的加速比。
  1. available = ort.get_available_providers()探测本机装了哪些“车队”(EP)。
  2. candidates = [ep for ep in preference if ep in available]按优先级过滤出当前环境真正可用的 EP。
  3. session_options.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL开启全量图优化,让模型先被 ORT 优化一遍。
  4. providers.append('CPUExecutionProvider')给每个被测 EP 配上 CPU 兜底,避免算子不支持时直接报错。
  5. for _ in range(5): session.run(None, feed)预热 5 次,让 GPU 完成初始化,避免首次推理的冷启动噪声。
  6. results[ep] = float(np.median(times))取多轮延迟的中位数,抗抖动、更稳健。
  7. best = min(results, key=results.get)选出延迟最低的 EP,相当于把“秒表冠军”挑出来。
  8. cpu_ms / results[best]用 CPU 延迟除以最优 EP 延迟,得到加速比。

常见误区

误区我把所有 EP 全注册进 providers 列表,让系统自己挑最快的,这样肯定最稳妥。

正解注册顺序即优先级,第一个 EP 会优先承接尽量多的算子。全部注册反而会把模型拆得七零八落,跨 EP 的数据拷贝增多,还会占用多个后端的初始化内存。正确做法是按硬件环境只注册 2-3 个:一个主 EP、一个次选、一个 CPU 兜底。

为何常见:初学者容易把 EP 当成“备选项越多越保险”的插件,忽略了图分区和跨设备拷贝带来的真实开销。

误区TensorRT 也是跑在 NVIDIA 显卡上,跟 CUDA 差不多,不如直接用 CUDA 省事。

正解TensorRT 对计算图做了层融合、内核自动调优和低精度量化,在相同硬件下通常比 CUDA 快 1.5-3 倍。但 TensorRT 构建引擎耗时较长,模型频繁更新时不划算。是否选 TensorRT,要看“构建成本 vs 性能收益”的权衡。

为何常见:没接触过 TensorRT 的层融合机制,把 EP 当成简单的函数调用,忽略了图级优化带来的性能差距。

误区只要服务器有 GPU,我就注册 CUDA EP,推理一定加速。

正解GPU 的优势在大批量、算子密集的场景。小模型、单请求场景下,GPU 内核启动和 CPU 与 GPU 之间的数据拷贝开销可能盖过计算收益,CPU 反而更快。必须用真实数据实测,不能凭感觉下结论。

为何常见:只听说 GPU 并行能力强,忽略了数据搬运和内核启动这些固定开销,尤其在轻量模型上表现明显。

误区模型某个算子没被 GPU EP 支持,ONNX Runtime 会直接报错,这算是部署失败了。

正解ONNX Runtime 默认会把不支持的算子自动回退到 CPU,业务不会中断。大量回退确实会导致性能劣化,但这是正常的容错机制而非异常。部署时应通过日志监控回退比例,若回退过多,再考虑换兼容性更好的 EP 或改造算子。

为何常见:把“回退”理解成错误,没意识到这是 EP 机制内置的分层兜底设计,正是它保证了跨平台可用性。

误区TensorRT 开 FP16/INT8,肉眼看起来差不多,所以所有模型都默认开启就行。

正解FP16 通常影响很小,但 INT8 需要专门的校准数据集,处理不当可能造成精度明显下降,比如分类掉点、检测漏框。必须在验证集上量化评估精度与速度的权衡,再决定是否开启。

为何常见:把“视觉上差不多”等同于“所有指标都达标”,忽视了数值误差在深层网络中可能被放大,也跳过了必要的回归测试。

面试题

Q1. 在 ONNX Runtime 中,执行提供者(EP)的核心作用是什么?

单选题 · easy

  • A.负责编译运行 Python 业务代码
  • B.提供硬件执行后端加速推理← 正确答案
  • C.负责训练深度神经网络模型
  • D.负责存储模型的权重参数

答案:B。EP 是把 ONNX 模型映射到特定硬件执行的后端组件,就像调度中心把送货任务交给不同车队,EP 负责在 GPU/CPU 上把算子真正跑起来。编译 Python 是解释器的事,训练是训练框架的事,存储是文件系统的事,都与 EP 无关。

Q2. 哪个 EP 在 NVIDIA GPU 上通过层融合实现极致推理性能?

单选题 · easy

  • A.CoreMLExecutionProvider
  • B.CPUExecutionProvider
  • C.TensorrtExecutionProvider← 正确答案
  • D.DirectMLExecutionProvider

答案:C。TensorRT 是 NVIDIA 专为自家 GPU 打造的优化引擎,通过层融合、内核自动调优和低精度量化追求极致性能,就像赛道改装车队。CoreML 服务苹果生态,DirectML 面向 Windows 全平台,CPU 是兜底方案。

Q3. 使用 CUDAExecutionProvider 通常需要满足哪些条件?

多选题 · easy

  • A.机器安装有 NVIDIA 显卡← 正确答案
  • B.安装匹配的 CUDA 运行库← 正确答案
  • C.必须同时安装 TensorRT
  • D.模型必须是 INT8 量化模型

答案:AB。CUDA EP 依赖 NVIDIA GPU 和配套的 CUDA/cuDNN 运行环境。TensorRT 是可选的另一个独立 EP,不是 CUDA 的前置条件;INT8 量化也不是必须的,FP32 和 FP16 都能正常在 CUDA 上推理。

Q4. 在苹果 iPhone 上部署 ONNX 模型,最匹配的 EP 是?

单选题 · mid

  • A.CoreMLExecutionProvider← 正确答案
  • B.TensorrtExecutionProvider
  • C.DirectMLExecutionProvider
  • D.OpenVINOExecutionProvider

答案:A。CoreML 是苹果生态的原生推理引擎,能调用 iPhone 的神经引擎和 GPU,延迟最低、功耗最优。TensorRT 只支持 NVIDIA GPU,DirectML 面向 Windows,OpenVINO 面向 Intel 平台,在 iPhone 上都无法发挥作用。

Q5. 某算子不被首选 GPU EP 支持时,ONNX Runtime 的默认行为是?

单选题 · mid

  • A.直接抛出异常终止推理
  • B.自动回退到 CPU 执行该算子← 正确答案
  • C.跳过该算子不参与计算
  • D.随机替换为常数参与计算

答案:B。ONNX Runtime 的图分区机制天然支持回退:不支持的算子连同其子图自动交给下一个 EP,最终兜底是 CPU,业务不会中断。跳过算子或替换常数都会破坏计算结果,直接报错则违背了 EP 的容错设计初衷。

Q6. 创建 InferenceSession 时传入的 providers 列表顺序代表什么?

单选题 · mid

  • A.列表顺序即优先级从高到低← 正确答案
  • B.列表按字母顺序自动排序
  • C.运行时随机挑选一个后端
  • D.所有后端同时并行执行模型

答案:A。providers 列表的顺序就是调度优先级,排在前面的 EP 优先承接子图,接不了的部分才依次往后传递。这一点和“排班表”类似:越靠前的车队越先接单。ORT 不会自动排序,更不会并行执行多个后端。

Q7. 以下哪些属于 EP 选择时的关键决策因素?

多选题 · mid

  • A.目标硬件的类型与算力← 正确答案
  • B.模型算子的支持覆盖度← 正确答案
  • C.开发机操作系统的桌面主题
  • D.部署环境的精度与依赖限制← 正确答案

答案:ABD。硬件类型决定可用 EP 集合,算子支持度决定模型能否完整交给某个 EP,精度与依赖限制决定能否启用低精度优化和具体部署方式。桌面主题与推理性能毫无关系,纯属干扰项。

Q8. TensorRT 相比普通 CUDA 推理性能更高的主要原因是什么?

单选题 · hard

  • A.支持了更多操作系统平台
  • B.层融合与精度校准降低开销← 正确答案
  • C.完全不需要 NVIDIA 显卡支持
  • D.自动降低模型所有权重的精度

答案:B。TensorRT 通过层融合减少内核启动次数、用精度校准在可接受误差内启用 FP16/INT8,从而大幅降低计算开销,类似赛道改装车对每个弯道做专项优化。它同样需要 NVIDIA 显卡,支持平台也不比 CUDA 更广。

Q9. 关于 EP 回退与混合执行,下列说法正确的是?

多选题 · hard

  • A.一个模型可以混合使用多个 EP← 正确答案
  • B.不支持的算子会自动回退到 CPU← 正确答案
  • C.回退后模型精度必然明显下降
  • D.跨 EP 的中间数据拷贝会带来开销← 正确答案

答案:ABD。图分区机制允许不同子图挂在不同 EP 上,这是混合执行的基础;不支持的算子自动回退 CPU 是默认行为;跨 EP 传数据必然有拷贝开销,算子频繁交替时尤为明显。回退本身不改变数值精度(除非启用了低精度优化),所以“必然明显下降”是错误的。

Q10. 使用 TensorRT 的 INT8 精度校准时,对模型精度的影响通常是?

单选题 · extreme

  • A.精度没有任何变化
  • B.精度可能出现轻微下降← 正确答案
  • C.精度必然大幅下降
  • D.精度必然会有所提升

答案:B。INT8 把权重和激活从 FP32 压缩到 8 位整数,量化误差通常导致精度轻微下降,但通过精心选择校准数据集可以控制在可接受范围。说“没有任何变化”过于绝对,“必然大幅下降”忽略了校准的作用,“必然提升”则完全违背常识。