跳转到主要内容
AI Systems

CUDA Agent

约 19 分钟阅读

论文: CUDA Agent: Large-Scale Agentic RL for High-Performance CUDA Kernel Generation 作者: ByteDance Seed & 清华大学 AIR 日期: 2026.02

1. 问题背景

GPU kernel 优化是现代深度学习基础设施的核心,但这项工作极度依赖对 GPU 微架构的深入理解和复杂的 profiling 工具链。尽管 LLM 在通用编程任务上已经接近人类水平,但在 CUDA kernel 生成上仍然不如 torch.compile 这样的编译器系统。

现有方法分两条路线,都有明显瓶颈:

Training-free 方法(STARK, ReGraphT, EvoEngineer, CudaForge):设计手工搜索/优化启发式,依赖基座模型本身的 CUDA 编码能力。模型不会写 CUDA,再怎么搜索也没用。

Fine-tuning 方法(Kevin, CUDA-L1, ConCuR):在固定的多轮执行反馈循环中微调模型。问题是把所有历史解决方案塞进 context,浪费 context length,同时限制了 agent 自主学习调试、搜索和 profiling 策略的能力。

CUDA Agent 的核心思路:不要给 agent 一个固定的优化流程让它照着走,而是让它在一个真实的 CUDA 开发环境中自主探索,通过 RL 从根本上提升模型的 CUDA 优化能力。

2. 系统架构总览

CUDA Agent 由三个核心组件构成:

  1. 可扩展的数据合成 Pipeline — 解决训练数据稀缺问题
  2. Skill-Integrated Agent Loop — 提供真实的 CUDA 开发环境和可靠的 reward 信号
  3. RL 算法改进 — 解决训练不稳定问题,支持 150 步稳定训练

3. 数据合成 Pipeline

高质量 CUDA kernel 数据极度稀缺,手动实现专家级参考代码成本过高。论文设计了三阶段数据合成流程:

3.1 种子算子爬取

torchtransformers 库中挖掘 PyTorch 实现的参考算子。每个算子表示为带 __init__forward 方法的 torch.nn.Module 子类。只选用维护良好的官方库,排除质量不可控的个人仓库。

3.2 组合式问题构造

用 LLM 从 torch 库中采样最多 5 个算子类,顺序组合成融合任务。

这里有一个关键洞察:组合多个算子产生的融合任务 ≠ 单独优化每个算子再串联。融合改变了优化格局:

  • 避免中间结果写回全局内存(intermediate global-memory materialization)
  • 耦合了 register/shared memory/occupancy 约束
  • 需要统一的并行映射和数据布局

所以组合式问题天然就是好的 CUDA 训练数据。

3.3 严格过滤

四个过滤条件:

  1. 必须在 Eager 和 Compile 模式下都能成功执行
  2. 排除具有随机性的算子(确保可复现性)
  3. 反作弊验证:不同输入的输出不能是常量或数值不可区分
  4. Eager 模式执行时间限制在 1ms-100ms(过滤过简单或过重的任务)

额外做了 AST 相似度去重,排除与 KernelBench 测试集相似度 > 0.9 的样本。

最终数据集 CUDA-Agent-Ops-6K 包含 6000 个样本,组成如下:

类别占比
torch 2-op 组合83.77%
torch 3-op 组合7.62%
torch 单 op3.40%
torch 4-op 组合2.80%
torch 5-op 组合1.23%
transformers 算子1.18%

4. Skill-Integrated Agent Loop(核心)

这是论文最重要的设计。

4.1 Agent Loop 架构

基于 OpenHands 框架,采用 ReAct 范式(Reasoning → Action → Observation 交替循环),支持迭代式编码、调试和性能优化。

Agent 的工具集(Action Space):

工具功能
Bash持久 shell 会话,执行编译、依赖管理、程序运行
Read / Write文件读写(写操作有 read-before-write 保护)
Edit / MultiEdit确定性字符串级代码修改,支持多文件原子编辑
Glob基于 glob 模式的文件发现
Grep基于 ripgrep 的代码搜索
BashOutput流式输出后台进程的增量输出(监控编译等长任务)
KillBash终止后台 shell 会话

