已关闭
[Bug]: Ascend 310P CGDR FP16 beta Cast 地址重叠导致 NaN #435
yuuray79创建于  8月25日关闭于  8月25日
yuuray79
yuuray79
8月25日 创建

Checklist

🐞 问题详细描述

问题现象

Ascend 310P 的 ChunkGatedDeltaRule 在 Qwen3.5-4B 典型 GQA 输入下产生 NaN/Inf,主要集中在偶数 value head。

最小复现规格

  • dtype:FP16
  • batch:1
  • T=64
  • Hqk=16
  • Hv=32
  • Dk=Dv=128
  • chunk_size=64
  • initial_state 全零
  • 固定随机种子 42
output, final_state = lite_ops.chunk_gated_delta_rule(
    query.half(),
    key.half(),
    value.half(),
    beta.half(),
    torch.zeros(1, 32, 128, 128, device="npu", dtype=torch.float16),
    actual_seq_lengths,
    g=g,
    scale_value=1.0 / (128 ** 0.5),
)

assert torch.isfinite(output).all()
assert torch.isfinite(final_state).all()

原版 Kernel 直调结果:

output_finite=False
final_state_finite=False
output_nan_total=124504
final_state_nan_total=230577
output_inf_total=2472
final_state_inf_total=23375

NaN 集中在 value head 0、2、4……30,奇数 head 无 NaN。

详细的环境信息描述

  • 硬件:Ascend 310P3
  • CANN:8.5.0(V100R001C25SPC001B232)
  • 操作系统:Linux aarch64
  • Python:3.10.21
  • PyTorch:2.9
  • torch_npu:2.9
  • LiteBoost:0.2.0
  • MindSpore Lite:master(83527bcc)

其他辅助信息

根因位于:

tools/custom_kernels/ascend_ops/src/ascend_300iduo/chunk_gated_delta_rule/op_kernel/chunk_gated_delta_rule.h

LoadChunkCoefficients 加载 beta 时,使用 chunkVFp32 的同地址 FP16 视图作为 Cast 输入,再将 FP16 扩宽写回同一地址。写出的 FP32 会覆盖尚未读取的 FP16 数据,导致 beta 损坏。

修复方案是使用当前阶段空闲且容量相同的 chunkAttnOutFp32 暂存 FP16 beta,使 Cast 的源、目标 UB 完全分离。

修复后相同规格下 output 和 final_state 均无 NaN/Inf,并与 CPU recurrence 对齐:

  • output cosine:0.999999881
  • output NRMSE:0.000462
  • final state cosine:0.999999940
  • final state NRMSE:0.000339
  • 完整测试:20 passed,13 skipped,0 failed

版本信息

受影响版本:当前 master 中 Ascend 310P ChunkGatedDeltaRule 实现。

复现环境为 CANN 8.5.0。修复不改变算子接口、tiling data ABI、属性含义或输出布局。

Thanks for contributing 🎉!

likedislike
yuuray79yuuray79
8月25日 关联组件 由 [] 改变为 [B-SIG-OPS]
yuuray79yuuray79
8月25日 关联分支 由 [] 改变为 [master]
yuuray79yuuray79
8月25日 问题后端类型 由 [] 改变为 [Ascend]
yuuray79yuuray79
8月25日 关联了pull request:[MS][LITE][ASCEND] fix CGDR beta cast buffer overlap
MindSpore-BotMindSpore-Bot成员
8月25日 关闭了 issue
MindSpore-BotMindSpore-Bot成员
8月25日 issue状态由 TODO 改变为 DONE