Decode Context Parallelism(DCP)详解:长上下文解码中的 KV Cach
一句话理解 DCP: Decode Context Parallelism(解码上下文并行)不是把模型权重继续切细,而是把同一个请求的历史 KV Cache 沿 sequence/context 维度分散到多个设备;每张卡只对自己的 KV 分片计算局部 Attention,最后用通信把局部结果精确合并。
1. 为什么长上下文 Decode 会出现 DCP
自回归 Decode 每产生一个新 token,都只需要为这个新位置计算一遍 Transformer,但它在每一层的 Attention 中仍然必须读取历史 token 的 KV Cache。
对第
历史 token 不需要重新经过 MLP/MoE,也不需要重新生成 K/V;KV Cache 正是为了避免这些重复计算。但上下文越长,每一步 Decode 需要扫描的历史 KV 越大。因此超长上下文 Decode 常常逐渐从“计算问题”变成:
- KV Cache 容量问题;
- HBM/DRAM 带宽问题;
- 多请求并发时的 KV Cache 容量与带宽竞争问题。
例如 1M token 上下文,即使每步只生成 1 个新 token,Attention 仍然要访问这 1M token 对应的历史 KV。NVIDIA 对超长上下文 Decode 的分析也指出:固定并行度下,Self-Attention 的 KV 读取开销会随上下文长度近似线性增长。
2. 为什么普通 Tensor Parallel 不一定能解决 KV Cache 问题
TP(Tensor Parallel)通常沿 Attention Head / Hidden Dimension / 权重维度切模型。
对于 KV Cache,传统 TP 最自然的切法是沿 KV Head 切:
KV heads = 8
TP = 4
GPU0 -> KV head 0,1
GPU1 -> KV head 2,3
GPU2 -> KV head 4,5
GPU3 -> KV head 6,7
这时 KV Cache 可以被很好地分散。
问题出现在现代 GQA 和 MLA。
2.1 GQA:KV Head 数可能小于 TP 数
假设:
num_query_heads = 64
num_kv_heads = 4
TP = 8
只有 4 个 KV Head,却有 8 个 TP Rank。TP 已经没有足够多的 KV Head 可以继续切,于是部分 Rank 必须保存重复 KV。
所以:
当 TP > KV Head 数时,继续增加 TP 不再等比例减少单卡 KV Cache。
2.2 MLA:问题更明显
DeepSeek-V2/V3/R1、部分 Kimi 模型使用 MLA(Multi-head Latent Attention)。MLA 把 K/V 压缩成共享的低秩 latent,从 KV 分片角度看可以近似理解为“有效 KV Head 数接近 1”。
因此在纯 TP 下:
TP=8
GPU0 -> latent KV 全量副本
GPU1 -> latent KV 全量副本
...
GPU7 -> latent KV 全量副本
TP 把模型权重切开了,但 KV Cache 并没有随 TP=8 缩成 1/8。
这正是 DCP 特别适合 MLA 长上下文推理的原因。
3. DCP 到底切什么
DCP 改变 KV Cache 的切分维度:
传统 TP:沿 Head / Tensor 维切
DCP: 沿 Sequence / Context 维切
为了建立直觉,可以先用连续分片理解一个 200K token 请求:
完整历史 KV:token 0 -------------------------- 200K
DCP=4:
Rank0 : token 0K ~ 50K
Rank1 : token 50K ~ 100K
Rank2 : token 100K ~ 150K
Rank3 : token 150K ~ 200K
于是理想情况下,每个 Rank 只保存约
3.1 重要工程细节:实际布局不一定是连续大段
上面的 0–50K / 50–100K 是教学模型。
当前 vLLM Ascend 的 DCP 实现支持 interleaved KV layout(交错布局),由 cp_kv_cache_interleave_size 控制粒度。也就是说,KV Block 可以按一定粒度轮转分给各个 DCP Rank,而不是必须把整段上下文切成几个连续的大区间。
这样更有利于:
- 负载均衡;
- Decode 过程中 KV Cache 持续增长时保持各 Rank 容量均衡;
- Chunked Prefill / 多请求场景下管理 Block。
所以应牢记的是:
DCP 的本质是 sequence-dimension sharding,而不是“必须连续切段”。
4. 一个关键问题:KV 被切开后,Attention 怎么还能算对
新 token 的 Query
如果 DCP=4,每张卡只有
但不能直接做:
O = O0 + O1 + O2 + O3
因为各 Rank 的 softmax 分母不同。
4.1 用 Log-Sum-Exp 精确合并
每个 Rank 除了产生局部输出
全局:
然后把每个局部输出重新加权:
这就是 distributed / online softmax 的关键。
结果与把全部 KV 放在一张卡上直接计算 Attention 数学等价,并不是近似 Attention。
这个思想和 FlashAttention / Flash-Decoding 在分块计算时维护局部 max、sum、output 再归并,本质上是一脉相承的。
5. vLLM DCP 的典型 Decode 通信流程
vLLM 官方对标准 DCP 流程的概括是:
AllGather Q
↓
Local Attention on local KV shard
↓
exchange partial Output + LSE
↓
Online-Softmax correction / combine
↓
return correct Attention output shard
Step 1:准备完整 Query
TP 后,每个 Rank 可能只持有部分 Query Head,而每个 DCP Rank 需要用相应 Query 去访问本地 KV 分片。
标准路径可以先 AllGather Q。
Decode 每一步 Query 只有当前 token,因此与把超长 KV Cache 搬来搬去相比,Query 通信量相对小。
对于 MLA,vLLM 还提供 dcp_q_replicate 思路:在加载阶段复制较小的 Query Projection,使每个 DCP Rank 可以自己产生完整 group-local Query,从而跳过 Decode 时的 Query AllGather,代价是少量重复计算和权重复制。
Step 2:每个 Rank 只读自己的 KV
Rank0 : Q × KV_shard_0 -> O0, LSE0
Rank1 : Q × KV_shard_1 -> O1, LSE1
Rank2 : Q × KV_shard_2 -> O2, LSE2
Rank3 : Q × KV_shard_3 -> O3, LSE3
这是 DCP 的核心收益:KV 容量和 KV 读取带宽都可以分摊到多设备。
Step 3:合并局部 Attention
vLLM 当前提供的 DCP 通信后端包括:
ag_rs:AllGather + ReduceScatter;a2a:All-to-All 交换局部输出和 LSE,再由 kernel 合并。
官方文档指出,对 MLA 路径,A2A 方案可减少 collective/NCCL 调用次数,是后续 DCP 优化的重要方向。
6. 为什么说 DCP“复用 TP Rank”,而不是额外增加一套 GPU
vLLM 的 decode_context_parallel_size 不一定扩大 process world size。
没有 PCP 时,DCP 通常复用现有 TP ranks:
原来:TP = 8
开启:
TP = 8
DCP = 8
仍然是这 8 个进程 / 8 张 GPU
同一批 GPU 在模型权重相关计算中承担 TP,在 Attention KV Cache 访问中又组成 DCP group。
因此不能简单理解为:
总卡数 = TP × DCP
MLA 常见约束
vLLM 官方给出的 MLA DCP 约束包括:
tensor_parallel_size >= decode_context_parallel_size
tensor_parallel_size % decode_context_parallel_size == 0
例如:
vllm serve deepseek-ai/DeepSeek-R1 \
--tensor-parallel-size 8 \
--decode-context-parallel-size 8
GQA 的 DCP 上限为什么通常更小
GQA 先利用 KV Head 做正常 TP 分片,DCP 主要用来消除“超过 KV Head 数以后产生的重复副本”。
假设:
num_kv_heads = 4
TP = 8
重复因子:
TP / num_kv_heads = 2
因此这里可利用的 DCP 空间通常只有 2,而不是 8。
这说明 DCP 的价值和模型 Attention 结构强相关:
MLA 往往是 DCP 的理想场景;GQA 是否值得开以及能开多大,要看 TP 与 KV Head 数的关系。
7. DCP 到底优化“显存”还是“速度”
答案是:两者都可能,但第一性收益是 KV sharding。
7.1 容量收益
DCP=N 时,理想情况下单 Rank KV Cache 可接近缩小为原来的
这意味着:
- 可以支持更长 context;
- 可以提高
max_num_seqs/ concurrency; - 同样显存下可以容纳更多请求;
- 降低 KV Cache OOM 风险。
7.2 带宽收益
每个 Rank 只扫描本地
7.3 代价:通信
Attention 结果必须跨 Rank 合并,所以 DCP 是典型的:
用高速互联通信换取 KV 容量与 KV 带宽扩展。
因此 DCP 是否收益明显,与以下因素强相关:
- Context 是否足够长;
- KV Cache 是否已经成为瓶颈;
- NVLink / HCCS / 灵衢 / RoCE 等互联延迟和带宽;
- Batch / concurrency;
- MLA、GQA、MHA 结构;
- 通信 kernel 是否能和 Attention 计算重叠。
短上下文、小 Batch 时,通信成本可能抵消 DCP 收益,因此 DCP 不是“任何推理都应该开启”的开关。
8. vLLM 官方实测说明了什么
2026-08 vLLM 官方博客使用 8×NVIDIA B200、Kimi K2.6 NVFP4 和真实的 agentic long-context trace 对比纯 TP 与 DCP。
该测试中输入中位数约为 67K token,并包含接近 1M token 的长尾请求。官方结果显示:
- 纯 TP 的 KV Cache 因复制更快占满;
- DCP 可以继续提升并发;
- 在其测试配置下,纯 TP 吞吐在约 1,863 tok/s/GPU 附近趋于平台,而 DCP 在 concurrency=512 时达到约 6,091 tok/s/GPU,同时 KV 使用率约 82%。
这些数字只能代表该硬件、模型、量化和工作负载,不能直接外推为“DCP 固定快 3 倍”。真正值得记住的是性能机制:
减少 KV duplication
↓
释放 HBM
↓
提高可容纳 batch / concurrency
↓
提高长上下文 serving 吞吐
9. 昇腾 / vLLM Ascend 中的 DCP
vLLM Ascend 官方设计文档同样把 DCP 定义为:
沿 sequence 维度把 KV Cache shard 到 TP group 内不同设备,从而消除冗余 KV 存储,同时不增加 process world size。
当前实现还涉及:
cp_kv_cache_interleave_size控制 KV Cache 交错粒度;- MLA 与 GQA 使用不同的数据交换方式;
- Decode 阶段各 Rank 对本地 KV 分片做 Attention,再合并 partial output + LSE;
- Sparse Attention 场景还有 DSA-CP / SFA DCP 等扩展路径。
9.1 一个非常有价值的真实案例:GLM-5.2 1M Context
vLLM Ascend 官方 GLM-5.2 文档给出的 Atlas 800 A3 单节点 1M context 配置中包含:
TP = 16
DCP = 16
cp_kv_cache_interleave_size = 128
max_model_len = 1,024,000
这个例子非常直观地说明:DCP 已经不是单纯的论文概念,而是昇腾超长上下文推理配置中的实际工程手段。
10. DCP、PCP、TP、EP 应如何区分
| 并行方式 | 主要切分对象 | 典型目的 |
|---|---|---|
| TP | 权重 / Head / Hidden Tensor | 模型计算与权重分摊 |
| EP | MoE Experts | 把大量 Expert 分散到设备 |
| PP | Transformer Layers | 模型纵向分层 |
| DP | Request / Batch | 提高整体吞吐 |
| PCP / Prefill CP | Prompt Sequence | 并行处理超长 Prefill |
| DCP | Decode KV Cache 的 Sequence 维 | 消除 KV 冗余、扩展长上下文容量与 Decode 带宽 |
一个非常好用的记忆方式:
TP:切“模型”
EP:切“专家”
PP:切“层”
DP:切“请求”
CP:切“序列”
DCP:专门把 CP 思想用于 Decode / KV Cache
11. DCP 与 NVIDIA Helix Parallelism 的关系
TensorRT-LLM 的 Helix Parallelism 和 DCP 属于非常相近的技术方向,但不能直接画等号。
共同核心:
- Decode 阶段沿 sequence 维度 shard KV Cache;
- 各 GPU 在本地 KV shard 上计算 partial attention;
- 使用 partial output + LSE 做精确 softmax 合并;
- 让超长上下文 KV 读取分散到多 GPU。
Helix 更进一步,把同一批 GPU 在 Transformer 层内部“重新编组”:
Attention 阶段:KV Parallelism / Context Parallelism
↓
Attention 结束
↓
FFN/MoE 阶段:重新作为更宽的 TP / TP×EP
NVIDIA 把这个设计称为在 Attention 和 FFN 之间采用不同的最优 sharding strategy。
Helix 的另一个重要特点是可以通过重复计算较小的 QKV Projection 来避免昂贵的 pre-attention Query AllGather,并使用 All-to-All 交换 partial output + LSE。
所以可以把它理解为:
DCP 是“Decode 阶段沿 Context/KV 维度并行”的核心思想;Helix 是围绕这一思想进一步做 Attention/FFN 动态并行布局优化的一套完整方案。
12. 与 Ring Attention 的关系:从算法思想上触类旁通
Ring Attention 更早系统展示了一个关键思想:
不要求单卡拥有完整 Sequence/KV,而是让不同设备持有不同上下文分块,通过分块 Attention 与通信得到完整结果。
Ring Attention 主要面向长序列训练/推理中的通用 Context Parallelism,而 DCP 更聚焦 Serving 的 autoregressive decode KV Cache。
理解 Ring Attention、FlashAttention/Flash-Decoding 的 online softmax 后,再看 DCP,会发现它并不是一个孤立的新技巧,而是:
Blockwise Attention
+
Online Softmax / LSE Merge
+
Distributed KV Sharding
+
Serving-specific KV Cache Management
=
Decode Context Parallelism
13. 什么时候优先考虑 DCP
非常值得评估:
- 64K、128K、1M 等长上下文;
- Agent 长历史 / Code Agent / 大型 RAG;
- MLA 模型(DeepSeek、部分 Kimi);
- TP 很大而 KV Head 很少;
- KV Cache 已明显限制 concurrency;
- 单节点存在高带宽互联;
- P/D Disaggregation 中 Decode 节点需要容纳海量 KV。
未必值得:
- 几千 token 的普通对话;
- KV Cache 占用很小;
- 网络/互联很弱;
- Decode 延迟极敏感而 DCP collective 无法隐藏;
- 当前模型/backend 对 DCP 支持不成熟。
14. 建议学习顺序
建议按下面的依赖顺序学习,而不是直接背 DCP 参数:
- KV Cache:为什么历史 token 不需要重新计算 K/V;
- MHA → GQA → MLA:为什么 KV Head 越来越少;
- Tensor Parallel:为什么 TP 通常按 Head/权重切;
- FlashAttention / Online Softmax / LSE:为什么分块 Attention 能精确合并;
- Context Parallelism / Ring Attention:如何沿 Sequence 切 Attention;
- DCP:把上述思想用于 autoregressive Decode 的 KV Cache;
- Helix / Sparse Attention / P-D Disaggregation:进一步理解现代超长上下文 serving 架构。
15. 推荐教材与一手资料
第一优先级:直接学习 DCP
- vLLM:Efficient Decode Context Parallelism with vLLM for Long Context Workloads
- 当前最适合入门 DCP 的材料。
- 解释 GQA/MLA 为什么产生 KV duplication、DCP 的通信过程以及真实性能数据。
- vLLM Ascend:Context Parallel Design Document
- 对昇腾学习尤其重要。
- 可以看到 KV layout、MLA/GQA 路径以及 DCP 在 Ascend backend 中的实际实现。
- vLLM Parallel Config / DCP 参数文档
- 重点关注
decode_context_parallel_size、dcp_comm_backend、dcp_q_replicate、cp_kv_cache_interleave_size。
- 重点关注
第二优先级:理解 DCP 背后的 Attention 数学
- Ring Attention with Blockwise Transformers for Near-Infinite Context
- 理解 Sequence/Context Parallel 的经典材料。
- 重点不是背实现,而是理解“不同设备持有不同序列块,Attention 如何在分布式环境中完成”。
- FlashAttention / Flash-Decoding 相关资料
- 学习 online softmax、局部 max / sum / LSE 如何合并。
- 这是理解 DCP 为什么能在不 AllGather 全部 KV 的情况下仍得到精确 Attention 的数学基础。
第三优先级:看工业界更进一步的实现
- TensorRT-LLM:Helix Parallelism
- 把 KV Parallelism 和 FFN 的 TP/EP 重编组结合起来。
- NVIDIA:Helix Parallelism in TensorRT-LLM — Scaling Multi-Million-Token Decoding with KV Cache Sharding
- 强烈推荐精读其中 Exact Attention via Log-Sum-Exp Rescaling 与 Communication Volume Analysis 两节。
- 它把 DCP 背后的数学、通信量以及 FFN 重编组解释得非常清楚。
- vLLM Ascend:GLM-5.2 1M Context Deployment
- 用真实 Atlas 800 A3 配置观察
TP=16 + DCP=16 + 1M context,非常适合作为工程案例。
- 用真实 Atlas 800 A3 配置观察
16. 最终心智模型
长上下文 Decode
│
├── 每生成 1 token
│ ↓
│ Query 很小
│ ↓
│ 但必须读取巨大历史 KV
│
├── 普通 TP
│ ↓
│ GQA / MLA 的 KV Head 太少
│ ↓
│ KV 开始在 GPU 间复制
│
└── DCP
↓
沿 Sequence 分 KV
↓
每卡只扫自己的 KV shard
↓
local Output + LSE
↓
collective + online softmax
↓
精确恢复完整 Attention
↓
更少 KV 显存 + 更高 KV 带宽
↓
更长 Context / 更高并发
整理时间:2026-09-14。 重点依据 vLLM、vLLM Ascend、TensorRT-LLM 官方资料与 Ring Attention 原论文;性能数字均保留具体硬件和工作负载上下文,避免把单次 benchmark 泛化成固定性能结论。