已开启
[Benchmark] torch_npu FSDP2 vs hyper_parallel Torch fully_shard(Qwen3.5 形状,8×910B) #250
changzherui创建于  6月25日
changzherui
changzherui成员
6月25日 创建

背景

在 Ascend 910B × 8 卡上,对比 torch_npu FSDP2(czr_pta/pytorch 的 torch_npu.distributed.fsdp)与 hyper_parallel Torch 后端 fully_shard 的训练性能。

自研 benchmark 仓库(本地):bench_qwen35_35b_fsdp2/
模型:Qwen3.5-35B-A3B 形状(简化实现,非官方完整模型),可调层数。
并行:1D FSDP,mesh=8,batch_size=1,HYPER_PARALLEL_PLATFORM=torch。


实验配置摘要

项 说明
硬件 8 × Ascend 910B
对比基线 torch_npu FSDP2 vs hyper_parallel fully_shard
prefetch 显式 forward=1 / backward=1(decoder layer 链式预取)
计时 warmup=2,measure=20,NPU sync 分阶段计时
交错实验 每轮 torch → hyper,共 3 轮,减少温度/频率漂移

实验一:seq=16K,4 层(prefetch 前,带 profiler)

指标 torch_npu hyper_parallel
step 中位数 1841 ms 1948 ms
forward 465 ms 465 ms
backward 1378 ms 1464 ms

Profiler(step3,prefetch 未显式开启)通信掩盖率:

  • torch_npu:48.8%(8 卡均值)
  • hyper_parallel:5.9%(7 卡)

根因:hyper 侧 HCCL 调用过碎(rank0 约 124 AG + 57 RS vs torch 12 AG + 7 RS),layer prefetch 未配置时几乎无 overlap。

Profiler 路径:results/profiler_20260625_143330/


实验二:seq=16K,4 层,prefetch=1(交错 3 轮)

指标 torch_npu hyper_parallel hyper/torch
step 中位数(3 轮均值) 1830.7 ms 1782.8 ms 0.974x
forward 中位数 456.8 ms 421.5 ms 0.921x
backward 中位数 1372.1 ms 1360.7 ms 0.992x

开启 prefetch 后两边基本持平,hyper 略快。

结果:results/interleaved_20260625_152124/


实验三:seq=8K,8 层,prefetch=1 + profiler(交错 3 轮)

Round torch step hyper step hyper/torch
1 2026 ms 1770 ms 0.874x
2 1929 ms 1768 ms 0.917x
3 1911 ms 1784 ms 0.933x

3 轮汇总(step 中位数): torch 1929 ms vs hyper 1770 ms(hyper 快 ~8.3%)

阶段 torch hyper Δ
forward 中位数 493 ms 422 ms -71 ms
backward 中位数 1436 ms 1350 ms -86 ms

Profiler step3(8 卡均值,prefetch=1):

指标 torch_npu hyper_parallel
通信掩盖率 57.6% 44.2%
暴露通信 603 ms 816 ms
纯计算 1579 ms 1450 ms
allGather 次数 (rank0) 20 244
reduceScatter 次数 (rank0) 11 111

结果:results/interleaved_8k_8L_prof_20260625_163102/


Profiler 差异点(实验三)

hyper 更快

  • Slice -64 ms、ConcatD -24 ms、Cast -14 ms(rank0 单步)
  • 总 kernel 时间 hyper 1473 ms vs torch 1606 ms(-133 ms)

hyper 更慢 / 待优化

  • HCCL 调用 10–12× 更碎(参数级 all_gather_inputs vs torch module 级 bucket)
  • 通信掩盖率仍低于 torch(44% vs 58%),暴露通信多 ~213 ms
  • BARRIER / Launch_Ffts 次数显著更多(365 vs 59)
  • RealDiv 调用 173 vs 73 次

torch 优势

  • FSDP2 module 级通信聚合,HCCL 次数少
  • backward prefetch 成熟,掩盖率更高

结论

  1. 未开 layer prefetch 时,hyper Torch 后端通信几乎串行暴露(掩盖 ~6%),step 慢于 torch_npu。
  2. 显式 prefetch=1 后,16K/4L 基本持平,8K/8L hyper 快 ~8%。
  3. 主要性能差距来自 HCCL 调度粒度:hyper 参数级 AG/RS vs torch module 级融合。
  4. hyper 在算子路径(Slice/Cast/Concat)上有优势,部分抵消通信暴露劣势。

建议优化方向

  1. P0:参数级 AG/RS 向 module-bucket 合并,减少 HCCL launch 与 BARRIER
  2. P1:降低多余 DeviceSync / Launch_Ffts
  3. P2:评估 comm_fusion=True、prefetch depth=2、HSDP 2×4 mesh

复现

source /home/czr/env.sh
cd bench_qwen35_35b_fsdp2

# 16K / 4L,prefetch=1,交错 3 轮
bash run_interleaved.sh

# 8K / 8L,prefetch=1,profiler,交错 3 轮
SEQ_LEN=8192 NUM_LAYERS=8 ENABLE_PROFILER=1 bash run_interleaved.sh

Benchmark 脚本:bench_torch_npu.py、bench_hyper_parallel.py、common.py(setup_layer_prefetch)


环境

  • CANN 9.1.0,torch + torch_npu(czr_pta patch)
  • hyper_parallel Torch 后端,comm_fusion=False(默认)
likedislike