AVO: Agentic Variation Operators for Autonomous Evolutionary Search

paper LLM-agent evolutionary-search GPU-kernel NVIDIA
Authors: Terry Chen, Zhifan Ye, Bing Xu 等 23 人(NVIDIA)
Source: arXiv:2603.24517v1 Date: 2026-03-26

? 问题

人类专家花几个月手调的 GPU attention kernel,AI 能不能自己调得更好?

Attention 是 Transformer 里最核心的操作。FlashAttention 系列和 NVIDIA 的 cuDNN 库已经把 attention 的 GPU 吞吐量推到了接近硬件极限的位置。在最新的 Blackwell B200 GPU 上,FlashAttention-4 和 cuDNN 都经过了好几个月的手工优化——warp 特化、流水线调度、寄存器分配,每一处改动都需要深入理解硬件架构。

之前有人尝试用 LLM 来辅助这类优化。FunSearch 和 AlphaEvolve 的做法是:把 LLM 塞进一个固定流水线里,让它充当"代码生成器"——框架选父代、LLM 生成子代、框架评估打分。LLM 只管生成,不能看文档、不能跑 profiler、不能调试、不能反思失败原因。就像请了一个专家,但只让他写代码,不让他看性能报告,不让他思考。

对于已经被极度优化过的 kernel,这种方式不够用。进一步提升需要的是:读硬件文档理解约束、跑 profiler 找瓶颈、试一种改法发现不行再换一种、基于积累的经验调整策略。这是一个完整的工程师工作流,不是单次代码生成能解决的。

📖 翻译

从"代码生成器"到"工程师"

AVO 的核心转变用一句话说清:把 LLM 从进化搜索中的代码生成器升级为变异算子本身。

以前(FunSearch / AlphaEvolve)

框架控制一切:选哪些父代、怎么采样、怎么评估。
LLM 只在 Generate 步骤里被调用一次,输出一段代码,交差。
不能看文档、不能跑测试、不能从失败中学习。

现在(AVO)

AI agent 替代整个变异过程:自己决定看哪些父代、查什么文档、改哪段代码。
改完自己编译、跑 profiler、看结果。
不行就调试、换策略、再试。整个循环自主完成。

打个比方:以前像让一个画家闭着眼睛画——你告诉他画布上有什么,他画一笔,然后你告诉他效果。现在把眼睛打开了,他自己看画布、自己选颜料、自己判断效果、自己决定下一笔。

怎么跑的

AVO 的一次变异步骤是一个完整的 agent session:

输入: - 历史所有 kernel 版本及其性能分数 (lineage) - 领域知识库 (CUDA 文档, PTX ISA, Blackwell 架构手册, FA4 源码) - 评分函数 (正确性检查 + 吞吐量测量) Agent 循环: 1. Planning -- 查看历史版本的 profiling 数据,查阅硬件文档 2. Implementation -- 修改 CUDA kernel 代码 3. Evaluation -- 编译、正确性检查、吞吐量测量 4. Bug-Fixing -- 如果失败,诊断原因,修复,回到 2 (这个内循环可能重复多次) 输出: 新的 kernel 版本 + 性能分数 外层: 监督 agent 检测停滞,停滞时介入引导新方向

外层有一个监督 agent。如果主 agent 在一个方向上卡住了——反复尝试同类改动但性能不涨——监督 agent 会介入,审视整个进化轨迹,提出几个新的优化方向,把搜索推向新区域。

跑了 7 天,发现了什么

在 NVIDIA B200 GPU 上,AVO 从一个种子 kernel 出发,连续自主进化 7 天。过程中探索了超过 500 个优化方向,最终提交了 40 个有效版本(性能持续提升的版本)。

最终结果:

场景vs cuDNNvs FlashAttention-4
多头注意力 (MHA) causal+0.4% ~ +3.5%+5.0% ~ +10.5%
多头注意力 (MHA) non-causal+1.8% ~ +2.4%持平或小幅领先
分组查询注意力 (GQA) causal+7.0%+9.3%
分组查询注意力 (GQA) non-causal+6.0%+4.5%

