让AI编译器像大厨一样自动寻找最佳配方,AutoTVM就是那位不知疲倦的“试菜师”。传统编译器优化靠专家手工调参,而AutoTVM把这件事变成了系统化的自动搜索:先划定一个“做菜手法的组合空间”,再用机器学习模型“闻香预判”哪张菜谱可能好吃,最后在真实灶台上反复实测,用有限的预算换取最优性能。这篇讲解将以“大厨研发招牌菜”作为贯穿比喻,帮你拆解调优空间、代价模型、搜索策略、测量调度四个核心模块,看清一条从“手工调参”走向“自动寻优”的完整链路。

岗位关联

对AI从业者而言,AutoTVM是打通“算法模型—硬件落地”的关键一环。掌握了它的设计思路,你就能让模型在不同芯片上自动达到最佳性能,把宝贵精力从手工调参中解放出来,真正理解深度学习编译器的现代优化范式。

目录
  1. 可视化演示
  2. 调优空间定义
  3. 代价模型预测
  4. 搜索算法策略
  5. 测量与任务调度
  6. 逐层调优流程
  7. TVM集成落地
  8. 实际应用与收益
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示AutoTVM自动调优器设计的核心机制,通过概览/流程/对比/趋势四种模式展示关键概念与交互流程。

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

AutoTVM自动调优器设计:Auto AutoTVM整体架构与调优流 调优空间设计与Schedule 核心机制可视化 AutoTVM自动调优器设计整体架构与关键组件

调优空间定义

一家餐厅的后厨里,大厨想研发一道招牌菜。同样的食材,切成丝还是块?大火爆炒还是小火慢炖?这些“手法选项”组合起来,就是一张张菜谱;所有菜谱汇总起来,就形成了一个“配方空间”。AutoTVM要做的事,就是在这片空间里找出最好吃(性能最优)的那一张菜谱。

在TVM中,“食材”是算子(如卷积、矩阵乘),“做菜手法”是调度(schedule)——分块大小(tile size)、循环展开(unroll)、向量化(vectorize)等。模板(template)把“可变手法”留成参数,例如分块大小取8或16、展开因子取2或4。每一个参数组合,都是一个具体的调度配置(config)。把这些参数写进模板,就生成了调优空间。

调优空间的大小由参数维度的乘积决定。假设某算子模板有 $\text{tile}$ 的3种取值、$\text{unroll}$ 的2种取值、$\text{vector}$ 的2种取值,则总配置数为:

真实算子的参数远不止3个,配置数常达数十万甚至百万级。这就像菜谱组合爆炸——大厨不可能逐一试完所有做法,必须靠聪明的搜索策略。AutoTVM的调优空间设计,就是给后续所有智能方法划出舞台边界。

Nconfig=∏i=1kni=3×2×2=12N_{\text{config}}=\prod_{i=1}^{k} n_i=3\times 2\times 2=12
配置总数等于各维度可选数量的连乘:维度越多、每维可选值越多,空间就呈指数膨胀。
  1. 配置总数 $N_{\text{config}}$表示调优空间里全部候选方案的数量,也就是所有参数组合的总个数。
    Nconfig=∏i=1kniN_{\text{config}}=\prod_{i=1}^{k} n_i
  2. 维度数量 $k$模板中可变参数的个数,比如分块大小、展开因子、向量宽度各算一个维度。
    k=3k=3
  3. 每维可选值 $n_i$第 $i$ 个参数有多少种选择,把所有维度连乘,就得到总配置数。
    3×2×2=123\times 2\times 2=12

代价模型预测

菜谱有上万张,大厨难道要每张都炒一遍再尝?当然不。老厨师凭经验看到“火候参数+食材状态”,就能预判七八分味道。AutoTVM里的代价模型(cost model),就是这样一个“有经验的老食客”。

代价模型是机器学习回归器,输入是配置特征——包括算子本身的形状(如输入通道数、输出通道数)、模板参数、硬件特性(如缓存大小、核数),输出是预测执行时间(或吞吐量)。AutoTVM使用XGBoost或神经网络作为底层模型,训练数据来自真实硬件上的测量结果:测过的配置越多,模型“味觉”越准,这正是“离线训练、在线推理”的闭环。

代价模型打分可以写成一个加权求和形式:

代价模型虽然不能替代真实测量,却能以极低成本给所有配置预打分、做粗筛。AutoTVM把“直觉预测”和“真实品尝”结合起来:先用模型筛出有潜力的候选,再送进真实硬件验证,大大节省调优时间。

