在线 LLM serving 中,prefill(计算受限)与 decode(内存受限)交织导致吞吐-延迟二选一。Sarathi-Serve 用 chunked-prefill + stall-free batching:把长 prefill 切成受 token budget 约束的小块,piggyback 到 decode 批次而不打断 decode。Mistral-7B 提升 2.6×、Falcon-180B 提升 6.9× serving capacity。
现有 LLM serving 调度器在吞吐与延迟之间存在硬性权衡,根源是每个请求分两阶段:
两类现有调度器各有致命缺陷:
利用 decode 批次的算术强度 slack(memory-bound 时算力空闲),把 prefill 拆块塞进 decode 批次:
核心技术壁垒:并非"切块"这个动作,而是把 token budget 校准到 decode iteration 的内存受限拐点之下——既榨干 decode 的算力 slack、又不越过 compute-bound 阈值触发 TBT 爆炸(naive full-prefill hybrid 会把 TBT 抬高 28.3×)。同时预算须落在 tile-size 倍数上,否则单个多余 token 就带来一整块 tile 的浪费(257 vs 256 → +32% prefill 时间)。这个"贴着两个物理边界走"的联合校准是最难复制的洞见。
Sarathi-Serve 的核心是调度策略的对比,而非新的模型结构。下图给出四种调度策略在同一时间线上的行为对比(A/B 处于 decode,C/D 随后到达):

Paper's Figure 4. vLLM 把尽可能多的 prefill 排在恢复 decode 之前,产生 generation stall;Orca 支持 hybrid batch 但含长 prompt 的批次执行时间仍高,无法消除 stall;FasterTransformer 跑完 decode 才排新 prefill,无 stall 但批量小、吞吐低;Sarathi-Serve 把 C 的 prefill 切成 $p_0,p_1$ 两块,与 A/B 的 decode 合批,既不停 decode 也不停 prefill。
宏观的两难关系由 Figure 2 概括:

Paper's Figure 2. 优先 prefill → 高吞吐但牺牲 TBT 尾延迟;优先 decode → 反之。Sarathi-Serve 通过 stall-free batching 同时拿到高吞吐与低 TBT。读者应注意 Sarathi-Serve 位于两条曲线的"帕累托前沿之外"。
调度算法的控制流(Algorithm 3)可用如下状态流表示:
顺序:先塞满 decode(保证 decode 不被延迟)→ 再放一个 ongoing prefill chunk → 最后在 τ 剩余预算内接纳新请求。
本文以实证为主,唯一形式化模型是 §3.2 的 roofline。给出符号表与物理意义,并做最小检查。
| 符号 | 含义 |
|---|---|
| $T$ | 算子总执行时间 |
| $T_{\text{math}}$ | 数学运算耗时 |
| $T_{\text{mem}}$ | 从 HBM 取数耗时 |
| $\tau$ | 每 batch 的 token budget |
| $N$ | 一个 prompt 被切成的 chunk 数 |
roofline 执行时间模型:
$$T = \max(T_{\text{math}}, T_{\text{mem}})$$
物理意义:matmul kernel 把访存与计算 overlap,取二者较慢者(用 $\max$ 而非求和)。当 $T_{\text{math}} < T_{\text{mem}}$ 为 memory-bound(decode);当 $T_{\text{math}} = T_{\text{mem}}$ 时算力与带宽利用率同时最大化,对应最优算术强度 = 设备 FLOPS/带宽比。
chunked-prefill 的 KV-cache 重读代价:若 prompt 切成 $N$ 块,则第 $k$ 块的 KV-cache 被加载 $N-k$ 次(第 1 块读 $N-1$ 次,以此类推),计算量不变但 HBM 读增加。

Paper's Figure 3 (Mistral-7B, A100, prompt=1024). decode 吞吐随 batch size 近线性增长,prefill 单请求已近饱和。这是 Takeaway-1,也是整个 hybrid-batching 论证的地基:decode 有 batching slack,prefill 没有。

Paper's Figure 5. linear 层主导 prefill 与 decode 运行时;由于 decode 算术强度极低,1 个 decode token 的 linear 代价 ≈ 128 个 prefill token —— 这正是"可免费 piggyback prefill"的量化依据。

Paper's Figure 7 (LLaMA2-70B, 不同 TP). token 数少时执行时间被 HBM 取权重主导,在 128-512 区间几乎持平(尤其高 TP);越过临界阈值后随 token 数线性上升。这条曲线定义了 token budget 应落在的"平台区"。

