上下文并行#

概述#

本指南介绍如何使用上下文并行(Context Parallel),这是一种长序列推理优化技术。上下文并行包括 PCP(预填充上下文并行)和 DCP(解码上下文并行),能够降低长序列 LLM 推理中的 NPU 显存占用并提高推理速度。

上下文并行的优势#

上下文并行主要解决长上下文请求的服务问题。由于预填充(Prefill)和解码(Decode)呈现出截然不同的特性,且具有不同的 SLO(服务水平目标),我们需要分别为它们实现上下文并行。主要考量点包括:

  • 对于长上下文预填充,我们可以使用上下文并行通过在查询 Token 之间分摊预填充的计算时间,从而降低 TTFT(首字延迟)。

  • 对于长上下文解码,我们可以使用上下文并行来减少 KV Cache 的重复,并为 KV Cache 提供更多空间以增加 Batch Size(从而提高吞吐量)。

欲了解更多关于上下文并行的理论和实现细节,请参考 上下文并行开发者指南

支持场景#

目前上下文并行可以与大多数其他功能协同使用,支持的功能如下:

Eager 模式

图模式 (Graph)

前缀缓存
(Prefix Cache)

分块预填充
(Chunked Prefill)

投机解码
(MTP)

PD 分离
(PD disaggregation)

MLAPO

PCP

DCP

如何使用上下文并行#

您可以通过 prefill_context_parallel_sizedecode_context_parallel_size 启用 PCPDCP,参考如下示例:

  • 离线示例:

    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)
    
  • 在线示例:

    vllm serve deepseek-ai/DeepSeek-V2-Lite \
        --tensor-parallel-size 2 \
        --decode-context-parallel-size 2 \
        --prefill-context-parallel-size 2 \
    

总的 world_size 是 tensor_parallel_size * prefill_context_parallel_size,因此上述示例每个都需要 4 个 NPU。

限制条件#

  • 使用 DCP 时,必须满足以下限制条件:

    • 对于基于 MLA 的模型,如 DeepSeek-R1:

      • tensor_parallel_size >= decode_context_parallel_size

      • tensor_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

  • 在需要进行 KV Cache 传输的场景(如 KV Pooling、PD 分离)中使用上下文并行时,为了简化 KV Cache 传输,必须将 cp_kv_cache_interleave_size 设置为与 KV Cache block_size(默认值:128)相同的值,这将指定上下文并行以块交织(block-interleave)风格切分 KV Cache。例如:

    vllm serve deepseek-ai/DeepSeek-V2-Lite \
        --tensor-parallel-size 2 \
        --decode-context-parallel-size 2 \
        --prefill-context-parallel-size 2 \
        --cp-kv-cache-interleave-size 128 \
        --kv-transfer-config {...} \
    

实验结果#

为了评估上下文并行在长序列 LLM 推理场景中的有效性,我们使用了 DeepSeek-R1-W8A8Qwen3-235B 模型,并在 64 卡 Ascend 910C*64G (A3) 环境下部署 PD 分离实例,配置和性能数据如下。

  • DeepSeek-R1-W8A8:

    配置

    输入长度
    32k

    输入长度
    64k

    输入长度
    128k

    P 节点: (DP2 TP8 EP16) *2
    D 节点: (DP32 EP32) *1

    TTFT: 9.3s
    TPOT: 72ms

    TTFT: 22.8s
    TPOT: 74ms

    TTFT: 73.2s
    TPOT: 82ms

    P 节点: (PCP2 TP8 DCP8 EP16) *2
    D 节点: (DP32 EP32) *1

    TTFT: 7.9s
    TPOT: 74ms

    TTFT: 15.9s
    TPOT: 78ms

    TTFT: 46.0s
    TPOT: 83ms

  • Qwen3-235B:

    配置

    输入长度
    32k

    输入长度
    64k

    输入长度
    120k

    P 节点: (DP2 TP8 EP16) *2
    D 节点: (DP32 EP32) *1

    TTFT: 5.1s
    TPOT: 65ms

    TTFT: 13.1s
    TPOT: 85ms

    TTFT: 33.9s
    TPOT: 120ms

    P 节点: (PCP2 TP8 DCP2 EP16) *2
    D 节点: (DP32 EP32) *1

    TTFT: 3.0s
    TPOT: 66ms

    TTFT: 8.9s
    TPOT: 86ms

    TTFT: 22.7s
    TPOT: 121ms