已开启
Linear Attention CP 融合算子 PR #1114测试报告 #320
xu-xianliang创建于  8月6日
xu-xianliang
xu-xianliang
8月6日 创建

Linear Attention CP 融合算子 PR 测试报告

文档结构总览

本报告按照从算子到整网的验证层级组织,每一章均就地给出测试配置、方法、结果和结论,
不再将测试计划与测试结果拆开放置。

章节 验证对象 主要目的
第 1 章 PR 功能范围 明确需要证明的能力及不在本 PR 范围内的路径
第 2 章 环境与统一方法 固定软硬件、精度指标、计时与显存口径
第 3 章 Backend 与交付检查 验证 Triton capability、fail-fast、UT 和 wheel 完整性
第 4 章 单卡 GDN core 对比 Triton 融合算子与 eager 小算子的精度、性能和显存
第 5 章 CP 完整 Linear Attention 层 验证 Ulysses、P2P 和 AllGather 的 CP 正确性及扩展性能
第 6 章 四层 Qwen3.5 整网 验证 FSDP+CP、多步 optimizer 轨迹及端到端收益
第 7 章 Level0 profile 与稳定性 量化计算通信构成,并检查 P2P 长时间运行稳定性
第 8 章 PR 结论 汇总可直接用于 PR 描述的验证结论

1. 测试目标与范围

测试对象为 linear_cp_fused 分支提交 9445b8b8ac19bc5c3f9125383adba4a6170319db

需要证明:

  1. Triton GDN 的 token output、final state 和全部输入梯度与 eager reference 一致。
  2. Ulysses Triton 和 P2P Triton 的完整 Linear Attention 层与无 CP reference 一致。
  3. P2P 多跳 forward state chain 和反向 state-gradient chain 正确且稳定。
  4. 四层 Qwen3.5 在非零学习率下执行 100/200 步优化时,loss 和 grad norm 不持续漂移。
  5. P2P 相对 Ulysses 的性能和显存收益能够在正式提交代码上复现。
  6. 不支持的 Triton 环境、shape 和 mode 明确报错,不发生静默回退。

本 PR 覆盖的路径如下:

Linear CP mode GDN backend 本报告中的定位
Ulysses Triton 融合算子基线及完整功能验证
P2P Triton 本 PR 核心方案及完整功能验证
AllGather eager 已有 CP 功能回归
AllGather Triton 当前不支持,只验证 fail-fast

AllGather Triton、融合 Conv1D、自动 backend 回退均不在本 PR 功能范围内。

2. 环境与统一测试方法

2.1 软件与硬件环境

项目 配置
NPU 8 × Ascend 910B3,64 GiB HBM/device
CANN 9.1.0-beta.3
Python 3.11
PyTorch 2.10.0+cpu
torch-npu 2.10.0
triton-ascend distribution 3.2.1+git2badfc89
Triton Python module 3.2.0,Ascend backend available
主要 dtype BF16;GDN gate 累计及 recurrent state 使用 FP32

运行 Triton 时需要确保当前 Python 环境的新版 libstdc++ 优先于系统动态库。否则
libtriton.so 可能加载不满足 GLIBCXX_3.4.29 的旧系统库,使 capability 检查失败。
本报告中的正式结果均在 is_triton_gdn_available(target_shape) == True 后获得。

整网轨迹使用真实 mmap token 数据流,每一步读取不同 token 序列。reference 与候选模式使用
相同的初始化权重、输入、labels、padding mask、有效 token 数和 optimizer 初态。

2.2 精度指标

张量精度同时记录:

max_abs    = max(abs(actual - reference))
relative-L2 = ||actual - reference||_2 / max(||reference||_2, eps)
finite      = actual/reference 均无 NaN 和 Inf

整网轨迹记录:

loss_abs = abs(cp_loss - reference_loss)
loss_rel = loss_abs / abs(reference_loss)
grad_norm_abs = abs(cp_grad_norm - reference_grad_norm)
grad_norm_rel = grad_norm_abs / abs(reference_grad_norm)

最大绝对误差与最大相对误差可能出现在不同 step,因此两者独立统计,不能简单相乘换算。

2.3 性能与显存口径

所有正式性能测试统一采用:

warmup = 5
repeat = 20
计时前 barrier + device synchronize
计时后 device synchronize
分布式 elapsed 使用 all_reduce(MAX)
报告 median / min / p90
正式计时关闭 profiler

显存测试在 warmup 后重置 peak stats,记录所有 rank 的最大值。单卡 GDN 表使用
incremental peak allocated,即扣除输入和固定常驻张量后的算子增量峰值;CP/整网表使用
完整进程的 peak allocatedpeak reserved。两种口径不会混在同一张对比表中。

3. Backend、兼容性与交付检查

3.1 Capability 与 fail-fast

目标生产 shape 的 Triton capability 检查通过。以下不支持条件均要求直接报错:

条件 预期行为
backend=auto 拒绝,避免静默选择不同 backend
all_gather + triton 拒绝,当前未提供该组合
head_dim != 128 拒绝
chunk_size != 64 拒绝
P2P local sequence 不能被 64 整除 拒绝
Triton 未安装或版本不满足 给出明确错误,不回退 eager

3.2 UT、静态检查与 wheel

