预填充解码分离 Prefill-Decode Disaggregation

PD Disaggregation (Prefill-Decode Disaggregation)

预填充解码分离(PD 分离)把大模型推理的 Prefill 预填充与 Decode 解码两个阶段拆到不同 GPU 节点池执行,让算力密集的 Prefill 与显存带宽密集的 Decode 各自跑在最优硬件上、互不干扰,从而提升长上下文高并发场景的吞吐与延迟稳定性,核心难点在 KV 传输。

详细解释

预填充解码分离,简称 PD 分离,英文为 Prefill-Decode Disaggregation,是大模型在线推理架构层面的一次结构性改造。它把推理链条里计算特征截然相反的两个阶段——预填充(Prefill)与解码(Decode)——从「同一批 GPU、同一个批次里混跑」改成「放到两组独立的 GPU 节点池上分别执行」,中间用高速互联把 Prefill 算好的 KV 缓存 搬运给 Decode 池。之所以非拆不可,是因为两个阶段对硬件的诉求几乎相反:Prefill 要一次性读完整段输入 prompt、对全部输入 Token 做注意力计算,是典型的算力密集任务,吃的是 GPU 的浮点算力上限,直接决定首 Token 延迟 TTFT;Decode 每一步只生成 1 个 Token,算力根本用不满,瓶颈在于把整条请求的 KV 缓存反复从显存里读出的访存带宽,是显存带宽密集任务,决定相邻 Token 间隔 TPOT 与整体吞吐。两个阶段硬塞在同一批卡上,注定互相拖累。

具体到硬件特征差异,Prefill 的算术强度高、能有效打满 Tensor Core,适合高浮点算力的加速卡,而且它天然可批处理——多条请求的 prompt 能拼成一个大矩阵一次算完;Decode 每一步的计算量极小,大量时间花在把 KV 从高带宽显存搬进计算单元,算力利用率常常只有 5% 至 15%,它的效率取决于显存带宽而非算力。矛盾就出在同卡混跑(Colocated)时:一条 32K Token 的长 prompt 进来做 Prefill,会在一次前向里长时间独占 SM 与算力,正在流式输出的 Decode 请求只能干等,用户看到的就是「打字机卡住」,TPOT 抖动剧烈、P99 延迟分位数 飙升。PD 分离把两类计算彻底解耦到不同池:Prefill 池倾向用较小张量并行换取更多实例数、追求吞吐,Decode 池倾向用较大张量并行配合 KV 分页与量化、追求显存带宽利用率。各自拿到最合适的硬件配比,正是分离架构相较混合部署最大的结构性优势——牺牲的是一部分资源弹性与部署简洁性,换来的是延迟分布的确定性。

工业落地方面,PD 分离已从论文走向生产:DistServe(见 DistServe 论文)与 Splitwise 最早系统化提出该思路,Mooncake 等工业实践进一步验证了长上下文场景下的吞吐收益,vLLM 与 SGLang 也都提供了生产可用的 PD 分离模式(见 vLLM 官方文档)。2026 年公开档的典型收益是:长上下文、高并发场景下 TTFT 的 P99 下降 40% 至 70%,整体吞吐提升 20% 至 40%,代价是多了一跳 KV 传输与两套资源池的运维复杂度。唯元智创 的推理网关把 PD 分离与 连续批处理、分页注意力 打包成默认推理优化组合,按业务实测的 Prefill 与 Decode 消耗比例自动分配两池实例数,并在峰值时段弹性扩容 Decode 池,让企业在不自研传输与调度组件的前提下拿到稳定的长尾延迟。

Prefill 与 Decode 两阶段特征对比表

