已开启
【RFC】HyperParallel Symmetric Memory — 子 Group、完整集合通信、反向传播及 Hccl 互操作 #304
hedongdong创建于 7月24日
hedongdong
7月24日 评论:
7月24日 评论:
对称内存特性 — 开发自验证计划
开发完成并自验通过后,方可提交测试团队验收。
一、UT(单元测试)
测试框架:unittest.TestCase,mock 所有通信调用,遵循 tests/ut/ 目录结构。
覆盖范围
| 覆盖模块 | 覆盖内容 | 关键验证点 |
|---|---|---|
| 子 Group 映射逻辑 | group 内局部 rank → 全局 rank 的映射和缓存机制 |
映射正确性、非法参数校验、缓存复用、group=None 退化行为 |
| 集合通信接口参数校验 | AllReduce / AllGather / ReduceScatter / AllToAll / Send / Recv 的入参验证 | op/shape/dtype 非法值、send_list/receive_list 长度一致性 |
| 反向传播逻辑 | 各通信接口的正反向对应关系及 group 参数传递 | AllGather↔ReduceScatter 互逆、AllReduce→Identity、AllToAll 自转置 |
| 低精度通信逻辑 | 低精度数据传输的前后 cast 流程及 dtype 校验 | cast 正确性、非法 dtype 拒绝 |
覆盖率要求
- 新增模块行覆盖率 ≥ 90%,分支覆盖率 ≥ 85%。
- 所有公开接口的错误路径 100% 覆盖。
二、ST(系统测试)
覆盖范围
| 覆盖维度 | 卡数 | 覆盖内容 |
|---|---|---|
| AllReduce | 4/8 | 多种 op(sum/avg/max/min)与 Hccl 结果对齐,含子 group |
| AllGather | 4/8 | 与 Hccl 结果对齐,含子 group |
| ReduceScatter | 4/8 | 与 Hccl 结果对齐,含子 group |
| AllToAll | 4/8 | MindSpore 侧补齐,与 Hccl AlltoAllV 对齐 |
| Send/Recv | 2 | 点对点通信正确性 |
| 反向传播 | 4 | 各通信接口反向梯度数值与框架自动微分一致 |
| Hccl 混用 | 4 | 同一任务中交替使用 Hccl 和 SHMEM,结果与纯 Hccl 一致 |
| MC2 融合算子 | 4 | MC2 算子 subgroup 支持及数值正确性 |
| 低精度通信 | 4 | fp8 通信 + fp16 累加 vs fp16 Hccl |
| 性能基准 | 8 | AllGather/AllReduce 带宽基准采集 |
| 异常/Signal 超时 | 2 | 超时检测及日志输出 |
自验通过门槛
- UT 全量通过:覆盖率达标,所有错误路径覆盖。
- ST 全量通过:MindSpore(
msrun_case)+ PyTorch(torchrun_case)在 910B 8 卡环境全部通过。 - 精度对齐:shmem 输出与对应 Hccl 输出
allclose比对,误差在 ISSUE 规格内。 - 性能基线:采集
test_perf_*用例的带宽/延迟数据入库。
三、自验流程
UT(覆盖率检查)→ MindSpore ST(msrun 4/8卡)→ PyTorch ST(torchrun 4/8卡)
→ 精度对齐检查 → 性能基线采集 → 自验报告


