autokernel开源项目:AI自动研究优化GPU内核


autokernel 是一个面向 GPU 开发者的开源工具,核心目标只有一件事:让 AI 自动优化 CUDA kernel(GPU底层算子),从而显著提升深度学习和高性能计算的运行速度。
简单说一句人话:它想把“GPU算子优化工程师”这份高难度工作,交给 AI 自动完成。

autokernel让AI自动优化CUDA kernel,从18 TFLOPS飙到187 TFLOPS,比cuBLAS快1.31倍。一晚上跑320次实验,用AI替代GPU优化工程师,实现软件栈自动化革命。
​​​​​​​



Autokernel 想解决什么问题

在深度学习系统里,真正消耗时间的通常不是 Python,而是底层 GPU kernel,比如:

* 矩阵乘法
* attention计算
* tensor运算
* convolution

这些代码通常写成 CUDA kernel。

问题在于:
GPU kernel 优化非常难。

原因有三个:

1、GPU架构复杂
线程块、warp、shared memory、register、memory coalescing 等一大堆细节。

2、优化高度依赖硬件
不同 GPU(Ampere、Hopper、Blackwell)最优实现完全不同。

3、经验门槛极高
很多性能优化来自 HPC 工程师几十年的经验。

结果就是:一个简单算子,手写 CUDA 可能比 naive 版本快 10 倍,再经过专家优化还能再快 2~3 倍。这种优化成本极高。
Autokernel 的思路是:让 AI 自动发现这些优化。



三条技术路线的大乱斗

GPU kernel优化领域目前有三条主要技术路线在竞争,场面堪比三国演义。

路线一是自动搜索派,代表选手包括TVM、Ansor、AutoTVM。这类工具通过搜索schedule(调度策略)来找到最优实现。优点是自动化程度高,缺点是搜索空间巨大,调优过程慢得让人想睡觉,而且使用复杂度堪比学习一门新语言。

路线二是DSL加编译器派,代表选手包括Triton、Halide。这类工具通过领域特定语言(DSL)生成高效kernel。Triton最近很火,因为它比写CUDA简单多了。但缺点是你得先学会Triton,而学习成本依然不低,毕竟从Python转到Triton的思维转换需要适应期。

路线三是AI自动优化派,AutoKernel就属于这一类。AI负责分析代码、生成优化版本、自动验证性能。目标是"用AI替代GPU kernel工程师",听起来就很激进。

对比这三种方案,Triton需要你学习新的DSL,TVM使用复杂,而AutoKernel的特点是AI自动生成、自动profiling、自动优化。如果说Triton是给你一把更好的锤子,TVM是帮你自动试遍所有钉子,那么AutoKernel就是直接派一个AI工人来帮你盖房子。



Autokernel想让AI自己卷自己

所以autokernel的思路就特别有意思了,它想干嘛,它想让AI自己去发现这些优化技巧。它的工作流程大概是这样的,你先给它一个原始的kernel或者一个tensor运算,然后AI就开始分析这段代码,接着自动生成优化版本,再放到GPU上去跑profiling,测量性能,然后比较一下到底快不快,不快就继续迭代优化,直到最终输出一个更快的kernel。整个过程就像是一个不知疲倦的学霸,一遍遍刷题,一遍遍总结经验,直到考满分才停下来。

这个系统有几个特别牛的能力。第一个就是自动profiling,它会自动测量你的kernel,看你的执行时间是多少,内存带宽用了多少,occupancy也就是GPU利用率怎么样,还有warp的效率高不高。通过这些数据找出性能瓶颈在哪儿。比如说它发现你的内存访问不连续,那说明数据在内存里摆得乱七八糟,GPU取数据的时候得东奔西跑,浪费时间。或者发现你没用共享内存,共享内存就像是GPU里面的快手缓存,比去显存拿数据快多了,你不用它那不是傻吗。再或者它发现你的线程块设置不合理,有的线程闲得发慌,有的线程忙得要死,这就叫负载不均衡。

写GPU kernel像写提示词一样简单
第二个能力就更有意思了,它可以自动生成CUDA kernel。你现在可以用自然语言去描述你想要什么,比如你就说给我优化一下这个tensor operation,然后系统就能生成对应的CUDA kernel实现。这意味着什么,意味着以后写GPU kernel可能就跟你现在用ChatGPT写作文一样,你只需要说我要什么,AI就给你写出来。你再也不用去记那些晦涩难懂的CUDA语法,不用去纠结该用多少线程块,用什么内存布局,这些全都交给AI。

