Triton 自动调优:写 3 组配置、指 1 个 key,省掉手动调参的一整天
【免费下载链接】tritonDevelopment repository for the Triton language and compiler项目地址: https://gitcode.com/GitHub_Trending/tri/triton
Triton 的 autotune(自动调优)能替你自动完成 GPU 内核参数调优:给出几组候选配置,它首次运行时逐组实测、挑出最快的一组并缓存复用,省掉你手动改参数、重编译、量时间的反复。
矩阵乘法里,BLOCK_SIZE 到底填多少
矩阵乘法的 BLOCK_SIZE 没有标准答案:填 64、128 还是 256,取决于矩阵尺寸和你用的 GPU,人工几乎无法穷举。
写一个 matmul 内核,通常要定 BLOCK_SIZE_M、BLOCK_SIZE_N、BLOCK_SIZE_K 三个分块大小,再配 num_warps(每块用多少 warp,1 warp=32 线程)和 num_stages(循环软件流水级数)两个编译选项。就算每个参数只给 3 个候选,组合数也轻松破百。你不可能对每一种都手动改代码、重新编译、再逐组量一遍耗时。这块"组合爆炸"的活,正好交给 autotune。
原理速览:autotune 就像一次"试吃"
autotune 的原理一句话就能说清:把每组配置都真跑一遍、量出耗时,留下最快的那组,之后复用。
打个比方,像厨师调一道菜的口味。他不会一次定死盐量,而是先做 3 个小份——偏咸、偏淡、正好——让你尝,记下哪份最合口味,之后就一直按那个比例出菜。autotune 做的正是这件事,对应关系是:
- configs:你列出的几份"小样",即不同 BLOCK_SIZE、num_warps 的组合;
- 首次调用:autotune 逐份"试吃",每组配置在 GPU 上真实执行一次并计时;
- 记结果:选出耗时最短的那组,写进内存缓存;
- 再次调用:同样的输入直接复用最优配置,不再重复实测。
上图就是 autotune 在"试吃"的东西:同一块数据换一种分块(BLOCK_SIZE),GPU 上的计算量、访存方式都不同,快慢自然也不同。它不靠猜,全靠实测挑最快。
✅ 最小上手示例:一个能跑的求和内核
给 @triton.jit 函数套一层 @triton.autotune 装饰器,传 configs 和 key 两个参数,就能自动调优。
import triton import triton.language as tl configs = [ triton.Config({'BLOCK_SIZE': 128}, num_warps=4), triton.Config({'BLOCK_SIZE': 256}, num_warps=8), triton.Config({'BLOCK_SIZE': 512}, num_warps=8), ] @triton.autotune(configs=configs, key=['x_size']) @triton.jit def sum_kernel(x_ptr, x_size, BLOCK_SIZE: tl.constexpr): pid = tl.program_id(0) offs = pid * BLOCK_SIZE + tl.arange(0, BLOCK_SIZE) return tl.sum(tl.load(x_ptr + offs, mask=offs < x_size))两个关键参数:
- configs:一个 triton.Config 列表,每个 Config 描述"一组候选参数"。字典里的键(如 BLOCK_SIZE)会作为常量在编译时固定下来并传进内核;num_warps、num_stages 是编译选项。上面 3 组配置就是 autotune 要"试吃"的 3 份小样。
- key:一组"触发重新调优的参数名"。key=['x_size'] 表示只有 x_size 变了才重跑 3 组配置;x_size 不变就直接复用。矩阵乘法一般写 key=['M', 'N', 'K'],即矩阵尺寸变了才重新调优。
🔧 调优提速:缓存、剪枝与看日志
调优省时间有三个抓手,按需取用。
按输入尺寸自动缓存最优配置
同一份 key 的输入,autotune 只在内存里调一次,后续调用直接复用。想让跨进程、跨运行也复用,把装饰器参数改成 cache_results=True,或设环境变量 TRITON_CACHE_AUTOTUNING=1,各组耗时会写进磁盘缓存,下次启动也能直接命中。
用 top_k 剪掉明显不优的配置
配置很多时,先剪枝再实测更省。prune_configs_by={'top_k': 0.3} 表示先用内置性能模型估算每组耗时,只保留最快的 30% 去实测。
@triton.autotune( configs=configs, key=['M', 'N', 'K'], prune_configs_by={'top_k': 0.3}, )打开调优日志,看清每组配置的真实耗时
设 TRITON_PRINT_AUTOTUNING=1 就能打印调优过程。运行前先 export TRITON_PRINT_AUTOTUNING=1,控制台会输出每个 key 的调优总耗时和选中的最优配置,方便你核对到底哪组最快、调优花了多久。
一句话收尾
autotune 不神秘:列出几组 configs、指一个 key,它替你试吃、留最快的一组合、之后复用。想继续深入,官方 API 见 docs/python-api/triton.rst,矩阵乘法的完整调优示例见 python/tutorials/03-matrix-multiplication.py。
【免费下载链接】tritonDevelopment repository for the Triton language and compiler项目地址: https://gitcode.com/GitHub_Trending/tri/triton
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考