一文了解解耦 Prefilling 与 Decoding(PD 分离)以及典型的 PD 分离方案
🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/
文章目录
- 一、PD 分离是什么?
- 二、为什么需要 PD 分离?
- 三、典型的 PD 分离方案举例
- 四、总结与展望
一、PD 分离是什么?
本节在讲解 PD 分离之前,首先明确常用的大语言模型(Large Language Models,LLMs)推理系统的性能指标:
-
服务级别目标(Service-Level Objectives,SLOs):系统在提供推理服务过程中,为保障可用性、可靠性和性能所设定的量化目标阈值。它通常涵盖 响应时延(Latency)、可用性(Availability) 和 错误率(Error Rate) 等关键指标,用于评估系统是否持续满足预期服务水平。SLO 实际是服务级协议(Service-Level Agreement,SLA)的基础,能够指导系统设计、容量规划与运行优化,从而在用户体验与资源利用之间取得平衡。
-
首词元时延(Time To First Token,TTFT):从系统接收到完整输入提示(Prompt)到生成输出序列中第一个词元(Token)所经历的时间。该指标反映模型在推理启动阶段的整体响应速度,包括请求解析、模型前向计算初始化以及首个解码步骤的耗时,通常用于评估系统的交互体验与实时性。TTFT 值越小越好。
-
平均输出词元时间(Time Per Output Token,TPOT):系统在生成过程中每输出一个词元所需的平均时间,通常以毫秒/{/}/词元(ms/{/}/token)为单位。其计算方式为 总生成时间 除以 输出词元总数。TPOT 值越小越好。
-
词元间时间(Token Between Token,TBT):系统在连续生成两个相邻输出词元之间所需的平均时间,反映模型在推理阶段的实时生成流畅度。其计算方式为统计所有相邻词元时间间隔的平均值、中位数或标准差。TBT 值越小,表示模型输出越流畅,交互实时性越高。
-
端到端时延(End-to-End Latency,E2E):从接收完整输入请求开始,到系统生成并返回完整输出结果为止所经历的总时间,涵盖输入预处理、模型加载、推理计算、解码及后处理等全过程。该指标用于综合评估模型推理系统的整体响应速度和用户体验。
-
指数移动平均(Exponential Moving Average,EMA)时延:对连续推理请求的响应时延应用指数加权平均算法,赋予近期观测点较高权重,同时平滑历史数据,从而实时、稳定地反映系统在动态负载下的时延变化趋势与短期性能波动。
-
吞吐量(Throughput):系统在单位时间内生成的输出词元数或完成的推理请求数,通常以 Tokens Per Second(词元/{/}/秒)或 Requests Per Second(请求/{/}/秒)为单位。该指标反映系统的并行处理能力与资源利用效率,是评估推理服务可扩展性与成本效益的关键之一。
-
Goodput 与 Throughput 类似,但要求请求完成必须满足 SLOs 的性能要求(才算 “Good”)。吞吐量统计每秒钟生成的输出词元数或完成的推理请求数,但未考虑 SLOs 的约束。如下图示意:
- MFU(Model FLOPs Utilization):模型实际执行的浮点运算量(FLOPs)占理论最大可用计算量的比例,用于衡量模型在硬件计算单元(如 GPU、NPU)上计算资源利用的效率。MFU 表示模型在推理过程中对底层算力的 “饱和度” 或 “利用率”,反映了系统的计算效率与优化程度 —— MFU 越高,说明推理系统对硬件算力的利用越充分。其计算公式通常为:
MFU=模型实际执行的 FLOPs硬件在该时间内的峰值 FLOPs×100%\text{MFU} = \frac{\text{模型实际执行的 FLOPs}}{\text{硬件在该时间内的峰值 FLOPs}} \times 100\% MFU=硬件在该时间内的峰值 FLOPs模型实际执行的 FLOPs×100% - 补充说明:SLO 的一个示例,P90 TTFT SLO=300ms,这意味着 90% 的请求的首个词元的生成时延需小于或等于 300ms。时延与吞吐量之间存在固有的权衡关系:设定此类 SLO 指标的本质,在于用户关注的时延与厂商关注的吞吐量往往不可兼得。因此,厂商通过设置 SLO 在保障用户体验的前提下,最大化系统吞吐量。这实质上是一个约束条件下的最优化问题。
接着,在 LLMs 的实际大规模部署中,推理优化是提升模型推理效率的关键环节。其中,“Prefilling 与 Decoding 分离,即 PD 分离” 实为一种重要的优化技术。LLM 推理过程的一个简单示例如下所示:
然后,明确 PD 分离的定义和主要特征。
PD 分离(Prefilling-Decoding Disaggregation)是将 LLMs 的推理过程划分为两个独立阶段:
-
Prefilling(预填充)阶段:处理输入的完整提示(Prompt),即词元(Token)序列;计算所有输入词元的上下文表示,并生成初始的 KV 缓存(Key-Value Cache 来自注意力层的 KV 向量);输出首个词元。该阶段的时延为 TTFT(Time To First Token),通常在几百毫秒(ms)量级。一次性计算:避免在解码阶段重复计算历史 Tokens 的中间结果。Prefilling 是计算密集型阶段,但对 GPU 内存的要求并不高。
-
Decoding(解码)阶段:基于 Prefilling 阶段已生成的 KV 缓存,以自回归方式逐步生成后续的每个输出词元。其时延称为 TBT(Token Between Token),通常在 10~20 ms 范围内。增量更新 KV Cache:每次生成新 Token 时,仅计算当前 Token 的 KV 向量并追加到 KV Cache 中,复用历史 KV 向量。与 Prefilling 不同,Decoding 需要快速的内存访问,但计算量相对较小。
Prefilling 阶段的主要特征包括:
-
计算密集型:执行完整的模型前向推理,计算全部输入词元的注意力矩阵,其计算复杂度与输入序列长度的平方呈正比,即 O(n2)O (n^2)O(n2)。
-
并行化处理:所有输入词元能够并行处理,从而充分发挥 GPU、NPU 等硬件加速能力。
Decoding 阶段的主要特征包括:
-
内存密集型:需频繁读取 KV Cache 中的历史数据,数据传输密集,内存与通信带宽 易成为性能瓶颈。
-
串行生成:严格遵循自回归过程,每次仅生成一个 Token。
-
注意力计算聚焦最新 Token:其计算复杂度与序列长度呈线性关系,即 O(n)O(n)O(n)。
Prefilling 阶段与 Decoding 阶段的主要特征总结如下表所示:
特性 | Prefilling 阶段 | Decoding 阶段 |
---|---|---|
输入 | 完整的输入提示词 Prompt | 前一步生成的 Token |
计算复杂度 | O(n2)O(n^2)O(n2),nnn 为输入 Prompt 的长度 | O(1)O(1)O(1) Per Token,总为 O(n)O(n)O(n) |
并行性 | 完全并行 | 严格串行 |
资源消耗 | GPU 计算性能 | 内存和通信带宽 |
输出 | 除首 Token 外,无新 Token 生成 | 逐个生成 Token |
性能瓶颈 | 受限于计算能力(FLOPs) | 受限于内存带宽,即 KV Cache 的读写速度 |
工程优化 | 适用 Flash Attention 等技术加速长序列处理 | 通过 Page Attention、内存压缩等技术降低 KV Cache 内存占用 |
🏠 最后,生活类比:以家庭烹饪为例
-
Prefilling 阶段:准备所有食材并进行切配、调味等预处理,开始制作第一道菜。该过程需大量准备工作,类似于模型的预填充阶段。
-
Decoding 阶段:依次加入食材,逐步完成菜肴烹制,该过程类似于模型的解码阶段。
若在同一个时段内,一个人同时进行食材准备与烹饪,可能导致烹饪效率降低。将两个过程分离,由两个人分别执行, 能够有效提升整体效率。
二、为什么需要 PD 分离?
在传统架构中,这两个阶段通常在同一设备上顺序执行;但由于它们在计算模式、资源需求和性能指标上存在显著差异,具有不同的推理特性,因而可能引发性能瓶颈。
举个例子,在单条请求的场景中,LLM 推理首先通过 Prefilling 阶段生成 KV Cache 和首个 Token,随后进入 Decoding 阶段执行自回归解码以生成后续 Token。这种单批次推理模式下,Prefilling 与 Decoding 阶段耦合执行(通常部署在同一设备上),其吞吐量较低。虽然这种模式在表面上看似合理,但为实现高吞吐量,必须采用批量推理技术,例如 Continuous Batching。该技术将多个请求同时输入大语言模型,并在某个请求完成后自动将其从批次中移除,同时加入新请求,从而满足高并发需求。如下图所示:
然而,将 Prefilling 与 Decoding 阶段部署在同一设备上,并采用持续批处理,会导致两个主要问题:
-
首先,不同请求之间在计算资源上相互干扰,造成资源浪费,并导致 TBT 时延出现尖峰,使用户感知到明显卡顿;
-
其次,例如当批次大小为 2 时,若请求 A 正处于 Decoding 阶段,而新请求 B 刚加入批次并执行 Prefilling,且 B 的 Prefilling 处理时间超过 A 的 Decoding 时间,则 A 请求输出 Tokens 的时延将显著增加。同时,由于 A 与 B 对计算资源的竞争,B 请求的首 Token 时延也会相应增加。
-
当 Prefilling 和 Decoding 处于同一批次中时,Prefilling 操作会显著降低 Decoding 阶段的输出效率。
总体而言,在实际操作中,系统往往会同时收到多条请求。每条请求都有各自的 Prefilling 和 Decoding 需求,但同一阶段只能同时计算一个。当 GPU 被计算密集型的 Prefilling 任务占用时,Decoding 任务就得等待,这会增加 TBT,反之亦然。由于 Prefilling 主要决定 TTFT,Decoding 会影响 TBT,把它们放在一起会使这两个指标很难同时优化。如下图所示:
将 Prefilling 与 Decoding 阶段耦合部署的策略会导致两者资源分配与并行策略的相互耦合。Prefilling 阶段属于计算密集型任务,在推理过程中适合采用张量并行策略。Decoding 阶段则是内存密集型任务,适合采用数据并行与流水线并行策略。若将 Prefilling 与 Decoding 阶段部署于同一计算设备,则两者的并行策略无法独立配置。
-
DistServe 论文的实验结果表明,Prefilling 阶段在请求率较低时更适合采用张量并行(Tensor Parallelism,TP),而在请求率较高时则更适合流水线并行(Pipeline Parallelism,PP)。对于 Decoding 阶段,随着 GPU 数量的增加,PP 可显著提高吞吐量;TP 则能降低时延,从而减少单个请求的处理时间。
-
采用耦合部署策略可能导致两个阶段各自的优化目标 SLOs(Service-Level Objectives)发生冲突。为此,Prefilling 与 Decoding 分离技术的核心思想是将两个阶段解耦,并将其分配至不同类型的硬件设备上执行,通过各自独立优化,最终提升整体系统效率。
Prefilling 与 Decoding(PD)分离的架构应运而生,其示意图如下所示:
由上图可知,PD 分离架构能够有效提升 Decoding 阶段的处理效率。从双卡并行(TP2)转变为单 Prefilling 卡与单 Decoding 卡(1P1D)的配置后,用于 Prefilling 阶段的计算卡数量减少。在面对大批次规模或长序列输入时,这会增加首 Token 时延(TTFT)。此外,由于 Prefilling 阶段计算密集,而 Decoding 阶段数据通信量较大,PD 分离架构允许为两个阶段分别配置不同类型的显卡,从而实现最佳性价比。
补充说明一点:Prefilling 与 Decoding 分离的一个现实背景可能是国内 GPUs 供应受限以及成本问题。部分公司采用 RTX 4090 负责 Prefilling 阶段、H20 负责 Decoding 阶段的协同方案,从而有效利用两种硬件在不同阶段的性能优势,减少资源浪费。以 NVIDIA 4090 为例,相较于 A 系列或 H 系列显卡,其计算性能约为后者的 30% 至 50%,但带宽不足后者的 10%。因此,4090 实际挺适用于计算密集的 Prefilling 阶段,并且具有较高的性价比。
PD 解耦的核心思想较为简明:将 Prefilling 与 Decoding 这两个不同任务进行分离,使其互不干扰。主要优势包括:
-
专用资源分配:Prefilling 与 Decoding 任务可在不同硬件上独立调度与扩展。例如,当工作负载中存在大量提示重叠(例如在多轮对话或智能体工作流中)时,大部分 KV 缓存可被复用,从而降低 Prefilling 阶段的计算需求,并将更多资源集中于 Decoding 阶段。
-
并行执行:Prefilling 与 Decoding 阶段互不干扰,能够以更高效率并行执行,进而提升系统整体的并发能力与吞吐量。
-
独立调优:Prefilling 与 Decoding 阶段可分别采用不同的优化策略(例如张量并行或流水线并行),从而更精准地优化 TTFT(首词元时间)与 TBT(词元间时间)等时延指标。
总体而言,Prefilling 和 Decoding 两个阶段在批处理方式与并行策略上的优化倾向存在差异。传统耦合式推理框架只能在 TTFT 与 TPOT 之间进行权衡。而解耦后的框架支持更精细化的策略配置,实现对两个阶段的分别优化,从而更好地满足服务级别目标。
三、典型的 PD 分离方案举例
现代 PD 分离系统(如 DistServe 和 Mooncake)通过 KV Cache 传输技术和调度算法的优化,能够将 LLM 推理的计算与内存成本控制在合理范围内。这一改进显著提升了模型的推理效率。
DistServe 优化了资源分配和并行策略,以达到更好的 Goodput 和 SLOs,DistServe 运行时系统架构如下图示意:
PD 分离式架构:
-
LLM 的预填充阶段,部署在 Prefilling Instance 节点上,专注于 Prefilling 阶段的计算,得到 KV 缓存。
-
LLM 的推理阶段,部署在 Decoding Instance 专注于 Decoding 阶段自回归的生成任务。
-
在 DistServe 中,Prefilling 实例数和 Decoding 实例数可以不一样。Decoding 和 Decoding 阶段解耦,两阶段在并行方式、batch 策略上分别优化,可同时满足 TTFT 和 TPOT 的 SLOs。
-
DistServe 首先筛选出所有满足硬件约束的配置参数,随后通过模拟器(Simulate 函数)实测各配置的有效吞吐量,最终采用网格搜索在所有可选参数中确定使有效吞吐量最大化的最优配置,这一过程类似机器学习中的超参数调优。
推理流程如下:当 Prefilling Instance 完成 KV Cache 的计算后,会将其传输给 Decoding Instance 解码,后者继续生成后续内容。因此,PD 分离架构的优势在于,两个阶段部署在不同服务器上,促进各自进行优化,从而最大化整体吞吐量和计算设备利用率。
DistServe 还针对两种不同的硬件场景,提供相应的 Placement 方案,其核心思想如下:
-
节点间带宽极高,KV Cache 的传输开销可忽略不计(例如单机多卡场景);
-
节点间带宽有限,KV Cache 的传输时延不可忽视,此时尽可能将 Prefilling 与 Decoding 阶段对应的模型层部署于同一节点,以降低传输时延。
在实践中,PD 分离架构一个核心点在于,KV Cache 的计算和传递,它直接影响整个架构的调度设计。Mooncake 进一步推进并扩展了 PD 分离架构,设计出一种以键值缓存(KV Cache)为中心的分离式 LLM 服务架构。通过优化 KV Cache 的管理和传输,Mooncake 在确保服务级别目标(Service-Level Objectives,SLOs)的前提下,Mooncake 最多可将吞吐量提高 525%,相比 vLLM,有效请求容量提升 107%,长上下文和大负载场景优势显著。在实际工作负载下,Mooncake 可使系统处理的请求增加 75%。
如下图 Figure 1 所示,Mooncake 同样采用了分离式架构。此处的 “分离” 实际包含两层含义:
-
第一,将 Prefilling 与 Decoding 的计算资源进行分离,这与现有工作(如 Splitwise 和 DistServe)的做法一致。在 Prefilling 阶段,优化目标是利用请求间可能存在的共同前缀,尽可能复用 KV Cache,同时满足首词元时间(TTFT)的服务水平目标(SLO),并尽可能提高模型浮点运算利用率(MFU),同时确保 KV Cache 总量不超过 CPU 内存容量限制。在 Decoding 阶段,优化目标为最大化系统吞吐量,满足词元间时间(TBT)的 SLO,并保证 KV Cache 总量不超过 GPU 显存限制。
-
第二,将 KV Cache 与计算单元分离。Mooncake 将 GPU 集群中的 CPU、DRAM、SSD 和 RDMA 资源整合为分布式 KV Cache 池,采用分页式块管理方式组织 KV Cache。KV Cache 块在该池中的调度策略与复用机制,是 Mooncake 设计的核心所在。
遵循论文的阐述,我们结合下图 Figure 4 来了解一下 Mooncake 处理一个请求的流程:
当一个请求(经 Tokenization 后)到达时,调度器会为其选择一对 Prefilling 实例和 Decoding 实例。这两个实例均需持有模型参数的副本,并启动一个包含四个步骤的工作流:
-
步骤一:KV Cache 复用。Prefilling 实例将请求划分为多个词元块。考虑到请求间可能存在的共同前缀,系统会尽可能将词元块调度至拥有最长前缀 KV Cache 的节点进行处理,以实现 KV Cache 的复用。为此,Mooncake 提出了一种以 KV Cache 为中心的调度策略。
-
步骤二:增量 Prefilling。利用前缀缓存(Prefix Cache),Prefilling 实例仅需计算前缀缓存未命中的 Tokens 部分。对于长序列的计算,系统通过多卡并行处理,并采用 TeraPipe 流水线并行方式。
-
步骤三:KV Cache 传输。与 Splitwise、DistServe 等分离式架构设计一致,需要将生成的 KV Cache 从 Prefilling 实例传输至 Decoding 实例。Mooncake 采用异步传输方式,将此过程与上述增量 Prefilling 步骤重叠执行,将每个模型层产生的 KV Cache 流式传输至目标 Decoding 实例的 CPU 内存中,旨在降低传输时延。
-
步骤四:解码。当 Decoding 实例的 CPU DRAM 完成接收所有 KV Cache 后,该请求即进入 GPU 上的连续批处理(Continuous Batching)流程进行解码。
实际上,目前主流的开源大语言模型推理引擎和框架也在积极探索 PD 分离方案,其中包括 vLLM、SGLang、Dynamo 和 LLM-d 等。
-
vLLM 的 PD 分离介绍
-
SGLang 的 PD 分离介绍
-
使用 NVIDIA Dynamo 部署 PD 分离推理服务
-
LLM-d 的 PD 分离
四、总结与展望
本文主要内容:
-
本文首先明确大语言模型推理系统的关键性能指标,继而剖析预填充(Prefilling)与解码(Decoding)这两个阶段的核心特征。
-
基于上述分析,本文指出:持续批处理(Continuous Batching)采用阶段隔离与抢占机制,虽有助于提高系统吞吐量并降低生成首词元的时延(Time To First Token,TTFT),但会显著增加词元间时延(Token Between Token,TBT),进而对端到端(End-to-End,E2E)时延造成不利影响。
-
最后,本文简要回顾了预填充与解码相分离(Prefilling-Decoding Disaggregation,PD 分离)方面的已有研究工作。PD 分离技术将大语言模型推理过程划分为两个独立阶段,并针对各阶段的计算特性实施针对性优化,从而显著提升推理效率与资源利用率。该架构的引入已为大语言模型的高效部署与实际应用开辟新的技术路径。
需要指出的是,解耦并非总是最优方案;尽管前景广阔,但 PD(Prefilling/Decoding)分离并非适用于所有场景:
-
性能阈值至关重要:当工作负载规模较小或 GPU 配置未针对该方法优化时,性能可能不升反降。
-
本地 Prefilling 更具优势:对于短提示或 Decoding 引擎前缀缓存命中率较高的情况,在 Decoding 节点本地执行 Prefilling 通常更快速且实现更简单。
-
数据传输成本:PD 分离要求 Prefilling 与 Decoding 节点间高效可靠地传输 KV Cache。因此,实施方案需支持快速、低时延的通信协议,并具备硬件与网络无关性。若数据传输开销超过解耦带来的性能收益,整体性能将受损。现有传输技术示例如下:NVIDIA Inference Xfer Library(NIXL)、CXL、NVMe-oF。
📚️ 参考资料链接整理如下:
-
怎么进行 PD 分离?
-
LLM 关于 PD 分离的最新实测
-
Perplexity:解耦 Prefilling 和 Decoding
-
B 站 UP 主 - AI老马啊 | 大模型推理 - 基于 Prefilling 和 Decoding 阶段特点,PD 分离架构,势在必行!
-
BentoML | Prefilling-Decoding Disaggregation
-
Perplexity:解耦 Prefilling 和 Decoding
-
Qin, R., Li, Z., He, W., Zhang, M., Wu, Y., Zheng, W., & Xu, X. (2024). Mooncake: A KV Cache-centric Disaggregated Architecture for LLM Serving. arXiv preprint arXiv: 2407.00079.
-
Zhong, Y., Liu, S., Chen, J., Hu, J., Zhu, Y., Liu, X., … & Zhang, H. (2024). {DistServe}: Disaggregating Prefilling and Decoding for Goodput-Optimized Large Language Model Serving. In 18th USENIX Symposium on Operating Systems Design and Implementation (OSDI 2024) (pp. 193-210).
-
Choukse, E., Patel, P., Zhang, C., Shah, A., Goiri, I., Maleki, S., … & Bianchini, R. (2025). Splitwise: Efficient Generative LLM Inference Using Phase Splitting. IEEE Micro.
-
Agrawal, A., Panwar, A., Mohan, J., Kwatra, N., Gulavani, B. S., & Ramjee, R. (2023). SARATHI: Efficient LLM Inference by Piggybacking Decodes with Chunked Prefills. arXiv preprint arXiv: 2308.16369.
-
【DistServe 博客翻译】通过 PD 分离实现 LLM 推理服务中的最大有效吞吐量
-
DistServe:优化大模型推理服务的分离式架构
-
【深度解读 FAST’25 最佳论文 Mooncake】:以 KV Cache 为中心的 LLM 推理架构
-
从科研角度分析 Kimi 推理系统 Mooncake 解决的是什么问题
-
Mooncake 架构概览:以 KV Cache 为中心的高效 LLM 推理系统设计
-
Mooncake 阅读笔记:深入学习以 Cache 为中心的调度思想