t^=∑j=1mwj⋅fj(config,hardware)\hat{t}=\sum_{j=1}^{m} w_j \cdot f_j(\text{config}, \text{hardware})
预测耗时为各特征项加权之和:模型从历史测量中学习出每个特征对性能的影响权重。
  1. 预测值 $\hat{t}$代价模型对某个配置给出的估计耗时,数值越小代表预测性能越好。
    t^=∑j=1mwj⋅fj\hat{t}=\sum_{j=1}^{m} w_j \cdot f_j
  2. 特征函数 $f_j$第 $j$ 个特征的取值函数,例如输入尺寸、tile大小、目标的并行度等。
    fj(config,hardware)f_j(\text{config}, \text{hardware})
  3. 权重 $w_j$模型训练出的特征权重,代表该特征对最终耗时的影响程度;权重越大,该特征越关键。
    wjw_j

搜索算法策略

有了配方空间和预判工具,接下来就是“怎么找”。最简单是随机搜索——像闭着眼睛在菜谱堆里抽签,虽然可能踩中好菜,但效率太低。爬山算法则像只往“比当前更香”的方向走,容易困在局部最优——比如只找到了“多放糖”的甜口高峰,却错过了“加辣”的更好顶点。

AutoTVM更常用模拟退火(simulated annealing):它在爬山的基础上,允许偶尔接受“暂时变差”的方案,就像大厨偶尔尝试看似奇怪的搭配,说不定能意外开辟新风味。接受较差解的概率由温差控制,随着搜索推进,温度逐渐降低,行为也越来越接近贪心。

模拟退火的接受概率公式:

在这一节里,探索与利用被巧妙平衡:前期像年轻人一样大胆尝鲜,后期像老师傅一样谨慎微调。AutoTVM的搜索器(如XGBTuner、RelaXDynTuner)还会结合真实测量反馈模型,让每一次尝试都比上一次更聪明。

Paccept=exp⁡(−ΔETcur)P_{\text{accept}}=\exp\left(-\frac{\Delta E}{T_{\text{cur}}}\right)
新配置比当前配置好多少(或差多少)决定接受概率:差距越小、温度越高,越容易接受“次优解”,以此跳出局部最优。
  1. 接受概率 $P_{\text{accept}}$面对一个新候选配置时,选择“接受它并移动过去”的概率。
    Paccept=exp⁡(−ΔE/Tcur)P_{\text{accept}}=\exp(-{\Delta E}/{T_{\text{cur}}})
  2. 性能差 $\Delta E$新配置与当前配置的预测耗时之差。$\Delta E>0$ 表示新方案更差,接受概率小于1。
    ΔE=t^new−t^cur\Delta E=\hat{t}_{\text{new}}-\hat{t}_{\text{cur}}
  3. 当前温度 $T_{\text{cur}}$模拟退火的“温度”参数,随迭代递减。温度高时接受差解的概率大,温度低时算法趋近于普通爬山。
    Tcur→0T_{\text{cur}} \to 0

测量与任务调度

搜索算法提出的候选配置,最终必须接受真实硬件的检验——这就是“试菜”环节。AutoTVM会把配置编译成可执行代码,放到目标芯片(GPU/CPU)上运行,记录真实耗时。

真实测量有两个麻烦:一是环境噪声,后台进程或温度波动都会干扰计时;二是时间成本,编译和运行一个算子常常需要数秒。AutoTVM采取“多次运行取中位数”来抵抗噪声,同时用并行调度(多个worker同时测不同配置)来摊薄成本。测量结果会被喂回代价模型,形成“预测—筛选—测量—再预测”的自我强化回路。

测量折算公式:

时间预算控制也是关键:调优器不会无限测下去,工程师设定总预算(如“最多测400个配置”或“最多跑30分钟”)。预算快耗尽时,搜索器会选择更安全的局部微调,而不是大范围冒险,所谓“时间紧就求稳,时间宽就多试错”。

