立即注册找回密码

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

手机动态码快速登录

手机号快速注册登录

搜索

图文播报

查看: 195|回复: 0

[讨论] PD分离还是融合

[复制链接]
发表于 2025-5-30 18:33 | 显示全部楼层 |阅读模式

登陆有奖并可浏览互动!

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录 手机动态码快速登录

×
概述

DistServe、POD-Attention 和 Drift三篇论文分别通过物理拆分内核融合空间复用三种不同策略,针对大模型推理中的“预填充(prefill)”与“解码(decode)”两个阶段的资源竞争与干扰,提出了差异化的调度与内核设计,从而在满足延迟 SLO 的前提下显著提升 GPU 资源利用率与系统吞吐。
DistServe: Disaggregating Prefill and Decoding for Goodput-optimized Large Language Model Serving (OSDI’24)

动机:现有 LLM 服务系统将预填充与解码阶段放在同一 GPU 上并行批处理,导致两阶段互相干扰且资源分配耦合,难以同时满足“首令牌延迟(TTFT)”与“每令牌延迟(TPOT)”的严格要求。
设计:DistServe 将预填充与解码阶段物理拆分到不同 GPU 上独立执行,允许对每个阶段采用专门的并行度资源分配策略,并通过调度算法根据 TTFT/TPOT 要求动态分配 GPU 数量。
跨卡通信:为最小化 KV 缓存的跨卡传输开销,DistServe 根据集群带宽拓扑智能地选择预填充与解码实例的放置位置。
评估:在多种流行 LLM 与请求负载下,DistServe 在保证 90% 请求满足延迟 SLO 条件下,可服务请求数**提升 7.4×或支持12.6×**更紧 SLO,相比最优现有系统均有显著优势。
Drift: Optimizing SLO-oriented LLM Serving with PD-Multiplexing (arXiv ’25)

动机:Out-of-place 拆分与 in-place 共享各有优劣:前者可保证阶段 SLO 但浪费 KV 缓存复用,后者复用高但资源耦合导致利用率低。
PD-Multiplexing:Drift引入相位分离(Phase-Decoupled)多路复用,在单卡内部通过低级 GPU 分区技术(如按 SM 空间切分)实现预填充与解码的并行执行,同时保留对同一 KV 缓存的就地复用。
自适应调度:提出Adaptive Gang SchedulingSLO-Aware Dispatching 策略,基于运行时模型预测与资源争用统计,动态调整每个阶段在各分区的优先级和资源份额。
评估:在多种复杂对话与混合请求场景下,Drift 平均吞吐提升 5.1×(最高 17.5×),并持续满足严格的 SLO 约束。



感觉这个示意图挺清晰的

POD-Attention: Unlocking Full Prefill-Decode Overlap for Faster LLM Inference (ASPLOS’25)

动机:混合批处理(hybrid batching)虽能重用模型权重,但现有注意力内核只能分别针对预填充或解码优化,无法充分利用 GPU 的计算内存带宽资源。  内核设计:POD-Attention 首次在同一 SM 内核同时并发执行预填充与解码的注意力计算,通过CTA 级别的软件调度资源划分,使得两阶段的计算与内存访问重叠进行。  集成与调度:将 POD-Attention 内核集成到 Sarathi-Serve 调度器中,实现对混合批请求的异步流水线处理,并根据批次特性动态选择资源分配策略。  评估:Attention 计算加速最高 59%(平均 28%),整体端到端推理吞吐提升最高 22%,同时显著降低 TTFT、TBT 及请求总延迟。
三种方法对比

方案拆分方式部署位置关键技术性能提升
DistServe物理拆分不同 GPU阶段专属并行度+资源分配+带宽感知实例放置7.4× 服务数或 12.6× 更紧 SLO
POD-Attention内核融合同一 GPU SM 内核并发 Prefill/Decode Attention KernelAttention 层加速 59%(均值 28%),推理吞吐+22%
DriftPD-Multiplexing同一 GPU 多 SM 空间复用相位分离多路复用 + 自适应 Gang Scheduling平均吞吐+5.1×(最高 17.5×)
Comments

