AI Infra 自学教材

第六篇 · 编译器与图优化

上面这些需求,怎么自动翻译成高效代码

⏳ 本章待补充

这一章要回答的问题

上面这些需求,怎么自动翻译成高效代码?

前五篇里的优化大多是"人工发现一个模式,然后写一个系统"。编译器要做的是把这种发现过程自动化

核心思想:计算与调度分离

同一个计算(比如矩阵乘),可以用完全不同的方式实现(分块大小、循环顺序、是否向量化、如何分配片上存储)。

"算什么"和"怎么算"是两件事——把二者解耦,就能把"怎么算"交给搜索与自动调优。这是整个机器学习编译器领域的基石。

前置知识

  • 第二篇(知道框架里的模型是一张计算图)
  • 第一篇 1.3 节(分块与局部性)
  • 编译原理的基本概念(IR、pass、lowering)即可,不需要完整学过

计划覆盖的内容

小节回答的问题
TVM计算与调度怎么分离?为什么手工为每种硬件写算子库不可持续?
MLIR为什么需要多层 IR?"渐进式 lowering"解决什么?
Ansor搜索空间的设计为什么比搜索算法本身更重要?
图级优化怎么自动生成并验证"等价但更快"的图替换?e-graph 是什么?
TorchInductor动态图最终怎么编译成高效 kernel?
动手实验用 TVM 手工写几组 schedule 对比性能;再看 Ansor 搜出来的结果

用到的第一篇的知识

  • 1.3 节的分块与局部性 → 所有算子调度的理论基础
  • 1.5 节的 Roofline → 编译器做代价模型时预测的目标
  • 1.4 节"编译器能做什么" → 这一章就是那个问题的深入版本

对应的论文(见论文清单)

TVM(OSDI 2018)、MLIR(2020)、Ansor(OSDI 2020)、TASO(SOSP 2019)、Equality Saturation(MLSys 2021)、Rammer(OSDI 2020)、Welder(OSDI 2023)、TorchInductor。


← 返回 首页 | 上一章:第五篇 · 推理系统与 Serving

On this page