已开启
fused_moe 返回值硬编码 .to(torch.bfloat16),与输入 dtype 不一致时产生不必要的类型转换 #16
此账号已注销创建于  8月18日
8月18日 创建

在 components/omni-npu/src/omni_npu/layers/fused_moe/fused_moe.py 的 fused_moe 函数末尾(约第 107 行):

return torch_npu.npu_moe_finalize_routing(out, None, None, None, topk_weights,
                                          expanded_src_to_dst_row, topk_ids).to(torch.bfloat16)

这里直接对 npu_moe_finalize_routing 的输出做了 .to(torch.bfloat16),但函数输入 x 的 dtype 并不一定是 bfloat16。如果模型使用 float16 作为计算精度,这里会强制把输出转成 bfloat16,导致:

  1. 后续算子收到的 tensor dtype 与预期不一致,可能触发隐式类型转换,影响数值精度
  2. 多了一次额外的 dtype 转换开销(虽然单次开销不大,但在 MoE 层频繁调用的场景下累积可观)
  3. 如果上层调用者已经按输入 dtype 分配了输出 buffer,dtype 不匹配会导致报错

建议改为保持与输入一致的 dtype:

return torch_npu.npu_moe_finalize_routing(out, None, None, None, topk_weights,
                                          expanded_src_to_dst_row, topk_ids).to(x.dtype)

或者如果 npu_moe_finalize_routing 本身支持 dtype 保持,直接去掉 .to() 调用。

likedislike
glucat
glucat成员
8月20日 评论:

您好,openPangu-2.0模型仅支持BF16,当前代码对实际功能无影响。谢谢您的反馈!

likedislike