/ MLC chentianqi
[MLC-04] Automated Program Optimization and Meta-Schedule
Notes for lesson four: turning schedules into a search space, stochastic schedule transformations, candidate measurement, and the Meta-Schedule optimization loop.
手工写 schedule 很适合理解优化,但很难覆盖所有 shape、硬件和算子组合。第四讲把问题改写为:既然有许多语义等价的 TensorIR 版本,能否定义变换空间,再通过测量自动选择更好的版本?
1. 从一个 schedule 到一族程序#
对 matmul 而言,tile 大小、loop order、并行轴、vector width、unroll 因子都可能不同:
same TensorIR semantics
|
+-> tile M/N/K = (16, 16, 32)
+-> tile M/N/K = (32, 8, 16)
+-> different reorder / cache placement / unroll这些选择组成程序搜索空间。关键不是随便改代码,而是只使用被证明保持语义的 schedule primitive。
2. Stochastic Schedule Transformation#
随机调度变换把“固定选择一个参数”替换成“从候选中采样”:
tile = sch.sample_perfect_tile(loop=j, n=2)
j0, j1 = sch.split(j, factors=tile)
sch.bind(j0, "blockIdx.x")
sch.vectorize(j1)同一段 schedule script 可生成多个候选模块。它描述的不是单一实现,而是一个由规则约束的实现家族。
3. 自动调优的闭环#
课程给出的自动优化流程可以写成:
IRModule
-> generate schedule candidates
-> build candidate
-> run on target and measure latency
-> record result / update search policy
-> select the best implementation成本模型可以减少无意义候选的测量次数,但最终性能仍需要目标环境的实测确认。因为缓存行为、编译器生成代码和硬件资源竞争通常无法被简单静态公式准确覆盖。
4. 搜索空间比搜索算法更重要#
自动调优有两个问题:
| 问题 | 含义 |
|---|---|
| Search space | 哪些变换被允许、哪些候选可能有价值? |
| Search strategy | 如何采样、排序、测量和停止? |
如果搜索空间不包含有效的 memory tiling 或硬件映射,再聪明的搜索器也找不到高性能版本;如果空间过大、无效候选过多,测量预算会被浪费。
因此 Meta-Schedule 的实际价值不只是“自动找参数”,而是把领域知识编码进 schedule rule、post-processing 和测量策略。
5. 回到端到端图#
调优得到的新 primitive function 需要回填到端到端模块:
Relax graph
call_tir("matmul")
|
+-> replace with tuned matmul implementation这说明 kernel tuning 和图执行不是两件孤立的事。图层负责引用哪个函数;程序层负责让该函数在目标上更快;构建系统负责把二者打包成同一部署产物。
6. 学习笔记#
自动优化并不消灭人工经验,它改变人工经验出现的位置:从手工指定一个唯一实现,变为设计可解释的变换空间、合法性约束和测量指标。
对于 LLM 推理也一样:block size、attention backend、CUDA Graph shape 或 batch policy 可能需要调优,但实验设计必须先保证比较的 workload 和资源约束一致。