深度学习编译器中的自动化调度系统已从基于模板的方法发展到全自动生成方式。理解 AutoTVM 和 Ansor(也称为 AutoScheduler)之间的架构差异,对于设计定制编译器后端或优化新型硬件加速器的工程师来说是基础。尽管两个系统都旨在最大化张量吞吐量,但它们在定义和搜索优化空间的方式上存在根本分歧。基于模板的方法:AutoTVMAutoTVM 代表了 TVM 堆栈中第一代统计调优。它的架构基于这样一个前提:尽管循环变换(如瓦片大小或展开因子)的精确参数难以预测,但高效调度的普遍结构通常为人类专家所知。在这种架构中,搜索空间并非从计算图自动生成。而是由领域专家定义一个调度模板。模板是一个使用 TVM 调度语言编写的 Python 函数,其中包含定义可调参数的特定“旋钮”或“轴”。对于矩阵乘法操作 $C = A \times B$,用户可能会编写一个定义循环顺序和内存范围的模板,但将瓦片因子保留为变量。$$ T_{split} \in {1, 2, 4, 8, 16, 32, 64} $$AutoTVM 架构包含三个在循环中交互的主要组件:调优器: 一个搜索算法(例如网格搜索、随机搜索或 XGBTuner),它从用户定义的模板中提出特定的配置。运行器: 一个独立进程,它用提出的配置编译内核,将其上传到目标设备(远程或本地),运行基准测试,并返回执行时间。成本模型: 一个统计模型,它学习配置参数与测得的执行时间之间的关系。随着从运行器收集到更多数据点,成本模型会更新自身,以更准确地预测高性能配置。这种架构的局限在于模板本身。搜索空间仅限于模板作者允许的变化。如果最优优化策略包含模板中未包含的变换,例如特定形式的张量布局重写或复杂的融合模式,AutoTVM 无法找到它。基于生成的方法:AnsorAnsor 旨在解决 AutoTVM 的可扩展性限制,它从基于模板的定义转向搜索空间生成。它消除了对人工编写模板的要求。相反,Ansor 分析计算的数学定义(通常是张量表达式形式),并自动构建一个大型的、全面的搜索空间。Ansor 架构通过分层过程运行:程序采样(草图生成): Ansor 不以固定的循环结构开始。它分析计算 DAG,并生成称为“草图”的高级结构。草图代表了调度的骨架,应用了高级规则,例如“始终对输出块进行瓦片化”或“将逐元素操作融合到归约循环中”。性能调优(注解): 一旦生成草图,系统会随机选择有效的指令来填充草图。这对应于特定的瓦片大小、向量长度和展开因子。这一步将高级草图转换为具体的、可执行的程序。任务调度: 对于端到端神经网络,Ansor 为不同的子图分配时间资源。它优先处理对端到端延迟影响最大的运算符,避免在对总运行时贡献不大的次优层上浪费时间。Ansor 中的搜索算法通常是演化策略。它维持一个有效调度种群,并应用变异(例如改变瓦片大小或交换循环顺序)来生成新候选。以下图表对比了这两种架构的工作流程,突出了从手动模板定义到自动规则应用的转变。digraph CompilerArchitecture { rankdir=TB; bgcolor="#ffffff"; node [fontname="Sans-Serif", shape=box, style=filled, color="#dee2e6", fillcolor="#f8f9fa", penwidth=1.5]; edge [fontname="Sans-Serif", color="#495057", penwidth=1.2]; subgraph cluster_0 { label = "AutoTVM (基于模板)"; fontname = "Sans-Serif"; fontsize = 14; color = "#ced4da"; style = dashed; User1 [label="用户 / 专家", fillcolor="#e7f5ff", color="#74c0fc"]; Template [label="调度模板\n(手动定义)", fillcolor="#e7f5ff", color="#74c0fc"]; ConfigSpace [label="配置空间\n(固定参数)", fillcolor="#e7f5ff", color="#74c0fc"]; Tuner [label="搜索算法\n(XGBoost/随机)", fillcolor="#fff5f5", color="#ff8787"]; User1 -> Template [label="编写"]; Template -> ConfigSpace [label="定义"]; ConfigSpace -> Tuner [label="查找"]; } subgraph cluster_1 { label = "Ansor (基于生成)"; fontname = "Sans-Serif"; fontsize = 14; color = "#ced4da"; style = dashed; ComputeDef [label="计算定义\n(张量表达式)", fillcolor="#f3f0ff", color="#b197fc"]; SketchGen [label="草图生成\n(推导规则)", fillcolor="#f3f0ff", color="#b197fc"]; Evolution [label="演化搜索\n(变异/交叉)", fillcolor="#fff5f5", color="#ff8787"]; ComputeDef -> SketchGen [label="分析"]; SketchGen -> Evolution [label="生成空间"]; } Hardware [label="硬件运行器\n(RPC / 性能分析器)", fillcolor="#d8f5a2", color="#94d82d"]; CostModel [label="成本模型\n(吞吐量预测器)", fillcolor="#ffe3e3", color="#ffa8a8"]; Tuner -> Hardware [label="测量"]; Evolution -> Hardware [label="测量"]; Hardware -> CostModel [label="训练数据"]; CostModel -> Tuner [label="引导", style=dotted]; CostModel -> Evolution [label="引导", style=dotted]; }AutoTVM 和 Ansor 流水线的对比。AutoTVM 依靠显式用户模板来定义优化范围,而 Ansor 则从计算定义中算法性地生成搜索空间。搜索策略与成本建模两种架构都大量依赖统计成本模型来修剪搜索空间。在实际硬件上评估一个调度需要数秒或数毫秒,当搜索空间包含数十亿种可能性时,这太慢了。成本模型充当代理,以微秒级别预测调度的性能。在 AutoTVM 中,成本模型的输入是从循环配置中提取的特征向量(例如,循环范围、内存访问计数)。Ansor 通过使用更结构化的表示来改进这一点。它从低级中间表示(IR)本身提取特征,包含:算术强度: 浮点运算与内存访问字节数的比率。内存访问模式: 缓冲区访问中步幅和对齐的特点。循环结构: 关于并行循环的嵌套深度和范围的信息。Ansor 通常采用梯度提升决策树(GBDT),如 XGBoost,作为其默认成本模型。系统分轮次运行。在每一轮中,搜索策略选择一批候选。这些候选在硬件上编译并测量,以获得真实的执行时间。这些数据用于重新训练成本模型,从而提高其对下一代候选的预测准确性。收敛性与权衡尽管 Ansor 因其更广泛的搜索范围通常在标准深度学习工作负载方面更胜一筹,但 AutoTVM 对于自动生成规则失效的专用领域特定逻辑操作仍有意义。Ansor 的基于生成的方法解决了模板固有的“局部最优”问题。模板可能会强制执行特定的缓存层次结构映射,这对于 ResNet-50 来说是最佳的,但对于像 MobileNetV3 这样略有不同的拓扑来说却是次优的。通过动态生成草图,Ansor 使高级策略适应编译时存在的特定张量形状和硬件限制。权衡点在于搜索时间。Ansor 通常需要更多时间才能收敛,因为它搜索的空间比受限模板大几个数量级。然而,迁移学习等技术,即使用在类似任务上训练的成本模型来预热搜索,可以显著减少这种开销。理解这些架构使得开发者能够调试性能下降问题。如果一个运算符表现不佳,必须确定限制是源于搜索算法未能找到最佳调度(调优问题),还是搜索空间本身缺乏必要的变换(表示问题)。在 AutoTVM 中,解决方案是重写模板。在 Ansor 中,解决方案包括添加新的草图生成规则或定制的内在映射。