把 agent 工作流当程序调度,推理吞吐最高涨到 3.6 倍

ThunderAgent: A Simple, Fast and Program-Aware Agentic Inference System

Hao Kang, Ziyang Li, Weili Xu, Xinyu Yang, Yinfang Chen, Junxiong Wang, Beidi Chen, Tushar Krishna, Chenfeng Xu, Simran Arora

cs.OS, cs.MA

2026-02-14

把整条 agent 工作流当成可调度程序,KV 命中率拉满,推理吞吐做到 vLLM 的 1.5 到 3.6 倍,RL rollout 最高 3.9 倍。

这篇在解决什么

跑一个会调工具的 agent,比如让模型一边写代码一边在沙箱里编译运行,要在 LLM 推理和工具执行之间来回切换几十次。现在的部署方式是把推理引擎(vLLM 这类)和工具编排器(Kubernetes 这类)两套系统松散拼起来,各自按单条请求分配资源,谁也不知道整条工作流长什么样。

后果有三个。高并发时,推理引擎为了给别的请求腾显存,会把正在等工具返回的那条工作流的 KV 缓存清掉,工具一回来又得把整段上下文重新算一遍,单条请求延迟最多被拉长到 7.14 倍。为了保命中率把同一工作流钉在一个节点上,又导致节点间显存严重失衡,90 分钟的 rollout 里最大能差到 51%,超过 20% 的失衡持续 37 分钟。工具沙箱用完没人收,磁盘和网络端口一点点漏光。

根子在于按请求调度,缺的是对整条工作流的端到端视角。

方法

ThunderAgent 把一条 agent 工作流抽象成一个「程序」,记录它的上下文长度(KV 缓存占多少显存)、用到的工具环境集合、落在哪个节点、当前在推理还是在调工具、调度状态(运行、暂停、结束)。有了这个统一抽象,显存、系统状态、外部磁盘和网络端口这些原本各管各的资源就能一起调度。

调度器围绕一个目标设计:把 KV 缓存命中率顶住。它每隔一段时间(默认 5 秒)查一次各节点显存,一旦某个节点显存吃紧要开始抖动,就按「最短优先」暂停上下文最短的程序。原因是重算一条 KV 缓存的代价和它上下文长度成平方关系,丢掉短的损失最小。对正在调工具(暂时不需要 KV)的程序,用一个时间衰减函数 2 的负 t 次方逐步降低它的显存权重,工具拖得越久越倾向于先让位。论文还证明:当工具执行时间满足无记忆性(剩余时间和已等多久无关),指数衰减是唯一最优的衰减形式。

工具资源这一侧,程序结束就靠生命周期钩子立即拆掉沙箱和 API 服务,堵住泄漏;当某个高优先级程序快轮到恢复时,提前异步把它的执行环境准备好,把初始化的 I/O 藏到推理时间里。最后,所有节点共享一个全局等待队列,一条程序被暂停后不必回到原节点,谁显存空就路由给谁,把跨节点的空闲显存也用起来。

结果

在 SWE-Bench、HLE-Bench、ScienceAgentBench 三类工作流(代码、路由、科学发现)上,以 GLM-4.6(355B)、Qwen-3(235B)FP8 部署在 8 张 H100 的节点上测:

工作流模型对 vLLM 提速
OpenHands 代码GLM-4.63.58 倍
mini-SWEAgentQwen-3 235B3.02 倍
ScienceAgent 科学发现GLM-4.61.24 倍
ToolOrchestra 路由(HLE)Qwen3-8B1.48 倍

整体 serving 吞吐相对 vLLM 提速 1.48 到 3.58 倍,相对多轮专用系统 Continuum 提速 1.17 到 3.31 倍。对工具耗时确定的工作流,ThunderAgent 的 KV 命中率接近 100%,而 Continuum 在高并发下从 90% 以上掉到约 60%。RL rollout(两个 8×H100 节点)上,mini-SWEAgent 从每分钟 375 步涨到 672 步(1.79 倍),OpenHands 从 69 步涨到 271 步(3.92 倍)。工具资源管理还省下 4.2 倍磁盘。系统已接入 SkyRL 和 NVIDIA Dynamo,扩展性验证到 64 张 H100,A100 上同样有效。

为什么重要

推理成本正在从单次问答转移到跑完整条 agent 工作流,而工作流里大头是等工具和重算被清掉的上下文。这篇的贡献是给出一个不绑死某个推理引擎的调度层(它直接包在 vLLM 或 SGLang 外面,接入只改三处),按工作流结构而非单条请求来调度。对在攒 agent 训练和上线的人,这是直接能用上的吞吐优化。但要看清:提升来自高并发下的显存调度,单条低并发跑不会有大变化。

局限与存疑

工具耗时高度随机的工作流(比如 ToolOrchestra 调外部模型 API)是弱项,某个配置下甚至比基线慢到 0.65 倍,论文也承认这种场景下它是拿 KV 命中率换计算利用率。所有评测都在 GLM-4.6 和 Qwen-3 这两个模型族上做的,换模型没验证;多模态 agent、消费级显存(除了一张 RTX 5090)、分布式下的容错都没有覆盖。调度器本身的开销从 2 节点的 13.5 毫秒涨到 8 节点的 22.7 毫秒,目前还在可接受范围,更大集群下没有数据。

术语

原文与代码

社区讨论

全部论文解读