为什么 LLM 推理需要拆开两个阶段
很多团队部署 LLM 服务时,会把一个请求完整交给同一个推理实例处理:先读入 prompt,生成第一个 token,再逐 token 生成后续结果。这种架构简单,但在长 prompt、高并发和严格延迟目标下,很容易出现不稳定延迟。
原因在于 LLM 推理天然分成两个阶段:Prefill 和 Decode。
Prefill 负责处理输入 prompt,并为所有输入 token 计算 KV cache。它通常发生一次,适合大规模并行计算,计算量随输入长度增长。
Decode 负责逐 token 生成输出。它会持续读取已有 KV cache,并追加新 token 的 KV。它通常持续多轮,更容易受内存带宽、batch 调度和尾延迟影响。
如果两个阶段共享同一组 GPU,长 prompt 的 prefill 任务可能插入正在进行的 decode 批次中,导致用户看到的输出 token 间隔突然变长。这就是很多流式对话系统中「前几个 token 正常,后面突然卡顿」的根源之一。
一句话理解 Prefill-Decode Disaggregation
Prefill-Decode Disaggregation,简称 PD 分离,就是把 prompt 处理和 token 生成拆到不同推理实例或 GPU 池中:
User Request -> Router -> Prefill Worker: process prompt and produce KV cache -> KV Cache Transfer -> Decode Worker: generate output tokens
它的目标不是简单让系统架构更复杂,而是把两个不同瓶颈的阶段分开优化。
- Prefill: optimize TTFT and prompt throughput
- Decode: optimize ITL / TPOT and stable streaming generation
这也是为什么 PD 分离经常出现在长上下文、Agent、RAG、代码生成、推理模型和多租户推理平台中。
核心知识结构
可以把 PD 分离拆成 6 个工程模块。
1. Prefill:一次性处理上下文
Prefill 阶段读取完整 prompt,包括 system prompt、用户问题、历史消息、RAG 文档、工具描述等。它会计算 prompt token 对应的 KV cache。
它的关键指标是 TTFT(Time To First Token),也就是从请求进入系统到第一个 token 输出的时间。
2. Decode:持续生成输出 token
Decode 阶段每次生成一个或少量 token,需要不断读取历史 KV cache。它的关键指标是 ITL(Inter-Token Latency)或 TPOT(Time Per Output Token),也就是 token 与 token 之间的生成延迟。
对流式聊天、代码补全和语音交互来说,decode 稳定性往往比平均吞吐更重要。
3. KV Cache Transfer:分离架构的核心成本
Prefill worker 生成的 KV cache 必须交给 decode worker。这个传输可能发生在同机 GPU、跨 GPU、跨节点或 RDMA 网络上。
如果 KV cache 传输太慢,PD 分离带来的收益会被抵消。
4. Router:请求不再只是负载均衡
PD 架构下的 router 不只是把请求发给某个模型实例。它需要选择 prefill worker、选择 decode worker、协调 KV cache 位置,并记录请求状态。
5. Scheduler:分别优化两个阶段
统一实例里,prefill 和 decode 共享一个调度器。PD 分离后,prefill 调度器可以优先处理长 prompt 或短 prompt,decode 调度器可以优先保护流式输出稳定性。
6. SLO:从 tokens/s 转向 goodput
PD 分离的目标不是最大化裸吞吐,而是在 TTFT 与 ITL/TPOT 约束下,最大化满足延迟目标的请求数,也就是 goodput。
为什么统一调度会产生干扰
统一实例部署看起来像这样:
GPU Instance: Batch A decode step → Batch B decode step → New request prefill → Batch A decode step → Another long prefill → Batch B decode step
问题是 prefill 和 decode 的资源形态不同。
Prefill 需要对完整输入并行计算,长 prompt 会形成较大的计算任务。Decode 每一步计算量较小,但需要稳定地读取权重和 KV cache,一旦被 prefill 插队,用户侧就会看到 token 输出间隔变长。
因此,统一调度会导致两类问题:
- TTFT 与 ITL 互相牵制:优化 prefill 可能影响 decode,保护 decode 又可能推迟新请求首 token。
- 尾延迟放大:平均 latency 看起来还行,但 P90/P99 ITL 出现尖刺。
PD 分离的价值就是把这种资源冲突显式拆开。
典型 PD 分离流程
一个生产级 PD 分离请求流程通常如下:
- Client 发送请求到 Router
- Router 选择 Prefill Worker
- Prefill Worker 处理 prompt 并生成 KV cache
- KV cache 被传输或注册给 Decode Worker
- Decode Worker 接管请求并逐 token 生成
- Router 或 Gateway 向客户端返回流式输出
- Metrics 系统记录 TTFT、ITL、TPOT、KV transfer time 和 SLO 命中情况
这套流程真正的难点不在第 3 步,而在第 4、5、7 步。也就是:cache 怎么交接,decode 怎么稳定接管,指标怎么证明架构真的变好。
PD 分离不等于一定更快
这是最容易被误解的地方。
PD 分离会减少 prefill 与 decode 的干扰,但也会引入新的成本:
- KV cache transfer cost
- router orchestration cost
- extra service hops
- prefill/decode ratio imbalance
- debugging and failure recovery complexity
因此,判断 PD 是否适合,不能只看 tokens/s。更合理的判断方式是按 workload 分类。
更适合 PD 分离的场景
- 输入 prompt 长,输出中等或较长
- 并发下 ITL/TPOT 尾延迟明显抖动
- 业务有明确 TTFT 与 ITL SLO
- RAG 或 Agent 请求包含大量上下文
- 不同请求长度差异大,统一调度难以稳定
- 有 RDMA、高速互联或同机高效 KV 传输能力
不一定适合 PD 分离的场景
- prompt 很短,输出很短
- 单机低并发,延迟波动不明显
- KV cache 传输成本高于阶段干扰收益
- 团队还没有完善的 trace、metrics 和回退机制
- 只追求离线批量吞吐,而不是在线 SLO
指标体系:从 TTFT 到 Goodput
上线 PD 分离前,至少要把指标拆开看。
| 指标 | 说明 |
|---|---|
| TTFT | Time To First Token,衡量用户多久看到第一个 token。Prefill worker、router、KV cache handoff 都会影响它 |
| ITL / TPOT | Inter-Token Latency 或 Time Per Output Token,衡量流式输出是否稳定。PD 分离最常见的目标就是降低尾部 ITL |
| KV Transfer Time | 记录 KV cache 从 prefill worker 到 decode worker 的传输耗时。它决定 PD 分离的收益上限 |
| Queue Time | 分别统计 prefill queue 和 decode queue。很多系统的问题不是模型慢,而是某一侧 worker 堆积 |
| P/D Ratio | 记录 prefill worker 与 decode worker 的资源比例。固定比例不一定适合混合长度请求 |
| Goodput | 满足 SLO 的有效请求吞吐。它比 raw throughput 更适合在线推理服务 |
一个简化指标结构如下:
metrics:
ttft_ms:
p50: 320
p90: 780
p99: 1400
itl_ms:
p50: 28
p90: 55
p99: 120
kv_transfer_ms:
p50: 18
p90: 41
slo_attainment:
ttft_under_1s: 0.94
itl_under_80ms: 0.97
goodput_rps: 42
架构选择:Aggregated、Disaggregated 还是 Hybrid
生产架构不一定非黑即白。
| 架构 | 特点 | 优点 | 缺点 |
|---|---|---|---|
| Aggregated Serving | Prefill 与 Decode 在同一实例里运行 | 简单,无 KV cache 跨实例传输 | 高并发和长 prompt 下容易发生阶段干扰 |
| Disaggregated Serving | Prefill 与 Decode 使用不同实例或 GPU 池 | 阶段隔离,TTFT 与 ITL/TPOT 可独立优化 | 系统复杂,引入 KV cache transfer 成本 |
| Hybrid Serving | 部分请求走统一实例,部分请求走 PD 分离 | 灵活,按 workload 动态切换 | 路由和调度逻辑更复杂 |
Hybrid 方案更符合真实生产环境,因为不同 workload 对 TTFT 与 TPOT 的约束不同。短请求可能留在 aggregated 模式,长上下文请求可能进入 disaggregated 模式。
生产落地 Checklist
上线前建议逐项检查:
- 是否按请求类型统计 prompt length 与 output length 分布
- 是否分别记录 TTFT、ITL/TPOT,而不是只看 tokens/s
- 是否验证 prefill 插队导致的 decode 尾延迟问题真实存在
- 是否测量 KV cache transfer time
- 是否评估不同 prefill/decode GPU 配比
- 是否有 router 层 trace,能定位请求停在哪个阶段
- 是否有 prefill queue 与 decode queue 的独立监控
- 是否有 decode worker 失败后的请求恢复策略
- 是否有 KV cache 传输失败后的重试或降级方案
- 是否保留 aggregated fallback
- 是否用真实 prompt/output 分布压测,而不是只用固定 synthetic case
- 是否以 SLO attainment 和 goodput 作为主要验收指标
结论
Prefill-Decode Disaggregation 的本质不是「把服务拆成更多模块」,而是承认 LLM 推理的两个阶段有不同瓶颈:
- Prefill 关注上下文处理和 TTFT
- Decode 关注持续生成和 ITL/TPOT
- KV cache transfer 决定拆分成本
- Scheduler 和 Router 决定收益是否真实兑现
对工程团队来说,最重要的判断标准不是 PD 分离听起来是否先进,而是你的 workload 是否已经出现 prefill 与 decode 干扰。
如果没有明确 SLO、没有尾延迟问题、没有 KV cache 传输能力,PD 分离可能只是增加复杂度。
如果你的系统已经面对长上下文、高并发、流式输出抖动和严格在线延迟要求,那么 PD 分离就不只是优化项,而是从单实例推理走向生产级推理平台的重要架构分界线。