阶段 / 场景计算特征瓶颈资源单次处理 Token 数对延迟影响典型硬件偏好是否可批处理
Prefill(预填充)算力密集,算术强度高GPU 浮点算力与 Tensor Core 利用率一次处理整段输入,常见 1K 至 128K决定 TTFT 首 Token 延迟高浮点算力加速卡可以,多条 prompt 拼批
Decode(解码)显存带宽密集,算力利用率低显存带宽与 KV 读取速度每步产出 1 个 Token决定 TPOT 与流式流畅度高显存带宽、大显存容量卡可以,靠连续批处理拼批
混合部署中的 Prefill同上,但会独占 SM触发解码请求排队取决于同批最长 prompt同时抬高 TTFT 与 TPOT无差别,只能折中会打断同批 Decode
混合部署中的 Decode同上,但被 Prefill 抢占SM 与算力被 Prefill 挤占每步 1 个 TokenTPOT P99 抖动可达数百毫秒无差别受长 prompt 干扰严重
PD 分离后的 Prefill 池专注算力密集计算浮点算力可被充分打满一次或分块处理输入TTFT 稳定、可预测高浮点算力卡,实例数多可以,且不受解码干扰
PD 分离后的 Decode 池专注显存带宽计算显存带宽与 KV 容量每步 1 个 TokenTPOT P99 稳定在低位高带宽、大显存卡可以,连续批处理打满

推理部署架构对比表

架构GPU 资源配比长上下文 P99 稳定性部署复杂度KV 传输开销适用场景典型框架支持
同卡混跑(Colocated)单一池,Prefill 与 Decode 共享差,TPOT P99 抖动可达数百毫秒低,开箱即用无短请求为主、低 QPSvLLM、SGLang、TensorRT-LLM 默认
Chunked Prefill 缓解单一池,按 Token 预算编排批次中,TPOT P99 压到 80 至 150 毫秒低,改配置即可无单机部署、长短混合vLLM、SGLang 原生支持
PD 分离(独立 Prefill 池 加 Decode 池)两套池,P 与 D 配比常见 1 比 2 至 1 比 8好,TPOT P99 稳定在 40 至 80 毫秒高,需高速互联与传输库中,依赖 NVLink 或 RDMA高 QPS、长上下文、延迟敏感vLLM、SGLang 提供 PD 模式
PD 分离 加 KV 分级存储(GPU 到 CPU 到 SSD)两套池 加 分级存储层很好,P99 进一步下降且支持超长上下文很高,需存储与调度协同高,多级搬运需精细调优超大规模、超长上下文Mooncake 等工业方案
唯元智创 默认组合网关托管,按业务实测自动配比好,TPOT P99 稳定在 40 至 70 毫秒中,平台托管免自研中,平台侧优化传输企业多租户、RAG 与 Agent网关统一纳管