Paper's Figure 8. Decode+Full-Prefill(Orca)对 decode 延迟冲击巨大;Decode+Chunked-Prefill(Sarathi-Serve)在固定 token budget 下冲击小得多,且 decode batch 越大、context 越长,相对影响越小。

Paper's Figure 9. 严格(SLO-S)与宽松(SLO-R)两档下,Sarathi-Serve 的可持续 QPS 一致高于 Orca/vLLM。关键现象:Orca/vLLM 往往在达到最大吞吐前就已违反 P99 TBT SLO。

Paper's Figure 10. 带 pipeline parallelism 的大模型上,均匀 iteration 计算额外压缩了 pipeline bubble,Falcon-180B 端到端提升达 6.9×。
Table 4(Yi-34B, TP2, 128 请求, budget 1024)显示两个组件单用都会在某维度退化,合用最佳:
| Scheduler | openchat P50 TTFT | openchat P99 TBT | arxiv P50 TTFT | arxiv P99 TBT |
|---|---|---|---|---|
| hybrid-batching-only | 0.56 | 1.08 | 4.18 | 1.76 |
| chunked-prefills-only | 1.04 | 0.34 | 4.86 | 0.38 |
| Sarathi-Serve (combined) | 0.85 | 0.29 | 3.03 | 0.35 |
hybrid-only 因长 prefill 仍造 stall → TBT 高;chunked-only 因 chunk 略低效 → TTFT 高;合用两维度都改善。
| # | 论证步骤 | 依据(paper 内部) |
|---|---|---|
| 1 | prefill 计算受限、decode 内存受限,batching 只对 decode 有效 | §2.2 Takeaway-1,Fig 3 |
| 2 | 因此现有交织调度必然在吞吐与 TBT 间二选一(prefill-prioritizing 造 stall;decode-prioritizing 吞吐低) | §3.1 Takeaway-2,Fig 4 |
| 3 | decode 批次处于 memory-bound regime,存在算力 slack 可塞入更多 token | §3.2 Takeaway-3,Fig 5/6/7 |
| 4 | 直接塞整段 prefill 会因越过 compute-bound 阈值把 TBT 抬到 28.3×,故须 chunk 并限制 token budget τ | §4.2,Fig 8 |
| 5 | 在 τ 约束下先装 decode 再装 prefill chunk(stall-free),decode 永不被延迟 | §4.2 Algorithm 3 |
| 6 | 结果:在 SLO 内 capacity 全面超越 baseline,大模型因 bubble 缩减额外获益 | §5.1,Fig 9/10,Table 4 |
实现建立在 vLLM 开源代码之上(PyTorch + xFormers 提供 matmul/attention kernel,NCCL 负责 PP/TP 通信),扩展了调度策略、chunked-prefill、pipeline parallelism 与 telemetry(§5 Implementation 段)。论文正文未给出行级代码路径,故:
compute_token_buget、get_next_chunk_size 为关键函数,论文未公开其源码行号 → [实现未公开]。sarathi-serve / 已上游到 vLLM chunked-prefill 路径,论文未在正文给出 file:line 锚点 → [实现未公开]。核心技术壁垒(§7 展开):最难复制的是 token budget 的联合校准。它必须同时满足三个约束——(1) 落在 decode 内存受限"平台区"以内(Fig 7),越界即触发 TBT 线性爆炸(naive full-prefill 达 28.3×);(2) 是 GPU tile size 的整数倍,否则 tile-quantization 让单个多余 token(257 vs 256)带来 +32% prefill 时间;(3) 满足应用的 P99 TBT SLO。论文用一次性 profiling + 取 SLO 内最大可打包 token 数来定 τ,但把它调到"贴着物理边界又不越界"依赖对具体模型/硬件的细致标定,不是照搬公式就能得到。
关键实现细节(易漏):
N/A — 本文为在线 serving 调度系统(Sarathi-Serve),而非模型发布(model release)。所评测的 Mistral-7B / Yi-34B / LLaMA2-70B / Falcon-180B 均为已有开源模型(均采用 decoder-only transformer,GQA/GQA-SW attention,见 Table 1),本文未提出新的模型结构,故不附代码驱动的模型架构图。
评测模型的关键配置(§5,Table 1):
| Model | Attention | GPU 配置 | 总显存(每卡) |
|---|---|---|---|
| Mistral-7B | GQA-SW | 1 A100 | 80GB (80GB) |
| Yi-34B | GQA | 2 A100 (TP2) | 160GB (80GB) |
| LLaMA2-70B | GQA | 8 A40 (TP4-PP2) | 384GB (48GB) |
| Falcon-180B | GQA | 4 A100 × 2 节点 (TP4-PP2) | 640GB (80GB) |