Open
【RFC】test #1
yide12Add on Mar 12
yide12
Jun 1 Comments:
Jun 1 Comments:
Context Parallel 能力地图
本文简要整理 hyper_parallel/core/context_parallel 当前 CP(Context Parallel)相关支持能力。
1. 入口能力
| 能力类别 | 入口类 | 说明 |
|---|---|---|
| 通用同步 CP | ContextParallel |
面向普通 attention core,支持 Ulysses / Colossal / Hybrid |
| 通用异步 CP | AsyncContextParallel |
在 projection 后提前发起通信,与计算重叠 |
| DSA 同步 CP | DSAIndexerContextParallel、DSASparseAttentionContextParallel、DSAIndexerLossContextParallel |
面向 DeepSeek Sparse Attention 相关算子边界 |
| DSA 异步 CP | AsyncDSAIndexerContextParallel、AsyncDSASparseAttentionContextParallel、AsyncDSAIndexerLossContextParallel |
DSA key/value 等生产者侧提前发起 all-gather |
2. 支持模式
| 模式 | 配置 | Q 布局 | K/V 布局 | 主要通信 | 约束 |
|---|---|---|---|---|---|
| Pure Ulysses | ulysses_degree=None |
Shard(head_dim) |
Shard(head_dim) |
Q/K/V seq -> head all-to-all,输出 head -> seq | num_heads % cp_size == 0 |
| Pure Colossal AI | ulysses_degree=1 |
Shard(seq_dim) |
Replicate() |
K/V sequence all-gather | 无 head 数整除 CP 约束 |
| Hybrid CP | 1 < ulysses_degree < cp_size |
(Shard(seq_dim), Shard(head_dim)) |
(Replicate(), Shard(head_dim)) |
Ulysses 子网格 all-to-all + Colossal 子网格 K/V gather | cp_size % ulysses_degree == 0,num_heads % ulysses_degree == 0 |
| Load-balance Colossal | ulysses_degree=1, load_balance=True |
Shard(seq_dim) |
Replicate() |
Head/Tail Q 交换 + 两次子 attention | 仅 Colossal 模式 |
3. 通用功能
| 功能维度 | 支持情况 |
|---|---|
| Attention 边界挂接 | apply(module, device_mesh) 通过 forward pre/post hook 改写 Q/K/V 布局 |
| Q/K/V 参数定位 | 支持 qkv_indices 位置参数;支持 qkv_kwarg_names 关键字参数 |
| 序列维配置 | seq_dim 可配置,常见 BSHD=1、BNSD=2、TND=0 |
| Head 维配置 | head_dim 可配置,常见 BSHD=2、BNSD/TND=1 |
| 本地 tensor 输入 | 支持 |
| CP DTensor 输入 | 支持 |
| 非 CP DTensor 输入 | 支持,会临时构造 CP + non-CP composed mesh |
| 输出 local tensor | use_local_output=True |
| 输出 DTensor | use_local_output=False,可保留 CP DTensor 或恢复非 CP DTensor 布局 |
| CP + TP/SP 组合布局 | 支持;多 mesh 轴切同一 tensor 维时可使用 StridedShard 表达 |
4. 异步功能
| 异步类别 | 支持情况 | 说明 |
|---|---|---|
| Async Ulysses | 支持 | Q/K/V projection 后提前发起 seq -> head all-to-all |
| Async Colossal | 支持 | K/V projection 后提前发起 sequence all-gather |
| Async Hybrid | 部分支持 | Ulysses all-to-all 异步;Colossal K/V gather 仍同步 |
| 缺少 projection handoff | 支持回退 | 未传完整 q_proj/k_proj/v_proj 时回退同步 ContextParallel |
| 反向 overlap | 支持 | backward 通信 wait 延后到 projection backward pre-hook |
| 使用前提 | 有限制 | projection 输出需直接进入 attention;若 QK-Norm 紧邻 attention,应将 Norm 作为 handoff 点 |
5. DSA 能力
| DSA 类 | 目标边界 | Query 侧 | Key/Value 侧 | 输出处理 |
|---|---|---|---|---|
DSAIndexerContextParallel |
indexer (query, key, weights, ...) |
query/weights -> Shard(seq) |
key -> Replicate() |
支持 local / DTensor 输出 |
DSASparseAttentionContextParallel |
sparse attention (query, key, value, topk, query_rope, key_rope, ...) |
query/topk/query_rope -> Shard(seq) |
key/value/key_rope -> Replicate() |
支持 local / DTensor 输出 |
DSAIndexerLossContextParallel |
indexer loss | query/query_index/weights/topk/query_rope -> Shard(seq) |
key/key_index/key_rope -> Replicate() |
Partial 输出按需 reduce;d_key_index 切回本地 shard |
| DSA 维度 | 支持情况 |
|---|---|
| layout | BSND、TND |
| mode | 仅 colossal |
| Ulysses/head sharding | 暂不支持 |
| 异步 handoff | 支持 key/value/key_rope/key_indexer 等生产者侧 all-gather 提前发起 |
| 未配置 handoff | 自动回退同步 gather |
6. 组合能力
| 组合方式 | 支持情况 | 示例 |
|---|---|---|
| TP + CP | 支持 | (tp, cp) mesh;TP/SP 用 mesh["tp"],CP 用 mesh["cp"] |
| DP/FSDP + TP + CP + SP | 支持 | (dp, fsdp, cp, tp) mesh |
| PP + FSDP + TP + CP + SP | 支持 | (pp, fsdp, cp, tp) mesh |
| CP + 非 CP DTensor | 支持 | 输出侧可 drop CP 轴并恢复原 non-CP 布局 |
7. 典型用法
| 场景 | 示例 |
|---|---|
| BSHD Colossal CP | ContextParallel(seq_dim=1, head_dim=2, ulysses_degree=1).apply(attn, mesh["cp"]) |
| BNSD Ulysses CP | ContextParallel(seq_dim=2, head_dim=1).apply(attn, mesh["cp"]) |
| Async CP | AsyncContextParallel(seq_dim=1, head_dim=2).apply(attn, mesh["cp"], q_proj, k_proj, v_proj) |
| DSA Sparse Attention CP | DSASparseAttentionContextParallel(layout="BSND").apply(module, mesh["cp"]) |
8. 验证覆盖
| 测试目录 | 覆盖内容 |
|---|---|
tests/torch/context_parallel |
Torch/NPU 下 Ulysses、Colossal、Hybrid、load-balance、Async、TP+CP |
tests/mindspore/st/context_parallel |
MindSpore 下同步/异步 CP 前向、反向、重复调用、Hybrid |
tests/ut/core/context_parallel |
异步 hook、kwargs 改写、DSA boundary、DSA async handoff、输出布局 |


