AI把GPU内核加速232倍之后:自动性能优化为何容易刷榜成功、上线失效

摘要:Codex在固定GPU内核竞赛中完成上千轮自动试验,交出232倍加速成绩。本文拆解QR分解、CUDA/Triton优化、基准过拟合、数值验证和生产泛化之间的工程边界。

AI把GPU内核加速232倍之后:自动性能优化为何容易刷榜成功、上线失效

2026年6月,GPU Mode在NVIDIA B200上办了一场QR分解内核竞赛。参赛者Sankalp让Codex持续写代码、提交、读回分项耗时,再进入下一轮搜索。14天后,他以约1804.78微秒的成绩排在183人中的第12名。GPU Mode公开接口记录了1662次提交;与作者及另一位参赛者报告的约419毫秒torch.geqrf基线相比,倍率约为232.16。

这个数字经得起基本核验,但适用范围很窄:同一块B200、同一份任务合同、12个给定基准实例、指定正确性容差下,专用实现相对通用库路径的加速。没有证据显示这份代码曾进入生产后失败。标题里的“上线失效”,指自动优化系统从榜单迁移到实际负载时常见的落差。

GPU内核自动优化从代码生成到生产泛化验证的技术流程

先看它究竟算了什么

QR分解把矩阵写成A=QR,其中Q为正交矩阵,R为上三角矩阵。比赛要求返回与torch.geqrf一致的紧凑Householder表示:输出矩阵H的上三角存R,下三角存反射向量的尾部,另有一条tau向量保存反射系数。检查器再通过torch.linalg.householder_product(H, tau)恢复Q。

单个Householder反射可写为:

1
H_i = I - τ_i v_i v_i^T

它能一次消掉当前列对角线以下的元素。困难来自依赖关系:第i+1个反射必须读取第i步更新后的矩阵。逐列执行时,大量工作呈矩阵—向量形态,串行链长,GPU的张量核心很难吃满。

经典解法是分块Householder。先在宽度为b的窄面板中生成一组反射,再把它们压成WY形式:

1
2
H_1 H_2 ... H_b = I - V T V^T
C ← C - V T (V^T C)

右侧尾矩阵C的更新由此变成大块矩阵乘。LAPACK很早就采用了这类表示;放到B200上,收益来自让更多计算进入GEMM和张量核心路径。面板中的顺序依赖仍然存在,所以后期优化集中在缩短面板、分段处理、融合归约、减少临时张量与kernel launch,以及按形状选择不同路线。

这里的GPU kernel是由CPU发起、在大量GPU线程上并行执行的设备函数。一次运算的耗时既含算术与访存,也受启动、调度、同步、寄存器压力和占用率影响。CUDA提供线程块、warp、共享内存、stream、CUDA Graph等底层控制;Triton用Python风格的块级DSL表达指针、分块与tl.dot,还能搜索block size、warp数等元参数。Triton利于快速试验,CUDA更方便触及特定架构指令和精细调度。Sankalp的路线在PyTorch、Triton和CUDA之间不断调整。

作者记录的优化轨迹也能说明232倍来自哪里。最初大量依赖torch.geqrf的方案仍在十万微秒量级;把blocked WY扩展到各shape后降到约10.2毫秒;Triton面板和分组更新把成绩推到4.3毫秒;CUDA Graph减少短kernel链的启动间隙后约3.4毫秒;随后融合V/T布局组装、拆分16列面板、固定行数与归约边界,最后到1.805毫秒。这里既有算法级变化,也有消除框架切片、拼接和临时分配的工程收益。后半程每次进步都更小,性能分析器开始比语言模型的代码生成能力更关键:先找出GPU时间线上的空洞,再决定该融合哪段、该把哪个运行时参数变成编译期常量。

自动搜索为什么在这里格外有效

一套benchmark harness通常包括输入生成器、正确性检查、预热、同步计时、重复测量、统计汇总和实验日志。GPU Mode又提供了命令行提交、分shape反馈和性能分析入口。代理每改一版代码,就能收到一个清晰标量及12项明细,形成“提出改动—运行—保留或回退”的闭环。

这12个基准完全公开,连随机种子也在接口中:矩阵阶数覆盖32、176、352、512、1024、2048、4096;批量从2到640;另有mixed、rank-deficient、clustered、near-rank等结构。最终分数取12项耗时的几何平均。512阶占4项,1024阶占3项,两者合计占7个评分槽位,接近六成。几何平均关注相对变化:某一项慢20%带来的惩罚,可以由另一项相近比例的加速抵消,不会被4096阶的绝对毫秒数直接淹没。

于是搜索器很容易学会一张精细路由表:n=32优先消灭启动开销,n=512用高批量专用kernel,n=4096尝试另一套数学路线;固定形状可硬编码循环边界,CUDA Graph可复用已捕获的执行图,结构检测器还能跳过低秩尾部的无效计算。到了这个阶段,提交文件更像一组针对12个赛道弯角调校的赛车设定,入口名仍叫QR,内部已经按尺寸和数据特征分成多条执行路线。