最高吞吐量 1668 TFLOPS(BF16 精度)。GQA 的结果特别有意思——AVO 只在 MHA 上做了 7 天进化,然后花 30 分钟自主适配到 GQA,性能提升反而更大。说明 agent 发现的优化不是针对特定配置的微调,而是触及了更深层的硬件效率改进。

Agent 发现了什么样的优化

论文详细分析了三个代表性优化,每一个都不是简单的代码变换,而是需要同时理解多个硬件子系统:

无分支累加器重缩放(v19 → v20,non-causal +8.1%):在线 softmax 算法中,当 row-maximum 更新时需要重新缩放输出累加器。原来的实现用条件分支跳过不需要重缩放的情况。Agent 把分支去掉了——始终计算重缩放,maximum 没变时乘以 1.0(无操作)。代价是多了一次乘法,但消除了 warp 同步开销和分支预测惩罚。同时还把阻塞式内存屏障换成了非阻塞式的,因为无分支路径保证了 warp 内所有线程走同一条路。

流水线重叠(v29 → v30,non-causal +1.1%):原来的 correction warp 必须等两个 Q-tile 阶段的 PV GEMM 都算完才能开始归一化。Agent 重组了流水线,让 correction warp 在第一阶段的 PV GEMM 完成后就开始处理,与第二阶段的 GEMM 并行。把串行依赖变成了流水线执行。

寄存器重新分配(v32 → v33,non-causal +2.1%):Blackwell 每个 SM 有 2048 个寄存器,分配给不同 warp 组。原来按 FA4 的分配方式(softmax 192 / correction 80 / 其余 48),correction warp 因为寄存器不够在往 local memory 溢出。Agent 发现 softmax warp 实际上用了打包运算,峰值寄存器用量很低,于是从 softmax 组借了 8 个寄存器给另外两组(184/88/56),消除了溢出。

每一个优化都不是在调一个参数,而是在跨多个硬件子系统做联合推理。

🔑 核心概念

Agentic Variation Operator(代理式变异算子)

在进化搜索中,用一个自主 AI agent 替代传统的变异操作(选择 + 生成)。Agent 自己决定看什么、改什么、怎么验证、失败了怎么调整。

类比

传统进化搜索里的 LLM 像一个被蒙住眼睛的棋手——别人告诉他棋盘状态,他说一步棋,别人执行。AVO 里的 agent 像一个坐在棋盘前的完整棋手——自己看盘、自己思考、自己落子、自己复盘。

为什么重要

这个升级让 agent 能做到单次生成做不到的事:跨多步迭代调试(改了编译不过就修)、策略自适应(早期做结构改动,后期做微调)、基于 profiling 数据做硬件级推理。这些能力在优化已经很好的 kernel 时是必需的。

Continuous Evolution with Self-Supervision(带自监督的持续进化)

Agent 不是跑一次就结束,而是持续运行(这次跑了 7 天),每个成功版本保存为 git commit。监督 agent 检测停滞并重新引导方向。

类比

像一个博士生连续做了一周的实验。有时候一个方向走不通了,导师(监督 agent)来看一眼进展,建议换个角度试试。但具体怎么做还是学生自己决定。

为什么重要

两个失败模式被系统性地处理了:停滞(一个方向做到头了)和无效循环(反复尝试同类改动但不见效)。没有自监督,长时间自主运行很容易陷入死胡同。

💡 洞见

在优化的后半程——当低垂的果实已经被摘完——AI 需要的不是更强的代码生成能力,而是完整的工程闭环:读文档、跑 profiler、试错、反思、换方向。

FunSearch 和 AlphaEvolve 证明了 LLM + 进化搜索能在数学和算法领域找到好方案。但它们面对的问题有一个共同特点:解空间中存在大量"还不错"的解,随机变异就能撞上。GPU kernel 优化不一样——在 FlashAttention-4 和 cuDNN 的基础上再提升几个百分点,需要的不是更多随机变异,而是精准的硬件推理。AVO 证明了一件事:当你给 agent 完整的工具链(文档 + profiler + 编译器 + 调试能力),它能做出人类专家级别的硬件优化——而且是在人类专家已经优化过的基础上。