实战经验与避坑

  1. 只有 P 与 D 比例失衡、长上下文占比高时才值得上 PD 分离,短请求为主时收益可能为负:判断是否上分离,核心看两条曲线:一是 Prefill 与 Decode 的算力消耗比例,二是输入长度的分布(尤其是 P95 与 P99)。如果业务以短 prompt 为主、QPS 不高,长 prompt 极少出现,那么同卡混跑本就没有明显干扰,上 PD 分离只会白白增加一跳 KV 传输和两套资源池的运维成本,2026 年公开档的经验是这类场景分离后单位 Token 成本反而上升 10% 至 25%。反之,若 P95 输入超过 2K Token 且峰值 QPS 在 50 以上,长 prompt 频繁打断解码,分离的收益才稳定为正。务实建议是先把同卡混跑加 Chunked Prefill 的基线跑满,用真实流量回放确认「长尾延迟确实被 Prefill 干扰拖垮」之后再动分离。

  2. KV 传输必须走 NVLink 或 RDMA,走 PCIe 或普通 TCP 会把收益全部吃光:这是 PD 分离翻车最常见的根因。KV 的搬运量等于层数 乘 2(Key 与 Value)乘 注意力头数 乘 头维度 乘 序列长度 乘 每元素字节数。以 70B 模型 FP8 KV 为例,每个 Token 的 KV 约 320KB 至 640KB,一条 4K Token 请求要搬 1.3GB 至 2.6GB。走 100Gbps 普通以太网,实测有效带宽往往只有 8GB 至 10GB 每秒,单条就要多等 130 毫秒以上;换 400Gbps RDMA 或 NVLink 后,同样体量只需几毫秒到十几毫秒。工程底线是让两池尽量共置同一超节点或同一机架,节点内优先 NVLink 直连,跨节点至少 RDMA 组网,并选用支持零拷贝的传输库;若机房只有 PCIe 或普通 TCP,宁可退回单机的连续批处理加分块预填充,也不要强行上分离架构。

  3. Prefill 池与 Decode 池的实例配比要按业务实测,常见 1 比 2 至 1 比 8,不要照抄别人的比例:典型在线业务里 Prefill 的算力消耗约占三成、Decode 占七成,但 Prefill 更吃算力、Decode 更吃显存带宽,因此一个 Prefill 实例通常要配多个 Decode 实例。业界实测典型区间是 1 比 2 至 1 比 8,具体取决于平均输入长度与平均输出长度之比:长输入短输出的业务,Prefill 占比会升到五成以上,配比要往 1 比 1 甚至 1.5 比 1 调;短输入长输出的业务,Decode 压力更大,配比要往 1 比 6 甚至 1 比 8 调。上线前建议用 30 分钟等比压测拟合出自己业务的真实配比,并把它写进自动扩缩容策略;实测中把配比从拍脑袋的 1 比 1 调到贴合业务的 1 比 3,同一集群的 TTFT P99 常能再降 15% 至 25%,总卡数还能省 10% 左右。

  4. 一定要给 Decode 池留足 KV 显存预算,避免 KV 页被 Prefill 传输挤压:分离之后,Prefill 池算完的 KV 要写进 Decode 池的显存,如果 Decode 池的显存被权重与预留空间吃掉太多,KV 页就会频繁换出换入,反而增加 TPOT 抖动。经验做法是给 Decode 池按并发上限预留充足的 KV 显存,通常把可分配给 KV 的比例提到总显存的 50% 至 70%,并开启分页管理避免碎片;同时把 Prefill 传输的写入速率与 Decode 的读取速率错峰,防止同一时刻争抢显存带宽。若业务并发波动大,还要按峰值并发估算 KV 容量,宁可多留余量也别贴着上限跑,否则一次长 prompt 洪峰就可能触发显存不足与请求排队,前功尽弃。

  5. 分离后必须独立做两池的扩缩容与故障隔离,避免单点串扰:把两个阶段拆到不同池,意味着它们可以也应该独立伸缩——按队列深度分别对 Prefill 池与 Decode 池设置扩缩容规则,Decode 池跟随并发数变化、Prefill 池跟随输入 Token 速率变化,两者节奏不同。更重要的是故障隔离:一个池的抖动或重启不应拖垮另一个池,网关要为两池分别配置健康检查、熔断与降级策略,当 Prefill 池过载时把新请求排队或降级到混合部署实例,当 Decode 池过载时限流或缩减单请求输出上限。实测中,不做隔离的集群经常出现「Prefill 池一次扩容抖动,把 Decode 池的健康检查也带崩」的连锁故障,而做了隔离后整体可用性明显提升。

  6. 监控指标必须拆成 Prefill 时长、KV 传输时长、Decode TPOT 三段,否则定位不到瓶颈:分离架构把一条请求的耗时切成了三截,如果只在网关层看一个总延迟,出问题时根本不知道慢在哪一段。正确做法是分别在 Prefill 池记录 Prefill 计算时长、在传输层记录 KV 搬运时长与带宽利用率、在 Decode 池记录 TPOT 的分位数,再把三段拼成端到端视图。常见坑是「总延迟上涨」其实来自 KV 传输排队,而不是任何一段计算变慢;也可能是 Prefill 池排队导致 TTFT 上涨而 Decode 侧完全正常。只有三段拆开看,才能判断该扩容哪个池、该优化哪条链路,而不是盲目加卡。

常见问题

