第六篇 · 编译器与图优化
上面这些需求,怎么自动翻译成高效代码
⏳ 本章待补充
这一章要回答的问题
上面这些需求,怎么自动翻译成高效代码?
前五篇里的优化大多是"人工发现一个模式,然后写一个系统"。编译器要做的是把这种发现过程自动化。
核心思想:计算与调度分离
同一个计算(比如矩阵乘),可以用完全不同的方式实现(分块大小、循环顺序、是否向量化、如何分配片上存储)。
"算什么"和"怎么算"是两件事——把二者解耦,就能把"怎么算"交给搜索与自动调优。这是整个机器学习编译器领域的基石。
前置知识
- 第二篇(知道框架里的模型是一张计算图)
- 第一篇 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