更深一层:进化搜索的变异算子长期以来被当作一个无状态的函数——输入父代,输出子代。AVO 把它变成了一个有状态的、有记忆的、能自我调整的 agent。这个从"函数"到"agent"的升级可能适用于所有进化搜索的场景。

🧑‍🎓 博导审稿

选题眼光非常好。LLM 在进化搜索中的角色定位是一个真问题——FunSearch/AlphaEvolve 把 LLM 限制在 Generate 步骤里确实是一个瓶颈。把 agent 升级为完整的变异算子是一个自然且有说服力的推进。选 attention kernel 作为测试场景也很聪明——这是地球上被优化得最极致的代码之一,如果 agent 能在这里赢,说服力极强。

方法的定义清晰。公式 (3) vs (4) 的对比把 AVO 和先前工作的区别说得很精确。实际上 AVO 的方法论很简单——就是把一个有能力的 coding agent 放进进化搜索的变异步骤里。简单是优点,不是缺点。

实验结果令人印象深刻。在 cuDNN 和 FA4 这两个极其强的 baseline 上取得 3.5% 和 10.5% 的提升,在 GPU kernel 优化的语境下是很显著的数字。GQA 的迁移实验是亮点——30 分钟适配就拿到更大的提升,证明优化的泛化性。Section 5 对三个代表性优化的详细分析做得好,证明 agent 做的不是表面文章,而是真正的硬件级推理。

但有几个让我不太舒服的地方。第一,论文回避了一个关键问题:用的是什么 agent/什么模型?只说"internally-developed general-purpose coding agent powered by frontier LLMs"。这让复现几乎不可能。我理解 NVIDIA 可能有商业考虑,但对学术论文来说,方法的关键组件不透明是硬伤。第二,只做了 attention kernel 一个任务。论文声称 AVO 是一个通用的变异算子家族,但证据只来自一个领域。至少应该在另一个不同性质的优化任务上验证。第三,7 天的 agent 运行成本是多少?用了多少 token?多少 GPU 小时?论文完全没提。如果 7 天消耗了几十万美元的 API 费用,那这个方法的实用性就需要重新评估。第四,没有和 AlphaEvolve 做直接对比。论文在 related work 里讨论了 AlphaEvolve,但没有在 attention kernel 任务上跑一次 AlphaEvolve 作为对比。这是最直接的 baseline,缺失让人遗憾。

写作质量高。Figure 1 的 EVO vs AVO 对比一目了然。Section 5 的优化分析写得扎实有深度。进化轨迹的可视化(Figure 5/6)也很有信息量——能看到阶梯式提升和收益递减的模式。

判决:weak accept。核心想法(agent 作为变异算子)有真正的贡献,实验结果在一个极难的场景上令人信服。但 agent 实现细节不透明、只有一个任务、缺成本分析和直接对比,限制了论文的说服力和可复现性。

🔗 启发

迁移:AVO 的核心思路——"把 agent 从流水线中的一个步骤升级为整个流水线的控制者"——适用于所有 LLM-in-the-loop 的场景。很多当前的 AI 辅助工作流都有同样的问题:LLM 被限制在"生成"这一步,不能看反馈、不能迭代、不能换策略。任何需要多轮试错的优化任务(编译器优化、超参搜索、材料配方设计),都可以考虑类似的升级。

混搭:进化轨迹中观察到的"阶梯式提升"模式值得注意——大的性能跳跃来自架构级改动(无分支重缩放、流水线重组),小的持续改进来自微调(寄存器重分配、指令调度)。这提示一种两阶段策略:先用 agent 做探索性的大改动,找到一个好的架构骨架,再切换到更便宜的自动调优方法(grid search / Bayesian optimization)做细粒度微调。不需要全程用昂贵的 agent。

反转:直觉上,极度优化过的代码(cuDNN 级别)应该只有人类硬件专家才能继续改进。AVO 证明这个假设错了——agent 在寄存器分配、流水线调度这些需要联合推理的地方找到了人类专家遗漏的改进空间。这暗示:越是需要跨多个子系统联合推理的优化,AI 可能越有优势,因为人类在多维度同时推理时的认知负荷很高。