跳转至

上下文并行指南

概述

上下文并行(CP)通过沿序列维度拆分计算或 KV 缓存存储来处理长上下文请求:

  • 预填充上下文并行(PCP)将长预填充请求的预填充 token 拆分到额外的 rank 上。每个 rank 计算序列的不同部分,从而降低首 token 时间(TTFT)。
  • 解码上下文并行(DCP)在 DCP 组内的 rank 之间对 KV 缓存进行分片,这些 rank 可能复用 PCP 组、张量并行(TP)组或两者的 rank,具体取决于并行配置。它可以减少重复的 KV 缓存存储,并可能提高解码吞吐量。

如需了解这两种策略的一般介绍,请参阅上游 vLLM 上下文并行部署 指南。

DSA-CP 是一种独立的稀疏注意力优化,由 additional_config.enable_dsa_cp 控制。启用它会自动启用 FlashComm 作为 all2all 后端;无需单独设置 enable_flashcomm1。一旦 PCP 支持稳定,它将被移除。有关其配置和模型要求,请参阅 附加配置。

支持的场景

预填充上下文并行

PCP 支持是实验性的,并且仅在 ModelRunner V2 中可用。下表显示了基础后端支持情况,以及每个功能是否可以与 PCP 组合使用:

注意力后端 基础 PCP 前缀缓存 + PCP 分块预填充 + PCP MLAPO + PCP 推测解码 + PCP P/D 分离 + PCP KV 缓存池 + PCP 序列并行(SP)+ PCP
MLA ✅ 完全兼容 ✅ 完全兼容 ✅ 完全兼容 ✅ 完全兼容 🟠 部分兼容(MTP、eager 和 FULL_DECODE_ONLY) ✅ 完全兼容(MooncakeConnectorV1) 🟠 部分兼容(AscendStoreConnector,非逐层) ❌ 不兼容
GQA ✅ 完全兼容 ✅ 完全兼容 ✅ 完全兼容 — 不适用 🟠 部分兼容(Eagle3、eager 和 FULL_DECODE_ONLY) ✅ 完全兼容(MooncakeConnectorV1) 🟠 部分兼容(AscendStoreConnector,非逐层) ❌ 不兼容
SFA ✅ 完全兼容 ✅ 完全兼容 ✅ 完全兼容 ❌ 不兼容 ❌ 不兼容 ✅ 完全兼容(MooncakeConnectorV1) 🟠 部分兼容(AscendStoreConnector,非逐层) ❌ 不兼容
DSA ✅ 完全兼容 ✅ 完全兼容 ✅ 完全兼容 — 不适用 🟠 部分兼容(MTP 和 DSpark、eager 和 FULL_DECODE_ONLY) ✅ 完全兼容(MooncakeHybridConnector) 🟠 部分兼容(AscendStoreConnector,非逐层) ❌ 不兼容
  • ✅ 完全兼容:支持基础路径或功能组合。
  • 🟠 部分兼容:在所述限制下支持基础路径或功能组合。
  • ❌ 不兼容:当前 MRV2 PCP 实现不支持该后端或功能组合。
  • 不适用:该功能不适用于该注意力后端。

解码上下文并行

DCP 支持 vLLM Ascend 文档中记录的模型和硬件组合上的 eager 和 graph 执行、前缀缓存、分块预填充、推测解码、P/D 分离以及 MLAPO。下表显示了在不同设备和注意力后端上,每个功能是否可以与 DCP 组合使用:

设备 注意力后端 分块预填充 + DCP 前缀缓存 + DCP 图模式 + DCP P/D 分离 + DCP MLAPO + DCP 推测解码 + DCP
Ascend A2/A3 MLA/GQA ✅ 完全兼容 ✅ 完全兼容 ✅ 完全兼容 ✅ 完全兼容 ✅ 完全兼容(MLA)
— 不适用(GQA)
✅ P/D 分离
❌ PD 混合部署
Ascend A2/A3 SFA ✅ 完全兼容 ✅ 完全兼容 ✅ 完全兼容 ✅ 完全兼容 ✅ 完全兼容 ✅ 完全兼容
950PR&950DT Products MLA/GQA 🟠 部分兼容 🟠 部分兼容 🟠 部分兼容 🟠 部分兼容 🟠 部分兼容(MLA)
— 不适用(GQA)
🟠 P/D 分离
❌ PD 混合部署
950PR&950DT Products SFA ❌ 不兼容 ❌ 不兼容 ❌ 不兼容 ❌ 不兼容 ❌ 不兼容 ❌ 不兼容
  • ✅ 完全兼容:支持将该功能与 DCP 组合使用。
  • 🟠 部分兼容:实验性支持将该功能与 DCP 组合使用;接口和功能可能会变化。
  • ❌ 不兼容:不支持将该功能与 DCP 组合使用。
  • 不适用:该功能不适用于此注意力后端。

