- 文档与开关验收 这里的文档是指什么?在哪看?
- enable_mc2开关需要怎么配置,只在examples/torch/llama3/parallelize.py示例脚本里找到这个开关,如果不跑示例,是否需要配置enable_mc2?


缺少接口参数说明和约束
缺少了竞品分析
缺少必要的样例说明


- 文档与开关验收 这里的文档是指什么?在哪看?
- enable_mc2开关需要怎么配置,只在examples/torch/llama3/parallelize.py示例脚本里找到这个开关,如果不跑示例,是否需要配置enable_mc2?
- 没有文档,复制的模板标题,已修改。
- 当前这个PR,提供的是MC2的能力,用户可以选择使用或者不使用。使用的话可以在构建网络切分时,自己调用相关的style方法。
enable_mc2只是举了一个demo,表示用户可以在端到端场景自己控制是否使用。(后续可以考虑在trainer相关能力完备后,在yaml侧暴露一个开关,当前不涉及)


1. 「文档与开关验收」里的「文档」指什么?在哪看?
这里的「文档」不是指某个已存在的独立文档页,而是指本特性对外可读的说明载体,验收范围包括:
| 载体 | 当前状态 | 内容 |
|---|---|---|
| 本 Issue / 合入 PR(!1096)描述 | ✅ 已有 | 能力边界、约束矩阵、验收标准 |
| 示例脚本注释与 docstring | ✅ 已有 | examples/torch/llama3/parallelize.py、bench_mc2_vs_tp.py |
| 源码模块/类 docstring | ✅ 部分 | mc2.py、mc2_style.py |
docs/api/api_reference.md |
❌ 尚未补齐 | MC2 三个 API 条目缺失 |
| 独立用户指南 | ❌ 尚未补齐 | 后续单独补文档 PR |
结论:Issue 8.4 的「文档验收」目前主要靠 Issue/PR + 代码内注释满足;正式 API 文档尚未落地,这是已知 gap,会在后续文档 PR 中补齐。
2. enable_mc2 怎么配?不跑示例要不要配?
enable_mc2 不是框架级全局开关或环境变量,而是 Llama3 示例封装层 的参数:
parallelize_llama3(model, tp_mesh, enable_mc2=True) # 默认 False
内部逻辑:仅在 enable_sequence_parallel=True 时生效,将 MLP 的 ColwiseParallel/RowwiseParallel 替换为 MC2ColwiseParallel/MC2RowwiseParallel;Attention 投影仍走非 MC2 路径。
不跑 Llama3 示例时,不需要也不存在 enable_mc2 这个参数。正确用法是在自定义 parallelize_module plan 中 直接选用 MC2 Style:
from hyper_parallel import MC2ColwiseParallel, MC2RowwiseParallel, parallelize_module
from hyper_parallel.core.dtensor.placement_types import Shard
plan = {
"fc1": MC2ColwiseParallel(input_layouts=Shard(1), use_local_output=False),
"fc2": MC2RowwiseParallel(
input_layouts=Shard(-1),
output_layouts=Shard(1),
use_local_output=False,
),
}
parallelize_module(model, tp_mesh, plan)
参考样例:
examples/torch/bench_mc2_vs_tp.py— MC2 vs 非 MC2 性能对比tests/torch/tensor_parallel/test_mc2_distributed.py— 分布式精度 ST
默认行为不变:不选用 MC2 Style 时,仍走原有 ColwiseParallel/RowwiseParallel。
3. 接口参数说明与约束(补充完整版)
承认 Issue 正文对接口参数的说明不够系统,以下为补充。正式版将写入 docs/api/api_reference.md。
3.1 公开 API
from hyper_parallel import MC2ColwiseParallel, MC2RowwiseParallel
from hyper_parallel.core.tensor_parallel.mc2 import MC2Linear
3.2 MC2ColwiseParallel
Column 并行 + 融合 AllGather+MatMul。继承 ColwiseParallel。
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
input_layouts |
Placement |
Replicate() |
必须设为 Shard(...)(序列维切分);默认 Replicate() 会在构造时 ValueError |
output_layouts |
Placement |
Shard(-1) |
输出 layout;Column 输出按 last-dim shard |
use_local_output |
bool |
True |
False 时保持 DTensor 链路(MLP 链推荐) |
行为要点:
- 不做 input AG redistribute,
desired_input_layouts = input_layouts(保持序列 sharding,融合核内部 AG) apply()时将nn.Linear原地替换为MC2Linear(mode=all_gather)- 仅支持
nn.Linear(Embedding 等会NotImplementedError)
3.3 MC2RowwiseParallel
Row 并行 + 融合 MatMul+ReduceScatter。继承 RowwiseParallel。
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
input_layouts |
Placement |
Replicate() |
实际 desired 为 Shard(-1)(Partial 输入,由 base Rowwise 处理) |
output_layouts |
Placement |
Replicate() |
必须设为 Shard(...)(序列维切分);默认 Replicate() 会 ValueError |
reduce_dtype |
dtype |
None |
继承自 Rowwise;MC2 前向走融合 RS,此参数影响非 MC2 输出路径 |
use_local_output |
bool |
True |
是否 to_local() |
行为要点:
apply()时替换为MC2Linear(mode=reduce_scatter)- Row 路径要求 序列维长度能被
world_size整除,否则RuntimeError
3.4 MC2Linear.configure_mc2
通常由 Style apply() 自动调用,高级用户可直接配置:
| 参数 | 说明 |
|---|---|
mode |
"all_gather"(Column)或 "reduce_scatter"(Row) |
group |
TP ProcessGroup |
world_size |
group 大小 |
sequence_dim |
SP 序列轴维度索引(支持负索引) |
前置条件:须先 MC2Linear.from_linear(nn.Linear) + Style apply();未配置就 forward 会 RuntimeError;weight 须为 DTensor。
3.5 Kernel / 运行时约束
| 约束 | 说明 | 入口校验 |
|---|---|---|
| 后端 | PyTorch + Ascend NPU + torch_npu |
import 时 RuntimeError |
| Sequence Parallel | Style 要求序列维 Shard layout |
Style 构造时 ValueError |
| dtype | 仅 float16 / bfloat16 |
kernel 运行时(入口未校验,后续可补) |
| 收缩维 k | k ∈ [256, 65535) |
kernel 运行时 |
| world_size | {2, 4, 8} |
kernel 运行时 |
| Column 反向融合 MRS | 收缩维 = out_features / tp(即 n_local),需 ≥ 256 |
kernel 运行时 |
| Row RS | 序列维 size % world_size == 0 | MC2Linear forward RuntimeError |
| batch-first | [B, S, H] + Shard(1) 时内部 permute 到 seq-first |
自动处理 |
| 模块类型 | 仅 nn.Linear |
Style apply NotImplementedError |
Shape 选型公式(MLP 链设计时参考,ST 注释):
- Column 前向收缩维 =
in_features - Row 前向收缩维 =
in_features / tp - Column 反向(融合 MRS)收缩维 =
out_features / tp - 实践中:
in_features ≥ 256 × world_size,Column 层的out_features / tp ≥ 256
fail-closed 说明:Issue 8.3 要求 dtype/k/world_size 不满足时在入口明确失败;当前 layout 约束已在 Style 入口校验,dtype/k/world_size 暂依赖 kernel 运行时失败。后续会在 Style/Linear 入口补前置校验,与 8.3 对齐。
4. 竞品 / 替代方案分析(补充)
| 方案 | 通信+MatMul | 可训练反向 | TP+SP MLP | 备注 |
|---|---|---|---|---|
HyperParallel 默认 ColwiseParallel/RowwiseParallel |
分离调度 | ✅ | ✅ | 功能完整,Ascend 上无法走 MC2 融合流水 |
| HyperParallel MC2 Style(本期) | AG+MM / MM+RS 融合 | ✅ 自定义 autograd | ✅ 仅 Linear+SP | 默认关闭,需显式选用 |
| MindFormers PyNative MC2 | 融合 | ✅ | ✅ | 对齐上游 mindformers!8397 |
| PyTorch DTensor 原生 TP | 分离 | ✅ | ✅ | 无 Ascend MC2 融合核 |
本期定位为 HyperParallel Torch 路径对齐 MindFormers MC2 能力补齐,非全框架替代。
5. 样例说明(补充)
| 样例 | 路径 | 用途 |
|---|---|---|
| Llama3 TP + 可选 MC2 | examples/torch/llama3/parallelize.py |
端到端模型,enable_mc2=True 仅作用于 MLP |
| MC2 vs TP 性能对比 | examples/torch/bench_mc2_vs_tp.py |
独立 MLP stack,直接选用 MC2 Style |
| 分布式精度 ST | tests/torch/tensor_parallel/test_mc2_distributed.py |
Col/Row 前向+反向、MLP 链、fp16、Shard(1) |
| UT | tests/ut/core/tensor_parallel/test_mc2_style.py |
layout 校验、模块替换、反向路径 |
本地复现:
export HYPER_PARALLEL_PLATFORM=torch
pytest tests/ut/core/tensor_parallel/test_mc2_style.py -q
export ASCEND_RT_VISIBLE_DEVICES=4,5
pytest tests/torch/tensor_parallel/test_mc2_distributed.py -v


