论文工作

Maestro · DeepShare · ElastiCo · 多目标性能预测 · SagePilot · 字节 Lumen 实习 · 面试问答

当前模块
学习进度0 / 7
Module Switcher
论文工作
内容模块

ICDCS 2026 Maestro

Q: 请介绍一下 Maestro 这项工作。

我讲的工作是 Maestro,它解决的是:多个 Agent 工作流共享有限 GPU 时,怎样减少长任务对短任务的阻塞,同时让多个模型和请求更有效地使用显存。

先解释一下场景。比如一个旅行规划任务,系统先分析用户需求,再调用工具查航班和酒店,最后生成完整行程。这一个用户任务会触发多次模型调用,我们把一次模型调用叫作一个 stage,也就是一个阶段。不同阶段有依赖,也可能使用不同模型。

这里的特点是,同样是调用模型,有的阶段只生成一小段工具参数,有的阶段要写很长的分析。它们看起来都是一个请求,实际运行时间和显存需求却可能差很多。当这些工作流与后台批处理一起运行时,长任务就可能挡住用户正在等待的短任务。

同时,显存里既要放模型权重,也要放每个请求的 KV Cache。KV Cache 可以理解为模型生成过程中保存的上下文计算结果,输入和输出越长,通常需要的空间就越多。如果按最大长度给每个请求预留,短请求会浪费空间;多个模型又都想留在 GPU 上,就容易互相挤占。模型换出去以后,再使用还需要重新加载。

所以我们希望提前知道:这次调用大概要生成多长、运行多久、需要多少显存,再用这些信息安排请求和模型。Maestro 分成三个部分:预测提供需求,节点运行时管理实际资源,调度器决定谁先执行、放到哪里。

第一个部分是输出长度预测。

我们发现,Agent 当前在做什么,比单看输入长度更有帮助。比如同一个旅行助手,查航班时可能只生成几十个 token 的查询参数,最后整理行程时可能输出上千个 token。这里预测的是模型生成的工具参数,不是工具返回多少内容,也不是查询工具要运行多久。

因此我们用了两阶段方法。先预测这次调用触发工具的概率,再把这个概率和其他信息一起交给长度回归器,预测会生成多少 token。前一步相当于给后一步提供一个线索:这次更像是在调用工具,还是在生成一段回答。

具体实现上,MiniLM 提取输入文本的语义,LightGBM 结合输入长度、工具数量、阶段位置和前一次调用情况做预测。工具调用分类器在不同 Agent 之间共享,长度回归器则按 Agent 区分,因为检索、分析、总结这些角色的输出规律不同。两阶段之间传递的是概率,不是先硬分成两类再分别处理。

拿到预测长度后,再换算成两项资源需求。时间上,用输入处理时间,加上预计生成 token 数乘以每个 token 的生成耗时;显存上,根据模型每个 token 的 KV 大小,估计输入加输出需要多少空间。

第二个部分是节点上的显存管理。预测告诉我们大概要用多少,节点运行时负责检查现在到底能不能放得下。

它同时管理模型权重和 KV Cache。对于模型,近期还会使用的尽量保留在 GPU;暂时不用的可以把权重移到 CPU,并保留一部分运行上下文,降低下次恢复成本;更冷的模型再退到磁盘或远端。这样,调度器看到的不只是“这个节点有没有模型”,还知道“这个模型要等多久才能用”。

对于 KV,我们利用 CUDA 虚拟内存管理,把虚拟地址和实际物理显存分开。可以先留出足够的地址范围,实际生成需要空间时,再映射物理页。这样不必一开始就把所有请求的最大空间都占满,但实际显存容量没有变大。

所以每次接收请求、增加分配时都要检查容量,预测预算外还要留余量。如果空间不够,就先考虑对其他任务影响较小的回收方式,并估计以后恢复这些状态要花多少时间,把这个代价反馈给调度器。预测低估时,也不能绕过容量检查继续分配。

第三个部分是调度。这里有两个不同的问题:一个是哪些工作流先推进,另一个是当前这次调用放在哪个节点。

先说执行顺序。我们采用预计剩余时间较短的工作流优先,也就是 SRTF 的思路。这里看的是整个工作流预计还需要多久,不只是眼前这一小步。当前阶段的时间来自长度预测,后续阶段的时间则根据工作流当前位置和相似历史执行情况估计。

举个假设例子:任务 A 当前这一步只要 1 秒,但后面预计还有 20 秒;任务 B 当前这一步要 3 秒,做完就结束。在其他优先级条件相同的情况下,我们更倾向先推进 B,让一个用户任务尽快完成。单看当前阶段最短,就会优先 A,忽略后面的依赖链。

