上下文并行¶
上下文并行功能包括 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_sizetarget_rank = local_block_index % dcp_size
槽位映射计算使用该布局,使每个 DCP rank 仅存储其本地序列分片。当前实现要求 block_size % cp_kv_cache_interleave_size == 0。

注意力执行¶
后端结构¶
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 rank 所需的查询头,针对本地 KV 缓存分片计算注意力,并在 DCP 组中合并部分输出和 LSE 值。

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