上下文并行指南¶
概述¶
本指南介绍如何使用上下文并行(Context Parallel),这是一种长序列推理优化技术。上下文并行包括 PCP(预填充上下文并行)和 DCP(解码上下文并行),可降低NPU内存使用并提升长序列LLM推理的推理速度。
上下文并行的优势¶
上下文并行主要解决长上下文请求的服务问题。由于预填充和解码具有截然不同的特性以及不同的服务等级目标(SLO),我们需要分别为它们实现上下文并行。主要考虑因素如下:
- 对于长上下文预填充,我们可以使用上下文并行,通过在查询令牌之间分摊预填充的计算时间,来降低TTFT(首令牌生成时间)。
- 对于长上下文解码,我们可以使用上下文并行来减少KV缓存重复,为KV缓存提供更多空间以增加批处理大小(从而提高吞吐量)。
要了解更多关于上下文并行的理论和实现细节,请参考上下文并行开发者指南。
支持场景¶
目前上下文并行可与大多数其他功能配合使用,支持的功能如下:
| Eager | Graph | Prefix Cache |
Chunked Prefill |
SpecDecode (MTP) |
PD disaggregation |
MLAPO | |
|---|---|---|---|---|---|---|---|
| PCP | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| DCP | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
如何使用上下文并行¶
您可以通过 PCP 和 DCP 启用 prefill_context_parallel_size 和 decode_context_parallel_size,参考以下示例:
-
离线示例:
from vllm import LLM, SamplingParams prompts = [ "The future of AI is", ] sampling_params = SamplingParams(temperature=0.8, top_p=0.95) llm = LLM( model="deepseek-ai/DeepSeek-V2-Lite", tensor_parallel_size=2, decode_context_parallel_size=2, prefill_context_parallel_size=2, ) outputs = llm.generate(prompts, sampling_params) -
在线示例:
总世界大小为 tensor_parallel_size * prefill_context_parallel_size,因此上述每个示例需要4个NPU。
约束条件¶
-
使用DCP时,必须满足以下约束条件:
- 对于基于MLA的模型,例如DeepSeek-R1:
tensor_parallel_size >= decode_context_parallel_sizetensor_parallel_size % decode_context_parallel_size == 0
- 对于基于GQA的模型,例如Qwen3-235B:
(tensor_parallel_size // num_key_value_heads) >= decode_context_parallel_size(tensor_parallel_size // num_key_value_heads) % decode_context_parallel_size == 0
- 对于基于MLA的模型,例如DeepSeek-R1:
-
在需要KV缓存传输的场景(例如KV池化、PD分离)中使用上下文并行时,为简化KV缓存传输,
cp_kv_cache_interleave_size必须设置为与KV缓存block_size(默认值:128)相同的值,该参数指定CP以块交错方式分割KV缓存。例如:
实验结果¶
为评估上下文并行在长序列LLM推理场景中的效果,我们使用 DeepSeek-R1-W8A8 和 Qwen3-235B,在64卡昇腾Atlas A3推理产品*64G(A3)环境中部署PD分离实例,配置和性能数据如下。
-
DeepSeek-R1-W8A8:
配置 输入长度
32k输入长度
64k输入长度
128kP节点: (DP2 TP8 EP16) *2
D节点: (DP32 EP32)*1TTFT: 9.3秒
TPOT: 72毫秒TTFT: 22.8秒
TPOT: 74毫秒TTFT: 73.2秒
TPOT: 82毫秒P节点: (PCP2 TP8 DCP8 EP16) *2
D节点: (DP32 EP32)*1TTFT: 7.9秒
TPOT: 74毫秒TTFT: 15.9秒
TPOT: 78毫秒TTFT: 46.0秒
TPOT: 83毫秒 -
Qwen3-235B:
配置 输入长度
32k输入长度
64k输入长度
120kP节点: (DP2 TP8 EP16) *2
D节点: (DP32 EP32)*1TTFT: 5.1秒
TPOT: 65毫秒TTFT: 13.1秒
TPOT: 85毫秒TTFT: 33.9秒
TPOT: 120毫秒P节点: (PCP2 TP8 DCP2 EP16) *2
D节点: (DP32 EP32)*1TTFT: 3.0秒
TPOT: 66毫秒TTFT: 8.9秒
TPOT: 86毫秒TTFT: 22.7秒
TPOT: 121毫秒