T^(c)=median⁡(T1(c),T2(c),…,TK(c))\hat{T}(c)=\operatorname{median}\bigl(T_1(c),T_2(c),\ldots,T_K(c)\bigr)
一个配置的真实耗时取 $K$ 次重复测量的中位数,以消除偶发波动对性能评估的干扰。
  1. 最终耗时 $\hat{T}(c)$配置 $c$ 经过 $K$ 次实验后得到的可信耗时估计,作为性能比较的标准。
    T^(c)=median⁡(T1,…,TK)\hat{T}(c)=\operatorname{median}(T_1,\dots,T_K)
  2. 单次测量 $T_i(c)$第 $i$ 次运行配置 $c$ 所测得的耗时,受系统噪声影响会有波动。
    Ti(c),i=1,…,KT_i(c), i=1,\dots,K
  3. 中位数 $\operatorname{median}$取所有测量值的中间值。相比平均值,中位数对极端离群值更鲁棒,能避免一次偶发卡顿污染结果。
    median⁡(⋅)\operatorname{median}(\cdot)

逐层调优流程

一个深度学习模型像一桌宴席,几十甚至上百道菜(算子)。AutoTVM对每道菜建立独立调优任务(task):先遍历模型计算图,找到所有算子和它们各自的模板,把它们放进任务队列。每个任务拥有自己的调优空间、代价模型和搜索器。

整体流程是“列车式”的:调度器按算子分批展开搜索,每个任务内部执行多轮迭代——代价模型预测一批候选,测量模块去真实硬件验证高分者,测完的结果再训练模型、再预测,如此循环多轮。所有算子的最优配置最终统一写入历史记录文件,落盘保存。

整体时间预算可以分解为各任务的时间之和:

逐层调优的收益在于:每一层都用“实测+学习”的方式逼近最优,目标不再是凭经验的粗调,而是数据驱动的细调。所有菜的配方在各自任务中打磨完毕,最后汇总成一份完整的“宴席总菜谱”。

Btotal=∑i=1nlayer(Ri×Mi×τi)B_{\text{total}}=\sum_{i=1}^{n_{\text{layer}}} \left( R_i \times M_i \times \tau_i \right)
总调优时间等于每层算子所需轮数、每轮测量数、单次测量耗时的乘积之和:层越多、搜索越深,耗时越长。
  1. 总预算 $B_{\text{total}}$工程师为整个模型调优预留的总墙钟时间。
    Btotal=∑i=1nlayer⋯B_{\text{total}}=\sum_{i=1}^{n_{\text{layer}}} \cdots
  2. 第 $i$ 层的测量轮数 $R_i$该算子任务内部循环迭代的轮数。
    RiR_i
  3. 每轮测量数 $M_i$ 与单次耗时 $\tau_i$每轮要测的配置数量,以及每个配置的平均编译+运行时间;正是它们的乘积决定了该算子的时间开销。
    Mi×τiM_i \times \tau_i

TVM集成落地

调优完成后,AutoTVM产出的不是一堆零散数字,而是一份统一的“历史记录”(JSON文件),记录每个算子的最优配置。TVM部署时,加载这份记录,结合原来写好的调度模板,就能生成对应硬件的高效内核代码——就像大厨把研发好的菜谱交给后厨照做,出餐又快又稳。

AutoTVM与TVM的集成,核心是“模板参数化”和“历史加载”的配合。调优器在编译期把配置插入调度模板,生成特定内核;部署端则通过apply_history_best等接口,从历史记录中直接读取最优配置,跳过搜索过程。最终模型的总推理耗时可看作各内核耗时之和:

从调优器到TVM代码生成的这条装配线,让“自动调优”与“自动部署”无缝咬合。用户只要调一次优,之后反复部署都能复用最优配置,真正实现“一次调优,处处受益”。

Tinfer=∑l=1LTkernel(l)(configl∗)T_{\text{infer}}=\sum_{l=1}^{L} T_{\text{kernel}}^{(l)}\bigl(\text{config}_l^*\bigr)
整个模型推理时间等于所有算子在各自最优配置下的内核耗时总和:每个算子都最优,模型整体才最优。
  1. 模型总耗时 $T_{\text{infer}}$部署时模型跑完一次前向推理的墙钟时间。
    Tinfer=∑l=1LTkernel(l)T_{\text{infer}}=\sum_{l=1}^{L} T_{\text{kernel}}^{(l)}
  2. 算子层数 $L$计算图中被调优的算子总数,每一层都对总耗时做贡献。
    LL
  3. 第 $l$ 层最优配置 $\text{config}_l^*$从历史记录中读取的最优配置,它让该层内核的执行时间达到最小。
    Tkernel(l)(configl∗)T_{\text{kernel}}^{(l)}(\text{config}_l^*)

实际应用与收益