yide12
Jun 1 Comments:
Jun 1 Comments:
Context Parallel 能力地图
本文简要整理 hyper_parallel/core/context_parallel 当前 CP(Context Parallel)相关支持能力。
1. 入口能力
| 能力类别 | 入口类 | 说明 |
|---|---|---|
| 通用同步 CP | ContextParallel |
面向普通 attention core,支持 Ulysses / Colossal / Hybrid |
| 通用异步 CP | AsyncContextParallel |
在 projection 后提前发起通信,与计算重叠 |
| DSA 同步 CP | DSAIndexerContextParallel、DSASparseAttentionContextParallel、DSAIndexerLossContextParallel |
面向 DeepSeek Sparse Attention 相关算子边界 |
| DSA 异步 CP | AsyncDSAIndexerContextParallel、AsyncDSASparseAttentionContextParallel、AsyncDSAIndexerLossContextParallel |
DSA key/value 等生产者侧提前发起 all-gather |
2. 支持模式
| 模式 | 配置 | Q 布局 | K/V 布局 | 主要通信 | 约束 |
|---|---|---|---|---|---|
| Pure Ulysses | ulysses_degree=None |
Shard(head_dim) |
Shard(head_dim) |
Q/K/V seq -> head all-to-all,输出 head -> seq | num_heads % cp_size == 0 |
| Pure Colossal AI | ulysses_degree=1 |
Shard(seq_dim) |
Replicate() |
K/V sequence all-gather | 无 head 数整除 CP 约束 |
| Hybrid CP | 1 < ulysses_degree < cp_size |
(Shard(seq_dim), Shard(head_dim)) |
(Replicate(), Shard(head_dim)) |
Ulysses 子网格 all-to-all + Colossal 子网格 K/V gather | cp_size % ulysses_degree == 0,num_heads % ulysses_degree == 0 |
| Load-balance Colossal | ulysses_degree=1, load_balance=True |
Shard(seq_dim) |
Replicate() |
Head/Tail Q 交换 + 两次子 attention | 仅 Colossal 模式 |
3. 通用功能
| 功能维度 | 支持情况 |
|---|---|
| Attention 边界挂接 | apply(module, device_mesh) 通过 forward pre/post hook 改写 Q/K/V 布局 |
| Q/K/V 参数定位 | 支持 qkv_indices 位置参数;支持 qkv_kwarg_names 关键字参数 |
| 序列维配置 | seq_dim 可配置,常见 BSHD=1、BNSD=2、TND=0 |
| Head 维配置 | head_dim 可配置,常见 BSHD=2、BNSD/TND=1 |
| 本地 tensor 输入 | 支持 |
| CP DTensor 输入 | 支持 |
| 非 CP DTensor 输入 | 支持,会临时构造 CP + non-CP composed mesh |
| 输出 local tensor | use_local_output=True |
| 输出 DTensor | use_local_output=False,可保留 CP DTensor 或恢复非 CP DTensor 布局 |
| CP + TP/SP 组合布局 | 支持;多 mesh 轴切同一 tensor 维时可使用 StridedShard 表达 |
4. 异步功能
| 异步类别 | 支持情况 | 说明 |
|---|---|---|
| Async Ulysses | 支持 | Q/K/V projection 后提前发起 seq -> head all-to-all |
| Async Colossal | 支持 | K/V projection 后提前发起 sequence all-gather |
| Async Hybrid | 部分支持 | Ulysses all-to-all 异步;Colossal K/V gather 仍同步 |
| 缺少 projection handoff | 支持回退 | 未传完整 q_proj/k_proj/v_proj 时回退同步 ContextParallel |
| 反向 overlap | 支持 | backward 通信 wait 延后到 projection backward pre-hook |
| 使用前提 | 有限制 | projection 输出需直接进入 attention;若 QK-Norm 紧邻 attention,应将 Norm 作为 handoff 点 |
5. DSA 能力
| DSA 类 | 目标边界 | Query 侧 | Key/Value 侧 | 输出处理 |
|---|---|---|---|---|
DSAIndexerContextParallel |
indexer (query, key, weights, ...) |
query/weights -> Shard(seq) |
key -> Replicate() |
支持 local / DTensor 输出 |
DSASparseAttentionContextParallel |
sparse attention (query, key, value, topk, query_rope, key_rope, ...) |
query/topk/query_rope -> Shard(seq) |
key/value/key_rope -> Replicate() |
支持 local / DTensor 输出 |
DSAIndexerLossContextParallel |
indexer loss | query/query_index/weights/topk/query_rope -> Shard(seq) |
key/key_index/key_rope -> Replicate() |
Partial 输出按需 reduce;d_key_index 切回本地 shard |
| DSA 维度 | 支持情况 |
|---|---|
| layout | BSND、TND |
| mode | 仅 colossal |
| Ulysses/head sharding | 暂不支持 |
| 异步 handoff | 支持 key/value/key_rope/key_indexer 等生产者侧 all-gather 提前发起 |
| 未配置 handoff | 自动回退同步 gather |
6. 组合能力
| 组合方式 | 支持情况 | 示例 |
|---|---|---|
| TP + CP | 支持 | (tp, cp) mesh;TP/SP 用 mesh["tp"],CP 用 mesh["cp"] |
| DP/FSDP + TP + CP + SP | 支持 | (dp, fsdp, cp, tp) mesh |
| PP + FSDP + TP + CP + SP | 支持 | (pp, fsdp, cp, tp) mesh |
| CP + 非 CP DTensor | 支持 | 输出侧可 drop CP 轴并恢复原 non-CP 布局 |
7. 典型用法
| 场景 | 示例 |
|---|---|
| BSHD Colossal CP | ContextParallel(seq_dim=1, head_dim=2, ulysses_degree=1).apply(attn, mesh["cp"]) |
| BNSD Ulysses CP | ContextParallel(seq_dim=2, head_dim=1).apply(attn, mesh["cp"]) |
| Async CP | AsyncContextParallel(seq_dim=1, head_dim=2).apply(attn, mesh["cp"], q_proj, k_proj, v_proj) |
| DSA Sparse Attention CP | DSASparseAttentionContextParallel(layout="BSND").apply(module, mesh["cp"]) |
8. 验证覆盖
| 测试目录 | 覆盖内容 |
|---|---|
tests/torch/context_parallel |
Torch/NPU 下 Ulysses、Colossal、Hybrid、load-balance、Async、TP+CP |
tests/mindspore/st/context_parallel |
MindSpore 下同步/异步 CP 前向、反向、重复调用、Hybrid |
tests/ut/core/context_parallel |
异步 hook、kwargs 改写、DSA boundary、DSA async handoff、输出布局 |