hedongdong
7月24日 评论:
7月24日 评论:
对称内存特性 — 测试团队验收标准
一、端到端验证场景
| 场景 | 验收标准 | 验证方式 |
|---|---|---|
| FSDP/HSDP 梯度同步 | DP group 内用对称内存 AllReduce 替代 Hccl AllReduce,训练收敛曲线与纯 Hccl 一致 | 典型模型端到端训练对比 |
| MoE AllToAll 通算掩盖 | TP/EP group 内用对称内存 AllToAll 替代 Hccl,通算掩盖率 ≥ 90% 或不低于 Hccl | MoE FFN 端到端测试 |
| 序列并行通信 | CP group 内用对称内存 AllGather / ReduceScatter,端到端精度与 Hccl 对齐 | Context Parallel 端到端测试 |
| Hccl 混用 | 同一训练任务中 DP group 用 SHMEM、TP group 用 Hccl,训练正常收敛 | 混合并行策略端到端测试 |
| 跨平台一致性 | PyTorch 与 MindSpore 同接口、同配置下端到端训练结果一致 | 两平台相同模型+策略对比 |
二、性能验收指标
| 指标项 | 验收标准 | 测试方式 |
|---|---|---|
| AllGather 带宽 | 消息 ≥ 1MB 时 ≥ Hccl 的 85% | perftest: 对标 nccl-tests,多消息大小 |
| AllReduce 带宽 | 消息 ≥ 1MB 时 ≥ Hccl 的 80% | perftest |
| AllToAll 延迟 | MoE 典型消息(128KB~4MB)≤ Hccl 的 90% | perftest |
| ReduceScatter 带宽 | 消息 ≥ 1MB 时 ≥ Hccl 的 80% | perftest |
| 端到端吞吐 | 开启对称内存后的训练吞吐不低于纯 Hccl 方案 | 典型模型端到端对比 |
三、精度验收指标
| 场景 | 验收标准 |
|---|---|
| AllReduce / AllGather / ReduceScatter | 与 Hccl 结果 allclose(rtol=1e-7, atol=1e-7)(fp32);allclose(rtol=1e-3, atol=1e-5)(fp16) |
| 端到端 loss 曲线 | 对称内存方案与 Hccl 方案的训练 loss 曲线趋势一致,最终 loss 差异 < 1% |
| 低精度通信高精累加 | fp8 通信 + fp16 累加结果与 fp16 Hccl allclose(rtol=1e-3, atol=1e-5) |
| MC2 融合算子 | 数值误差 ≤ 分离式通信+计算的 1e-5(fp32) |
四、DFX 验收指标
| 指标项 | 验收标准 |
|---|---|
| 日志分级 | HYPER_PARALLEL_SHMEM_LOG_LEVEL 正确控制日志输出 |
| 异常处理 | 非法参数(负 rank、超范围 rank、shape 不匹配)抛出明确错误,不 crash |
| Signal 超时 | 模拟 stuck rank,超时后输出日志退出,不 hang |
| symm_memory_stats | 接口正确返回已分配/峰值/剩余量 |
| Profiling 集成 | 对称内存操作在 CANN profiler 中可见可统计 |
五、验收环境与流程
环境:Atlas 800T A2(910B,≥ 8 卡),MindSpore ≥ 2.10,PyTorch 配套 NPU 适配版本。
流程:MR 自验报告 → 全量 ST + 端到端验证 → 性能/精度达标 → DFX 注入通过 → 验收报告。