DSA-CP 支持 vLLM Ascend 文档中记录的模型和硬件组合上的前缀缓存、分块预填充、推测解码、P/D 分离。

使用方法

预填充上下文并行

启用 ModelRunner V2,并将 prefill_context_parallel_size 设置为 PCP rank 数量:

export VLLM_USE_V2_MODEL_RUNNER=1

vllm serve <supported-model> \
    --tensor-parallel-size <tp-size> \
    --prefill-context-parallel-size <pcp-size> \
    --enforce-eager

与 DCP 不同,PCP 会增加额外的 rank:world_size_with_pcp = prefill_context_parallel_size * original_world_size。

推测解码

MRV2 PCP 支持 MLA 和 DSA 模型的 MTP、GQA 模型的 Eagle3,以及 DeepSeek-V4 DSA 模型的 DSpark。目标模型按配置的 PCP 拓扑运行,而草稿模型在每个 PCP rank 上复制,并以逻辑 PCP 大小 1 运行。仅为目标模型配置 PCP。

有关推测解码的一般配置和模型要求,请参阅 推测解码。

MLA 的 MTP
export VLLM_USE_V2_MODEL_RUNNER=1

vllm serve <mtp-capable-mla-model> \
    --tensor-parallel-size 2 \
    --prefill-context-parallel-size 2 \
    --enable-chunked-prefill \
    --enforce-eager \
    --speculative-config '{"method": "mtp", "num_speculative_tokens": 3}'
Eagle3 与 GQA
export VLLM_USE_V2_MODEL_RUNNER=1

vllm serve <gqa-target-model> \
    --tensor-parallel-size 2 \
    --prefill-context-parallel-size 2 \
    --enable-chunked-prefill \
    --enforce-eager \
    --speculative-config '{"method": "eagle3", "model": "<eagle3-draft-model>", "num_speculative_tokens": 3}'

对于任意一种方法,移除 --enforce-eager 并添加以下选项,以使用受支持的图模式:

--compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY"}'

约束

  • PCP 仅支持 ModelRunner V2。
  • 在 P/D 分离中,仅在 prefill(kv_producer)引擎上启用 PCP;decode(kv_consumer)引擎必须使用 prefill_context_parallel_size=1。
  • 使用 PCP 的 KV 缓存池化仅支持 use_layerwise=false 的 AscendStoreConnector。
  • PCP 推测解码支持 MLA 和 DSA 模型的 MTP、GQA 模型的 Eagle3,以及 DeepSeek-V4 DSA 模型的 DSpark。
  • 草稿采样必须使用贪心方法。
  • PCP 的完整图执行仅限于 FULL_DECODE_ONLY。
  • MRV2 PCP 不支持流水线并行、编码器-解码器模型、多模态输入和 LoRA。
  • PCP 推测解码不支持 SFA 草稿注意力。
  • PCP 和 DCP 不能同时启用。
  • PCP 推测解码不支持自适应验证。
  • 动态草稿长度不在当前已验证范围内。
  • 在 DSA 后端中,PCP 和 DSA-CP 不能同时启用。

解码上下文并行

vllm serve <glm-5.2-model> \
  --tensor-parallel-size <N> \
  --prefill-context-parallel-size 1 \
  --decode-context-parallel-size <N> \
  --block-size <B> \
  --cp-kv-cache-interleave-size <B>

DCP 复用 TP 设备,并且不会增加 world size。

约束

  • 对于 DeepSeek-R1 等 MLA 模型:
    • tensor_parallel_size >= decode_context_parallel_size
    • tensor_parallel_size % decode_context_parallel_size == 0
  • 对于 Qwen3-235B 等 GQA 模型:
    • (tensor_parallel_size // num_key_value_heads) >= decode_context_parallel_size
    • (tensor_parallel_size // num_key_value_heads) % decode_context_parallel_size == 0
  • 在 KV 缓存传输场景(例如 KV 池化或 P/D 分离)中,将 cp_kv_cache_interleave_size 设置为 KV 缓存的 block_size(默认值:128):

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

DSA-CP

PCP 就绪后,DSA-CP 将被完全弃用。PCP 目前仍处于实验阶段,部分功能组合的支持仍在进行中。

若要使用相同的 world size 尝试 PCP,请将 TP 大小 N > 1 替换为 --tensor-parallel-size 1 --prefill-context-parallel-size N,并从 additional_config 中移除 enable_dsa_cp。当 TP 大小为 1 时,PCP 需要额外的 ranks。迁移前请检查上述兼容性和限制。

vllm serve <glm-5.2-model> \
  --tensor-parallel-size <N> \
  --block-size <B> \
  --additional-config '{"enable_dsa_cp": true}'

有关实现细节,请参阅上下文并行设计文档。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 vl/vllm-ascend