# 【推理】PD分离的绝佳入门教程 —— DistServe > **来源**:知乎专栏 > **作者**:Zoe Lee > **发布日期**:2026-08-05 > **原文链接**:https://zhuanlan.zhihu.com/p/19666783423 --- 作为推理服务中PD分离的技术的经典方法之一,DistServe(OSDI 2024)无疑为广大学者提供了一份绝佳的入门教程。该工作详细分析了PD分离的技术动机、提出了通俗易懂的PD分离算法思想、并充分开源了代码,让每一个想了解PD分离技术的人都能够"亲自把玩"。 本文为在精度论文并部署代码进行多组实验后整理的"玩后感",会从PD分离技术动机、DistServe项目算法思想、code实现以及个人理解等方面展开介绍。本人初学,望看到本文的大佬们多多指点交流~ ## 1. PD分离技术动机 我们知道一条请求在推理的过程中需要经过两个步骤:第一步,根据输入序列的内容生成第一个token,该过程称为Prefill;第二步,根据输入序列以及之前已经生成的token生成下一个token,该过程称为Decoding。随着"以存代算"的KV-Cache技术的引入,大多推理过程避免了在Attention结构的重复计算,这导致Prefill与Decoding在执行时存在着较大的差异。 为什么Prefill和Decoding存在较大的差异? 首先我们从计算过程上去直观理解两个步骤的区别。在Prefill阶段,模型输入prompt的所有token,经过一步计算后得到第一个输出,与此同时每个token在计算时产生的KV-Cache被储存下来,而在Decoding阶段,每个新token的计算都会涉及到KV-Cache的读取与存储,而计算量相比Prefill而言被大大降低了,取而代之的是高频的存取操作带来的压力,这便是KV-Cache技术带来的Prefill和Decoding的差异化。 这种差异是否会导致放在一个batch中处理会相互拖后腿? 论文通过实验给出了肯定的答案。下图表示在全部是decoding状态的batch中加入一个做prefill的请求导致的延迟变化。蓝色线条的起点表示只处理一条prefill的延迟,蓝色后面的点与起点的差值都可以看做添加decoding状态的请求对该prefill状态的请求带来的延迟危害,而蓝色与橙色对应节点的差值可以看作添加的一个prefill状态的请求对decoding状态的请求batch带来的延迟危害。 ![图1:混合batch中的延迟干扰](https://pica.zhimg.com/v2-4cc03f245d34af4919b94ed441ed7ab2_1440w.jpg) 截取自论文 综合分析,两阶段混合推理带来的主要问题如下: 1. 调度低效:在相同GPU上进行不同状态的调度会造成decoding等待prefill的现象,并且GPU在进行decoding会导致资源低利用率; 2. 资源和并行策略的耦合:两阶段的差异对于资源和并行策略的需求不同,相同GPU上部署不可避免的会导致两阶段资源和并行策略的共享。 至此,PD分离就成为了一种最为直接的解决思想。 ## 2. P/D阶段特性分析 在正式提出算法前,论文对于P和D阶段的batch策略和并行方案进行了分析。对于batch策略,论文通过以下实验对比了两阶段的不同特点: ![图2:P/D阶段batch策略对比](https://pic2.zhimg.com/v2-146793643fe85191ddcddcd819bb8a11_1440w.jpg) 截取自论文 Prefill阶段并不是batch size越大吞吐越大,吞吐随batch size的变化取决于输入文本的长度,因此在设置batch size时要考虑输入长度。而增加batch size对于Decoding阶段是一个避免低吞吐的好方法。 对于并行方式,为了分析Prefill阶段对于并行策略的偏好,论文首先利用M/D/1排队模型对请求队列进行了建模,进而TTFT就可以用请求在系统内的平均等待时间表示,加入Pipeline并行和Tensor并行的影响后,TTFT建模结果分别如下: ``` PP=2: D + (R*D^2) / (4*(2 - R*D)) TP=2: D/K + (R*D^2) / (2*K*(K - R*D)) ``` 其中D为请求的执行时间,R为到达率,K为TP带来的影响系数,由于通信代价,通常 1