已开启
[Bug]: Inductor Ascendc后端引入预期之外的expm1 decomp #4248
mihudan创建于  28 天前
mihudan成员
28 天前 创建

在提交新问题之前,请确保您已经在社区中搜索过相关问题,并使用了社区中提供的资源/工具后,仍未找到满意的解决方式。

⚠️ 安全信息提醒:请仔细检查提供的文本内容,确保其不包含敏感数据信息,包括但不限于:

  • API 令牌或密钥
  • 密码或身份验证凭证
  • 私有网址或接口地址
  • 个人或机密数据
  • ...

在分享配置信息或代码示例时,请将敏感信息脱敏处理,或使用 <TOKEN> 等占位符替代原有内容。

环境信息

例如:
- 操作系统
- 昇腾硬件信息
- CANN软件版本
- 安装的对应软件版本

2.9 - 2.12 torch版本
950环境

🐛 问题描述

model = torch.compile(
        test, backend="inductor",
        options={"npu_backend": "ascendc" )

涉及修改的pr:
[refactor]exmp1 的decomp提到了share_decomp

增加ascendc backend

此前的PR修改将exmp1的decomp规则提到的share_decompse中,inductor所有后端在 load backend时都会加上这个规则。
但修改前,ascendc后端无这个decomp, 修改后引入预期之外的decomp。

 @run_once 
 def _register_shared_decompositions(): 
     @register_decomposition([aten.expm1]) 
     def expm1(x): 
         tensor = torch.exp(x) - torch.ones_like(x) 
         return tensor

ascendc后端不希望Exmp1 被decomp成exp - 1的原因

  • exp(x)接近1,例如1.0000503。再减1时会发生大数抵消。浮点尾数有限,低位小数丢失。
  • 单算子expm1在整数部分直接按0处理。小数部分使用多项式拟合。因此精度更高,也更接近CPU结果。
  • 如果保留decomposition并拆成小算子,即使后续再融合,也很难在相同数据类型下恢复单算子的特殊精度。
  • 后端已有expm1 AscIR,不需要新增IR,但当前实现也是exp()-1,没有复用单算子的特殊精度优化。

当前倾向于保留融合方案。如果希望融合,方案应是:

  • 前端需要修改torch_npu load_backend的exmp1 公共注册,避免将expm1decompose成exp - 1,。
  • lower到expm1 AscIR

欢迎加入社区,感谢您对社区的贡献 🎉!

likedislike
Mmihudan成员
28 天前 添加了label:bug
Mmihudan成员
28 天前 关联了看板:FrameworkPTAdapter 版本issue看板
TorchNPU-BotTorchNPU-Bot成员
28 天前 添加了label:triage-review
TorchNPU-Bot
TorchNPU-Bot成员
28 天前 评论:

issue待分派,添加triage-review标签

likedislike
Mmihudan成员
28 天前 修改了issue 的描述