分离之后 Prefill 池算好的 KV 缓存要传给 Decode 池,这条链路会不会成为新的瓶颈?
结论是链路选对了就几乎不构成瓶颈,选错了即走 PCIe 或普通 TCP 则会把 PD 分离的收益全部吃光。先算搬运量:KV 体量等于层数 乘 2(分别对应 Key 与 Value)乘 注意力头数 乘 头维度 乘 序列长度 乘 每元素字节数。以 70B 模型 FP8 KV 为例,每个 Token 约 320KB 至 640KB,一条 4K Token 请求要搬 1.3GB 至 2.6GB。走 100Gbps 普通以太网实测有效带宽只有 8GB 至 10GB 每秒,1.3GB 要传 130 毫秒以上,TTFT 收益被吃掉大半,而换 400Gbps RDMA 或 NVLink 后同样体量只需几毫秒到十几毫秒,相对几百毫秒的 Prefill 计算完全可以忽略。因此工程底线是:Prefill 池与 Decode 池尽量共置同一超节点或同一机架,节点内优先 NVLink 直连,跨节点至少 RDMA 组网,绝不走 PCIe 或普通 TCP。若机房条件确实只有 TCP,与其硬上 PD 分离,不如先退回单机的连续批处理加 Chunked Prefill,收益更稳。另外还有两个缓解手段:对 KV 做量化或选择性传输,只搬注意力真正需要的层或头,可把搬运量压到原来的三到五成;把两个池就近部署,缩短物理链路时延。综合来看,2026 年公开档的经验是:只要用上 RDMA 或 NVLink,KV 传输带来的额外 TTFT 通常只有 5 毫秒至 20 毫秒,远小于它消除干扰所节省的几百毫秒,净收益稳定为正。
我们团队 QPS 不高、请求也不长,还有必要上 PD 分离吗?
绝大多数中小团队不需要,PD 分离是给高 QPS、长上下文长尾明显的场景准备的,低 QPS 部署上它往往得不偿失。判断标准很直接:如果峰值 QPS 低于 5 到 10、请求长度分布集中、用户对首 Token 延迟的容忍度在 1 秒以上,那么同卡混跑配合连续批处理与分块预填充已经完全够用,收益能拿到 PD 分离的七成以上,却省掉了整套高速互联、KV 传输库与两套资源池的运维复杂度。PD 分离真正有价值的场景是长 prompt 频繁打断解码的高并发业务,比如高峰期 QPS 50 以上、且 P95 输入长度超过 2K Token 的在线客服、Agent 编排或长文档问答,此时长 prompt 的 Prefill 会让解码请求的 TPOT 尖峰冲到几百毫秒,用户体验明显变差,分离后 TTFT P99 能降 40% 至 70%。此外还要算清隐性成本:PD 分离需要 Prefill 池与 Decode 池两套部署,低峰期 Prefill 池会空转,利用率可能掉到 15% 至 25%,单位 Token 成本反而比混合部署高。给中小团队的务实建议是分步演进:第一步先在单机开连续批处理与 Chunked Prefill 把 TPOT 抖动压下去;第二步若还有瓶颈,先做单机内的阶段化调度或换更强的卡;第三步只有当 QPS 与输入长度都稳定进入高区间、且有 RDMA 或 NVLink 组网条件时,再考虑上 PD 分离。如果确实想要分离收益又不想自建,可以直接采用 唯元智创 这类托管网关,由平台侧决定两池配比与弹性伸缩,省掉自研与运维成本。
PD 分离和 Chunked Prefill 是二选一,还是可以叠加使用?
两者不是二选一,而是解决不同层级问题的互补手段,完全可以也推荐叠加使用。先把边界划清楚:PD 分离是跨资源池的架构级优化,解决的是 Prefill 计算与 Decode 计算抢同一批卡导致的跨阶段干扰,它把两类计算彻底分到不同实例池,属于部署拓扑层面的改造;Chunked Prefill 是单实例内的调度级优化,解决的是「一条超长 prompt 在一次前向里独占整个批次」导致的队头阻塞,它把长 prompt 切成 512 至 2048 Token 的小块与其他请求混批,属于连续批处理的调度策略。两者一个管池间、一个管池内,叠加后各管一层,收益叠加而冲突很小。具体收益上,只上 PD 分离时 TTFT P99 约降 40% 至 70%,此时 Prefill 池内部若仍有超长 prompt 独占批次,池内其他请求的 TTFT 仍会尖峰;在 Prefill 池里再开 Chunked Prefill,把长 prompt 分块消化后,TTFT P99 还能再降 20% 至 30%,同时 Prefill 池的算力利用率上升 10% 至 20%,因为不再有「一条请求占满整张卡」的空窗。因此推荐组合是:Decode 池保持连续批处理并尽量开满并发,Prefill 池开启 Chunked Prefill 且把 chunk 预算设为 512 至 1024 Token。注意一个细节:分块过细会拉长单请求的 Prefill 总时长、进而略微抬高其 TTFT,所以要结合平均输出长度调参,别一味求小。最后提醒,若部署量小到连单机都跑不满,叠加两者的复杂度不划算,先做好单机连续批处理与分块即可,等规模上来再引入 PD 分离。