LLM 推理在线调度的最优性视角:hindsight benchmark + 多项式在线算法

  • 关联论文:2502.07115
  • 作者:spark
  • 更新:2026-07-05

一句话结论

在 KV cache 内存约束下为 LLM 推理提出一个后视最优(hindsight optimal)基准——把"假设能看穿未来"的形式化为整数规划——然后证明确定性在线算法无法达到常数竞争比,并给出一个多项式时间在线调度算法,在合成和真实数据集上都明显优于 vLLM 等基线。

解决什么真问题

LLM 服务系统每秒钟都在做一类隐式决策:把哪一组请求拼成一个 batch 送进 GPU?什么时候让一个新请求开始 prefill?一个请求快结束了,再插入新请求还是先结束它?这些决策直接影响:

  • 尾延迟:用户感知的"打字停顿"主要由调度策略决定;
  • 吞吐上限:把长、短请求打包到一起,能让 GPU 算力更均匀地分布;
  • 资源效率:KV cache 是稀缺内存,拼得过满就 evict,拼得不满就浪费算力。

经验上工程师已经摸出了一套做法(vLLM 的 continuous batching、Sarathi 的 chunked prefill),但缺乏两个东西:

  1. 上界基准:不知道当下系统离"理想上限"还差多远;
  2. 最坏情形保证:不知道流量突变(bursty workload)时系统会不会崩坏。

这篇论文就是冲着这两件事来的。

核心方法

1. 系统模型

把 $n$ 个请求视作按到达时间 $\alpha_i$ 入队的作业,每个作业包含 prompt 长度 $p_i$ 和输出长度 $q_i$($q_i$ 通常未知)。调度器在时刻 $t$ 选一组请求组成 batch 进入 GPU。约束:

  • KV cache 上限 $M$:所有在飞的请求的 KV 占用不能击穿 GPU 显存预算;
  • 线性迭代时间:每个 batch 的执行时间主要由它的(prefill 长度 + 当前 decode 长度之和)决定;
  • 完成一致性:一个请求必须 batch 进去才能往后推进,否则只能原地等待。

这是一台经典的"内存受限并行机"模型。

2. Hindsight Optimal Benchmark(HOPT)

论文最尖锐的贡献是给出一个离线最优基准。给定所有请求的(到达时间、prompt 长度、输出长度、未来到达),求最小化总推理延迟 $L$:

$$ \text{HOPT} = \min_{z} \sum_{i} c_i z_i + L(z) $$

其中 $z$ 是调度决策的离散变量。这个问题自然写成整数规划(integer program)

  • 变量:每对 (请求, 时段) 的"是否在此时段处于在飞状态";
  • 约束:到达一致性(请求在到达后才可开始)、KV cache 内存约束每个时刻都成立、完成一致性(一旦开始,必须跑完 batch 流程才能结束)、batch 容量;
  • 目标:最小化总时延(含等待时间 + 服务时间)。

作者强调:HOPT 不是可实现的算法,而是参照物——"如果你有上帝视角,最低能做到多低"。这才是衡量所有在线算法的尺子。

3. 不可能性定理(no-go result)

论文给出了理论上的坏消息:

Theorem:当到达过程任意时,不存在一个确定性在线调度算法能达到常数竞争比。

直觉很简单:如果流量可以突变,未来到达的请求可以在你刚把 GPU 填满时把内存打爆,再或者可以全部延迟到达让你空跑。这告诉我们:在最坏情形下,没有"万能银弹"。

4. 多项式时间在线算法

受不可能性定理激励,作者把视线放到温和到达过程(例如高负载但 burst 程度有限的到达)。在这样一组条件下,他们给出一个多项式时间在线算法,并证明:

  • 在受限到达下能达到常数竞争比
  • 计算复杂度(求解每步决策)随请求数线性或多项式增长,可放到生产系统中。

具体策略的工程要点:

  1. 基于内存状态的准入:维护当前 KV cache 占用与 GPU 估算吞吐,预估若把请求 $r$ 放进来,它在剩余生命周期内的内存峰值是否会击穿 $M$;
  2. 长度感知 batching:估算 prefill token 数(影响瞬时 compute)与预期 decode 长度(影响后续 KV 增长),把"短输入 + 长输出"和"长输入 + 短输出"互补地拼成一个 batch;
  3. 轻度抢占:用最低代价的 swap(不是真正的抢占)让接近完成的请求早点结束以释放 KV,避免它们在峰值时挤爆内存。

