已关闭
[Bug]: Ascend 310P CGDR FP16 beta Cast 地址重叠导致 NaN #435
yuuray79创建于 8月25日关闭于 8月25日
8月25日 关联组件 由 [] 改变为 [B-SIG-OPS]
8月25日 关联分支 由 [] 改变为 [master]
8月25日 问题后端类型 由 [] 改变为 [Ascend]
8月25日 关联了pull request:[MS][LITE][ASCEND] fix CGDR beta cast buffer overlap
8月25日 关闭了 issue
8月25日 issue状态由 TODO 改变为 DONE
Checklist
🐞 问题详细描述
问题现象
Ascend 310P 的 ChunkGatedDeltaRule 在 Qwen3.5-4B 典型 GQA 输入下产生 NaN/Inf,主要集中在偶数 value head。
最小复现规格
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 直调结果:
NaN 集中在 value head 0、2、4……30,奇数 head 无 NaN。
详细的环境信息描述
其他辅助信息
根因位于:
tools/custom_kernels/ascend_ops/src/ascend_300iduo/chunk_gated_delta_rule/op_kernel/chunk_gated_delta_rule.hLoadChunkCoefficients加载 beta 时,使用chunkVFp32的同地址 FP16 视图作为 Cast 输入,再将 FP16 扩宽写回同一地址。写出的 FP32 会覆盖尚未读取的 FP16 数据,导致 beta 损坏。修复方案是使用当前阶段空闲且容量相同的
chunkAttnOutFp32暂存 FP16 beta,使 Cast 的源、目标 UB 完全分离。修复后相同规格下 output 和 final_state 均无 NaN/Inf,并与 CPU recurrence 对齐:
版本信息
受影响版本:当前 master 中 Ascend 310P ChunkGatedDeltaRule 实现。
复现环境为 CANN 8.5.0。修复不改变算子接口、tiling data ABI、属性含义或输出布局。
Thanks for contributing 🎉!