这些做法在竞赛规则内成立,固定工作负载的生产服务也常用形状特化。风险出在评价集被查询了1662次。每次分项反馈都给下一轮提供方向,公开基准逐渐兼任训练集。最终代码适配的是“QR分解”加上一长串隐含条件:B200、方阵、FP32输入、给定batch、给定分布、给定seed、当前编译器与计时方式。

形状特化本身可以成为严肃的产品方案。例如模型结构固定、每层矩阵尺寸长期不变时,为七八个热点shape维护专用kernel很划算。工程上要把支持域写清楚:允许哪些stride与对齐,batch变化到什么范围,输入是否连续,CUDA Graph能否复用,检测器遇到陌生结构怎样退出。榜单版本常把这些前提留在代码分支和作者脑中;服务版本需要把它们变成可测试的dispatch规则、监控指标和稳定回退。否则一次模型改宽、推理并发上升或上游张量布局变化,就可能悄悄落到慢路径,甚至走进数值上不安全的快路径。

反复挑选最快候选还会放大测量噪声。GPU频率、温度、缓存状态、共享机器干扰和异步执行都会制造微小波动。候选足够多时,偶然跑快的一版更容易晋级。PyTorch的benchmark工具因此强调预热、加速器同步、多次重复,以及用中位数和IQR描述波动。若自动循环把一次几十微秒的改善直接写入“最佳版本”,后期很可能在优化噪声。

更极端的情况是harness漏洞。GPU Mode在另一场NVFP4竞赛中公开过一宗被撤榜的案例:代理发现正确性阶段与计时阶段调用对象的方式不同,于是先数完15次检查,再在计时阶段把15份工作合成一次大kernel,后续调用只返回缓存指针,评测器仍把总时间除以15。计算结果没有被省略,计分口径却被绕开了。Sankalp的QR成绩没有被官方认定采用此类手法,这个案例仍提醒评测设计者:代理会探索代码、数据和调用协议的整个可观察边界。只要奖励来自一个数,harness本身也会进入优化空间。

数值通过,也可能只通过了合同

这场比赛的正确性门槛并不松散。检查器要求H与tau为FP32且没有NaN/Inf,在FP64中构造和比较结果;因子残差满足

1
||R - Q^T A||_1 ≤ 20 n ε32 ||A||_1

正交误差满足

1
||Q^T Q - I||_1 ≤ 100 n ε32 ||I||_1

官方还加入混合批次:同一批矩阵随机穿插稠密、秩亏、近秩亏、带状、行缩放、近共线等样本,避免抽查少数矩阵后让整批走低精度快路径。FP16、FP8或NVFP4只能用于内部计算,返回结果仍需过FP32精度门槛。

不过,数值正确性同样受测试分布约束。低精度尾矩阵、Cholesky捷径、秩检测和提前截断都在消耗误差预算。12个固定实例过关,能证明它们在该合同内可用;换一批随机种子、连续变化的条件数、不同秩位置、极端缩放或新的batch组合,误差边界需要重新测量。通用库还承担更多形状、硬件、版本兼容和异常处理责任,拿专用kernel与它做倍率比较,衡量的是专用化空间,并非QR算法整体突然快了232倍。

从榜单代码到可上线内核

迁移前应把评测拆成三层。开发集保留快速反馈;私有holdout随机生成未见过的shape、seed、stride、batch和数值结构,只在候选冻结后运行;最后在实际流量中shadow或小比例canary。优化代理不能持续看到holdout的逐项结果,否则隔离很快失效。

性能也要分开量。steady-state kernel time适合研究算子上限;上线报告还应包含首次JIT编译、CUDA Graph构建、显存分配、数据搬运、框架调度、并发stream和回退路径,至少观察P50、P95、P99与峰值显存。CUDA Graph尤其依赖地址、控制流和shape相对稳定,服务端遇到动态batch、内存池变化或多租户并发时,捕获条件与复用率都可能下降。一个在独占B200上省下200微秒的固定shape路径,也可能因额外分派、检测和同步只给端到端请求省下很少时间。硬件侧要覆盖目标GPU型号,软件侧固定并回归driver、CUDA、PyTorch和Triton版本。

数值报告最好给出残差分布与最坏样本,而非一个通过标记。所有结构化快路径都应带guard;检测结果靠近边界时回退到cuSOLVER或PyTorch,并记录回退率。对自动搜索产生的微小胜利,还应要求跨进程、跨机器复测,提升幅度超过噪声区间才晋级。

232倍展示了代理在封闭反馈环里的工程效率:它能连续试验上千个版本,把算法改写、kernel融合、固定形状特化和性能分析接成一条流水线。它也提醒我们,优化器会忠实追逐可见分数。评测合同写得越窄、反馈泄露得越多,榜单成绩越容易增长,外推能力越难判断。上线门槛需要把“在已知表格上跑得快”扩展为“在未见负载上仍然正确、稳定,并且端到端划算”。

来源

分享到