Auto-tuning
Auto-tuning(自动调优 / 自动自动性能优化)是现代 AI 编译系统(如 TVM、Triton、Ansor、Halide、XLA 等)和高性能计算(HPC)中的核心技术。
它的主要目标是:针对特定的硬件架构(如 GPU、NPU、CPU),自动探索极度庞大的编译参数空间(Search Space),为高频算子(如 Gemm、Conv2D、FlashAttention)寻找最优的代码生成策略,从而榨干硬件的峰值性能。
为什么需要 Auto-tuning?
传统的高性能算子开发依赖顶级性能专家手写 Assembly/CUDA 代码(如 cuBLAS、cuDNN)。但面对如今的大模型时代,这种模式遇到了巨大瓶颈:
- 硬件架构高度异构与复杂:NVIDIA(Hopper/Blackwell)、AMD(CDNA3)、华为升腾(Ascend)、Google TPU 等不同架构的 Register 数量、Shared Memory/SRAM 容量、Memory Bandwidth 以及 Tensor Core 架构截然不同。
- 算子与 Shape 爆炸:LLM 中不仅有各种 Transformer 变体,而且动态 Shape(如不同 Prompt 长度、Batch Size、KV Cache 状态)使得“一套代码调优所有场景”变得不再可能。
- 组合爆炸的优化空间:一个看似简单的矩阵乘法(C=A×BC = A \times BC=A×B),涉及到的编译参数组合可能多达上百万种:
- Tile Sizes:Thread Block / Warp / Thread 级的数据块切分大小。
- Loop Transformations:循环展开(Unrolling)、循环重排(Reordering)、循环向量化(Vectorization)。
- Memory Management:Shared Memory double buffering(双缓冲)、Register Tiling、Swizzling(消除 Bank Conflict)。
- Pipeline/Parallelism:流水线深度、线程块映射逻辑。
人力根本无法枚举并找出最优解,Auto-tuning 相当于用“计算”代替“人力”。
Auto-tuning 的基本工作流程
一个典型的 Auto-tuning 系统包含以下 4 个核心模块构成的闭环:
┌────────────────┐ │ Search Space │ │ (Program/IR) │ └───────┬────────┘ │ ▼ ┌─────────────────┐ Predict ┌───────────────┐ Select ┌─────────────────┐ │ Machine Learning│ <─────── │ Optimization │ ───────> │ Code Generator │ │ Cost Model │ │ Search Engine │ │ (Triton/TVM IR) │ └────────┬────────┘ └───────────────┘ └────────┬────────┘ ▲ ▲ │ │ │ ▼ │ Feedback │ Feedback ┌─────────────────┐ └───────────────────────────┴───────────────── │ Hardware Test │ │ (Kernel Timing) │ └─────────────────┘- 搜索空间定义(Search Space Definition):
算子编译器将算法逻辑抽象为程序模板(Schedule Template / IR),并将待调优的参数定义为搜索维度(如block_size_x ∈ [16, 32, 64, 128])。 - 搜索算法(Search Engine):
在巨大的组合空间中寻找最优解。常用搜索策略包括:
- 随机采样(Random Search)/ 格点搜索(Grid Search)
- 遗传算法(Genetic Algorithm, GA)/ 模拟退火(Simulated Annealing)
- 贝叶斯优化(Bayesian Optimization)
- 代价模型(Cost Model):
如果在真实 GPU 上测试每一个候选配置,调优可能需要数天甚至数周。Cost Model(通常基于 XGBoost、GNN 或 MLP)的作用是在不开辟真实 GPU 编译运行的前提下,快速预测某个编译参数组合的性能,过滤掉 99% 的劣质配置。 - 真实硬件测速与反馈(Benchmark & Feedback):
挑选出 Cost Model 预测排名前KKK的候选 Kernel,在物理显卡上实际编译执行并精准测量耗时(Kernel Duration)。真实耗时会反馈给 Cost Model 进行在线学习(Online Fine-tuning),使其预测越来越准。
主流 Auto-tuning 技术路线的演进
从历史演变来看,Auto-tuning 经历了从手写模板调优到全自动程序生成,再到结合 AI 大模型指导的三个阶段:
阶段 1:基于模板的调优(Template-based Tuning)
- 代表:TVM AutoTVM、Halide。
- 特点:性能专家为特定算子手写一个带有占位符(Parameters)的 Schedule 模板,Auto-tuning 只负责在给定的取值范围内“填空”。
- 优缺点:性能上限极高(依赖专家经验),但开发成本极高。如果不手写模板,系统就无能为力。
阶段 2:无模板的全自动搜索(Template-free / Ansor-style Tuning)
- 代表:TVM Ansor (AutoScheduler)。
- 特点:摒弃手写模板。系统直接输入算子的数学表达式(Compute Definition),通过层次化程序生成器(Hierarchical Program Generator)自动生成极其庞大的搜索空间,并使用梯度提升树(XGBoost)或图神经网络预测性能。
- 优缺点:极大地解放了人力,通用性极强;但搜索耗时依然较长。
阶段 3:JIT 与动态/运行时调优(Just-In-Time & Dynamic Tuning)
- 代表:Triton Auto-tuner、PyTorch
torch.compile(Inductor)。 - 特点:在 Triton 中,用户可以使用装饰器
@triton.autotune为 Kernel 指定多种属性组合(如num_warps、num_stages、BLOCK_SIZE_M)。在程序运行初期,系统进行JIT 编译与 Warmup 测速,选择当前 Shape 下性能最好的配置文件挂载执行,并将结果Cache在磁盘中。
Auto-tuning 的核心挑战与未来趋势
- 编译与搜索耗时(Tuning Overhead):
- 问题:对一个大模型的全套算子进行全量 Auto-tuning 可能会耗费数小时甚至数天。
- 解法:离线调优 + Kernel Database(将调优好的结果持久化到数据库);引入迁移学习(Transfer Learning),将卡 A 上的调优经验迁移到卡 B。
- 动态 Shape 难题(Dynamic Shapes):
- 问题:大模型推理时,Prompt 长度(SeqLen)是变化的。针对 SeqLen=512 调优出的最优 Kernel,在 SeqLen=1 时性能可能极其糟糕。
- 解法:基于分段(Bucketing)的多 Kernel 预调优 + 运行时根据 Shape 动态路由;结合 Symbolic Execution(符号化执行)。
- LLM 辅助编译与代码生成(AI for Compiler):
- 近年来,利用 LLM / RL(强化学习)来引导编译器策略(如 Seed Code 提取、死锁避让、自动配置参数)成为热点方向,能够极大地缩短 Search Engine 的收敛时间。