把一个编码 Agent 扔进真实的软件工程任务里跑,经常意味着一次 rollout 就要消耗多小时、上百次模型与工具交互、滚出接近 1M tokens。这种「超长时长」(xlong-horizon)的训练,正在成为 Agent RL 的核心瓶颈。GPU 要么在等最慢的那次 rollout,要么在堆积的空泡里闲置;而当 Agent 像 Claude Code 那样压缩上下文、生成子 Agent、改方向重试时,一次执行会变成一棵分支共享前缀的轨迹树,展开来训又会把显存与计算量撑爆。阿里 Qwen 团队最新放出的 QwenGyre,就是冲着这两个问题来的。
弹性调度:硬件跟着活儿走,而不是反过来
QwenGyre 把多机 GPU 切成若干「单元」(cell),每个单元既能在 SGLang 上服务 rollout,也能在 Megatron 里跑一次完整的训练步。核心单元持有权威权重和优化器状态,卫星单元平时只服务 rollout,等调度器判定「剩下的单元仍然够撑住现有请求」,就立刻往训练角色切换。
切换不需要 Agent 配合——所有模型调用都打在一个 proxy 后面,proxy 通过 RDMA 把 KV-cache block 顺手搬走,KV 复用最大化、重算前缀被压到最低。Mooncake 的 Transfer Engine 让卫星单元把核心权重拉过来直接加入正在进行的训练 batch,流式训练再让单元微步级别地领取数据。实测一次角色切换平均只需 8.52 秒(rollout→训练)和 3.46 秒(训练→rollout)。
这套设计直接体现在端到端速度上。在匹配 GPU 预算与延迟的前提下,NL2RepoBench、DeepSWE、TerminalBench 三个基准都跑过 Qwen 3.6 122B 与 Qwen 3.8 2.4T 两套模型:对比 Async 模式提速 1.38x–1.78x,对比 Colocate 模式提速 1.21x–1.85x,其中 TerminalBench 上达到最高的 1.85x。
轨迹处理器:把分支树压成「有界训练样本」
弹性调度解决 GPU 利用率,轨迹处理器处理训练样本本身的爆炸。QwenGyre 在 proxy 这一层用 token-in/token-out(TITO)把 token ID 与 policy 的行为 log-prob 完整记录下来,把每个执行的结果存成「前缀共享的轨迹树」。
有意思的是,超时或者评估器异常都没被当成「零分惩罚」。超时但工作区还在的 rollout,会以部分被保留的 workspace 作为评估对象,如果评估器自身崩溃,这条数据会被剔除,绝不污染策略梯度。每条执行最多留 5 条轨迹,优先级 main > main-summary > sub-agent > sub-agent-summary,共享目标只计一次,只有策略真正生成过的 token 参与训练损失。每个执行内部做损失平均,避免一条执行被扩张成多份以后权重被悄悄放大。
这套约束有一个出乎意料的结论:把样本上限定为 5,实际能拿到的训练分数跟无上限的版本「对齐」,但前向-反向时间直接砍掉 25.2%。
跑在 Qwen 3.8 2.4T 上的真实收益
最能说明问题的还是 2.4T 模型本身。48 个训练步下来,QwenGyre 用 75.42 小时跑完,Async 需要 134.55 小时,Colocate 需要 91.47 小时,在 NL2RepoBench 上任务通过率从 52.48% 提到 58.54%——一个百分点不到 6 小时,这种边际成本,在 2.4T 的 MoE 上完全不可想象。训练用的还是改写过的 GSPO 目标,每组 16 个 rollout。
横向看,veRL、AReaL、微软 Agent Lightning 都在做「异步 RL + Agent 训练」这件事:QwenGyre 把独占的弹性 GPU 调度拉到 Agent 训练里、把分支轨迹主动裁剪到有界尺寸,在 2.4T 的尺度上跑出公开可比较的端到端数字。对需要把编码、运维类 Agent 训出「真能干数小时活」的团队来说,这不再只是一个工程优化,而是判断「能不能训」的分水岭。