BNInferGrad 的 Ascend950 kernel 与 GEIR Golden 存在计算语义不一致:
sqrt(abs(batch_variance + epsilon))
abs
batch_variance + epsilon < 0
(scale * rsqrt) * grads
GEIR Excel Level1 前 200 条用例在修复前表现为 99 PASS、101 FAIL,失败主要为 NaN/Inf 不一致。
cann/ops-nn
norm/bn_infer_grad
/home/ylj/cann/ops-test-kit
BNInferGrad.xlsx
custom_nn
grads * scale / sqrt(abs(batch_variance + epsilon))
precision_status
batch_variance + epsilon
BNInferGrad kernel 应与 GEIR Golden 保持一致:
修复后验证结果:
.o
acc8e51c8e0d4294713bb09e15935e9b4e863685
修复 PR:https://gitcode.com/cann/ops-nn/merge_requests/9432
本次仅修改 norm/bn_infer_grad/op_kernel/arch35/bn_infer_grad.h,不改变接口、tiling、dtype 或 format 支持范围。
norm/bn_infer_grad/op_kernel/arch35/bn_infer_grad.h
/assign
Describe the current behavior / 问题描述 (Mandatory / 必填)
BNInferGrad 的 Ascend950 kernel 与 GEIR Golden 存在计算语义不一致:
sqrt(abs(batch_variance + epsilon))计算,原 kernel 缺少abs,当batch_variance + epsilon < 0时 NPU 输出 NaN,而 Golden 为有限值。(scale * rsqrt) * grads会在 FP32 中间步骤先溢出;GEIR NumPy 计算的中间值可提升为 float64,因此最终结果仍可能可表示。GEIR Excel Level1 前 200 条用例在修复前表现为 99 PASS、101 FAIL,失败主要为 NaN/Inf 不一致。
Environment / 环境信息 (Mandatory / 必填)
cann/ops-nnnorm/bn_infer_grad/home/ylj/cann/ops-test-kitBNInferGrad.xlsx, Level1 rows 2-201Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)
custom_nn自定义算子包。BNInferGrad.xlsx的 Level1 rows 2-201 原序转换为 TTK kernel CSV。grads * scale / sqrt(abs(batch_variance + epsilon))。precision_status。batch_variance + epsilon用例可观察到原 NPU 输出 NaN、GEIR Golden 输出有限值;对乘法极值用例可观察到中间溢出差异。Describe the expected behavior / 预期结果 (Mandatory / 必填)
BNInferGrad kernel 应与 GEIR Golden 保持一致:
batch_variance + epsilon先取绝对值再开方。Related log / screenshot / 日志 / 截图 (Mandatory / 必填)
修复后验证结果:
.o,12 个子 kernel,安装包生成成功。acc8e51c8e0d4294713bb09e15935e9b4e863685Special notes for this issue/备注 (Optional / 选填)
修复 PR:https://gitcode.com/cann/ops-nn/merge_requests/9432
本次仅修改
norm/bn_infer_grad/op_kernel/arch35/bn_infer_grad.h,不改变接口、tiling、dtype 或 format 支持范围。