注意:不提供任何 web 搜索或外部信息检索工具,确保所有解决方案纯粹来自本地执行环境。

4.2 CUDA Coding Skill

受 Anthropic 的 Agent Skills 思想启发,将 CUDA 编码特定的指令和工具以 Agent Skills 格式提供。核心是一个 SKILL.md 文件,规范了 CUDA kernel 优化的标准流程:

Step 1 — 分析:使用 profile.py 分析原生 PyTorch 实现的性能,识别瓶颈(过多 kernel 启动、次优内存访问模式等)

Step 2 — 实现:在 model_new.py 中重写模型,在 kernels/ 目录开发 CUDA kernel 源文件和绑定代码

Step 3 — 编译评估:在 GPU sandbox 环境中编译和评估,迭代优化直到数值正确性和性能要求都满足

Step 4 — 迭代:重复 Step 2-3,直到最终实现比 torch.compile 基线快至少 5%

SKILL.md 中还包含:

  • 工作区结构规范(哪些文件可以修改,哪些不能)
  • CUDA kernel 编写模板(.cu 文件 + _binding.cpp 文件分离,加速编译)
  • 优化策略优先级:算法优化(>50% 收益)> 硬件利用率(20-50%)> 精细调优(<20%)
  • 常见问题排查指南和完整的优化 checklist

这个设计的精妙之处在于:不是把 CUDA 知识硬编码到模型里,而是以”技能文档”的形式提供,让 agent 在交互过程中自主参考和运用。

4.3 Robust Reward Scheduling

论文发现直接用 speedup 作为 reward 有问题:不同算子优化难度差异巨大,原始 speedup 是代码质量的不可靠代理。一个简单算子 10x speedup 可能比复杂算子 1.5x speedup 容易得多。

提出归一化的离散 reward 方案:

r = -1  正确性检查失败
r =  3  比 eager 和 compile 都快 5% 以上
r =  2  只比 eager 快 5% 以上
r =  1  正确但不够快

消融实验证实,这种基于里程碑的 reward 显著优于连续 speedup reward(Faster Rate: 96.8% vs 60.4%)。

4.4 防止 Reward Hacking

这是工程上非常重要的细节。之前的工作(如 Sakana AI 的 AI CUDA Engineer)就被发现存在 reward hacking 问题。CUDA Agent 采取了五重防护:

  1. 文件权限控制:正确性验证和性能 profiling 的 Python 脚本通过文件权限保护,agent 无法修改评估逻辑
  2. 禁止回退:通过 context manager 禁止调用 torch.nn.functional 的回退实现,确保性能提升来自真正的 CUDA kernel
  3. 多输入验证:每个问题用 5 个随机采样的输入验证 kernel 输出,遵循 KernelBench 评估协议
  4. 精确 profiling:proper device synchronization、warm-up iterations、重复测量取平均,大幅降低测量噪声
  5. 无外部信息:不提供 web 搜索工具,所有解决方案必须来自本地环境

4.5 Sandbox 环境