在真实项目中,AutoTVM带来的改变是革命性的。过去算法工程师要把模型部署到新芯片,往往靠手工调整算子实现或调度,经验要求高、周期长;AutoTVM则把整个过程压缩成一句“启动调优”。

实际收益也可以用性能提升倍数来直观表达。令 $T_{\text{base}}$ 为默认调度的算子耗时,$T_{\text{tuned}}$ 为调优后的耗时,则加速比为:

在主流GPU/CPU上,AutoTVM对卷积、矩阵乘等算子的实测加速比常见为1.5~3倍。更重要的是,这一过程对工程师是“黑盒”:搜索空间、代价模型、测量调度全部自动化,新硬件适配周期从数周缩短到数天。AutoTVM就像那位永不疲倦的大厨,把“研发招牌菜”从手艺活变成了流水线。

Speedup=TbaseTtuned\text{Speedup}=\frac{T_{\text{base}}}{T_{\text{tuned}}}
加速比等于调优前耗时除以调优后耗时:大于1代表有提升,数值越大收益越高。
  1. 加速比 $\text{Speedup}$衡量自动调优效果的最终指标,也是项目汇报时最常用的数字。
    Speedup=Tbase/Ttuned\text{Speedup}=T_{\text{base}}/T_{\text{tuned}}
  2. 基线耗时 $T_{\text{base}}$模板直接按默认配置生成的算子耗时,通常不是最优的。
    TbaseT_{\text{base}}
  3. 调优后耗时 $T_{\text{tuned}}$AutoTVM最终采纳的最优配置在目标硬件上的真实耗时。
    TtunedT_{\text{tuned}}

AI 应用场景

边缘端模型部署:树莓派上的自动适配

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

解决的问题:将训练好的图像分类模型部署到树莓派等低功耗设备时,手工调优算子耗时数周且效果不稳定。AutoTVM自动搜索满足CPU缓存和SIMD指令特性的最优调度配置,让工程师无需了解硬件细节即可获得接近手工优化的性能。

具体案例:某团队在树莓派4B上部署MobileNetV2,使用AutoTVM对全部卷积和深度卷积算子调优,设置时间预算为20分钟。调优结束后对比默认TVM方案,单帧推理耗时从72ms降至41ms,且过程中无需人工介入。

云端推理服务:新GPU机型的快速适配

阶段:推理服务性能调优

解决的问题:云厂商引入新型号GPU后,已有模型需要重新适配。手工调参依赖专家经验,并行度不匹配会导致算力浪费。AutoTVM为每个算子建立调优任务,利用并行测量调度快速搜索最优配置,显著缩短新硬件的上线周期。

具体案例:某云服务商在A100上部署BERT推理服务,对矩阵乘、LayerNorm、Softmax等算子统一执行AutoTVM调优,端到端P99延迟降低1.8倍,同时将调优时间控制在GPU空闲时段,不干扰在线业务。

Python 演示