再说放在哪个节点。我们先排除显存无法安全承载请求的节点,再给剩余节点打分。网络和显存匹配越合适,分数越高;开始执行前要等得越久、为它腾空间造成的恢复代价越大,分数越低。 最后选分数最高的节点。

这里开始前的等待,包括节点排队和模型激活。比如两台机器网络条件差不多,一台模型已经准备好,但还要排队 10 秒;另一台没有排队,模型恢复需要 3 秒。在其他条件相同的情况下,第二台更合适。如果第二台还需要回收别人的状态,造成很大的恢复代价,就要把这部分损失一起算进去。这里数字只是为了说明取舍。

交互任务和后台任务竞争时,我们还支持在阶段边界让出执行机会。也就是后台任务完成当前这次模型调用后,先不让它继续下一次,给交互任务让路。普通调度抢占不会直接打断正在进行的生成,所以遇到特别长的一次调用,交互任务仍可能等待。我们也设置了切换收益门槛、冷却时间和等待时间提升优先级,减少反复切换和后台任务长期得不到执行的问题。

把三个部分连起来看:一个请求到来,预测器先估计长度,再换算成时间和 KV 需求;节点报告模型状态、可用显存,以及腾空间的代价;调度器利用这些信息排序和选节点;执行结束后,再把真实长度和资源使用反馈回来,校准后续预测。

实验方面,论文包括物理集群实验和基于执行记录的模拟。高争用模拟中,相比 EDF,SLO 达成率提高了 23.6 个百分点,也就是更多请求能在规定时间内完成。另一个显存实验中,KV 预留的物理显存开销降低了 67.2%。这两个数字对应不同实验。

我认为这项工作的关键,是把 Agent 的行为差异变成资源调度可以使用的信息。我们先估计调用成本,再让弹性显存管理和工作流调度一起利用这些估计,减少长短任务互相阻塞,也减少多模型服务中的保守预留和反复加载。

展开:Maestro 的调度算法、评分与三个模块的关系

排序和放置使用不同的依据

工作流排序:预计剩余时间 = 当前阶段预计执行时间 + 后续工作流时间估计。后续项来自近期相似状态的执行记录中位数,状态包括角色、阶段模板、调用序号和工具意图等。工作流依赖仍需满足;预测工具参数的长度不能替代工具执行耗时。

节点放置:先检查策略和显存可行性,再计算分数,选择最高分节点:

$$S(N,T)=A(N,T)-\lambda T_{ready}(N,T)-\mu C_{deg}(N,T)$$
  • N 是候选节点,T 是当前模型调用。
  • A 是匹配分数,考虑网络距离和显存 best-fit;不是单纯空闲显存越多越好。
  • T_ready 是开始执行前的预计等待,由节点排队时间与模型激活时间组成。
  • C_deg 是腾出资源所需回收方案带来的恢复代价;影响活跃执行还会计入额外惩罚。
  • λ、μ 控制两类代价的权重。论文对指标做稳健归一化,时间项以毫秒报告,默认 λ = μ = 1。

论文公式 (5) 是候选节点评分,公式 (7)–(8) 是工作流剩余时间估计;两者共同服务调度,但不能合并成一个声称全局最优的 cost。Algorithm 3 遍历可行节点并选最高分,节点资源协调的 Algorithm 2 按状态优先级贪心构造回收方案。

三个模块分别交付什么

模块输出谁使用
长度与成本预测输出 token 数、预计阶段耗时、KV 需求排序使用时间;节点准入使用显存预算。
节点运行时能否承载请求、模型激活时间、显存余量、回收恢复代价调度器过滤并评分;运行时执行资源管理动作。
集群调度工作流推进顺序、节点选择、阶段边界让出执行机会节点执行后回传真实用量,供后续校准。

普通抢占与内存压力处置要分开

普通交互优先调度在两次模型调用之间切换,避免打断正在 decode 的调用;显存压力下的分级处置还可能涉及活跃 KV 换出或中止执行,这属于更高扰动的资源降级,需要计入恢复和中断代价。不能把阶段边界抢占说成任何情况下都不会中止活跃执行,也不能声称交互请求一定立即运行。

实验数字的口径

23.6 个百分点是高争用模拟中相对 EDF 的 SLO 达成率提升;67.2% 是显存实验中的 KV 预留 HBM 开销下降,不是总显存或每个请求实际 KV 数据量都下降相同比例。预测与后续服务实现的差异以两阶段预测实现章节的核对记录为准。

来源:Maestro 论文 §III-B–D、公式 (2)–(8)、Algorithm 1–3 与 §IV;预测服务细节参考此前核对的 concerto-runtime@8ee8969。