已合并
refactor: remove obsolete sanitizer autograd workaround #43468
refactor: remove obsolete sanitizer autograd workaround #43468
已合并
No_neck创建于 7月31日
No_neck成员
7月31日

【合入来源】

关联 Issue:https://gitcode.com/Ascend/pytorch/issues/3596
关联 Issue:https://gitcode.com/Ascend/pytorch/issues/3669

【修改方案】

调用链和现有作用

  1. 当设置 TORCH_NPU_SANITIZER 后导入 torch_npu,或显式调用 enable_npu_sanitizer() 时,会进入 NPUSanitizer.enable()
  2. Stream Check 模式在 enable_stream_check() 中创建 NPURecordStreamHandlerNPUSanitizerDispatchMode,随后调用 dispatch.__enter__(),将该 Mode 压入当前线程的 TorchDispatchMode 栈。
  3. Mode 启用期间,每个被 PyTorch Dispatcher 拦截的普通 ATen 算子都会自动进入 NPUSanitizerDispatchMode.__torch_dispatch__()。该类负责分析算子输入/输出的内存读写、执行真实算子并调用 EventHandler 检查跨 Stream 数据竞争。
  4. enable_autograd(aten_api) 在真实算子执行前调用,原意是在五个白名单名称匹配时从 TLS excluded 集合中移除 AutogradFunctionality,使 Autograd Dispatch Key 重新参与 redispatch。

删减原因

PyTorch 2.13 进入 DispatchMode 的实际名称是 _adaptive_avg_pool2dnative_batch_norm_log_softmaxnll_loss_forward_to_copy 等内部 ATen 名称,与旧白名单中的公开 API 名称不相等。

五个真实用例均覆盖到旧 enable_autograd() 调用点,但白名单命中次数和 TLS 状态修改次数均为 0。因此 setter 真分支在当前真实路径中不可达。

代码修改

  1. 删除 self.npu_adjust_autograd 白名单。
  2. 删除 enable_autograd() 方法。
  3. 删除 aten_api 临时变量和 self.enable_autograd(aten_api) 调用。
  4. 删除只验证上述旧函数和字段的过期单元测试。
  5. 保留 TorchDispatchMode 注册、输入/输出分析、真实算子执行、Stream 获取、数据竞争检查和 record_stream 检查流程。

【资料变更】

不涉及。

【接口变更】

不涉及跨代码仓或客户可见接口变更。本次仅删除 NPU Sanitizer 内部不可达的兼容逻辑。

【功能验证】

当前 master 自检:

  • git diff --check 执行通过。
  • python -m py_compile torch_npu/npu/_stream_check.py test/npu/test_stream_check.py 执行通过。
  • GitCode 远端 Git Hooks 检查通过。

NPU 实机消融验证环境:

  • PyTorch:2.13.0a0+gitfad7424
  • torch_npu:2.13.0+git19cd51d
  • 设备:Ascend 910B2
  • 同一 torch_npu master 提交分别构建保留版和删除版 wheel。

验证结果:
img_v3_02147_3d70ff36-6019-4534-bc1e-b27cbed090cg.jpg

  • adaptive_avg_pool2dbatch_normlog_softmaxnll_lossto 前向和反向均通过。
  • 删除前后输出、梯度、shape、dtype、device 逐元素一致。
  • BatchNorm running_meanrunning_var 一致。
  • 删除前后有序 Sanitizer Dispatch 序列和各 operator 调用次数一致。
  • Sanitizer 启用前、启用后和用例结束后的 TLS 状态一致。
  • 五个真实用例白名单命中和 TLS 状态修改次数均为 0。
  • torch_npu 官方 Sanitizer 测试:保留版 38/38 通过,删除版 37/37 通过。
  • 数量差异来自删除一个只验证旧 enable_autograd() 的过期测试。

【CheckList】

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 No_neck 的贡献)
NNo_neck成员
7月31日 创建了 pull request,commit 8996c78b
NNo_neck成员
7月31日 关联了issue:【Sanitizer】删除失效的 Autograd Dispatch Key 兼容逻辑
atomgit-bot
atomgit-bot
7月31日 评论:

变更摘要

此 PR 移除了 NPUSanitizerDispatchMode 中已废弃的 Autograd 白名单绕过逻辑(enable_autograd)。该逻辑原本在特定 ATen 算子调用时通过 TLS 将 AutogradFunctionality Dispatch Key 从排除集合中移除,但由于 PyTorch 2.13 进入 DispatchMode 的实际算子名称(如 _adaptive_avg_pool2d)与白名单中的公开 API 名称(如 adaptive_avg_pool2d)不匹配,导致该分支实际不可达,白名单命中次数为零。因此直接删除相关代码及对应测试。

主要改动

  • 移除 enable_autograd 方法和白名单列表:在 NPUSanitizerDispatchMode 中删除 npu_adjust_autograd 字段(包含 "adaptive_avg_pool2d""batch_norm" 等五个算子名)以及 enable_autograd 方法,该方法的 TLS _dispatch_tls_set_dispatch_key_excluded 调用从未被真正触发。
  • __torch_dispatch__ 中移除 enable_autograd 调用链:删除了 aten_api = func.__name__.split(".")[0]self.enable_autograd(aten_api) 两行,不再在每个被拦截的算子执行前尝试修改 Autograd 排除状态。
  • 删除对应单元测试:移除 test_enable_autograd_with_matching_api 测试方法,并在 test_init_with_event_handler 中删除对 npu_adjust_autograd 字段的断言。
  • 修复日志错误处理parse_outputs 方法的异常捕获中将原来的 err 变量引用替换为 exc_info=True,并简化错误消息文字,避免记录可能未绑定的变量。
  • 清理无用导入:测试文件中移除 from torch.utils._python_dispatch import TorchDispatchModeimport torch_npu 两个不再需要的导入语句。
likedislike
不准确?
atomgit-bot
atomgit-bot
7月31日 评论:

🤖 AI Code Review

⚠️ 审查未能完成

本次代码审查未能完成,可能是临时性故障。

你可以在评论区输入 /ai review 重新发起审查。若多次失败,请联系管理员并附上下方追踪 ID。

追踪 ID: task-142613-run-136857

likedislike
不准确?
此处折叠了256条消息 查看更多
ascend-robotascend-robot成员
8月7日 添加了label:approvedlgtm
ascend-robotascend-robot成员
8月7日 关闭了关联的issue
ascend-robotascend-robot成员
8月7日 合入了pull request
ascend-robot
ascend-robot成员
8月7日 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike
ascend-robot
ascend-robot成员
8月7日 评论:
流水线 pytorch_gitcode_PR_multiVersion#13775 [ commitID:62fd06e5 ] 运行失败
likedislike