已关闭
[Bug-Report|缺陷反馈]: DVM图模式SiLU BF16与ACLNN精度不一致 #4543
SorryNaCN创建于 9月3日关闭于 12 天前
9月3日 添加了label:triage-review
TorchNPU-Bot
9月3日 评论:
9月3日 评论:
issue待分派,添加triage-review标签


9月3日 添加了label:bot-triaged;删除了label:triage-review
TorchNPU-Bot
9月3日 评论:
9月3日 评论:
检测到当前 issue 已关联 PR,自动添加标签:bot-triaged


9月3日 关联了pull request:[bugfix][v2.7.1] 修复DVM SiLU BF16精度不一致
9月3日 关联了pull request:[bugfix][v2.10.0] 修复DVM SiLU BF16精度不一致
9月3日 关联了pull request:[bugfix][v2.11.0] 修复DVM SiLU BF16精度不一致
9月3日 关联了pull request:[bugfix][v2.12.0] 修复DVM SiLU BF16精度不一致
9月3日 关联了pull request:[bugfix][master] 修复DVM SiLU BF16精度不一致
9月4日 关联了pull request:[bugfix][v2.7.1-26.1.0] 修复DVM SiLU BF16精度不一致
9月4日 关联了pull request:[bugfix][v2.9.0-26.1.0] 修复DVM SiLU BF16精度不一致
9月8日 关联了pull request:[bugfix][v2.10.0-26.1.0] 修复DVM SiLU BF16精度不一致
chenrayray
12 天前 评论:
12 天前 评论:
因为本单相关实施 PR 已全部结束(9 个已合入、0 个已关闭),按照本轮 issue 整理规则,先关闭此单。
核对的 PR:
- pytorch !45689:已合入
- pytorch !45729:已合入
- pytorch !45730:已合入
- pytorch !45731:已合入
- pytorch !45732:已合入
- pytorch !45733:已合入
- pytorch !45807:已合入
- pytorch !45808:已合入
- pytorch !46064:已合入
如仍有问题或需要继续推进,请重新打开,并补充当前 PyTorch / TorchNPU / CANN 版本、硬件环境、复现步骤及相关日志;需求类请补充尚未完成的具体内容。


12 天前 关闭了 issue
12 天前 issue状态由 TODO 改变为 DONE
12 天前 添加了label:resolved
问题描述
在 Ascend910B3 上使用 DVM 图模式执行 BF16 SiLU/SiLU backward 时,结果与原生 ACLNN 不一致。
x * (1 / (1 + exp(-x))),而 ACLNN 使用x / (1 + exp(-x))。浮点运算不满足结合律,两种写法在 BF16 下存在不同的舍入结果。silu_backward注册了CompositeImplicitAutograd。AOTAutograd 图模式的外层FunctionalTensorMode会在 DVM 显式 decomposition 命中前走 CIA 展开,展开计算未按照 ACLNN 的 opmath 路径升到 FP32,导致 BF16 精度不一致。期望结果
DVM 图模式下 BF16 SiLU forward/backward 与原生 ACLNN 位级一致。
修复方案
pw_cast_for_opmath将 BF16/FP16 输入升到 FP32 计算,输出再转换回原 dtype。silu_backward被 CIA 提前展开,使其进入 DVM 显式 decomposition。sigmoid和silu_backward使用aten.reciprocal(...),避免Tensor.__rdiv__引入冗余的reciprocal * 1.0。验证结果
CANN 9.1.0 Beta3、torch 2.9.0、torch_npu 2.9.0.post3、Ascend910B3 环境下,BF16 normal、特殊值和 uniform[-20, 20] 三组输入,每组 67591 个元素;SiLU forward/backward 相对原生 ACLNN 均为 0 mismatch,最大绝对误差为 0。