真实面经题目 · 原创解析
大模型推理中 Prefill/Decode(PD)分离部署为什么能提升处理速度?
这题考 LLM serving 的工作负载拆分,回答要讲清 prefill 和 decode 的差异、分离部署收益、KV cache 交接和适用边界。
真实面经题目 · 原创解析
这题考 LLM serving 的工作负载拆分,回答要讲清 prefill 和 decode 的差异、分离部署收益、KV cache 交接和适用边界。
LLM 推理可以拆成 prefill 和 decode 两个阶段。Prefill 是把用户 prompt 一次性跑过模型,计算所有输入 token 的 hidden state 并生成 KV cache,它更偏大矩阵计算、并行度高,影响首 token 延迟。Decode 是后续一个 token 一个 token 自回归生成,每步都要读历史 KV cache,计算粒度小、迭代多,更容易受内存带宽、调度和 batch 影响。PD 分离部署就是把 prefill 和 decode 放到不同实例、队列或 GPU 资源池上,让 prefill 侧优化大 prompt 的吞吐和 TTFT,decode 侧优化持续生成的 TPOT 和并发吞吐,避免两类任务在同一批处理里互相干扰。代价是 KV cache 要从 prefill 侧交给 decode 侧,会产生网络传输、缓存管理、调度复杂度和故障恢复问题。它适合长 prompt、高并发、prefill/decode 资源特征差异明显的场景;短 prompt、小模型或低并发时不一定划算。
Prefill 阶段读取用户 prompt 的所有输入 token,一次性完成前向计算,并为后续生成准备 KV cache。它的特点是序列长度可能很长,矩阵计算并行度高,对首 token 延迟影响大。长上下文、RAG 拼接和多轮历史都会让 prefill 成本变高。
Decode 阶段每次生成一个新 token,再把这个 token 的 K/V 追加到 cache 中。它的每步计算规模比 prefill 小,但步骤很多,而且每步都要读取历史 KV cache。Decode 更容易受内存带宽、cache 管理、调度粒度和 batch 形态影响,决定每 token 延迟和持续吞吐。
如果 prefill 和 decode 放在同一批请求和同一资源池里,长 prompt 的 prefill 可能阻塞正在 decode 的请求,导致流式输出卡顿;大量 decode 请求也可能让新的 prefill 排队,拉高 TTFT。两类工作负载的计算形态不同,统一调度很难同时优化首 token 和后续 token。
PD 分离把 prefill 和 decode 拆成不同队列、实例或 GPU 池,分别做 batch、并发和资源配置。Prefill 节点可以偏向高吞吐地处理 prompt,decode 节点可以维持稳定小步生成和流式返回。这样有机会同时改善 TTFT、TPOT、吞吐和资源利用率。
Prefill 结束后 decode 需要继续使用同一请求的 KV cache,所以分离部署必须解决 KV cache 传输、地址管理、压缩、生命周期、失败重试和一致性。cache 交接如果太慢,会抵消分离收益;如果网络或存储不可靠,还会影响请求恢复和尾延迟。
PD 分离不是所有场景都更快。长 prompt、高并发、生成较长、prefill/decode 比例差异大时更容易收益;短问短答、低并发、小模型或网络传输昂贵时可能不划算。评估要看 TTFT、TPOT、P95/P99、goodput、GPU 利用率、KV 传输耗时和失败率。
Prefill 主要影响 TTFT,也就是首 token 多久出现;decode 主要影响 TPOT、流式输出速度、总生成时间和持续吞吐。
Prefill 已经为 prompt 计算了历史 K/V,decode 继续生成必须复用这些缓存。如果换到 decode 节点,就要把缓存状态交过去,否则会重复计算或无法接续。
短 prompt、低并发、生成很短、模型较小或网络传输成本高时,KV cache 交接和系统复杂度可能超过收益。
continuous batching 是调度方法,PD 分离是资源拆分架构。二者可以结合:prefill 和 decode 各自使用适合自己的 batch 策略。
需要保留请求状态和 KV cache 生命周期策略。可以重试到其他 decode 节点、重新 prefill、或返回可恢复错误,具体取决于缓存是否可复制和服务 SLA。
要做同流量对比,观察 TTFT、TPOT、端到端延迟、P99、goodput、GPU 利用率和单位成本,并按 prompt 长度和输出长度分桶。