跳转至

上下文并行

上下文并行功能包括 Decode Context Parallel(DCP)和 DSA-CP。

Decode Context Parallel 在 Tensor Parallel(TP)组内的设备之间沿序列维度分片 KV 缓存。它无需向进程世界添加设备即可消除冗余的 KV 缓存存储。

vLLM Ascend 不支持 Prefill Context Parallel。本文档仅描述 DCP 以及独立的 DSA-CP 稀疏注意力路径。

KV 缓存布局

DCP 以交错布局在 rank 之间存储 token。交错粒度由 cp_kv_cache_interleave_size 控制,其默认值为 1。

对于 DCP 大小 dcp_size,一个虚拟块包含 block_size * dcp_size 个 token。对于 token x:

  • virtual_block_index = x // (block_size * dcp_size)
  • offset_in_virtual_block = x % (block_size * dcp_size)
  • local_block_index = offset_in_virtual_block // cp_kv_cache_interleave_size
  • target_rank = local_block_index % dcp_size

槽位映射计算使用该布局,使每个 DCP rank 仅存储其本地序列分片。当前实现要求 block_size % cp_kv_cache_interleave_size == 0。

DCP 块表

注意力执行

后端结构

DCP 作为相应 v1 注意力后端的特化实现,而不是其并行副本:

  • DCPMetadataBuilderMixin 负责 DCP 组/rank 发现以及对每个 rank 的上下文长度矩阵的访问。
  • DCPImplMixin 负责 DCP 集合通信以及通用的部分输出/LSE 合并。
  • GQA、MLA 和 SFA DCP 构建器继承其 v1 元数据构建器。它们仅添加 DCP 元数据字段或临时暴露 DCP 特定的缓存视图。
  • GQA、MLA 和 SFA DCP 实现继承其 v1 实现,并仅重写通信或缓存布局不同的内核阶段。

常规 v1 构建器仍然是请求分类、填充、掩码、图元数据和通用 KV 缓存元数据的权威来源。DCP 特定元数据被排除在常规 v1 元数据模式之外。

预填充与分块预填充

在分块或缓存预填充期间,本地查询必须关注分布在 DCP 组中的 KV 缓存分片。

  • MLA 收集上下文 KV 缓存,恢复请求连续顺序,并为当前查询块计算注意力。
  • GQA 在 DCP 组中收集查询头,针对每个本地 KV 分片计算注意力,并合并部分输出和 LSE 值。

DCP 预填充

解码

解码收集每个 DCP rank 所需的查询头,针对本地 KV 缓存分片计算注意力,并在 DCP 组中合并部分输出和 LSE 值。

DCP 解码

GLM-5.2 SFA DCP 复制索引器

GLM-5.2 使用 Sparse Flash Attention(SFA)和 LightningIndexer。对于 DCP,索引器需要完整序列视图,以选择与非 DCP SFA 相同的稀疏 top-k 块,而大得多的 SFA KV 缓存应保持分片,以保留 DCP 的内存优势:

  • LightningIndexer 缓存在每个 DCP rank 上复制,因此索引选择使用完整序列。
  • SFA KV 缓存保持 DCP 本地。来自复制索引器视图的全局索引在 SFA 运行前重新映射到本地 KV 索引。
  • 在预填充或混合批次期间,仅稀疏块表引用的 KV 块会被压缩,并在当前层写入其 KV 缓存后执行 all-gather。
  • 仅解码批次保留 DCP SFA Q-gather 和结果合并路径。

当 prefill_context_parallel_size=1 且 decode_context_parallel_size>1 时,SFA 稀疏模型会自动选择此模式。它要求 decode_context_parallel_size == tensor_parallel_size。

对于 GLM-5.2 DSA-CP 部署,启用序列并行和 DSA-CP,并保持 CP 交错大小等于 KV 缓存块大小。 启用 DSA-CP 会自动启用 FlashComm 作为 all2all 后端:

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> \
  --additional-config '{"enable_dsa_cp": true}'

复制索引器会使索引器缓存内存按 DCP 世界大小成比例增加;SFA KV 缓存本身仍保持分片。

SFA DSA-CP o_proj 路径

SFA DSA-CP 执行有意复用常规 TP 分片的 o_proj。 这既适用于混合角色实例,也适用于 PD 分离的 P 节点;它不是一个独立的面向用户的 o_proj TP 开关。 运行时路径支持两种布局:

  • 仅解码批次保留解码 TP 路径。 SFA 输出在 TP 组中通过 all-to-all 交换,然后原始 TP 分片的 o_proj 正常运行。
  • 预填充或混合批次,包括 PD 分离 P 节点上的批次,产生的 SFA 输出与 TP 分片的 o_proj 输入布局不直接兼容。 在 o_proj 前向之前,每个 rank 将 TP 分片的 o_proj 权重和所有输入分片的量化参数 all-gather 到临时全权重缓冲区。 全权重 o_proj 前向针对该批次运行一次,然后模块恢复为 TP 参数别名。

存储不变量是原始 TP 分片的 o_proj 参数仍然是唯一的持久权威来源。 o_proj_tp_* 张量是原始参数存储的别名。 o_proj_full_* 张量仅用于预填充/混合全收集执行的可重用通信缓冲区。 它们不得成为 TP 权重的第二个持久副本。

这种耦合保留了现有解码 TP 行为,支持混合角色和仅 P 实例上的预填充/混合 DSA-CP 批次,并避免在每个 TP rank 上持久化全权重副本。

  • 槽位映射:vllm_ascend/worker/block_table.py
  • 输入和注意力元数据:vllm_ascend/worker/model_runner_v1.py
  • 共享 DCP 后端能力:vllm_ascend/attention/context_parallel/common_cp.py
  • GQA DCP 后端:vllm_ascend/attention/context_parallel/attention_cp.py
  • MLA DCP 后端:vllm_ascend/attention/context_parallel/mla_cp.py
  • SFA DCP 后端:vllm_ascend/attention/context_parallel/sfa_cp.py
  • DSA-CP 后端:vllm_ascend/attention/context_parallel/dsa_cp.py

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