已开启
Linear Attention CP 融合算子 PR #1114测试报告 #320
xu-xianliang创建于 8月6日
8月6日 关联了pull request:feat: add fused GDN backend for linear attention CP
8月6日 修改标题为 “Linear Attention CP 融合算子 PR #1114测试报告”,原标题为“Linear Attention CP 融合算子 PR 1114测试报告”
8月6日 修改标题为 “Linear Attention CP 融合算子 PR #1114测试报告”,原标题为“Linear Attention CP 融合算子 PR 1114测试报告”
8月6日 修改了issue 的描述
8月6日 修改了issue 的描述
Linear Attention CP 融合算子 PR 测试报告
文档结构总览
本报告按照从算子到整网的验证层级组织,每一章均就地给出测试配置、方法、结果和结论,
不再将测试计划与测试结果拆开放置。
1. 测试目标与范围
测试对象为
linear_cp_fused分支提交9445b8b8ac19bc5c3f9125383adba4a6170319db。需要证明:
本 PR 覆盖的路径如下:
AllGather Triton、融合 Conv1D、自动 backend 回退均不在本 PR 功能范围内。
2. 环境与统一测试方法
2.1 软件与硬件环境
运行 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 精度指标
张量精度同时记录:
整网轨迹记录:
最大绝对误差与最大相对误差可能出现在不同 step,因此两者独立统计,不能简单相乘换算。
2.3 性能与显存口径
所有正式性能测试统一采用:
显存测试在 warmup 后重置 peak stats,记录所有 rank 的最大值。单卡 GDN 表使用
incremental peak allocated,即扣除输入和固定常驻张量后的算子增量峰值;CP/整网表使用完整进程的
peak allocated与peak reserved。两种口径不会混在同一张对比表中。3. Backend、兼容性与交付检查
3.1 Capability 与 fail-fast
目标生产 shape 的 Triton capability 检查通过。以下不支持条件均要求直接报错:
backend=autoall_gather + tritonhead_dim != 128chunk_size != 643.2 UT、静态检查与 wheel
wheel 完成隔离安装验证,并确认包含:
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 层的投影配置是:
进入 GDN core 前,16 个 Q/K heads 会按照分组关系复制到 32 个 V heads,因此 GDN kernel
实际接收的是:
所以本章表格中的
H=32与模型的QK/V=16/32并不矛盾:前者是 GDN core 的实际输入head 数,后者是 projection 输出的模型配置。
测试序列为 8K、16K 和 32K。每个长度覆盖:
initial_state=None,对 token output 施加随机dO;initial_state,同时对 output/final state 施加随机dO/dHT;output/final_state/dq/dk/dv/dg/dbeta/dH0。dO/dHT按张量规模归一化,避免序列增长只因 loss 求和尺度而放大梯度。4.2 精度结果
全部张量 finite。序列从 8K 增长到 32K 后,output、final state、
dH0和输入梯度误差没有系统性增长,最差 relative-L2 为
5.86e-3,低于1e-2验收阈值。4.3 正式性能与显存结果
测试对象为 stateful GDN,同时输出 token output 与 final state。首次 Triton 编译和 autotune
不计入稳态结果。
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 测试范围与配置
完整层覆盖:
基础配置为:
无 CP eager 层作为数学 reference。CP 模式比较 Ulysses Triton、P2P Triton 和
AllGather eager。第 4 章已独立验证 Triton GDN 与 eager 的误差,因此本章重点验证 CP
布局转换、Conv halo、状态传递、输出顺序和参数梯度。
5.2 CP4 完整层精度
无 padding 结果:
AllGather eager 在 8K 下的 global grad norm 同样 finite 且通过阈值;该次早期日志未输出精确
relative 数字,因此不构造缺失值。
尾部 padding 使用
B=2, global sequence=8192, valid_length=7777:这一配置专门覆盖真实训练中的变长样本和 batch padding,而不是为了增加一个任意 shape:
batch>1时进入实际 masking 分支,B=2因此既覆盖真实
[B,S]路径,也可发现错误广播或只处理第一条样本的问题;7777既不能被 CP4 的 local sequence2048整除,也不能被 GDN chunk size64整除,valid/padding 边界落在 rank3 的一个 GDN chunk 内部;
token 顺序、padding output 为零,以及整体输入/参数梯度与无 CP reference 一致;
P2P 与 Ulysses 的误差几乎逐项一致,说明三跳 forward state chain 和反向
state-gradient chain 没有额外放大 BF16/Triton 误差;32K 相比 8K 也没有误差增长。
5.3 CP4 性能与显存
Backward estimate = Fwd+Bwd median - Forward median,只用于宏观拆分,不等价于独立计时。三个长度下 P2P 均更快。allocated 固定多约 12 MiB,随序列增长后占比迅速下降;reserved
并未更高。收益不随序列单调增长,原因是 local GDN tiling、Ulysses all-to-all 和 P2P
summary/backward 各部分占比都会随 local chunk 数变化。
5.4 CP8 扩展性能与显存
固定 local sequence 的弱扩展:
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 模型、数据与并行拓扑
每一步从真实 token 数据流读取不同序列,学习率非零;reference 与候选各自执行
forward、backward 和 optimizer update。
主精度报告覆盖两种 FSDP+CP 拓扑:
这里的 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 数值量级、最大绝对误差和最大相对误差:
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-3max-grad 判据,但 Ulysses 与 P2P 的幅度相同,且 100/200 步均无 NaN/Inf、无持续扩大,因此不是 P2P 状态递推特有误差。平均 grad-norm relative diff 约为
2.3e-4。AllGather eager 额外完成 10 步功能回归:
6.3 CP4(FSDP group=4)整网性能与显存
计时覆盖模型 forward,或 cross entropy + 完整 backward + FSDP root backward hook;
无 activation checkpoint。
完整 optimizer step 额外覆盖
zero_grad + forward + loss + backward + FSDP reduce + AdamW.step: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、无 activationcheckpoint、rank-max、
warmup=5/repeat=20,分别复测 4 层和 8 层模型。8 层测试进一步将 Fwd+Bwd 放在独立进程中采样,避免先测 forward 留下的编译/HCCL workspace 干扰显存:
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 ms(9.1%)也被当前复测的1686.321 -> 1529.381 ms(9.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:固定 local sequence 从 CP4 扩展到 CP8:
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 p906401.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 peakallocated 基本不变,符合 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:
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 拓扑和优化器,额外设置:
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 中重放七跳正向链。
多步精度结果如下:
四组轨迹均完成全部 optimizer steps,无死锁、P2P 顺序错配、NaN/Inf 或误差持续扩大。
表中误差是各 CP/FSDP 路径相对单卡参考的并行数值误差,不能解释成 activation checkpoint
引入的误差。不同独立运行取到的最大值也不能直接作为 checkpoint-off/full 的配对差值。
为直接验证重计算是否改变数值,另在 CP4/P2P 下设置
HCCL_DETERMINISTIC=True和torch.use_deterministic_algorithms(True),固定模型、数据、seed及优化器,执行以下配对检查:
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 稳定复测:
整层重算使 CP4 的 Ulysses/P2P Fwd+Bwd 分别增加
26.70%/27.16%,CP8 分别增加28.68%/28.97%,对应重跑一次 Decoder Layer forward 的预期代价。两种拓扑下 peakallocated 均下降约
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 和 Tritonbackend 判定均通过。
7. Level0 Profile 与稳定性
CP4/64K 的 Ulysses Triton 与 P2P Triton 各采集一次 Level0 前反向 trace。Level0 关闭
AIC metrics、shape 和 stack 收集;profile elapsed 不进入第 5 章正式性能表。
P2P 中间 rank 约 9.8 ms communication 被设备计算覆盖,边界 rank 的通信主要体现为状态
等待;Ulysses 的序列/头布局转换在该 trace 中为非重叠通信。单个 P2P
HcclSenddeviceself duration 约
0.12–0.14 ms,说明状态 tensor 传输带宽不是主要瓶颈,后续优化重点应是state-ready chain 和 summary/gradient-summary 计算。
每个分布式 mode 连续执行至少 20 次前反向,未观察到 P2P 顺序错配、async buffer 生命周期
错误、死锁、NaN/Inf 或显存持续增长。
8. PR 可引用结论
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,且误差不随序列长度增长。12.65×、16K22.37×、32K
40.08×和 64K74.17×,incremental peak allocated 均降低约3.84×。64K 只补测性能和显存;这些结果是 GDN core 收益,不代表整层收益。
parameter gradient 和 global grad norm。Ulysses Triton、P2P Triton 和 AllGather eager
均通过,P2P 与 Ulysses 的误差几乎逐项一致。
CP8/200 步轨迹。loss 最大相对误差低于
3.8e-4,无 NaN/Inf 或持续漂移;两种 mode的 max grad-norm relative diff 均约
3.8e-3–4.0e-3,不是 P2P 特有偏差。并完成对应的 SUM reduce-scatter 和 optimizer update。
14.4%、CP4/64K17.0%、CP4/128K9.7%、CP8/64K31.6%、CP8/128K45.8%。3.5%/4.3%;global/local sequence=
64K/16K时,4 层和 8 层整网分别加速8.83%/9.31%,证明历史约
9.1%主要对应长序列 workload,而不是只由模型加深产生。16K扩展到 CP8/global sequence=128K后,4 层 P2PFwd+Bwd 加速
15.94%,8 层逐样本稳定复测加速15.84%;对应 forward 分别加速15.25%/15.56%,P2P peak allocated 均比 Ulysses 低约2.4%。0.12–0.14 ms,中间 rank 存在计算通信重叠;P2P 后续优化应优先面向 state summary,而不是继续优化很小的状态传输。
recompute 中稳定重放三跳/七跳正向状态链。整网 peak allocated 下降约
64.9%,P2P相对 Ulysses 的 Fwd+Bwd 收益仍为 CP4
8.50%、CP815.75%。