Jun 1 Close issue
Jun 1 Reopen issue
【RFC】FullyShard 多维并行适配设计方案
第一章 背景介绍
1.1 现状
HyperParallel 当前在并行能力上已经具备以下基础:
1.2 当前问题
结合现有实现,存在两个关键缺口:
1.3 本次需求
需求1:
需求2:
第二章 方案
2.1 基本原理
2.1.1 统一拓扑语义
统一用高维 mesh 描述并行维度,推荐角色划分:
2.1.2 单一 DTensor 布局承载多策略
参数初始化后只维护一个“逻辑完整布局”的 placement 元组,包含 FSDP/TP/EP 信息。
示例(3D):
(Shard(fsdp_axis), Shard(tp_axis), Replicate())。(Replicate(), Shard(tp_axis), Replicate())。(Shard(fsdp_axis), Shard(tp_axis), Replicate())。核心点:仅切换 fully_shard 对应 placement,TP/EP placement 不变。
2.1.3 前后向边界
ReduceScatter(sharded_group_info),再AllReduce(unsharded_group_info)(按需)。2.2 方案设计
2.2.1 GroupInfo 双组模型
对每个参数构建:
这与现有 HSDP 路径一致,便于复用调度和测试资产。
2.2.2 反向通信决策矩阵
按参数状态选择通信策略:
参数启用 fully-shard,且
shard_size > 1:dp_size > 1且需要副本一致性,再 AR 于 unsharded_group_info。参数未启用 fully-shard,且需要数据副本同步:
参数既不切分也无副本:
2.2.3 纯 TP 识别评审方案
方案A(显式控制):
enable_param_shard。enable_param_shard=False时,不做参数切分,仅复用通信框架。方案B(mesh 自动判断):
enable_param_shard=None时,基于 mesh 角色自动判断。评审建议:
2.2.4 需求2的同步修复策略
在纯 TP 或“禁用参数切分”路径下,提供 unsharded_dp_group 同步:
weight.grad。weight本体同步(仅在明确需要时启用)。2.2.5 shard_size / dp_size 详细定义与来源
概念定义:
rank_size:当前参数所在 fully_shard 数据并行域的总并行规模。shard_size:参数切分组规模,决定 RS 维度与梯度切片份数。dp_size:副本组规模,决定 AR 维度与副本一致性范围。基本关系:
dp_size = rank_size // shard_size。shard_size = 1时,表示参数不进行 fully_shard 切分,通信只可能发生在副本组。参数来源:
rank_size来自参数所在 mesh 的 fully_shard 数据并行域(按角色映射后的局部域)。shard_size来自参数切分策略与 mesh 切分维度综合决定:dp_size按公式计算得到;在纯 TP 兼容路径中通常等于该同步域规模。工程语义:
shard_size控制“参数与梯度是否切片,以及切几片”。dp_size控制“每个切片在多少副本间需要一致”。典型示例:
rank_size=8, shard_size=4, dp_size=2,反向执行RS(4) + AR(2)。rank_size=8, shard_size=1, dp_size=8,反向仅执行AR(8)。第三章 设计实现,具体实现,简单描述
3.1 涉及模块
hyper_parallel/core/fully_shard/hsdp_param.pyhyper_parallel/platform/torch/fully_shard/param.pyhyper_parallel/platform/torch/fully_shard/state.pyhyper_parallel/core/fully_shard/api.pyhyper_parallel/platform/torch/fully_shard/utils.py3.2 核心实现点
参数初始化阶段接入 HSDP 同款流程:
_init_rank_info()_init_param_shard_size()_init_param()dp_sizesharded_group_infounsharded_group_infoTorchHSDPParamV2中新增 GroupInfo 属性与访问接口,通信统一经 GroupInfo 路由。前向 unshard 仅替换 fully_shard 维 placement 为 Replicate,保留 TP/EP placement。
反向
post_backward的梯度通信从“mesh类型分支”升级为“GroupInfo 分支”,减少硬编码。纯 TP 修复路径:
unsharded_dp_group上执行同步操作(优先 grad,同步对象可配置)。3.3 实现流程(简版伪代码)
第四章 设计接口,变化
4.1 fully_shard 接口新增项
仅新增一个参数:
enable_param_shard: Optional[bool] = None语义:
True:显式启用 fully_shard 参数切分。False:显式禁用 fully_shard 参数切分,仅复用统一通信框架。None:按 mesh 角色自动推断(用于兼容自动识别路径)。优先级:显式值优先于自动推断。
4.2 行为变化
4.3 纯 TP 识别与收敛策略
第五章 测试用例设计
5.1 测试目标
5.2 测试矩阵
enable_param_shard=False:unsharded_dp_group 同步生效,反向不触发 RS。5.3 验收标准