Throughput-Optimal Scheduling Algorithms for LLM Inference and AI Agents
本文建立了大语言模型推理的数学排队论基础,证明了工作守恒调度算法能为个体和 AI 智能体工作负载实现最大吞吐量,同时通过评估现实世界系统证实了 Orca 和 Sarathi-Serve 的最优性,并警示了 FasterTransformer 和原生 vLLM 的不稳定性。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
想象你经营着一家高速工厂,专门制造定制机器人。在这家工厂里,每个订单(即“请求”)都要经过两个截然不同的阶段:
- 准备阶段(Prefill):你阅读蓝图并收集所有必要的零件。这是一项繁重的体力活,需要大量的脑力(计算资源),但是一次性完成的。
- 组装阶段(Decode):你开始组装机器人,一次添加一个零件,逐个进行。这是一项较慢、内存占用较高的工作,需要一步步完成。
你的工厂拥有一只巨大且超高速的机械臂(GPU),它可以同时处理多个订单。然而,这只机械臂有一个限制:它的夹爪一次只能承受特定总重量的零件(即Token 预算)。
你提供的这篇论文是一项数学研究,探讨如何组织订单,以确保你的工厂永不停工,并在不造成堵塞的情况下生产出尽可能多的机器人。
以下是他们研究发现的分解,使用了简单的类比:
1. 黄金法则:“不要让机械臂闲置”
这篇论文最重要的发现是一个被称为**“工作守恒”(Work-Conserving)**的概念。
想象你的机械臂准备抓取零件。
- 糟糕的做法:你只允许机械臂抓取“准备”阶段的零件,前提是只有“准备”阶段的订单在等待。如果“组装”阶段的订单在等待,即使机械臂有空位,你也忽略它们。或者,你只允许它抓取“组装”阶段的零件,前提是只有“组装”阶段的订单在等待。
- 结果:机械臂半空闲置,等待特定类型的订单,而另一类订单堆积如山。工厂速度变慢甚至崩溃。
- 好的做法(工作守恒):如果机械臂有空位,你就用任何可用的东西填满它。你在同一个批次中混合“准备”零件和“组装”零件。只要有工作要做,你绝不让机械臂闲置。
论文的声明:遵循这种“填满桶”规则(如 Orca 和 Sarathi-Serve)的算法,在数学上被证明是最有效的。它们能够在系统不崩溃的情况下处理最大可能的工作量。
2. “旧”与“新”的工厂经理
作者测试了四种流行的“经理”(调度算法),看看谁遵循了黄金法则:
- FasterTransformer & Vanilla vLLM(严格的经理):这些经理太挑剔了。
- FasterTransformer 只抓取“组装”阶段的零件。如果没有“组装”订单,即使机械臂是空的,它也会忽略排队等待的“准备”订单。
- Vanilla vLLM 只抓取“准备”阶段的零件。如果没有“准备”订单,它会忽略“组装”订单。
- 裁决:这些不是最优的。在重负载下,它们会导致工厂堵塞且不稳定。
- Orca & Sarathi-Serve(灵活的经理):这些经理混合了两种类型的工作。它们用任何能装下的东西填满机械臂。
- 裁决:这些是最优的。它们让工厂以最大速度平稳运行。
3. "AI 代理”工厂(复杂工作流)
有时,一个订单不仅仅是一个机器人,而是一整组协同工作的机器人团队。
- DAG(有向无环图):想象一个工作流,其中订单 A 流向站点 1,然后站点 2,然后站点 3,并且绝不返回。
- 发现:只要工作流是直线(无循环),“不要让机械臂闲置”的规则在所有站点上仍然完美适用。
- 分叉 - 汇合(Fork-Join):想象订单 A 分裂成三个子任务,分别送往三个不同的站点,它们必须全部完成后,最后一步才能开始。
- 发现:“不要让机械臂闲置”的规则在这里也依然有效。
- 循环(The Trap):想象订单 A 从站点 1 流向站点 2,但订单 B 从站点 2 返回站点 1。它们在圆圈里互相追逐。
- 发现:在这里,“不要让机械臂闲置”的规则可能会失效。即使经理们尽了最大努力,循环交通也可能导致永远无法清除的交通堵塞。论文表明,如果你的工厂存在这些循环回路,你需要一个更聪明、更谨慎的经理,而不仅仅是一个“填满桶”的经理。
4. “桶大小”的意外
工厂还有第二个限制:批次大小(Batch Size)。这是机械臂能容纳的订单数量上限,无论它们有多重。
- 意外:作者发现,有时将机械臂填满至其绝对最大重量限制(Token 预算)实际上是一个坏主意。
- 类比:想象你有一个能装 100 磅的桶。你有 100 颗小鹅卵石(准备阶段)和 100 块重砖(组装阶段)。
- 如果你试图用砖块将桶装满到 100 磅,你可能只能装进 5 块砖。提起这沉重负载所需的时间很长。
- 但如果你停在 50 磅(较轻的负载),你可能能更快地提起它,从而每小时能完成更多次运输。
- 发现:在特定情况下,最高效的策略是在桶装满之前停止填充,以保持处理速度。这意味着,即使“好经理”(工作守恒)也会失败,如果工厂规则(批次大小限制)过于严格,且订单组合恰好会导致堵塞。
总结
这篇论文告诉我们:
- 混合你的工作:不要将“准备”和“组装”任务分开。将它们混合在同一个批次中,以保持 GPU 忙碌。
- Orca 和 Sarathi-Serve 是赢家:它们遵循“混合并填满”的规则,使其成为大多数情况下最稳定、最高效的选择。
- 警惕循环:如果你的 AI 代理在服务器之间循环发送任务,简单的“填满桶”规则可能不起作用;你需要特殊的交通控制。
- 满并不总是最好:有时,在批次中留一点空位比将其填满更明智,这取决于单个任务的大小。
所有这些数学的目标是帮助工程师构建 AI 系统,使其在数百万人同时提问时不会崩溃。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。