1.examples/torch/bench_mc2_vs_tp.py库上没找到
2.非目标里的MoE / Attention 路径的 MC2 融合。是指MoE / Attention里不能apply() 将 nn.Linear 原地替换为 MC2Linear吗?如果apply了是会报错还是没效果?
3.与其他特性的交互?


补充一组 PyTorch / Ascend 本地性能对照(MC2 vs 非融合 ColwiseParallel / RowwiseParallel),用于说明什么场景有收益、什么场景可能劣化。本期 Issue 明确未覆盖正式多机 E2E 吞吐报告,以下为单机 910B3 上的定向 A/B,供评审参考。
测试环境
| 项 | 值 |
|---|---|
| 设备 | Ascend 910B3(HBM 64GB) |
| CANN | 9.1.0 |
| 框架 | PyTorch 2.7 + torch_npu,HYPER_PARALLEL_PLATFORM=torch |
| dtype | bfloat16 |
| 对照 | 相同权重、相同 TP+SP plan;仅 Linear 是否走 MC2 Style |
| 计量 | warmup=3,iters=10,npu.synchronize 后取平均墙钟 |
对照网络与 PR 一致:
- MLP 堆叠(
examples/torch/bench_mc2_vs_tp.py):fc1Column +fc2Row - Llama3 SwiGLU FFN(
parallelize.py):w1/w3Column +w2Row;Attention 始终非融合 - Llama3 block:Attention 非融合 + MLP 可选 MC2(即
enable_mc2=True的真实覆盖面)
示例 Llama3DemoConfig(dim=256) 不满足 Column 反向 n_local≥256(TP=2 时 FFN=256 → n_local=128),未纳入本表。
结果(正数 = MC2 更快)
| 场景 | 结构 | H / FF / seq / B / layers | TP | 前向 | 前向+反向 |
|---|---|---|---|---|---|
| PR 大 MLP | fc1+fc2 | 8192 / 28672 / 4096 / 2 / 4 | 2 | +14.1% | +11.3% |
| Llama3 SwiGLU 7B 档 | w1/w3/w2 | 4096 / 11008 / 2048 / 2 / 4 | 2 | +8.9% | +3.6% |
| Llama3 SwiGLU 70B 档 | w1/w3/w2 | 8192 / 28672 / 2048 / 2 / 2 | 2 | +6.4% | −10.4% |
| Llama3 整 block(Attn 非融合 + MLP MC2) | 7B 档 | 4096 / 11008 / 1024 / 1 / 2 | 2 | +12.3% | +13.1% |
| 短序列 + 大 GEMM | fc1+fc2 | 8192 / 28672 / 128 / 2 / 4 | 2 | +18.4% | −6.8% |
| kernel 边界小 shape | fc1+fc2 | 512 / 512 / 128 / 2 / 8 | 2 | +61.6% | +61.0% |
| 中小 MLP | fc1+fc2 | 1024 / 2816 / 256 / 2 / 8 | 2 | +59.1% | +59.0% |
| 更大 TP | fc1+fc2 | 4096 / 11008 / 2048 / 2 / 4 | 4 | +41.0% | +22.2% |
本组 前向全部正向。训练(fwd+bwd)出现回退的是:短序列大 GEMM、以及 70B 档 SwiGLU。
小/中 shape 上 2.4–2.6x 主要来自少掉 DTensor 独立 AG/RS + nn.Linear 的调度,不完全是通算流水本身。
什么场景有收益
- 纯 MLP / FFN 占比高
PR 推荐的大 MLP 长序列(8192 / 28672 / seq=4096)前向约 +14%,训练约 +11%。 - 通信与框架调度相对明显
层数多、shape 未大到纯计算墙;或 TP 更大(同 7B 档 MLP:TP=2 训练约 +4%,TP=4 前向 +41%、训练 +22%)。 - Llama3 在
enable_mc2真实覆盖面下
Attention 不走 MC2,但 FFN 仍占时间。7B 档 2 层 block、seq=1024 时整 block 训练约 +13%。 - 只跑前向 / 推理
本组前向均加速,包括训练会回退的两个 case。
什么场景没有收益(或会劣化)
- 大 GEMM + 短序列的训练
seq=128、FFN=28672:前向仍 +18%,fwd+bwd −6.8%。计算已很重、通信量相对小,融合反向(Column MRS 收缩维为很大的n_local)不如分离 GEMM+通信。 - 大 SwiGLU 的训练
70B 档 FFN(3 个 Linear + SiLU):前向 +6%,fwd+bwd −10.4%。比 2-linear MLP 多一次 Column 融合反向,SiLU 也不在 MC2 内。 - Attention / MoE 占绝对大头的端到端
本期不融 q/k/v/o 与 MoE。seq 更长、层数更多时 SDPA 会进一步稀释 MLP 收益;正式全模型吞吐仍未覆盖。 - 约束不满足,不应启用(不是变慢,是跑不了或 fail-closed)
- 无 Sequence Parallel
- 示例级
dim=256(n_local<256) - dtype 非 fp16/bf16、
world_size不在{2,4,8}、收缩维不在[256, 65535) - 单卡 / 非 Ascend / MindSpore 后端
选用建议
优先开 MC2:Ascend + TP+SP + 合法 shape + MLP/FFN 为主;更长序列、更大 TP、前向/推理
建议 A/B:很短 seq + 很宽 FFN 的训练;70B 级 SwiGLU 训练
不要开:dim 过小、无 SP、dtype/world_size/k 不合法
结论:MC2 在 PR 的 MLP / Llama3 FFN 路径上 有可测收益,默认关闭是合理的。收益随拓扑变化:前向更稳;训练在短序列大 GEMM 和大 SwiGLU 上可能回退。正式 E2E 吞吐报告仍按 Issue 非目标留后续。