论文把这套策略实现到仿真里,与 vLLM 的 continuous batching 和另外两个基线(FCFS、Orca 风格的 chunked batch)做了对比。

5. 实证评估

两份数据:

  • 合成数据集:多种到达率、长度分布组合;
  • 真实公开 LLM 推理 trace:模拟 Llama2-70B 在 A100 GPU 上跑。

主要结论(原文表述):

"our algorithm significantly outperforms the benchmark algorithms"

具体来说:

  • 在合成 trace 上,新算法相对 HOPT 的 gap 远小于 FCFS / chunked baseline;
  • 在 Llama2-70B 模拟上,平均与尾延迟(P50 / P99)都有明显改善;
  • 内存利用率更平滑,几乎不出现 KV cache 溢出驱逐

原文未明确列出"M 比 N 提升 X%"这种单点数字,因为它在不同 trace 上变化较大。论文的呈现风格是把竞争比 / 延迟分布作为函数画出来,强调 regime-level 行为。

亮点与局限

亮点: - 把"上帝视角下的最优"显式写成一个 IP 问题,给整个 serving 研究社区提供了统一的对照尺子——后续任何在线调度算法都可以和 HOPT 比一下差距,而不必各自挑对手。 - 不可能性定理给"为什么我们需要在线学习/自适应机制,而不是找静态最优算法"提供了理论背书。 - 多项式时间在线算法的存在性,配合常数竞争比的有条件证明,让"工程 vs. 理论"对峙的局面有所缓和——理论侧给出了一个温和场景下的可实现基准。 - 仿真跨 Llama2-70B,相对接近当前主力部署尺寸,落地参考价值较高。

局限: - HOPT 本身不可计算:求解 IP 在请求量大时是组合爆炸的,论文里也提到"computationally intractability of solving the integer program at scale"。所以"对照 HOPT"只能在小规模上做,规模扩大就要靠松弛、采样或启发估计。 - 抵达过程"任意"时的不可能性是标准结果,但论文没有把它扩展到随机到达情形(例如泊松到达):那样至少可以谈期望竞争比,而不只是最坏情形不可行。 - 算法假设长度分布已知或可估,工程实战里输出长度估计自己的误差就很大,这层不确定性可能让常数竞争比退化为接近最坏情形。 - 仿真集中在 homogeneous GPU(单型号 A100),对当下多卡张量并行、prefill–decode 分离的拓扑尚未建模。

对工程落地的启发

  1. 给线上系统加一个 HOPT-shaped 探针:把"假设看穿未来,能不能再压 N 秒"做成内部 SLA 监控项——让产品/工程对话有共同语言。
  2. 长度感知的 batch 拼装:在现有 vLLM / SGLang 调度器里改一行"准入函数",让短 prefill + 长 decode 与长 prefill + 短 decode 互相平衡,就能拿到论文中模拟看到的延迟收益。
  3. 不要做静态最优:行业里偶尔会听到"找一个万能调度公式"的声音,论文的不可能性定理告诉我们:把力气放在自适应 / 在线学习 上比放在"找一个静态最优"上更值得。
  4. 优先建模输出长度:把输出长度预测器当成系统部件,正式纳入调度决策链。可以预测不准,但要主动告诉下游"我对这请求的预期长度是 ±X%"——这是把不确定性引入决策的标准做法。
  5. IP 松弛当 audit 工具:实际生产不必解 IP,可以用 LP 松弛 + 采样做"事后 audit",衡量当天的调度决策离 HOPT 还有多远。

与同方向工作的关系

  • 与本次另一篇解读的 2504.11320(Fluid-Guided Online Scheduling)合在一起读最有意思:2502.07115 用 hindsight IP 当基准,2504.11320 用 fluid model 当基准;2502.07115 证明最坏情形不可达常数竞争比、给温和条件下多项式算法,2504.11320 直接在温和模型下给出可证明的算法(WAIT / Nested WAIT)。两篇互为"上限"与"可实现"侧的最佳搭档。
  • Sarathi / DistServe / Splitwise 形成对比:后者关心怎么把 GPU 时间片拆开,本文关心决定哪个请求进哪个时间片;可以叠加。
  • Orca / vLLM:vLLM 是工业标杆,Orca 提出 chunked batch,2502.07115 的算法可以视为它们的有理论保证升级版。

