已合并
refactor: remove obsolete sanitizer autograd workaround #43468
No_neck创建于 7月31日
refactor: remove obsolete sanitizer autograd workaround #43468
已合并
Pull Request已成功合入, 合并人@ascend-robot
(感谢 No_neck 的贡献)ascend-robot
7月31日 评论:
7月31日 评论:
atomgit-bot
7月31日 评论:
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 TorchDispatchMode和import torch_npu两个不再需要的导入语句。


不准确?
atomgit-bot
7月31日 评论:
7月31日 评论:
此处折叠了256条消息 查看更多
8月7日 添加了label:approvedlgtm
8月7日 关闭了关联的issue
8月7日 合入了pull request
ascend-robot
8月7日 评论:
8月7日 评论:
Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.


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


【合入来源】
关联 Issue:https://gitcode.com/Ascend/pytorch/issues/3596
关联 Issue:https://gitcode.com/Ascend/pytorch/issues/3669
【修改方案】
调用链和现有作用
TORCH_NPU_SANITIZER后导入torch_npu,或显式调用enable_npu_sanitizer()时,会进入NPUSanitizer.enable()。enable_stream_check()中创建NPURecordStreamHandler和NPUSanitizerDispatchMode,随后调用dispatch.__enter__(),将该 Mode 压入当前线程的TorchDispatchMode栈。NPUSanitizerDispatchMode.__torch_dispatch__()。该类负责分析算子输入/输出的内存读写、执行真实算子并调用 EventHandler 检查跨 Stream 数据竞争。enable_autograd(aten_api)在真实算子执行前调用,原意是在五个白名单名称匹配时从 TLS excluded 集合中移除AutogradFunctionality,使 Autograd Dispatch Key 重新参与 redispatch。删减原因
PyTorch 2.13 进入 DispatchMode 的实际名称是
_adaptive_avg_pool2d、native_batch_norm、_log_softmax、nll_loss_forward、_to_copy等内部 ATen 名称,与旧白名单中的公开 API 名称不相等。五个真实用例均覆盖到旧
enable_autograd()调用点,但白名单命中次数和 TLS 状态修改次数均为 0。因此 setter 真分支在当前真实路径中不可达。代码修改
self.npu_adjust_autograd白名单。enable_autograd()方法。aten_api临时变量和self.enable_autograd(aten_api)调用。【资料变更】
不涉及。
【接口变更】
不涉及跨代码仓或客户可见接口变更。本次仅删除 NPU Sanitizer 内部不可达的兼容逻辑。
【功能验证】
当前 master 自检:
git diff --check执行通过。python -m py_compile torch_npu/npu/_stream_check.py test/npu/test_stream_check.py执行通过。NPU 实机消融验证环境:
2.13.0a0+gitfad74242.13.0+git19cd51d验证结果:

adaptive_avg_pool2d、batch_norm、log_softmax、nll_loss、to前向和反向均通过。running_mean和running_var一致。enable_autograd()的过期测试。【CheckList】