distserve

PD放到一张卡会面临如下的资源竞争:
chunked prefill会导致对KV的更多的访问。N + (N −1) +...+1 = O(N^2 )相比于O(N)。prefill是compute bound,decoding是memory bound。
////题外话:我学到了,多轮对话,后续输入会直接复用前面的KV cache(后续prefill正常算,只是decoding直接KV cache来用)/////
drift

以前的PD分离的思想还是有点粗粒度。在GPU之间传输KV cache,那开销是挺大的。其实通过控制不同SM干不同事情,就相当于分开了GPU嘛。这样就不需要传输KV cache了。嗯。不过问题在于,其他资源会不会受到干扰,比如L2,内存容量之类的。
///题外话,本文还大段埋汰了chunked prefill,我尚未看完,还没明白为什么与此相关////
/////前填充分块(Prefill chunking [2])的阶段耦合是一种动态计算分区技术,它保留了 KV 缓存的重用。该技术将长上下文的前填充阶段拆分成更小的块,并将每个块的执行与解码阶段的执行耦合起来。然而,如图 4-(a) 所示,这种阶段耦合设计由于以下三个缺点,难以在 SLO 约束下最大化吞吐量。
第一个缺点是资源浪费——难以在满足 SLO 要求和实现高利用率之间找到平衡点。图 5 展示了不同块大小在与固定配置的解码阶段配合下的执行时间。图中的“令牌预算”是指解码批次大小(本实验中为 32)与前填充块大小之和,该预算用于论文中判断能否保证 SLO。正如图中所示,只有当令牌预算达到 4K 时,延迟才开始呈线性增长。这表明,要充分利用 GPU 资源,前填充块的上下文长度应为(4K – 32),才能达到“甜点”点;但此时耦合执行的延迟高达 240 毫秒,远远超过典型的每令牌延迟(TBT)SLO 目标(<100 毫秒)。在这种情况下,为了满足较小的 TBT SLO 目标,前填充和解码阶段往往都会以低效的方式运行。
第二个缺点是前填充分块会导致对先前块中 KV 缓存的重复读取,这会产生两方面的低效:1)引入二次方级的内存开销;2)当重用的上下文过长时,可能无法满足解码阶段的 SLO 目标。每个分块前填充都可以看作是带缓存的前填充。如表 1 所示,其计算复杂度会随着重用上下文长度的增加而增加。当重用上下文达到数千令牌时,注意力计算本身就会成为该块延迟的主要瓶颈,在这种情况下,该块的延迟已经超过了耦合解码阶段的 TBT SLO 目标。我们在第 5.2.1 节的评测中也印证了这一点。
第三个缺点是该方法与 CUDA Graph 等加速技术不兼容,因为 CUDA Graph 要求静态配置。而前填充块大小和解码批次大小共同形成了一个庞大的配置空间,使得在该设计中应用 CUDA Graph 加速变得不可行。///////
pod-attention


在一个block内(SM内)结合prefill和decoding,实现计算资源的极致利用。

PA和drift都使用了SM-specialize技术,不过前面是用%smid控制,后面是用green_context。(没细研究过)

其他相关的paper,有空继续看:
Fast State Restoration in LLM Serving with HCache(对KV cache的空间占用做了优化。如果P/D的资源抢占是内存不够,这个似乎有用)
感觉PD分离的资源竞争问题,可以借鉴分布式的空分共享啊?什么MPS, MIG,如何划分资源之类的。

原文地址:https://zhuanlan.zhihu.com/p/1901666478148813068
楼主热帖
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册 微信登录 手机动态码快速登录

本版积分规则

关闭

官方推荐 上一条 /3 下一条

快速回复 返回列表 客服中心 搜索 官方QQ群 洽谈合作
快速回复返回顶部 返回列表