适合谁读

  • LLM serving / inference infra 工程师:重点看实证段落和"长度感知 batching"的工程含义;
  • 调度算法 / 近似算法背景的研究者:HOPT 形式化是非常好的 mini-project 题目,可以延展到带有抢占、推测解码、分布式张量并行的扩展模型;
  • LLM 产品与 SRE 团队负责人:用 HOPT 思维建立"延迟基准线"概念,是和工程团队对齐问题的简洁语言;
  • 对"什么是最优服务"感性好奇的非系统读者:本文写得相对可读,作为入门论文不错。

工程落地与核查(Jay)

事实核查

  • 不可能性定理:任意到达过程下无常数竞争比,是近似算法理论的标准结论,引用合理。
  • HOPT IP 形式化:变量/约束/目标表述与 integer programming 标准形式一致,未发现形式错误。
  • ⚠️ "几乎不出现 KV cache 溢出驱逐":原文为 "significantly fewer evictions" 或类似表述(原文 Table 未逐字核对),解读升格为"几乎不出现"措辞偏强;实际生产中 burst 流量下仍可能出现零星 evict,建议以原文数字为准。
  • ⚠️ 竞争比常数上界:定理证明依赖"温和到达过程"具体条件,论文附录定理编号与条件需对照 PDF §3/§4 核验;此处引用为摘要级理解,未逐条核对形式证明。
  • ⚠️ 实验"明显优于 vLLM":原文 abstract 未给具体延迟数字(P50/P99),解读中"明显改善"为定性描述,缺乏可核查量化基准;建议补充原文 Table 数据。
  • 调度算法实现:原文称"实现到仿真"但未明确仿真代码是否开源;GitHub 链接需对照 PDF 确认(arxiv 全文可能附在 §附录)。

实际系统怎么用

场景 A:vLLM / SGLang 的调度增强 在 vLLM 的 BlockSpaceManager 或 SGLang 的 Runtime调度器 中接入论文的长度感知准入:

# 伪代码示意(参考论文 §4 策略 1-3)
def admission_check(request, current_kv_footprint, M):
    projected_peak = estimate_kv_peak(request, current_kv_footprint)
    if projected_peak > M * 0.9:   # 留 10% 安全边界
        return False                # 拒绝入队,等下一帧
    return True

def batch_assemble(running_requests, new_request):
    # 短 prefill + 长 decode 与反之配对
    short_prefill_long_decode = [r for r in running if r.prefill_len < threshold]
    long_prefill_short_decode = [r for r in running if r.prefill_len >= threshold]
    # 优先组对后再塞 new_request

这个改动可以独立于 vLLM 主线,只动 scheduler 层,适合作为内部 fork 或 patch PR 验证。

场景 B:HOPT audit 工具 离线跑 LP 松弛版 HOPT,每日抽样 N 条真实 trace:

from scipy.optimize import linprog
# 简化版:松弛整数约束,求 LP 下界
# 变量:每时刻每个请求是否在飞
# 约束:内存预算 + 到达一致性
# 目标:最小化总延迟
lp_relaxation = linprog(cost_vec, A_ub=mem_constraints, b_ub=mem_budget,
                         A_eq=arrival_constraints, b_eq=arrival_eq)
hopt_lower_bound = lp_relaxation.fun

然后对比当日实际调度的总延迟,计算"距 HOPT 下界还有 X%"作为每日健康度指标。

坑与边界

  1. HOPT 不可规模化:IP 求解在请求数 > 100 时已经很慢;生产 audit 只能用 LP 松弛或采样近似,不要尝试全量 IP 求解。
  2. 输出长度估计误差会级联放大:如果预测短了,调度器会高估 cache 可用空间,可能在 decode 中期触发 evict;建议配合保守的安全边界(mem_budget × 0.85)。
  3. 跨 GPU 张量并行场景未建模:论文模型是单 A100 homogeneous;实际多卡推理时 KV cache 分布在不同设备的 HBM,内存约束变为 NUMA-aware,该论文结论需重新验证。
  4. Prefill-Decode 分离(PD 分离)部署:DistServe / TIDAL 等把 prefill 和 decode 拆到不同机器,KV 传输延迟不在本模型范围内;PD 分离下调度策略需重新设计。
  5. Burst 流量下常数竞争比保障失效:论文的不可能性定理证明任意到达过程下无法保证常数比;生产中的 burst(凌晨流量突增、促销事件)正是这个"任意到达"的现实版本,此时调度器退化为"尽力而为",论文算法提供的常数比保障不成立。