
Triton autotune 指南把内核调参从几天压到一次调用【免费下载链接】tritonDevelopment repository for the Triton language and compiler项目地址: https://gitcode.com/GitHub_Trending/tri/triton写 GPU 内核时块大小和线程数往往决定了快慢而靠人肉试配置每换一个输入尺寸就得重来一遍。Triton 的 autotune 自动调优让你只需声明一组候选配置首次调用就会自动跑完整轮性能采样并锁定最优项之后相同输入直接复用缓存。读完本文你会在自己的内核上挂上 autotune并说清它何时重新搜索、何时直接命中缓存。先说结论用了它能省掉什么一句话把换一次输入尺寸就重新折腾一天的活变成一次调用的自动事。下面用手动调参与 autotune 对比对比项手动调参用 autotune 自动调优配置来源你逐个猜一份候选清单枚举搜索候选规模2~3 组凭经验十几组甚至更多按采样结果择优换输入尺寸后重新试一遍由 key 决定是否重新搜索并缓存结果复用靠笔记和文档内存缓存磁盘缓存自动完成结论行你省下的是试配置记结果的重复劳动付出的只是首次调用多等几秒到几十秒。看完这张表你可能会问它凭什么选得准下一节讲原理。图 1矩阵乘法内核把输出矩阵切成块多个线程块并行执行每个块读 A、B 的对应块并写入 C 的一个块配置之所以能改变性能原因就藏在这张图里块太小每次访存摊到的计算少访存效率低块太大单块占用显存和寄存器多能同时跑住的块数就少了。Triton 的 autotune 做两件事先用triton.Config把候选配置列成清单定义参数搜索空间再按key指定的输入参数触发性能采样用内置do_bench跑 warmup 加重复执行取中位耗时编译失败或资源超限的候选会被记为无穷耗时自动淘汰。最后把最快的一份按 key 存进内存和磁盘缓存同尺寸输入直接命中换了尺寸才重新搜索。打个比方它像你在鞋店试穿不看说明书的玄学参数把几双都穿上走两步比对之后记下最舒服的那双。原理清楚了接下来用 10 分钟把一个最小示例跑起来。10分钟上手Triton autotune 怎么用四个步骤就能挂上自动调优先用triton.Config枚举候选再用triton.autotune包住内核并指定key首次调用触发搜索之后同尺寸调用直接复用。下面这段代码在做的事就是给内核挂上两档配置的自动调优完整内核实现参考 python/tutorials/03-matrix-multiplication.pyconfigs [ triton.Config({BLOCK_SIZE_M: 64, BLOCK_SIZE_N: 64, BLOCK_SIZE_K: 32}, num_warps4), triton.Config({BLOCK_SIZE_M: 128, BLOCK_SIZE_N: 128, BLOCK_SIZE_K: 32}, num_warps8), ] triton.autotune(configsconfigs, key[M, N, K]) triton.jit def my_kernel(a_ptr, b_ptr, c_ptr, M, N, K, BLOCK_SIZE_M: tl.constexpr, BLOCK_SIZE_N: tl.constexpr, BLOCK_SIZE_K: tl.constexpr): ...运行后第一次调用会先打印调优耗时和选中的配置设置环境变量TRITON_PRINT_AUTOTUNING1即可看到之后同尺寸调用不再搜索直接执行内核你观察到的现象就是首调慢一拍、后续调用明显更快。效果如何数据与观察真实数字要由你自己的硬件和输入形状给出这里先说清规律与可验证的观察项。输入状态首次调用行为再次调用行为同 M/N/K逐候选采样取中位耗时择优命中内存缓存零搜索开销换一组 M/N/K按新 key 重新采样新 key 单独缓存加 cache_resultsTrue采样结果写磁盘重启进程也能直接命中图 2分组调度让同一批线程块集中访问 A、B 的局部区域减少冗余加载这正是教程中 GROUP_SIZE_M 配置参数的作用从定性角度看首次调用一定比裸跑慢慢多少约等于候选数 × 单候选基准耗时可用knobs.autotuning.print打印的finished after X s量化稳态下官方 matmul 教程里挂 autotune 的版本在多种尺寸上快于任意单一手工配置因为不同尺寸的最优块大小本来就不一样。把cache_resultsTrue打开后同一组输入连首次搜索都能省掉。知道规律之后有三个坑值得提前绕开。新手最容易踩的3个坑现象换了输入尺寸性能不升反降。原因key里漏了真正影响性能的那个参数比如只写了[M]N 变化不会触发重新调优新尺寸沿用了旧配置。解法把影响块数与形状的参数都放进key。现象运行直接抛 Conflicting meta-parameters 错误。原因同一个 meta 参数既写在triton.Config里又在调用时手动传了。解法自动调优的参数只在 configs 里定义一处。现象调优跑完输出张量是错的。原因每个候选配置都会完整执行一次内核累加写出到同一张量就被写了很多遍。解法用reset_to_zero或restore_value在采样前复位、采样后还原。坑都绕开了最后给你一条继续深入的路线。下一步读 python/triton/runtime/autotuner.pyprune_configs是剪枝入口check_disk_cache是磁盘缓存入口读懂这两个函数你就掌握了 autotune 的全部决策点。跟 python/tutorials/03-matrix-multiplication.py 对照这是 Triton 自动调优 教程里最完整的一份参考16 个候选配置加GROUP_SIZE_M的写法可以直接抄。设置TRITON_PRINT_AUTOTUNING1在真实负载上观察每个 key 的调优耗时和选中配置验证本节讲的缓存与重搜行为。翻 python/triton/language/core.py确认内核用到的语言原语写配置时心里有底。现在就可以动手挑一个你现有的内核挂上两到三个配置的 autotune先跑通首次搜索、二次命中缓存再逐步加配置别一上来就枚举几十个候选。【免费下载链接】tritonDevelopment repository for the Triton language and compiler项目地址: https://gitcode.com/GitHub_Trending/tri/triton创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考