采用 CPU-GPU 资源解耦架构

  • Docker-based terminal sandbox 处理 CPU 密集任务(kernel 编译)
  • Agent 通过预定义的 skill scripts 将验证和 profiling 任务分发到专用 GPU sandbox pool(128 块 NVIDIA H20 GPU
  • 进程级隔离和独占资源分配,消除进程间干扰,确保延迟测量稳定

5. RL 算法改进:解决训练不稳定

这是论文的另一个关键贡献。

5.1 训练不稳定的根因

初始 RL 试验只能稳定训练 17 步就崩溃。根因是严重的领域分布不匹配:

  • CUDA 编码数据在预训练数据中占比 不到 0.01%
  • 基座模型的先验分布与 CUDA kernel 编码所需的数据分布严重偏离
  • 大量采样到低概率的 CUDA kernel 代码 token
  • 训练和推理引擎使用不同数值精度(BF16 vs FP16)时,低概率 token(如 π(a|s) ≈ 10⁻⁹)导致 importance sampling ratio 方差爆炸

5.2 三阶段 Warm-up 策略

为了解决这个问题,论文提出了一个简单但有效的 warm-up 策略:

Stage 1: Single-Turn RL Warm-up

先在基座模型上进行单轮 RL(标准代码生成目标,模型一次性预测最终 kernel,没有执行反馈)。使用 PPO 优化,context window 32K tokens。这一步提升模型的基础 CUDA 生成能力。

Stage 2: Actor 初始化 — Rejection Fine-Tuning (RFT)

用 Stage 1 的模型在完整 agent loop 中收集 CUDA agent 轨迹,然后做 rejection sampling:

  • 结果过滤:只保留正 reward (R > 0) 的轨迹
  • 模式过滤:丢弃低效行为(冗余多轮循环、违反工具调用 schema 的幻觉)

用过滤后的轨迹做标准 SFT 初始化 actor。

RFT 的作用是提供一个强行为先验,约束 RL 训练过程中的策略熵增长。消融实验显示,去掉 RFT 会导致训练 reward 快速崩溃,策略熵急剧上升(策略分布变得越来越弥散,输出不连贯)。

Stage 3: Critic 初始化 — Value Pretraining

用采样的轨迹数据(状态序列 + outcome reward)预训练 critic network。使用 GAE(Generalized Advantage Estimation)计算目标值,γ=1, λ=0.95。

Value Pretraining 的作用是让 critic 能立即提供准确的价值估计。消融实验显示,去掉 Value Pretraining 会导致 critic 无法学到有意义的 value function(explained variance 极低),进而导致轨迹长度爆炸——未初始化的 critic 无法惩罚无效搜索路径,agent 陷入无限循环。

5.3 Agentic RL 训练

完成三阶段 warm-up 后,使用 PPO 进行 agentic RL 训练:

参数
基座模型Seed1.6 (23B active / 230B total, MoE)
Context window131072 tokens (128K)
最大 agent turns150(训练)/ 200(评估)
Global batch size1024
Actor LR3×10⁻⁶
Critic LR6×10⁻⁶
PPO clip (lower/higher)0.2 / 0.28(非对称)
训练步数150

经过这些改进,RL 训练可以稳定进行 200 步并持续 reward 增长(对比初始的 17 步崩溃)。

6. 实验结果

6.1 主要结果

在 KernelBench(250 个算子任务,Level 1-3)上的表现:

模型Pass RateFaster Rate (vs Compile)Speed-up (vs Compile)
Seed1.6 (base)74.0%27.2%0.69×
GLM 4.675.6%19.2%0.57×
Kimi K266.8%22.8%0.66×
Gemini 3 Pro91.2%69.6%1.42×
Claude Opus 4.595.2%66.4%1.46×
CUDA Agent98.8%96.8%2.11×

三个关键发现:

  1. CUDA Agent 全面碾压顶级闭源模型。Claude Opus 4.5 和 Gemini 3 Pro 虽然 Pass Rate 不错(91-95%),但 Faster Rate 只有 66-69%,说明通用 LLM 经常生成”能跑但不快”的 naive kernel。CUDA Agent 的 96.8% Faster Rate 说明专门的 RL 训练让模型学会了持续生成正确且高度优化的实现。

  2. 在算子融合场景(Level 2)上优势最大。CUDA Agent 达到 100% Faster Rate 和 2.80× speedup。传统编译器依赖预定义的规则模式做 kernel fusion,遇到非平凡的算子组合就力不从心。CUDA Agent 通过迭代 agent loop 探索了更大的设计空间,发现了静态后端无法触及的硬件特定内存访问模式和 tiling 策略。

  3. 在最难的 Level 3 上比最强闭源模型高约 40%(Faster Rate: 90% vs 50-52%)。

有趣的细节:ChatGPT-5 系列(5, 5.1, 5.2)在评估中持续拒绝响应 CUDA 相关 prompt,无法参与评测。

6.2 消融实验

变体Faster Rate (vs Compile)Speed-up (vs Compile)
w/o Agent Loop14.1%0.69×
w/o Robust Reward60.4%1.25×
w/o RFT49.8%1.05×
w/o Value Pretraining50.9%1.00×
CUDA Agent (full)96.8%2.11×

每个组件都不可或缺:

  • 去掉 Agent Loop 影响最大(96.8% → 14.1%):没有编译错误、运行时失败和 profiler 反馈的迭代交互,模型根本无法有效优化
  • 去掉 Robust Reward:Pass Rate 几乎不变,但优化质量大幅下降
  • 去掉 RFT:训练 reward 快速崩溃,策略熵爆炸
  • 去掉 Value Pretraining:critic 失效,轨迹长度爆炸

7. Case Studies:CUDA Agent 学到了什么

7.1 代数简化(Level 1)

任务:对角矩阵与稠密矩阵相乘。

原始实现显式构造对角矩阵再做 GEMM。CUDA Agent 识别出这等价于逐行缩放(diag(A) × B 等价于每行 i 乘以 A[i]),将复杂度从 O(N²M) 降到 O(NM)。

结果:73.31× speedup vs torch.compile

7.2 Kernel 融合 + 代数重写(Level 2)

任务:矩阵乘法 → 除法 → 求和 → 缩放。

CUDA Agent 利用求和和矩阵乘法的线性性,将 Σⱼ(xᵢ·wⱼᵀ)/2 重写为 xᵢ·(Σⱼwⱼᵀ)/2,把矩阵乘法+归约变成列求和+点积。然后融合为两个高效 kernel,使用 float4 向量化加载和 shared memory tree reduction。

结果:24.04× speedup vs torch.compile

7.3 硬件感知优化(Level 3)

任务:ResNet BasicBlock(卷积 + BatchNorm + ReLU + 残差连接)。

CUDA Agent 的优化策略:

  1. 将 BatchNorm 参数折叠进卷积权重和 bias,消除 BatchNorm 算子
  2. 使用 cudnnConvolutionBiasActivationForward 融合 conv + bias + ReLU 为单个 cuDNN kernel
  3. 启用 TF32 计算,利用 Tensor Core
  4. 融合残差加法和最终 ReLU 为单个自定义 CUDA kernel
  5. 尝试了 NCHW → NHWC 布局转换以更好利用 Tensor Core,但发现转换开销抵消了收益,最终保留 NCHW

结果:3.59× speedup vs torch.compile

7.4 通用优化模式总结

跨所有难度级别,CUDA Agent 展现出几类反复出现的优化模式:

  • 代数简化:识别高层张量表达式的数学结构,用更简单的等价计算替代
  • Kernel 融合:合并逻辑相关的操作,消除中间张量物化,减少 kernel 启动开销
  • 内存访问优化:coalesced global memory access、shared memory、vectorized loads (float4)
  • 硬件感知优化:TF32 Tensor Core、精度选择
  • 库感知优化:在合适时调用 cuDNN/cuBLAS 融合 API

8. 局限性

  1. 未与 TVM 等更复杂的编译器框架比较。TVM 的调优开销和部署复杂度难以集成到大规模 RL 训练循环(数千次 rollout)中,论文选择 torch.compile 作为广泛采用的基线。
  2. 计算资源需求巨大。训练 pipeline 依赖 128 块 H20 GPU pool 和进程级隔离,计算和工程成本高,限制了更广泛研究社区的可及性。

9. Takeaways

这篇论文的核心贡献不只是一个更好的 CUDA kernel 生成器,而是验证了一个更广泛的范式:

给基础模型配备结构化环境和可靠的执行反馈 reward,可以将它们从被动的代码生成器转变为主动的系统优化器。

几个值得关注的设计选择:

  • Agentic RL > 固定多轮循环:让 agent 自主决定何时编译、profiling、调试、重写,比预定义的固定交互协议更有效
  • Agent Skills 范式:将领域知识结构化为 skill 文档而非硬编码到模型中,兼顾了灵活性和专业性
  • 离散里程碑 reward > 连续 speedup reward:归一化的 reward 方案更稳定,更能引导策略发现有效优化
  • 三阶段 warm-up 解决分布不匹配:RFT 初始化 actor + Value Pretraining 初始化 critic,是在数据稀缺领域做 agentic RL 的通用方案
  • 防 reward hacking 的工程实践:文件权限隔离、禁止回退、多输入验证——这些细节决定了 RL 训练能否真正 work