十万张国产卡上,GLM 用两周把自己的推理吞吐做到三倍——而这篇最该抄的不是成绩,是它怎么把「掉了 20%」拆成查得动的证据
Toward Recursive Self-Improvement: How GLM Built Its Own Inference Infrastructure
9 月,智谱(Z.ai)发了一篇工程博客,记录 GLM-5.3-Flash 上线前那两周发生了什么:他们在一个十万张以上国产 AI 加速卡的集群上从零搭出一套生产级推理服务,端到端吞吐相对第一版刚能跑通的基线翻了三倍。原文特意写了一句——这些活「不是一个基础设施工程师团队独力完成的」,大部分由一个叫 Infra Agent 的智能体做,而驱动它的模型正是 GLM-5.3 本身。模型在优化自己正在跑的那套推理系统。
值得读的不是这个成绩,是他们回头总结出的那句判断:Infra Agent 干得好不好,主要不取决于模型的代码和推理能力,而取决于系统能不能持续给出「能归因到具体原因」的反馈。代码库只是静态上下文;把「数值精度测试失败」「首 token 延迟涨了 30%」「输出吞吐掉了 20%」这种结论丢给 agent,它照样不知道该怀疑哪一层。原文这句写得很准:端到端指标只能告诉 agent 结果变差了,不能解释为什么。这和本栏第 22 篇把「感觉变差了」变成可测的东西是同一个调子,只不过这回的对象不是模型输出,是一整套推理栈。
「密集反馈」不是把日志全塞给它
他们把这套做法叫 dense feedback(密集反馈),并特意声明「密集」不等于喂得越多越好——恰恰相反,大量无结构的日志会把关键信号埋掉,覆盖不全的性能剖析还会让 agent 归因归错地方。密集只指三条判据:一、反馈必须足够局部,能绑到某个引擎启动参数、某次代码改动、某个算子、某种输入条件、某个线程或某段执行区间上,帮 agent 把范围收窄;二、反馈必须便宜且及时,验证周期短,agent 才来得及掉头,不至于把一整轮耗在一个错假设上;三、反馈必须能客观验证,改得对不对、快了没有,由参考实现、测试结果和可比的实验指标说话,不由 agent 自己表态。三条凑齐,反馈才算「可行动」。
把老工程师脑子里的诊断顺序摆到外面
传统推理优化从不缺测试、日志、profiler 和微基准,问题是它们散在不同工具和不同工程阶段里,靠资深工程师的经验串起来:压测结果不对,他知道下一步该看算子输出还是执行时间线。这套隐性顺序对 agent 并不存在。所以他们把正确性测试、运行日志、执行 trace、运行时事件、微基准、端到端指标全部编进 agent 的迭代流程,做成可直接调用、可重复的工作流——算子级比对管「算得对不对」,微基准管「特定输入下局部多快」,trace 和事件管「时间花在计算、等待还是通信上」。关键设计是让 agent 按当前假设去挑验证手段,而不是每改一次就整套服务重新部署、重新压测。分工也说得清楚:局部验证负责早点淘汰无效改动、挑出值得深挖的候选;端到端测试负责确认局部收益是否真落到服务上、有没有引进新的回归。
三个案例:算得对不对、时间去哪了、怎么更快
第一个是数值精度。并行策略一变,算子输入怎么切、走哪条执行路径、结果怎么合并都跟着变,所以只在不切分的情况下测算子输出根本不够。他们先建了一张「并行策略 → 算子实现」的映射,把系统级部署配置翻译成 agent 能逐个验证的算子级任务,再让它拿切分路径和不切分路径的结果对比。查出来的问题在 KDA 算子的 Context Parallelism(上下文并行,把一条长序列按位置切给多张卡分头算、再把状态合并回去)路径上:合并状态用的 tl.dot 为了性能默认走 TF32 精度,即便输入是 FP32 也一样,误差在状态变换合并与更新中逐步累积,上下文越长越明显。修法是显式指定 input_precision="tf32x3",用三次 TF32 张量核运算拼出更高精度,同时尽量保住张量核的速度优势。这处修复已经合并进上游的 Flash Linear Attention,不是只在自家仓库里自说自话。
第二个是定位瓶颈,最能说明「约束条件本身就是反馈」。工程师给 agent 划好了测试场景——只跑 Prefill(把整段提示词一次算完)、Prefill 加 KV Transfer(把算好的 KV 缓存搬到负责逐字输出的那一端)、只跑 Decode(逐个 token 往外吐)——并给每个场景定了验收线:同样负载下,Prefill 加 KV Transfer 相对只跑 Prefill 的性能差距不得超过 5%。agent 实测发现某些场景超过 20%,于是把范围收到 KV Transfer 带来的额外开销和并发交互上;再看时间线,发现一个异常:Python 侧的 KV Transfer 执行从来不和 DeepEP 的 dispatch/combine 调用区间重叠。顺着调用链追到 Python 与 C++ 的边界,原因是他们用的 DeepEP v1.2.1 里 intranode_dispatch 和 intranode_combine 都没有显式释放 GIL(Python 全局解释器锁,同一进程同一时刻只允许一个线程执行 Python 字节码)。进了 C++ 不等于自动放锁——锁被握着的这段时间里,同进程中负责搬 KV 的那个 Python 线程拿不到锁,传输任务的调度和提交被拖住,底层再支持异步也兑现不了。更漂亮的是现成的对照:同版本的 internode_dispatch 已经显式放锁,注释里写明就是为了别挡住别的线程传 KV。改完之后那个差距从 20% 以上降到 1% 以下。
第三个是算子优化,方法论味道最重。他们让 agent 去读 SGLang、Flash Linear Attention、DeepGEMM 这些项目里人手写的算子,跨语言、跨硬件平台地把优化手法抽出来,通过增量实验和消融实验蒸成一份份「优化骨架」——每份写清适用条件、变换方法、资源约束和验证证据。换一个新算子,agent 从骨架起手,再用 profiling 和分层测试重新评估分块、访存和资源分配,验证通过的改动连同它的适用条件回流进骨架库。文中给的例子是一个 KDA Decode 算子:ReplaySSM 用算力换显存,先让它变慢了一截;agent 的除法优化把这一版执行时间砍掉 9.6%;然后在「计算是主要瓶颈」这条反馈之后,它发现原实现沿 V 维度分块,导致同一份 FP32 归一化和门控计算被重复做了四遍,于是把分块并进一个线程块、让共享的中间结果常驻寄存器、用一次 warp 级归约替掉重复计算——牺牲一部分并行度,换来 1.71 倍加速。还有一条容易被跳过的提醒:算子性能必须放在推理引擎的真实执行环境里评估,给某个计算算子多分资源,可能让它自己变快、却把搬 KV 的算子挤慢,整条流水线反而更差。
人还守着哪条线
原文对边界写得很克制。工程师有三件事不交出去:定优化目标和系统约束、把 agent 能直接用的反馈环境搭出来、审那些牵涉系统架构、异步并发和线上风险的关键改动。agent 负责提假设、改代码、跑实验,再拿反馈决定留、改还是弃。结尾几句值得原样记下来:「模型优化系统,系统运行模型。」以及——我们还没到递归自我改进(RSI,指系统能自主设计并训练出比自己更强的下一代);选目标、划边界、评风险仍是人的责任,我们相信人应该长期守住这条线;但两周、三倍吞吐、十万张加速卡这几个数字告诉我们,这条边界上的进展不会因为我们希望它慢下来就真的慢下来。
但要把它的成绩读小一点,这是厂商自述,几处地方值得打个折。三倍是相对「第一版刚能跑通」的基线,不是相对一个已经调好的系统;两周之内的进展没有对照组,我们无从知道同样两周纯人类团队能到哪儿,也无从知道 agent 到底省掉的是哪部分工时。更要紧的是,「递归自我改进」这个标题和它实际展示的东西之间有落差。它展示的是:在一个被精心工程化的反馈环境里,agent 能把资深工程师的诊断套路跑得又快又便宜。被自动化掉的是搜索空间里的试错,不是判断——目标、边界、风险评估全在人手里,原文自己也这么说。这离「自主设计下一代」还远,第 69 篇算过这类加速的上限:真正的开关不是单轮迭代快了多少,是造下一代要多久,而那个时间有地板。
真正被低估的含义在另一头:地缘。十万张国产加速卡、生态不成熟、算子支持不全、该有文档的地方只能猜——这套栈历来最贵的成本就是人肉填坑的工时,而这恰好是 agent 最能摊薄的那一块。结果是硬件利用效率和单 token 成本做到了「与主流 NVIDIA GPU 相当」的水平(这句是他们自己的说法,没给同台数据,只能算一个待验证的声明)。如果这条路确实通,那「芯片性能差距」和「软件生态差距」这两件事的权重就得重新算:后者过去要靠年计的人力积累,现在可能变成一件用算力换的事。这比 RSI 那个标题重要得多。
和第 55 篇对照着读最有意思。那篇是 agent 在训练数据里几乎没有的 Blackwell 上,靠十个单元测试当反馈,写出比专家手写 Triton 更快的算子;这篇是同一件事换到国产卡上、换到生产环境里、由芯片厂之外的一方做了一遍。两篇合起来的结论挺硬:新硬件的软件栈,正在从「靠积累」变成「靠好测试加算力去换」。而这两篇的成功都押在同一件人做的事上——有人先把评判标准写死了。
本文为 AKL AI Club 原创撰写的导读,不是原文翻译;著作权归原文作者所有。 篇目由编辑独立选取,来源均经人工核实。