Linear Attention CP CPU UT: 10 passed
git diff --check: passed
正式提交工作树: clean

wheel 完成隔离安装验证,并确认包含:

hyper_parallel/platform/torch/custom_ops/gdn/LICENSE
hyper_parallel/platform/torch/custom_ops/gdn/chunk_gated_delta_rule.py
hyper_parallel/platform/torch/custom_ops/gdn/state_summary.py
hyper_parallel/platform/torch/custom_ops/gdn/triton/*.py

CPU/MindSpore import 不会主动加载 Torch Triton kernel;未安装 Triton 时 eager backend 仍可使用。
长序列 NPU 测试不放入有 180 秒超时限制的公共 UT。

4. 单卡 GDN 融合算子验证

本章只比较 GDN core,不包含 projection、Conv1D、RMSNormGated、out projection 或 CP 通信。

4.1 Shape 与 head 口径

Qwen3.5 层的投影配置是:

QK heads = 16
V heads  = 32
dk = dv  = 128

进入 GDN core 前,16 个 Q/K heads 会按照分组关系复制到 32 个 V heads,因此 GDN kernel
实际接收的是:

B=1, H=32, dk=dv=128, BF16

所以本章表格中的 H=32 与模型的 QK/V=16/32 并不矛盾:前者是 GDN core 的实际输入
head 数,后者是 projection 输出的模型配置。

测试序列为 8K、16K 和 32K。每个长度覆盖:

  1. initial_state=None,对 token output 施加随机 dO
  2. 随机 FP32 initial_state,同时对 output/final state 施加随机 dO/dHT
  3. 三个随机种子;
  4. 比较 output/final_state/dq/dk/dv/dg/dbeta/dH0

dO/dHT 按张量规模归一化,避免序列增长只因 loss 求和尺度而放大梯度。

4.2 精度结果

Sequence Initial state Worst output rel-L2 Final-state rel-L2 dH0 rel-L2 Worst input-grad rel-L2 Worst tensor Result
8K 4.3701e-3 3.3544e-3 1.5870e-3 5.6824e-3 dk PASS
8K 4.3692e-3 N/A N/A 5.6839e-3 dk PASS
16K 4.3707e-3 3.3464e-3 1.5942e-3 5.8559e-3 dg PASS
16K 4.3704e-3 N/A N/A 5.6885e-3 dk PASS
32K 4.3710e-3 3.3549e-3 1.5840e-3 5.6805e-3 dk PASS
32K 4.3712e-3 N/A N/A 5.6893e-3 dk PASS

全部张量 finite。序列从 8K 增长到 32K 后,output、final state、dH0 和输入梯度误差
没有系统性增长,最差 relative-L2 为 5.86e-3,低于 1e-2 验收阈值。

4.3 正式性能与显存结果

测试对象为 stateful GDN,同时输出 token output 与 final state。首次 Triton 编译和 autotune
不计入稳态结果。

Seq Backend Forward median/min/p90 Backward median/min/p90 Fwd+Bwd median/min/p90 Incremental peak allocated
8K eager 74.926 / 74.097 / 75.677 ms 357.230 / 356.838 / 357.477 ms 455.672 / 452.192 / 460.131 ms 4346.0 MiB
8K Triton 9.384 / 9.305 / 9.466 ms 26.343 / 25.800 / 26.759 ms 36.022 / 35.381 / 36.413 ms 1135.0 MiB
16K eager 139.751 / 138.399 / 142.614 ms 1393.546 / 1392.996 / 1393.683 ms 1585.064 / 1578.077 / 1587.287 ms 8667.8 MiB
16K Triton 17.685 / 17.598 / 17.724 ms 52.790 / 51.404 / 53.109 ms 70.862 / 70.116 / 71.712 ms 2258.0 MiB
32K eager 352.325 / 326.949 / 362.839 ms 5171.605 / 5168.136 / 6708.731 ms 5525.082 / 5507.708 / 7069.434 ms 17303.6 MiB
32K Triton 34.913 / 34.511 / 35.333 ms 102.955 / 100.557 / 103.585 ms 137.857 / 135.614 / 138.853 ms 4502.0 MiB
64K eager 732.588 / 715.411 / 761.692 ms 19475.424 / 19466.559 / 20074.664 ms 20214.181 / 20184.151 / 20815.913 ms 34559.7 MiB
64K Triton 68.398 / 67.449 / 68.680 ms 204.345 / 199.881 / 205.068 ms 272.523 / 267.829 / 273.651 ms 8998.0 MiB
Seq Forward speedup Backward speedup Fwd+Bwd speedup Incremental peak reduction
8K 7.98× 13.56× 12.65× 3.83×
16K 7.90× 26.40× 22.37× 3.84×
32K 10.09× 50.23× 40.08× 3.84×
64K 10.71× 95.31× 74.17× 3.84×

eager backward 保存并遍历逐 chunk 的大 autograd 图,其开销随 local chunk 数增长明显;
因此 16K/32K/64K 的 backward speedup 持续高于 8K。64K 本轮只补充性能和显存,未加入
第 4.2 节精度矩阵。上述加速比只说明 GDN core 融合收益,不能直接当作完整 Linear
Attention 层或整网收益。

4.4 为什么单卡算子不做 200-step optimizer 轨迹

单独的 GDN core 没有 projection/MLP 等可训练参数,也不执行 optimizer update。对同一个纯
函数重复 200 次只能重复相同前反向,不能证明训练轨迹稳定性。因此算子级精度采用长序列、
stateful/stateless、多个随机种子和完整 dO/dHT 梯度覆盖;真正的 100/200-step 非零学习率
验证放在第 6 章整网中完成。

5. CP 完整 Linear Attention 层验证

5.1 测试范围与配置

完整层覆盖:

QKV/Z/A/B projections
Conv1D CP halo
Q/K L2Norm
GDN core
RMSNormGated
out projection

基础配置为:

batch=1
hidden=2048
QK/V heads=16/32
head_k_dim=head_v_dim=128
dtype=BF16

无 CP eager 层作为数学 reference。CP 模式比较 Ulysses Triton、P2P Triton 和
AllGather eager。第 4 章已独立验证 Triton GDN 与 eager 的误差,因此本章重点验证 CP
布局转换、Conv halo、状态传递、输出顺序和参数梯度。

5.2 CP4 完整层精度

无 padding 结果:

Global/local seq Mode Output rel-L2 Input-grad rel-L2 Parameter-grad rel-L2 Grad-norm rel Result
8K/2K Ulysses Triton 4.4878e-3 5.8683e-3 5.0716e-3 3.76e-5 PASS
8K/2K P2P Triton 4.4878e-3 5.8687e-3 5.0719e-3 3.76e-5 PASS
8K/2K AllGather eager 0 1.5769e-4 2.3462e-3 见说明 PASS
32K/8K Ulysses Triton 4.4771e-3 5.8584e-3 5.0756e-3 3.7054e-5 PASS
32K/8K P2P Triton 4.4771e-3 5.8587e-3 5.0757e-3 3.7163e-5 PASS
32K/8K AllGather eager 1.3481e-4 3.5978e-4 2.3472e-3 1.0898e-6 PASS

AllGather eager 在 8K 下的 global grad norm 同样 finite 且通过阈值;该次早期日志未输出精确
relative 数字,因此不构造缺失值。

尾部 padding 使用 B=2, global sequence=8192, valid_length=7777

Mode Output rel-L2 Input-grad rel-L2 Parameter-grad rel-L2 Grad-norm rel Padding output
Ulysses Triton 4.4850e-3 5.8654e-3 5.0812e-3 3.9913e-5 exact zero
P2P Triton 4.4850e-3 5.8663e-3 5.0816e-3 3.9913e-5 exact zero
AllGather eager 0 1.6009e-4 2.3466e-3 2.2360e-7 exact zero

这一配置专门覆盖真实训练中的变长样本和 batch padding,而不是为了增加一个任意 shape:

  1. 当前模型的 padding helper 只在二维 mask 且 batch>1 时进入实际 masking 分支,B=2
    因此既覆盖真实 [B,S] 路径,也可发现错误广播或只处理第一条样本的问题;
  2. 7777 既不能被 CP4 的 local sequence 2048 整除,也不能被 GDN chunk size 64
    整除,valid/padding 边界落在 rank3 的一个 GDN chunk 内部;
  3. 它检查各 rank 的 local mask 切片、projection/Conv 前的 hidden-state masking、通信后的
    token 顺序、padding output 为零,以及整体输入/参数梯度与无 CP reference 一致;
  4. 全有效长度 case 无法暴露 mask 分支、CP 尾部切片和 partial chunk 问题。

P2P 与 Ulysses 的误差几乎逐项一致,说明三跳 forward state chain 和反向
state-gradient chain 没有额外放大 BF16/Triton 误差;32K 相比 8K 也没有误差增长。

5.3 CP4 性能与显存

Global/local seq Mode Forward median/min/p90 Fwd+Bwd median/min/p90 Backward estimate Peak allocated Peak reserved
32K/8K Ulysses 24.430 / 24.006 / 24.787 ms 76.884 / 75.854 / 77.704 ms 52.454 ms 1883.8 MiB 2522.0 MiB
32K/8K P2P 19.644 / 19.541 / 19.708 ms 65.807 / 65.294 / 66.027 ms 46.163 ms 1895.8 MiB 2486.0 MiB
64K/16K Ulysses 45.806 / 45.421 / 46.310 ms 160.283 / 159.313 / 161.262 ms 114.477 ms 3680.3 MiB 4924.0 MiB
64K/16K P2P 40.015 / 39.869 / 40.259 ms 132.973 / 132.079 / 133.532 ms 92.957 ms 3692.3 MiB 4916.0 MiB
128K/32K Ulysses 100.589 / 99.538 / 101.233 ms 311.687 / 309.306 / 314.530 ms 211.097 ms 7274.4 MiB 9860.0 MiB
128K/32K P2P 79.682 / 79.167 / 79.893 ms 281.569 / 280.434 / 282.688 ms 201.887 ms 7286.4 MiB 9716.0 MiB

Backward estimate = Fwd+Bwd median - Forward median,只用于宏观拆分,不等价于独立计时。

Global seq P2P Forward 加速 P2P Fwd+Bwd 加速 allocated 差值(P2P-Ulysses)
32K 19.6% 14.4% +12.0 MiB
64K 12.6% 17.0% +12.0 MiB
128K 20.8% 9.7% +12.0 MiB

三个长度下 P2P 均更快。allocated 固定多约 12 MiB,随序列增长后占比迅速下降;reserved
并未更高。收益不随序列单调增长,原因是 local GDN tiling、Ulysses all-to-all 和 P2P
summary/backward 各部分占比都会随 local chunk 数变化。

5.4 CP8 扩展性能与显存

Global/local seq Mode Forward median/min/p90 Fwd+Bwd median/min/p90 Backward estimate Peak allocated Peak reserved
64K/8K Ulysses 30.680 / 27.362 / 32.030 ms 98.427 / 97.544 / 99.281 ms 67.747 ms 1947.9 MiB 2740.0 MiB
64K/8K P2P 20.417 / 20.302 / 20.507 ms 67.336 / 66.817 / 67.618 ms 46.920 ms 1895.8 MiB 2486.0 MiB
128K/16K Ulysses 64.016 / 63.588 / 64.787 ms 279.313 / 276.145 / 280.709 ms 215.297 ms 3808.5 MiB 5350.0 MiB
128K/16K P2P 46.063 / 44.509 / 46.727 ms 151.257 / 148.916 / 153.277 ms 105.193 ms 3692.3 MiB 4916.0 MiB
Global seq P2P Forward 加速 P2P Fwd+Bwd 加速 allocated 差值(P2P-Ulysses)
64K 33.5% 31.6% -52.1 MiB
128K 28.0% 45.8% -116.2 MiB

固定 local sequence 的弱扩展:

Local seq Mode CP4 → CP8 Forward CP4 → CP8 Fwd+Bwd
8K P2P +3.9% +2.3%
8K Ulysses +25.6% +28.0%
16K P2P +15.1% +13.8%
16K Ulysses +39.8% +74.3%

P2P 保持每个 rank 的完整 32 个 GDN heads,CP 增长主要增加较小的 state-summary apply
和状态传递链。Ulysses 在 CP8 将 32 个 repeated heads 切到每 rank 4 heads,降低 fused GDN
kernel 的 head 并行度,同时增加前反向 all-to-all,因此 CP8 下扩展损失明显更大。

6. 四层 Qwen3.5 整网验证

6.1 模型、数据与并行拓扑

Qwen3.5 dense, 4 layers
layer types = [linear, linear, linear, full]
hidden = 2048
intermediate = 6144
QK/V heads = 16/32
head dim = 128
dtype = BF16
optimizer = AdamW
learning rate = 1e-4
weight decay = 0.01

每一步从真实 token 数据流读取不同序列,学习率非零;reference 与候选各自执行
forward、backward 和 optimizer update。

主精度报告覆盖两种 FSDP+CP 拓扑:

拓扑 总卡数 逻辑样本数/step 参数分片与验证目的
CP4(FSDP group=4)/100 steps 4 1 每层及 root 参数在 4-rank CP/loss group 上 fully shard
CP8(FSDP group=8)/200 steps 8 1 每层及 root 参数在 8-rank CP/loss group 上 fully shard,并验证七跳 P2P 链

这里的 CP4/CP8 均已开启 FSDP 参数分片。FSDP 复用对应的 CP/loss group:CP4 时
group size 为 4,CP8 时 group size 为 8。每个 rank 处理同一条样本的一个序列分片,
并持有参数 shard;它不是额外乘一个独立 DP 维度,因此也不需要 16/64 张卡。

6.2 多步 loss 与 grad norm 精度

下表同时给出 reference 数值量级、最大绝对误差和最大相对误差:

Topology Mode Steps Reference loss range Max loss abs Max loss rel Reference grad-norm range Max grad-norm abs Max grad-norm rel
CP4(FSDP group=4) Ulysses 100 5.573–8.448 2.6097e-3 3.6715e-4 2.052–4.545 1.7036e-2 3.7480e-3
CP4(FSDP group=4) P2P 100 5.573–8.448 2.6107e-3 3.6729e-4 2.052–4.545 1.8070e-2 3.9756e-3
CP8(FSDP group=8) Ulysses 200 5.799–8.448 2.6898e-3 3.7746e-4 2.072–3.169 1.7224e-2 3.7883e-3
CP8(FSDP group=8) P2P 200 5.799–8.448 2.6526e-3 3.7223e-4 2.072–3.169 1.7531e-2 3.8563e-3

CP8 为减少日志量只定期打印 step,但上述最大误差在全部 200 步逐步更新;range 表示已记录
reference 的观测范围。

两种模式的 loss 最大相对误差均低于 4e-4。CP4/CP8 的 grad norm 约为 2–4.5,最大绝对
差约为 0.017–0.018,对应最大相对差约 0.38%–0.40%。少数 step 未满足最初预设的
1e-3 max-grad 判据,但 Ulysses 与 P2P 的幅度相同,且 100/200 步均无 NaN/Inf、无持续
扩大,因此不是 P2P 状态递推特有误差。平均 grad-norm relative diff 约为 2.3e-4

AllGather eager 额外完成 10 步功能回归:

max_loss_abs      = 6.5422e-4
max_loss_rel      = 8.1859e-5
max_grad_norm_abs = 6.3348e-4
max_grad_norm_rel = 2.8675e-4

6.3 CP4(FSDP group=4)整网性能与显存

计时覆盖模型 forward,或 cross entropy + 完整 backward + FSDP root backward hook;
无 activation checkpoint。

Global/local seq Mode Forward median/min/p90 Fwd+Bwd median/min/p90 Global tokens/s Peak allocated Peak reserved
8K/2K Ulysses 44.702 / 40.970 / 45.755 ms 140.436 / 136.671 / 144.270 ms 58332 2299.1 MiB 2820.0 MiB
8K/2K P2P 45.742 / 45.371 / 46.589 ms 135.489 / 131.782 / 141.823 ms 60463 2263.4 MiB 2692.0 MiB
16K/4K Ulysses 57.754 / 57.438 / 59.125 ms 198.460 / 197.207 / 199.461 ms 82556 4048.0 MiB 4844.0 MiB
16K/4K P2P 57.009 / 56.320 / 59.884 ms 189.960 / 189.007 / 191.406 ms 86250 3964.0 MiB 4764.0 MiB
Global seq P2P Forward P2P Fwd+Bwd Throughput Peak allocated
8K 慢 2.3% 快 3.5% 高 3.7% 低 35.7 MiB
16K 快 1.3% 快 4.3% 高 4.5% 低 84.0 MiB

完整 optimizer step 额外覆盖 zero_grad + forward + loss + backward + FSDP reduce + AdamW.step

Global seq Run Ulysses median/min/p90 P2P median/min/p90 P2P 收益
8K 1 168.855 / 156.113 / 183.415 ms 154.029 / 149.680 / 159.343 ms 8.8%
8K 2 160.484 / 157.707 / 163.556 ms 155.676 / 152.605 / 161.796 ms 3.0%
16K 1 217.475 / 214.653 / 222.585 ms 209.087 / 206.714 / 211.343 ms 3.9%

8K 第一轮 Ulysses 的 p90 波动较大,因此增加第二轮对称复测。结论应引用 3.0%–8.8%
实测区间,不能只引用第一轮。整网收益低于完整单层,是因为模型还包含 1 层 full attention、
4 层 MLP/norm、embedding、lm_head、loss 和 FSDP 公共开销。

为区分“序列长度”和“模型层数”两个变量,进一步在当前提交上固定 CP4、
global/local sequence=64K/16K、BF16、hidden=2048、Linear/Full=3:1、无 activation
checkpoint、rank-max、warmup=5/repeat=20,分别复测 4 层和 8 层模型。8 层测试进一步
将 Fwd+Bwd 放在独立进程中采样,避免先测 forward 留下的编译/HCCL workspace 干扰显存:

Layers Layer composition Mode Fwd+Bwd median/min/p90 Global tokens/s Peak allocated
4 3 Linear + 1 Full Ulysses 854.047 / 851.405 / 855.557 ms 76736 15986.9 MiB
4 3 Linear + 1 Full P2P 778.644 / 776.155 / 921.741 ms 84167 15614.9 MiB
8 6 Linear + 2 Full Ulysses 1686.321 / 1680.936 / 1690.159 ms 38863 30196.3 MiB
8 6 Linear + 2 Full P2P 1529.381 / 1523.421 / 1531.952 ms 42851 29452.2 MiB
Layers P2P Fwd+Bwd time reduction Throughput increase Peak allocated reduction
4 8.83% 9.68% 372.0 MiB / 2.33%
8 9.31% 10.26% 744.1 MiB / 2.46%

4 层 P2P 的 p90 受到同机其他任务启动时的三个慢样本影响,但 median/min 分别为
778.644/776.155 ms,optimizer-step median 为 783.762 ms,均得到约 9% 的一致收益;
因此主结论使用抗离群值的 rank-max median,不使用这次 p90 推断稳定性。

这组同代码、同长度结果表明,历史约 9.1% 并不是“8 层累积”才出现的收益:4 层与
8 层都稳定在约 9%。固定 3:1 层型比例时,模型加深会同时增加 Linear Attention 和
Full Attention,P2P 可节省部分与整网总时间近似同比增长,因此相对收益本来就应接近;
8 层只会进一步摊薄 embedding、lm_head、loss 和 FSDP root 等一次性开销。历史结果中
4 层或 8 层谁略高不到 1 个百分点,可能来自 kernel 调度、共享负载和统计波动,不能解释为
层数带来的结构性反转。

绝对时间也支持这一判断:4 层时 P2P 节省 75.403 ms,8 层时节省 156.940 ms,后者为
前者的 2.081x;与此同时 Ulysses/P2P 的整网时间分别增长为 1.974x/1.964x。若仅用
这两个点作线性分解,可写为 T_ulysses ~= 21.77 + 208.07 * layers
T_p2p ~= 27.91 + 187.68 * layers(单位 ms)。它说明 P2P 有约 6.14 ms 的额外固定开销,
但每增加一层平均少约 20.38 ms;模型加深后相对收益只会从 4 层的 8.83% 缓慢趋近约
9.8%,不会随层数翻倍。该两点模型只用于解释本组数据,不用于外推其他 sequence/CP 配置。

此前 4 层 8K/16K 只快 3.5%/4.3%,真正变化的是序列长度。短 local sequence=2K/4K
时,P2P summary、状态 apply 和通信调度的固定成本占比较高,Ulysses 大张量 all-to-all 与
小-head fused-kernel 代价尚未充分放大,同时整网公共计算占比更高。到 local sequence=16K
后,当前正式分支单个 Linear Attention 层的 P2P Fwd+Bwd 已比 Ulysses 快 17.0%;三个
Linear 层的绝对节省足以在 4 层整网中留下 8.83%,而不是被公共计算完全稀释。

历史 8 层 CP4/64K 的 1695.629 -> 1540.577 ms9.1%)也被当前复测的
1686.321 -> 1529.381 ms9.31%)复现。两轮绝对时间相差不足约 1%,说明当前正式分支
与历史长序列性能结论一致。收益不应按层数线性相加;应比较节省的绝对时间占完整整网时间的
比例,并始终保持序列长度、层型比例、checkpoint 和计时口径一致。

6.4 CP8(FSDP group=8)整网性能与显存

CP8 使用 global/local sequence=128K/16K,与上一节 CP4/64K 保持每 rank local sequence
和模型 shape 不变,只将 CP size 从 4 增至 8。Fwd+Bwd 在独立进程中采样,计时仍为
rank-max、warmup=5/repeat=20

Layers Layer composition Mode Forward median/min/p90 Fwd+Bwd median/min/p90 Global tokens/s Peak allocated
4 3 Linear + 1 Full Ulysses 338.300 / 336.268 / 339.827 ms 1151.401 / 1136.448 / 1225.878 ms 113837 15645.2 MiB
4 3 Linear + 1 Full P2P 286.702 / 284.926 / 288.565 ms 967.863 / 963.211 / 971.105 ms 135424 15273.2 MiB
8 6 Linear + 2 Full Ulysses 673.660 / 671.016 / 676.486 ms 2276.529 / 2265.003 / 2281.391 ms 57575 30068.0 MiB
8 6 Linear + 2 Full P2P 568.868 / 566.740 / 570.243 ms 1915.960 / 1906.424 / 1922.836 ms 68411 29324.0 MiB
Layers P2P Forward time reduction P2P Fwd+Bwd time reduction Throughput increase Peak allocated reduction
4 15.25% 15.94% 18.96% 372.0 MiB / 2.38%
8 15.56% 15.84% 18.82% 744.0 MiB / 2.47%

固定 local sequence 从 CP4 扩展到 CP8:

Layers Ulysses Fwd+Bwd growth P2P Fwd+Bwd growth
4 34.82% 24.30%
8 35.00% 25.28%

CP8 下 Ulysses 仍需更大规模的前反向 all-to-all,并将 32 个 repeated GDN heads 切到每
rank 4 heads,fused kernel 的 head 并行度进一步下降。因此在相同 local workload 下,
Ulysses 的整网时间稳定增长约 35%。P2P 保持每 rank 完整 heads,只增加状态链 hop 数,
所以增长较小,P2P 相对收益从 CP4 的约 9% 扩大到 CP8 的约 15.9%

8 层 CP8 的早期轮次曾出现 Ulysses 2730.649 ms、P2P p90 6401.113 ms 等异常长尾。
在确认无其他 NPU 进程后,重新输出全部 20 个 rank-max 样本:Ulysses forward 稳定在
671.016--678.263 ms,P2P forward 稳定在 566.740--578.844 ms,P2P Fwd+Bwd 稳定在
1906.424--1924.061 ms。表中只使用这组逐样本可审计的稳定复测,不使用异常轮次。

4 层与 8 层的显存差值分别为约 372/744 MiB,随 Linear Attention 层数近似成比例;
相对降幅都约 2.4%。CP4 到 CP8 保持 local sequence 不变后,两种模式的 per-rank peak
allocated 基本不变,符合 CP 将新增全局 token 分摊到新增 rank、而非增加单 rank 激活规模的
预期。

6.4.1 为什么单层收益进入整网后会下降

第 5 章的“完整单层”实际是一个完整 Qwen3_5GatedDeltaNet 模块,包含 projection、Conv、
GDN、gate/norm 和 output projection,但不包含 Transformer block 的 residual/norm/MLP,
也不包含 Full Attention、embedding、lm_head、cross entropy、FSDP 参数通信和 optimizer。
因此单层百分比不能直接作为整网百分比相加。

CP4/64K 下,单个 GDN 模块 Fwd+Bwd 从 160.283 降至 132.973 ms,节省
27.310 ms。4 层模型包含三个 Linear Attention,按单层估算节省 81.930 ms;整网实测
节省 75.403 ms,保留了约 92% 的绝对单层收益。整网百分比仍从单层 17.0% 降到
8.83%,是因为分母从一个 GDN 模块扩展成了包含 MLP、Full Attention、loss 和 FSDP 的
完整模型。这是标准的 Amdahl 稀释,不表示 P2P kernel 本身退化了一半。

CP8/128K 可以进一步拆成 forward 与 backward:

Stage Isolated one-GDN saving 4-layer expected for 3 GDN 4-layer measured saving Retained
Forward 17.953 ms 53.859 ms 51.598 ms 95.8%
Backward estimate 110.104 ms 330.312 ms 131.940 ms 40.0%

forward 中,三个 Linear Attention 的绝对收益几乎完整传递到整网;整体 forward 加速仍只有
15.25%,因为约 43% 的 Ulysses forward 时间属于不可由 Linear Attention P2P 优化的公共
部分。主要非线性损失发生在 backward:孤立模块用随机 output gradient 直接启动 backward,
没有 FSDP reduce-scatter、上游 MLP/Full Attention 和层间 collective;整网中 P2P 产生的
rank-ready skew 会在这些同步边界暴露为等待,且 P2P/HCCL 与 FSDP collective 共用通信资源。
因此孤立模块的 backward 节省不能按三倍直接累加。

上述 backward 原因是基于绝对时间分解得到的定位结论;要把约 198 ms 的未保留收益进一步
归因到 state-gradient chain、FSDP reduce-scatter 或 Full Attention barrier,需要补一组
CP8 四层整网 Level0 trace。它不影响当前结论:稳定整网收益约 15.9%,而“单层约 20% 到
整网约 9%”主要由公共计算分母稀释,CP8 额外包含 backward 层间同步效应。

6.5 Full activation checkpoint 验证

前述主精度与性能表使用 activation_checkpoint=off。为覆盖训练时常用的整层激活重计算,
本轮使用完全相同的模型、数据、FSDP 拓扑和优化器,额外设置:

train.gradient_checkpointing.activation_checkpoint = "full"

Hyper-Parallel 使用 non-reentrant checkpoint 包装每个 Decoder Layer。开启后,GDN custom
autograd function 在正常前向执行一次,并在 backward-time layer recompute 中再执行一次;
原始 custom backward 仍只执行一次。因此 P2P 每个 optimizer step 会执行两次正向 state
chain 和一次反向 state-gradient chain,CP8 对应在 backward 中重放七跳正向链。

多步精度结果如下:

Topology Mode Steps Max loss abs Max loss rel Max grad-norm abs Max grad-norm rel
CP4(FSDP group=4) Ulysses 100 2.6894e-3 3.7835e-4 1.5767e-2 3.4677e-3
CP4(FSDP group=4) P2P 100 2.6560e-3 3.7270e-4 1.6611e-2 3.6539e-3
CP8(FSDP group=8) Ulysses 200 2.8358e-3 3.9793e-4 2.3049e-2 6.1685e-3
CP8(FSDP group=8) P2P 200 2.7986e-3 3.9372e-4 1.8378e-2 4.0434e-3

四组轨迹均完成全部 optimizer steps,无死锁、P2P 顺序错配、NaN/Inf 或误差持续扩大。
表中误差是各 CP/FSDP 路径相对单卡参考的并行数值误差,不能解释成 activation checkpoint
引入的误差。不同独立运行取到的最大值也不能直接作为 checkpoint-off/full 的配对差值。

为直接验证重计算是否改变数值,另在 CP4/P2P 下设置
HCCL_DETERMINISTIC=Truetorch.use_deterministic_algorithms(True),固定模型、数据、seed
及优化器,执行以下配对检查:

  1. checkpoint-off 独立重复两次;
  2. checkpoint-full 独立重复两次;
  3. checkpoint-off 与 checkpoint-full 逐 step 比较。

10 步内三组比较的 CP loss、CP grad norm、相对单卡误差和最终 summary 均逐打印位完全一致。
这说明当前 P2P Triton 路径在该配置下可确定复现,full checkpoint 的 backward-time forward
重放没有改变 output、gradient 或 optimizer trajectory。此前 off/full 表中最大误差的轻微差异
来自非配对独立运行及其最大值统计口径,不能归因于 checkpoint,也没有证据表明 summary
Triton 算子不支持确定性。

长序列性能与显存结果如下。checkpoint-off 数据来自第 6.3/6.4 节的同 shape 稳定复测:

Topology Activation checkpoint Ulysses Fwd+Bwd P2P Fwd+Bwd P2P time reduction Ulysses peak allocated P2P peak allocated
CP4, global/local=64K/16K off 854.047 ms 778.644 ms 8.83% 15986.9 MiB 15614.9 MiB
CP4, global/local=64K/16K full 1082.048 ms 990.121 ms 8.50% 5602.3 MiB 5478.3 MiB
CP8, global/local=128K/16K off 1151.401 ms 967.863 ms 15.94% 15645.2 MiB 15273.2 MiB
CP8, global/local=128K/16K full 1481.585 ms 1248.249 ms 15.75% 5490.1 MiB 5366.1 MiB

整层重算使 CP4 的 Ulysses/P2P Fwd+Bwd 分别增加 26.70%/27.16%,CP8 分别增加
28.68%/28.97%,对应重跑一次 Decoder Layer forward 的预期代价。两种拓扑下 peak
allocated 均下降约 64.9%。P2P 相对收益只从 8.83%/15.94% 变为
8.50%/15.75%,表明 activation checkpoint 没有破坏 P2P 的性能优势或弱扩展趋势。

测试启动时还验证了 Triton 动态库环境:torchrun 子进程必须保证当前 Python 环境的
libstdc++ 位于 LD_LIBRARY_PATH 首位;否则加载系统 /usr/lib64/libstdc++.so.6 会因缺少
GLIBCXX_3.4.29 导致 capability fail-fast。修正动态库顺序后,输入 contract 和 Triton
backend 判定均通过。

7. Level0 Profile 与稳定性

CP4/64K 的 Ulysses Triton 与 P2P Triton 各采集一次 Level0 前反向 trace。Level0 关闭
AIC metrics、shape 和 stack 收集;profile elapsed 不进入第 5 章正式性能表。

Mode Rank Computing Communication Comm not overlapped Comm overlapped
P2P 0 118.75 ms 12.21 ms 12.07 ms 0.14 ms
P2P 1 129.59 ms 15.57 ms 5.74 ms 9.83 ms
P2P 2 129.62 ms 14.66 ms 4.79 ms 9.87 ms
P2P 3 121.63 ms 12.44 ms 12.32 ms 0.12 ms
Ulysses 0 144.35 ms 18.41 ms 18.41 ms 0
Ulysses 1 145.26 ms 17.31 ms 17.31 ms 0
Ulysses 2 146.06 ms 16.52 ms 16.52 ms 0
Ulysses 3 143.63 ms 16.71 ms 16.71 ms 0

P2P 中间 rank 约 9.8 ms communication 被设备计算覆盖,边界 rank 的通信主要体现为状态
等待;Ulysses 的序列/头布局转换在该 trace 中为非重叠通信。单个 P2P HcclSend device
self duration 约 0.12–0.14 ms,说明状态 tensor 传输带宽不是主要瓶颈,后续优化重点应是
state-ready chain 和 summary/gradient-summary 计算。

每个分布式 mode 连续执行至少 20 次前反向,未观察到 P2P 顺序错配、async buffer 生命周期
错误、死锁、NaN/Inf 或显存持续增长。

8. PR 可引用结论

  1. 单卡 GDN 在 S=8K/16K/32K,H=32,dk=dv=128,BF16 下完成 eager/Triton
    前反向对齐;output、final state、dq/dk/dv/dg/dbeta/dH0 最差 relative-L2 为
    5.86e-3,且误差不随序列长度增长。
  2. 单卡 GDN Triton 相对 eager 的 Fwd+Bwd 加速为 8K 12.65×、16K 22.37×
    32K 40.08× 和 64K 74.17×,incremental peak allocated 均降低约 3.84×
    64K 只补测性能和显存;这些结果是 GDN core 收益,不代表整层收益。
  3. CP4 完整 Linear Attention 层覆盖 8K/32K、padding mask、output、input gradient、
    parameter gradient 和 global grad norm。Ulysses Triton、P2P Triton 和 AllGather eager
    均通过,P2P 与 Ulysses 的误差几乎逐项一致。
  4. 四层 Qwen3.5 在真实 token stream、BF16、AdamW 和非零学习率下完成 CP4/100 步和
    CP8/200 步轨迹。loss 最大相对误差低于 3.8e-4,无 NaN/Inf 或持续漂移;两种 mode
    的 max grad-norm relative diff 均约 3.8e-3–4.0e-3,不是 P2P 特有偏差。
  5. CP4/CP8 整网测试均启用 FSDP:参数分别在 4-rank/8-rank CP/loss group 上 fully shard,
    并完成对应的 SUM reduce-scatter 和 optimizer update。
  6. 完整单层中,P2P 相对 Ulysses 的 Fwd+Bwd 加速为 CP4/32K 14.4%、CP4/64K
    17.0%、CP4/128K 9.7%、CP8/64K 31.6%、CP8/128K 45.8%
  7. 四层整网 CP4 短序列 8K/16K 中,P2P 的端到端 Fwd+Bwd 加速为 3.5%/4.3%
    global/local sequence=64K/16K 时,4 层和 8 层整网分别加速 8.83%/9.31%,证明
    历史约 9.1% 主要对应长序列 workload,而不是只由模型加深产生。
  8. 保持 local sequence=16K 扩展到 CP8/global sequence=128K 后,4 层 P2P
    Fwd+Bwd 加速 15.94%,8 层逐样本稳定复测加速 15.84%;对应 forward 分别加速
    15.25%/15.56%,P2P peak allocated 均比 Ulysses 低约 2.4%
  9. CP4/64K Level0 显示单次 P2P send 约 0.12–0.14 ms,中间 rank 存在计算通信重叠;
    P2P 后续优化应优先面向 state summary,而不是继续优化很小的状态传输。
  10. CPU UT、fail-fast、wheel 隔离安装和文件入包检查均通过,Triton 不支持条件不会静默回退。
  11. Full activation checkpoint 下,CP4/100 步和 CP8/200 步均完成;P2P 在 backward-time
    recompute 中稳定重放三跳/七跳正向状态链。整网 peak allocated 下降约 64.9%,P2P
    相对 Ulysses 的 Fwd+Bwd 收益仍为 CP4 8.50%、CP8 15.75%
likedislike
xu-xianliangxu-xianliang
8月6日 关联了pull request:feat: add fused GDN backend for linear attention CP
xu-xianliangxu-xianliang
8月6日 修改标题为 “Linear Attention CP 融合算子 PR #1114测试报告”,原标题为“Linear Attention CP 融合算子 PR 1114测试报告”
xu-xianliangxu-xianliang
8月6日 修改了issue 的描述
xu-xianliangxu-xianliang
8月6日 修改了issue 的描述