【RFC】HyperParallel Symmetric Memory — 子 Group、完整集合通信、反向传播及 Hccl 互操作
一、对外特性描述
1.1 背景
对称内存(Symmetric Memory)基于昇腾芯片内 Device 间共享内存,以 Push 模式实现单边通信——发起方可直接通过 Python API 读写远端对称内存,无需目标 rank 显式参与,消除了传统集合通信的同步屏障和中间数据拷贝。基础原语(put/get/signal/wait/put_with_signal)及
shmem_allgather等接口设计详见 #59。当前待补齐的能力:
shmem_allgathershmem_alltoall1.2 现状与问题
当前实现存在三大能力缺口:
不支持子 Group——所有对称内存操作基于全局
world_size,无法用于 FSDP/HSDP 中不同 DP group、TP group 等场景。典型需求:DP group 内用对称内存做 AllReduce,TP group 内用 Hccl 做 AllGather,两组互不干扰。缺少高级集合通信封装——用户需自行基于 put/get/signal 原语组装 AllReduce / ReduceScatter / Send / Recv,开发门槛高、容易出错。
无自动微分支持——
shmem_allgather/shmem_alltoall无法在训练中直接使用,因为缺少反向传播实现。1.3 设计目标
group参数,在指定子通信域内执行shmem_allreduce/shmem_reduce_scatter/shmem_send/shmem_recv,对标 Hccl 语义shmem_alltoall、MC2 融合算子补全1.4 典型场景
shmem_reduce_scatter/shmem_allreduce,降低延迟shmem_send/shmem_recv点对点通信,无 barrier1.5 功能与规格详述
1.5.1 对称内存子 Group 支持
核心设计:所有对称内存通信接口新增可选参数
group,指定通信域。group=None时使用全局通信组。# 新增 group 参数(所有接口统一) symm.shmem_put(target, target_offset, src, src_offset, size, target_rank, group=None) symm.shmem_get(target, target_offset, src, src_offset, size, target_rank, group=None) symm.shmem_signal_op(signal, signal_offset, signal_value, signal_op, target_rank, group=None) symm.shmem_put_with_signal(target, target_offset, src, src_offset, size, signal, signal_offset, signal_value, signal_op, target_rank, group=None) symm.shmem_allgather(output_tensor, input_tensor, group=None) symm.shmem_alltoall(send_tensor_list, receive_tensor, receive_list, group=None) symm.shmem_allreduce(tensor, op='sum', group=None) symm.shmem_reduce_scatter(output_tensor, input_tensor, op='sum', group=None) symm.shmem_send(tensor, dst_rank, group=None) symm.shmem_recv(tensor, src_rank, group=None)target_rank语义变更:当指定group时,target_rank变为 group 内局部 rank(0 ~ group.size-1),框架内部负责映射到全局 rank。约束:
group内所有 rank 必须处于同一物理节点(对称内存仅在节点内 Device 间共享)。hyper_parallel.collectives.split_group()或platform.create_group()创建,类型与平台无关(Torch: ProcessGroup, MindSpore: str)。1.5.2 高级集合通信接口
在底层单边原语之上,封装对标 Hccl 的高级通信接口:
shmem_allreduce(tensor, op, group)hcclAllReduceshmem_allgather(output, input, group)hcclAllGathershmem_alltoall(send_list, recv_tensor, recv_list, group)hcclAlltoAllVshmem_reduce_scatter(output, input, op, group)hcclReduceScattershmem_send(tensor, dst, group)hcclSendshmem_put_with_signal封装shmem_recv(tensor, src, group)hcclRecvshmem_wait_for_signal封装op参数支持:'sum'/'avg'/'max'/'min',与 HcclhcclRedOp对齐。'avg'操作内部先sum再除以 group size。低精度通信高精累加:
low_precision_dtype参数,指定通信时使用的低精度数据类型(如 fp8 / fp16)。SYMMETRIC_MEMORY_LOW_PRECISION_DTYPE环境变量全局配置,或接口级覆盖。1.5.3 反向传播(自动微分)
遵循经典通信-计算对偶关系:
实现方式:每个通信接口注册对应的
autograd.Function(Torch)或 custom bprop(MindSpore),group参数通过ctx传递到反向。1.5.4 与 Hccl 集合通信的互操作性
核心结论:可以混用,但需遵循约束。
推荐混用模式:
禁止:在同一数据的同一通信阶段混用 Hccl 和对称内存(如用 Hccl AllReduce 聚合一部分梯度、用 SHMEM AllReduce 聚合另一部分),这会导致结果不一致。
1.5.5 跨平台补齐计划
shmem_allreduceshmem_reduce_scattershmem_send/shmem_recvshmem_alltoall(MindSpore)1.5.6 性能与精度规格
性能指标(以 910B 8 卡节点为基准,nccl-tests 等价测试):
shmem_allgathervshcclAllGatherperftestshmem_allreducevshcclAllReduceperftestshmem_alltoallvshcclAlltoAllVperftestshmem_reduce_scattervshcclReduceScatterperftest精度对齐规格:
allreduce(input, 'sum')vs Hccl AllReduceallclose(rtol=1e-7, atol=1e-7)allgather → reduce_scatterroundtripallclose(rtol=1e-3, atol=1e-5)allclose(rtol=1e-3, atol=1e-5)1.5.7 DFX 能力
HYPER_PARALLEL_SHMEM_LOG_LEVEL(DEBUG/INFO/WARNING/ERROR)SHMEM_LOG_TO_STDOUT=1symm_memory_stats()→{"allocated": ..., "peak": ..., "free": ...}SYMMETRIC_MEMORY_SIGNAL_TIMEOUT_MS(默认 300000ms)symm.is_shmem_available()