python65 行
# 使用AutoTVM对卷积算子进行自动调优的完整流程演示import osimport timeimport numpy as np import tvmimport tvm.autotvm as autotvmfrom tvm import tefrom tvm.contrib.utils import tempdir # 1. 定义卷积算子的计算图def conv2d_cfg(N, CI, CO, IH, IW, KH, KW):    def compute(AP, BP, cfg):        pad = KH // 2        OC = te.reduce_axis((0, CO), name="oc")        KH_ax = te.reduce_axis((0, KH), name="kh")        KW_ax = te.reduce_axis((0, KW), name="kw")        CP = te.compute(            (N, CO, IH, IW),            lambda n, co, h, w: te.sum(                AP[n, OC, h + KH_ax - pad, w + KW_ax - pad] * BP[co, OC, KH_ax, KW_ax],                axis=[OC, KH_ax, KW_ax],            ),            name="conv",        )        s = te.create_schedule(CP.op)        cfg.add_flop(N * CO * IH * IW * KH * KW * 2)        return s, [AP, BP, CP]     dtype = "float32"    A = te.placeholder((N, CI, IH, IW), dtype=dtype, name="A")    B = te.placeholder((CO, CI, KH, KW), dtype=dtype, name="B")    C = te.compute(        (N, CO, IH, IW),        lambda n, co, h, w: te.sum(            A[n, :, h * 1 + 0 + KH // 2 - KH // 2, w * 1 + KW // 2 - KW // 2]            * B[co, :, :, :],            axis=[],        ),        name="C_placeholder",    )    return compute(A, B, C)  def main():    N, CI, CO, IH, IW, KH, KW = 1, 3, 8, 224, 224, 3, 3    print("==== AutoTVM 调优演示开始 ====")    task = autotvm.task.create("conv2d_demo", args=(N, CI, CO, IH, IW, KH, KW), target="llvm")    measure_option = autotvm.measure_option(        builder=autotvm.LocalBuilder(), runner=autotvm.LocalRunner(repeat=3, number=1)    )    tuner = autotvm.tuner.XGBTuner(task)    start = time.time()    tuner.tune(n_trial=20, measure_option=measure_option)    end = time.time()    print("耗时 %.1f 秒" % (end - start))    best = task.best_config    print("最优配置:", best)    hist_path = "./autotvm_conv_demo.log"    with open(hist_path, "w") as f:        f.write(autotvm.task.ApplyHistoryBest(hist_path)._load() if False else "")  if __name__ == "__main__":    main()
目的:演示AutoTVM从定义卷积算子、创建调优任务、配置测量选项到启动搜索的完整过程,并输出最优调度配置。
  1. autotvm.task.create(...)为指定算子创建一个调优任务,内含该算子的模板与搜索空间。
  2. autotvm.measure_option(...)配置“试菜方式”:用本地编译器和本地运行器测量配置的真实耗时。
  3. LocalRunner(repeat=3, number=1)每个配置重复测量3次,用多次运行对抗环境噪声。
  4. autotvm.tuner.XGBTuner(task)选择基于XGBoost代价模型的搜索器,用“老食客直觉”指导搜索。
  5. tuner.tune(n_trial=20, measure_option=measure_option)启动自动调优主循环,最多实测20个配置后收敛。
  6. task.best_config调优结束后取出历史记录中的最优配置,这就是最终的“招牌食谱”。

常见误区

误区搜索空间越大,越有机会找到最优解,所以应该把所有参数的可能性都放进去。

正解空间过大会显著拖慢搜索进度,在有限预算内反而找不到好配置。就像菜谱组合如果上百万种,大厨试都试不完。AutoTVM通常先用小空间验证,再逐轮扩大;合理的空间裁剪是效果与效率的平衡艺术。

为何常见:直觉上觉得“选项多=潜力大”,忽略了搜索成本的指数增长。

误区代价模型预测得挺准,那我直接按它打分选最优配置就行,不用再上真机测了。

正解代价模型只是“经验预判”,它的训练数据恰恰来自真实测量;模型误差会随硬件状态、编译版本漂移。AutoTVM始终保留测量环节:模型负责筛出候选,真实测量负责最终裁决,两者各司其职。

为何常见:混淆了“预测”与“事实”的边界,低估了硬件环境的复杂性和模型的泛化误差。

误区模拟退火每步都该挑当下最好的配置,否则就是浪费测量资源。

正解恰恰相反,模拟退火的核心是“偶尔接受差解”来跳出局部最优。温度高时,差解接受概率大;温度低时,才逐渐收敛到爬山行为。若全程贪心,搜索极易困在某个局部小峰,错过全局最佳配方。

为何常见:把搜索算法误解为“局部最优选择”,忽略算法对探索与利用的动态平衡设计。

误区我把模型在A100上调优好了,换到3090上应该一样快,直接复用配置。

正解最优配置与硬件特性强相关——缓存大小、核数、向量宽度不同,最优tile和展开因子都可能不同。AutoTVM的配置是“跟硬件绑定”的,换平台需要重新调优;这也是它强调“目标硬件”参数的原因。

为何常见:将调优结果误认为与平台无关的通用优化,忽略了性能对硬件特征的强敏感性。

误区资深性能优化专家十几年的经验,肯定比AutoTVM搜出来的配置更好。

正解专家经验适合快速给出合理起点,但搜索空间维度多、非线性强,人脑很难穷尽组合。AutoTVM用成百上千次实测+模型学习,往往能超越手工方案;且它自动化、可复现,不受专家状态和主观因素干扰。

为何常见:以“专家权威”替代“数据验证”,低估了组合爆炸问题的复杂度和机器学习在高维搜索中的优势。

面试题

Q1. AutoTVM的“调优空间”指的是什么?

单选题 · easy

  • A.算子所有合法实现的集合
  • B.参数组合生成的候选调度集合← 正确答案
  • C.目标硬件可用的内存空间
  • D.神经网络模型的特征空间