1.examples/torch/bench_mc2_vs_tp.py库上没找到
2.非目标里的MoE / Attention 路径的 MC2 融合。是指MoE / Attention里不能apply() 将 nn.Linear 原地替换为 MC2Linear吗?如果apply了是会报错还是没效果?
3.与其他特性的交互?
- 例子看这个吧:tests/torch/tensor_parallel/_test_mc2_distributed.py
- 必须是
nn.Linear,否则apply()会报NotImplementedError - mc2是TP的一种,和其他特性正交,没有影响


python -m torch.distributed.run --nproc_per_node=2 --master_port=29581
examples/torch/bench_mc2_vs_tp.py


🚀 功能描述
0. 基本信息
feat/tp-mc2-fused-paralleltorch_npuMC2 kernel)1. 需求背景
HyperParallel 在 PyTorch / Ascend 张量并行路径上,Column / Row Parallel Linear 的集合通信与
nn.Linear矩阵乘仍是分离调度(DTensor redistribute / Partial→AllReduce-RS)。MindFormers PyNative 侧已具备 MC2(MatMul + Communication)融合能力,但 HyperParallel Torch 侧缺少对齐实现:MC2ColwiseParallel+all_gather_matmulnn.Linear分离MC2RowwiseParallel+matmul_reduce_scatter在 TP + Sequence Parallel 场景下无法吃到 Ascend MC2 通算流水,独立通信算子调度开销偏高。
2. 本期目标与非目标
2.1 本期目标
MC2Linear:前向 AG+MM / MM+RS;Column 反向默认融合 MRS(满足n_local≥256)。MC2ColwiseParallel/MC2RowwiseParallel:要求序列维切分 I/O,apply时替换为MC2Linear。examples/torch/llama3/parallelize.py增加enable_mc2(默认False,且需 SP)。Shard(1)。2.2 本期非目标
3. 改动范围
3.1 MC2 产品能力
MC2Linear+ 融合 autograd(mc2.py)MC2ColwiseParallel/MC2RowwiseParallel(mc2_style.py)enable_mc2开关3.2 测试与基础设施
torchrun;去重 4 卡 Linear launcher;端口错开;MC2 ST shape 保证n_local≥256tests/common/distributed_launcher.pytests/ut/core/tensor_parallel/test_mc2_style.pytests/torch/tensor_parallel/test_mc2_distributed.py4. 对外接口
# 融合 Linear(可训练) from hyper_parallel.core.tensor_parallel.mc2 import MC2Linear # Parallel Style(apply 时替换为 MC2Linear) from hyper_parallel.core.tensor_parallel import ( MC2ColwiseParallel, MC2RowwiseParallel, ) # 示例开关(需 Sequence Parallel) # examples/torch/llama3/parallelize.py: enable_mc2=True是否影响现有 API
ColwiseParallel/RowwiseParallel保持;MC2 为新增 Style,需显式选用或打开enable_mc2MC2Linear、MC2ColwiseParallel、MC2RowwiseParalleldistributed_launcher与 ST 调度调整不影响产品 API5. 当前支持矩阵 / 关键约束
enable_mc2默认关float16/bfloat16kk ∈ [256, 65535);Column 反向时为n_localworld_size{2, 4, 8}n_local≥256,否则不可走融合反向6. 风险与限制
6.1 Ascend MC2 kernel 硬约束
MC2 路径直接依赖 CANN /
torch_npu融合核。dtype、收缩维、world_size、Column 反向n_local≥256任一不满足时,不能静默回退到“看起来能跑但未融合”的路径,必须在 Style/Linear 入口明确失败或保持默认关闭,避免用户误以为已获得 MC2 收益。6.2 仅覆盖 Linear + SP,能力面偏窄
本期只覆盖 TP+SP 下的 Column/Row Linear。Attention、MoE、无 SP 拓扑仍走原分离通信路径。若示例或文档表述成“全模型 MC2”,会造成预期偏差;
enable_mc2必须继续默认关闭,并由调用方显式打开。6.3 数值与调度差异
融合核与“通信 +
nn.Linear”分离路径在内核实现、rounding、流水排布上可能存在可接受范围内的数值差。验收应以与参考路径的精度阈值/相对误差为准,而不是 bit-wise 一致。ST 需覆盖前向+反向,避免只验前向。6.4 测试基础设施变更的连带风险
父进程 launcher 轻量化、ST 合并
torchrun、端口错开等改动会影响 tensor_parallel 相关用例调度。风险是“MC2 本身正确,但并行起测/导入路径回归”。验收需同时覆盖:parallel_case/distributed_launcher/ shard-ops suite 时父进程不加载torch/mindspore。6.5 与 MindFormers 对齐漂移
HyperParallel 侧实现需持续对齐 mindformers PyNative MC2 语义。上游 kernel ABI、反向融合条件或 Style 约束若变更,本仓库可能出现行为分叉;后续变更应同步对照 mindformers!8397 及后续修复。
7. 验证设计与当前结果
7.1 UT 覆盖
tests/ut/core/tensor_parallel/test_mc2_style.py:apply后模块替换为MC2Linear;7.2 ST 覆盖(Ascend)
tests/torch/tensor_parallel/test_mc2_distributed.py:Shard(1)Colwise补充约束:MC2 ST 默认 shape 保证
n_local≥256,满足融合反向条件。7.3 基础设施验证
parallel_case/distributed_launcher/ shard-ops suite 时,父进程不加载torch/mindspore;7.4 本地复现
export HYPER_PARALLEL_PLATFORM=torch pytest tests/ut/core/tensor_parallel/test_mc2_style.py -q # ST(示例 2 卡) export ASCEND_RT_VISIBLE_DEVICES=4,5 pytest tests/torch/tensor_parallel/test_mc2_distributed.py -v7.5 当前结果
8. 验收标准
8.1 功能验收
MC2Linear、MC2ColwiseParallel、MC2RowwiseParallel可从公开路径导入。apply后实际替换为MC2Linear。Shard(1)Colwise ST 通过。enable_mc2=False(默认)时,现有非 MC2 TP 行为不变。8.2 兼容性验收
ColwiseParallel/RowwiseParallel路径行为不变。8.3 明确报错 / fail-closed
以下场景必须明确失败或拒绝启用,而不是静默退回“未融合但宣称 MC2”:
float16/bfloat16;n_local不满足 MC2 kernel 或融合反向约束;world_size不在{2, 4, 8}。8.4 验收方法
enable_mc2的使用方式,自己构建一个MC2的TP切分方式9. 现有替代方案
继续使用现有
ColwiseParallel/RowwiseParallel:通信与 MatMul 分离调度,功能可用,但在 Ascend TP+SP 下无法走 MC2 融合核,通信调度开销更高。MindFormers PyNative 侧已有同类能力,本需求为 HyperParallel Torch 路径对齐补齐。与 DFX 相关性
enable_mc2可选启用补充信息