第三个能力是自动调优。你知道优化一个GPU kernel需要考虑多少参数吗,有线程块的大小,内存怎么排布,数据怎么分块,循环要不要展开,共享内存怎么用,这些参数组合起来就是一个天文数字。人类工程师优化的时候,往往就靠经验猜几个值试试,但AI不一样,它可以暴力搜索整个参数空间,找到理论上最优的那个组合。这有点像AutoTVM或者Triton autotune那套东西,但是autokernel把AI结合进来了,让AI去指导这个搜索过程。

没有GPU也能优化GPU代码
第四个能力对很多开发者来说简直就是福音,它提供了Serverless GPU profiling。什么意思,就是你本地哪怕没有GPU,也可以上传你的kernel,然后它会在远程的GPU上自动帮你跑profiling。你想啊,很多学生或者个人开发者,可能买不起那些昂贵的GPU,但是又想学习怎么优化CUDA代码,这个功能就完美解决了这个问题。你写个kernel传上去,它就在云端给你跑测试,然后把结果返给你,就像你拥有一块顶级GPU一样。

这个项目让我觉得特别有意思的地方在于,AI正在慢慢进入HPC这个领域。以前GPU kernel优化那纯纯就是人工工作,那些NVIDIA的CUTLASS、cuBLAS、cuDNN库,里面每一行优化代码都是工程师手写出来的,每一个trick都是无数个通宵换来的。但是现在出现了三条新的技术路线,一条是自动搜索,就像TVM、Ansor那套东西,通过搜索算法去找最优实现。另一条是DSL加编译器,比如Triton和Halide,你用专门的领域特定语言写kernel,然后编译器帮你优化。第三条就是autokernel这种,让AI直接负责分析代码、生成优化版本、自动验证性能。

Triton vs CUDA:AI选择的新战场

AutoKernel使用Triton而不是直接生成CUDA代码,这是一个有意思的选择。Triton是OpenAI开发的DSL(领域特定语言),专门用于编写GPU kernel。它比CUDA更高级,更容易优化,但性能天花板可能略低于手写CUDA。

AI选择Triton有几个原因:首先,Triton的抽象层次更适合AI生成,代码结构更规整,优化空间更明确。其次,Triton的编译器已经做了很多底层优化,AI只需要关注高层策略。第三,Triton正在快速成为社区标准,生态在快速成长。

但这不意味着CUDA会被完全替代。对于极致性能场景,手写CUDA可能仍有优势。更可能的趋势是:Triton负责90%的场景,CUDA负责剩下10%的极致优化。AI自动生成Triton代码覆盖大部分需求,人类工程师专注于那10%的关键路径。

技术细节背后的工程智慧

让我们深入看看AutoKernel的一些工程细节。

首先是Amdahl定律的应用。这个定律说的是:程序的加速比受限于串行部分的比例。换句话说,优化一个只占1%时间的kernel,即使提速100倍,整体性能也提升不了多少。AutoKernel用Amdahl定律决定优化优先级,先抓大头,确保每次优化都能带来实际的端到端加速。

其次是5-stage correctness checks(五阶段正确性检查)。在追求性能的同时必须保证正确性,这是工程的基本原则。这五个阶段可能包括:语法检查、类型检查、数值精度验证、边界条件测试、随机输入测试。只有全部通过,新的kernel才能被接受。

第三是self-contained的模型定义。自带GPT-2、LLaMA、BERT的定义意味着项目不依赖外部库,降低了使用门槛。这对于可复现性很重要,因为外部库的更新可能导致结果不一致。同时也方便了没有网络环境或网络受限的用户。

第四是program.md的设计。这个文件被称为"研究组织代码",相当于给AI智能体设定了行为准则和研究方向。这种设计让AI的优化过程可解释、可控制,而不是一个黑盒。人类工程师可以通过修改program.md来引导AI的优化方向。



背景
我开源了用于 GPU 内核的 autokernel --自动研究

你给它任何 PyTorch 模型。它会分析模型性能,找出瓶颈内核,编写 Triton 替换代码,并运行实验一整夜。只需编辑一个文件,进行基准测试,保留或还原,如此循环往复。

karpathy自动研究相同的循环,应用于核优化

95 个实验。18 TFLOPS → 187 TFLOPS。性能是 cuBLAS 的 1.31 倍。全部自主运行。

9 种内核类型(MATMU、Flash Attention、Fused MLP、LayerNorm、RMSNorm、Softmax、Rope、Cross Entropy、Reduce)。Amdahl 定律决定下一步优化方向。在计算任何加速之前,都会进行 5 阶段正确性检查。

该智能体读取 program.md(“研究组织代码”),进行编辑http://kernel.py ,运行http://bench.py ,然后保留或撤销更改。每小时大约进行 40 次实验。夜间大约进行 320 次实验。

它自带 GPT-2、LLaMA 和 BERT 的定义,因此您无需 transformers 库即可上手。