Skip to content
Self-Knowing

PD 分离

约 708 个字 11 行代码 预计阅读时间 2 分钟

What is Prefill and Decode? - Prefill : process input prompt, generate KV cache - Decode: generate tokens based on the KV. cache

Why PD disaggregation/
- Prefill: N tokens QKV. --> generate KV cache compute bound - Decode: N KV, 1 Q --> generate a new token, very fast ,memory bound

初始逻辑:在传统的在线推理调度中,系统往往会优先处理 Prefill,因为只有先完成 Prefill,请求才能生成第一个 token,因此这种策略有助于优化 TTFT

但问题在于,在在线服务场景中,系统中通常同时存在 PrefillDecode 请求。如果某个请求的 Prefill 很长,它可能会持续占用较多的 token budget 或计算资源,从而拖慢其他请求的 Decode,影响整体延迟表现

针对这个问题,常见有两类优化思路: - Chunked Prefill:将长 Prefill 切分成多个小块进行调度,使系统可以在 Prefill 之间穿插处理 Decode。开启后,vLLM 会优先调度 Decode,并在剩余 budget 中调度 Prefill,从而改善 ITL 和整体调度灵活性。  - PD Disaggregation:将 Prefill 和 Decode 部署到不同的 vLLM 实例或资源上,并通过 KV cache 传输进行衔接,从架构层面减少两者之间的资源干扰,并支持分别优化 TTFT 和 ITL。

def forward(
    self,
    position: torch.Tensor,
    hidden_states: torch.Tensor,
) -> torch.Tensor:
    qkv, _ = self.qkv_proj(hidden_states)
    q, k, v = qkv.split([self.q_size, self.kv_size, self.kv_size], dim = -1)
    q, k = self.rotary_emb(positions, q, k)
    attn_output = self.attn(q, k, v)
    output, _ = self.o_proj(q, k, v)
    return output

PD 分离的工程问题

KV Cache 怎么传

  • Pooling mode:发送方先把 KV Cache 放进中间池子或外部系统,接收方再去取。
  • P2P mode:发送方和接收方直接建立联系,点对点传输。

Pooling mode 的优点是系统边界清晰、解耦强;缺点是可能多一次落地或搬运。P2P mode 更接近直达,性能潜力更高,但调度器、连接关系、错误处理和资源管理都会更复杂。

KV Cache 怎样进入和离开 vLLM

即使外部传输系统已经存在,KV Cache 仍然要在正确的时机进入 vLLM,并在合适的时候再导出。 - forward 前:尝试接收并注入 KV Cache。 - model forward:执行当前阶段真正的模型计算。 - forward 后:抽取新的 KV Cache 或 hidden states 并发送出去。

PD 分离中的 KV Cache 传输位置

这是理解 vLLM 中 PD 分离实现的抓手:model runner 决定“什么时候交接状态”,connector 决定“状态交到哪里去”。 - 接收侧的 recv_kv_caches_and_hidden_states(...) - 发送侧的 send_kv_caches_and_hidden_states(...) - 它们前后夹着真正的 model forward。

请求应该先到 P,还是先到 D

做了 PD 分离以后,请求不再是进入一个实例然后一路跑完,而是至少跨两个阶段。于是就出现两种直观路线: - first P then D:请求先进入 Prefill 节点,生成初始 KV Cache 后再交给 Decode 节点。 - first D then P:请求先挂到 Decode 侧或它的调度入口,再由系统把 Prefill 委托出去,待 KV Cache 返回后继续在 Decode 侧生成。

PD 分离的请求流转方式


Created: April 29, 2026
Last update: April 29, 2026

Discussion