PD 分离详解:Prefill 与 Decode 的瓶颈、拆分与代价

PD 分离详解:Prefill 与 Decode 的瓶颈、拆分与代价

💡 原文中文,约6600字,阅读约需16分钟。
📝

内容提要

PD分离将LLM推理的Prefill(计算密集)与Decode(显存带宽密集)阶段拆分至独立资源池,以隔离干扰、优化TTFT和ITL,并允许按需配置硬件。它通过KV Cache传输衔接两阶段,但增加调度、网络和资源开销。仅当共置优化(如Chunked Prefill)无法满足SLO或资源需求不对称时,才值得采用。

🔎

延伸解读

运行时状态与路由

文章指出,LLM推理服务在用户层面看似无状态,但每个实例都维护请求队列、Prefix Cache和KV Cache。随机或轮询调度可能导致请求落到没有缓存的实例,造成Cache Miss和重复Prefill,推高TTFT和成本。因此,多副本服务需要感知负载和缓存局部性的智能路由,而非普通负载均衡。

硬件取舍与TCO

Prefill是计算密集,Decode是显存带宽密集,两者对硬件需求不同。芯片设计在计算单元和显存接口/容量间存在权衡,单一芯片难以同时最优满足两阶段。PD分离允许Prefill用高算力卡、Decode用高HBM容量卡,从而在系统层面优化总体拥有成本(TCO)。

KV Cache交接方式

PD分离后,KV Cache需跨实例传输。vLLM通过KV Connector抽象实现,不同Connector差异在于缓存存放位置和传输方式:如NixlConnector用NIXL进行P2P传输,LMCacheConnectorV1用LMCache管理,OffloadingConnector可卸载到CPU内存。Connector不负责路由,路由是另一层问题。

适用条件与替代方案

PD分离并非银弹,会带来额外调度、网络和资源开销。vLLM默认支持Chunked Prefill,可在同一实例中平衡两阶段,但共享GPU仍有干扰。只有当共置优化无法满足SLO,或资源需求不对称时,PD分离才值得引入。模型小、Prompt短或网络差时,额外开销可能超过收益。

Q&A

为什么说LLM推理服务在运行时层面不是无状态的?

因为每个实例都维护自己的请求队列、Prefix Cache和KV Cache。如果请求被调度到没有对应缓存的实例,会导致缓存未命中、重复Prefill,增加GPU计算,表现为更高的TTFT、更低的吞吐和更高的成本。

Prefill和Decode阶段的计算瓶颈分别是什么?

Prefill阶段处理输入Prompt,是计算密集型(compute-bound),主要受GPU计算能力限制;Decode阶段逐Token生成,需要读取KV Cache,是显存带宽密集型(memory-bandwidth-bound),更依赖显存带宽和KV Cache容量。

PD分离如何解决Prefill和Decode的相互干扰?

PD分离将Prefill和Decode部署到独立的实例组,长Prompt的Prefill在Prefill Pool中处理,不再占用Decode Pool的调度队列,从而减少对逐Token输出的干扰,使ITL更稳定。

PD分离后KV Cache是如何从Prefill传递到Decode的?

Prefill完成计算后,将KV Cache保留在本地,并返回KV Transfer元数据给编排组件。编排组件发起Decode请求,Decode根据元数据通过KV Connector(如NIXL)从Prefill实例获取KV Cache,然后继续生成。

vLLM中KV Connector有哪些类型?

vLLM中KV Connector包括:NixlConnector(P2P传输)、ExampleConnector(本地共享目录)、LMCacheConnectorV1(LMCache管理)、MooncakeConnector(Mooncake)、FlexKVConnectorV1(FlexKV)、OffloadingConnector(卸载到CPU/文件)、MultiConnector(多级组合)、MoRIIOConnector(ROCm环境)。

PD分离相比Chunked Prefill有什么优缺点?

PD分离能彻底隔离Prefill和Decode,避免相互干扰,并允许独立扩缩容和硬件配置,但增加了调度、网络和资源开销。Chunked Prefill在同一实例中通过分块调度平衡负载,部署简单,但两阶段仍共享GPU,需权衡TTFT、ITL和吞吐。

在什么情况下应该考虑使用PD分离?

当Chunked Prefill等共置优化无法同时满足Prefill和Decode的SLO,或者两边的资源需求明显不对称(如输入长输出短或反之)时,PD分离才值得引入。

PD分离会带来哪些额外代价?

模型权重要在两组GPU上分别加载,请求需要额外的Endpoint选择和阶段编排,KV Cache需要跨实例传输,还需考虑NIXL、RDMA、故障恢复和独立扩缩容等。如果模型小、Prompt短或网络差,额外开销可能超过收益。

🏷️

标签

➡️

继续阅读