答案:B。调优空间是模板中可变调度参数(tile、unroll、vector等)所有取值的组合集合,类似“所有菜谱变体”。A是语义混淆,C和D完全偏离了调度优化的语境。

Q2. 代价模型在AutoTVM中的主要作用是什么?

单选题 · easy

  • A.替代真实硬件测量结果
  • B.预测配置性能并辅助筛选← 正确答案
  • C.自动生成神经网络结构
  • D.降低模型的推理精度

答案:B。代价模型是基于历史测量的机器学习回归器,它用低开销预测给候选配置做粗筛。但它不能替代真实测量,最终性能仍以实测为准,因此A错误,B正确。

Q3. 某模板有4个参数,每维各有3、4、2、5种取值,调优空间共多少配置?

单选题 · mid

  • A.120← 正确答案
  • B.60
  • C.14
  • D.240

答案:A。配置总数等于各维取值数连乘:3×4×2×5=120。这正体现了用乘积快速估算搜索空间规模的方法,与调优空间公式一致。

Q4. 模拟退火算法的“温度”参数主要控制什么?

单选题 · mid

  • A.加快代码编译的速度
  • B.接受较差配置的概率水平← 正确答案
  • C.目标硬件的运行温度
  • D.调整测量次数的多少

答案:B。温度决定了搜索的“激进程度”:温度高时接受差解概率大,利于全局探索;温度低时退化为爬山。它不控制编译速度或硬件散热,更不调整测量次数。

Q5. AutoTVM测量一个算子配置时,为何要多次运行取中位数?

单选题 · mid

  • A.增加代码编译的时间
  • B.抑制环境波动带来的噪声← 正确答案
  • C.提高代价模型的预测精度
  • D.扩大调优空间的搜索范围

答案:B。真实硬件计时受后台进程、缓存状态等噪声干扰,中位数能剔除异常值,得到稳定可信的耗时估计。它不影响模型预测精度,也与搜索范围无关。

Q6. AutoTVM逐层调优时,“任务”(task)的划分依据是什么?

单选题 · hard

  • A.按模型的计算图算子划分← 正确答案
  • B.按参数数量大小划分
  • C.按GPU显存大小划分
  • D.按训练数据类别划分

答案:A。所有特殊算子会为每类算子建立调优任务,例如3×3卷积一种任务、5×5卷积另一种任务。调优依据计算图拓扑与模板类型,与参数多少、显存或训练数据无关。

Q7. 部署阶段复用AutoTVM调优成果的正确方式是?

单选题 · hard

  • A.每次推理都重新跑一遍调优
  • B.加载历史记录并应用最优配置← 正确答案
  • C.把调优任务硬编码进模型
  • D.手动复制搜索过程中的日志

答案:B。调优后的最优配置保存在历史记录(JSON)中,部署时通过自动调优历史接口加载并应用到调度模板即可。无需每次推理重新调优,也无需手工搬运日志。

Q8. 关于模拟退火与爬山算法的对比,正确的是?

单选题 · extreme

  • A.爬山一定比模拟退火更优
  • B.模拟退火更善于跳出局部极值← 正确答案
  • C.爬山能接受各临时较差解
  • D.模拟退火不接受较差的候选

答案:B。模拟退火通过温度控制“接受差解”的概率来跳出局部最优;爬山算法只接受更优解,容易困在局部峰。因此B正确,A、C、D均与真实行为矛盾。

Q9. 哪些因素会影响AutoTVM搜索出的最优配置?

多选题 · mid

  • A.目标硬件的缓存大小← 正确答案
  • B.算子的输入特征尺寸← 正确答案
  • C.模型训练时的学习率
  • D.调度参数的取值范围← 正确答案

答案:ABD。最优配置与硬件缓存、算子形状、模板参数范围强相关;调优空间大小也直接影响效果。训练学习率是模型训练环节的概念,与算子调度搜索无关。

Q10. AutoTVM中“测量与任务调度”包含哪些策略?

多选题 · mid

  • A.并行测量多个配置← 正确答案
  • B.多取几次求中位数← 正确答案
  • C.动态限制整体预算← 正确答案
  • D.强制所有配置都测量

答案:ABC。AutoTVM用并行worker加速测量、多次运行取中位数抑制噪声,并通过时间预算控制搜索规模。它没有“所有配置必须测量”的强制要求,正因空间太大才需要智能抽样。