Pull Request已成功合入, 合并人@ascend-robot
(感谢 wangzili121 的贡献)变更摘要
此 PR 修复了 NPU Inductor 中 GELU 分解实现与 eager 模式行为不一致的问题。核心改动是在两个 GELU 分解文件中引入兼容模式检测逻辑,根据 NPU 是否启用兼容模式(are_compatible_impl_enabled)来决定 approximate="none" 时使用 tanh 近似还是 erf 精确路径,使 Inductor 的 GELU 正向/反向计算与 eager 端的 aclnnGelu/GeluV2 选择保持一致。
主要改动
-
新增
_npu_use_compatible_gelu_v2()辅助函数:在torch_npu/_inductor/decomposition.py和torch_npu/_inductor/dvm/decomp.py中分别添加了该函数,通过调用torch_npu.npu.are_compatible_impl_enabled()判断 eager 端是否使用GeluV2(兼容模式),用于指导 Inductor 选择合适的 GELU 路径。 -
gelu()前向计算增加 erf 分支:两个文件中的gelu()函数从原先仅支持 tanh 近似(0.5 * x * (1 + tanh(...)))扩展为双路径:兼容模式开启且approximate="none"时走 erf 精确路径(x * 0.5 * (1 + erf(x / sqrt(2)))),否则走 tanh 近似路径;同时对无效的approximate参数值抛出RuntimeError。 -
gelu_backward()反向计算增加 erf 分支:两个文件中的gelu_backward()同样新增 erf 路径的反向梯度计算,使用cdf(累积分布函数)和pdf(概率密度函数)组合公式grad * (cdf + self * pdf);同时将 tanh 路径的tanh_derivative表达式从(tanh_inner * tanh_inner) * -1.0 + 1.0简化为1.0 - tanh_inner * tanh_inner。 -
dvm/decomp.py中gelu()实现重写:废弃了原先基于a / (1.0 + exp(y))的近似实现及配套的dtype升降精度逻辑,改为与decomposition.py一致的0.5 * a * (1 + torch.tanh(inner))tanh 公式,统一两个分解文件的计算路径。 -
提取共享常量与辅助逻辑:在
dvm/decomp.py中新增模块级常量_M_SQRT2、_M_SQRT1_2、_M_2_SQRTPI、_GELU_KAPPA,并抽取_gelu_use_tanh_approx()函数封装 tanh/erf 路径选择逻辑,减少重复代码。


代码审查
关闭总结
| 文件 | 审查结果 |
|---|---|
torch_npu/_inductor/decomposition.py |
1 个 P3 问题(except Exception 过于宽泛),无 P0-P2 问题 |
torch_npu/_inductor/dvm/decomp.py |
2 个 P0 问题(重复空函数定义导致语法错误)、1 个 P3 问题(except Exception 过于宽泛) |
- P0 × 2:
decomp.py中tanh(第 84 行)和sigmoid(第 140 行)存在重复的空函数定义,导致模块 import 时抛出IndentationError,阻断所有 DVM 路径。 - P3 × 2:两个文件中
_npu_use_compatible_gelu_v2()的except Exception过于宽泛。
整体风险判断:高。P0 问题会导致 torch_npu._inductor.dvm.decomp 模块完全无法加载,阻断 DVM 后端的 patch_decomp() → mlir_fusion.py 调用链,需在合入前立即修复。decomposition.py 中的 GELU 分解逻辑本身正确,仅有一个低风险的异常捕获建议。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 2 |
| 🟡 建议 | 0 |
⛔ 需要修改


Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.




【合入来源】
【修改方案】
背景:hf_bert_large 精度不通过问题定位到 gelu 分解
TORCH_NPU_USE_COMPATIBLE_IMPL走 Gelu(tanh) / GeluV2(erf|tanh)【资料变更】
不涉及
【接口变更】
不涉及
【功能验证】
运行多张网络验证,精度正常,output_code中 erf 算子不再出现,小算子已参与融合
【CheckList】