Closed
[Bug-Report|缺陷反馈]: MoeGatingTopk融合算子sigmoid计算结果与aclnnSigmoid小算子计算结果存在舍入偏差 #6944
Orange_JZAdd on  10 days agoClosed at  9 days ago
Orange_JZ
10 days ago Create

Describe the current behavior / 问题描述 (Mandatory / 必填)

在模型网络中,npu_moe_gating_top_k融合算子接入后,相较基线,模型训练首步grad_norm误差变大。

Environment Information / 环境信息 (Mandatory / 必填)

Ascend 950PR
CANN 9.2.0

Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)

从整网中收集该case下的算子输入,构造 融合算子vs小算子 对比示例,复现该问题

初步分析:在某些特殊输入下,aclnnSigmoid小算子计算结果 和 gating_topk融合算子中的sigmoid计算 有1ulp差异,导致在后续topk选择上,选择了两个不同的专家,误差放大至整网。

npu_moe_gating_top_k 的融合计算与模型接入前的
torch.sigmoid + bias + torch.topk + gather 路径不是 bitwise 等价。

当前用例中,融合算子 norm_out 的一个 FP32 sigmoid 结果比
torch.sigmoid 小 1 ULP:

0.9126850963 - 0.9126850367
= 5.9604644775e-08

对于一般连续计算,这个绝对误差通常很小;但 MoE top-k 是离散决策。
该元素恰好位于 top-10 边界,1 ULP 误差打破了原有平局,使第 10 个
expert 从 122 翻转为 472。路由变化随后被放大为不同的 expert dispatch、
路由权重、前向结果和反向梯度。

Describe the expected behavior / 预期结果 (Mandatory / 必填)

融合算子计算结果与小算子一致

测试环境:

torch=2.13.0+cpu
torch_npu=2.13.0
device=npu:0
input shape=(1, 512)
input dtype=torch.float32
top_k=10

当前算子输出:

reference_ids=[0, 1, 2, 3, 4, 5, 6, 7, 8, 122]
fused_ids    =[0, 1, 2, 3, 4, 5, 6, 7, 8, 472]
ids_bitwise_equal=False
scores_bitwise_equal=False score_max_abs=5.9604644775e-08 differing_scores=1

expert=122
ref_sigmoid=0.9126850963
fused_norm_out=0.9126850367
ref_rank=0.9365829229
fused_rank=0.9365828633

expert=472
ref_sigmoid=0.8373924494
fused_norm_out=0.8373924494
ref_rank=0.9365829229
fused_rank=0.9365829229

selected_weight_sum: reference=9.9122762680 fused=9.8369836807
abs_diff=0.0752925873

routed_vector_max_abs=0.9126850963
proxy_grad_max_abs=0.1361663342
proxy_grad_norm: reference=0.0796911195 fused=0.1361664087

Special notes for this issue/备注 (Optional / 选填)

likedislike
Orange_JZ
10 days ago Comments:
周云飞周云飞Collaborators
10 days ago Assign ZhouChuping as responsible person
CANN-robotCANN-robotCollaborators
9 days ago Close issue
CANN-robotCANN-robotCollaborators
9 days ago Added label: resolved