已关闭
【Sanitizer】删除失效的 Autograd Dispatch Key 兼容逻辑 #3596
No_neck创建于 7月31日关闭于 8月7日
7月31日 添加了label:bot-triaged
TorchNPU-Bot
7月31日 评论:
7月31日 评论:
检测到当前 issue 已关联 PR,自动添加标签:bot-triaged


8月7日 关闭了 issue
8月7日 添加了label:resolved
检测到当前 issue 已关联 PR,自动添加标签:bot-triaged


问题背景
NPU Stream Sanitizer 在启用时创建
NPUSanitizerDispatchMode并将其压入当前线程的TorchDispatchMode栈。之后每个被拦截的 ATen 算子都会自动进入NPUSanitizerDispatchMode.__torch_dispatch__()。当前
torch_npu/npu/_stream_check.py在执行真实算子前调用enable_autograd(aten_api),尝试对以下五个公开名称重新启用AutogradFunctionality:adaptive_avg_pool2dbatch_normlog_softmaxnll_lossto调用链为:
enable_npu_sanitizer() -> NPUSanitizer.enable() -> enable_stream_check() -> NPUSanitizerDispatchMode.__enter__() -> ATen operator -> __torch_dispatch__() -> enable_autograd()问题分析
PyTorch 2.13 实际传入 DispatchMode 的是内部 ATen 名称,例如:
_adaptive_avg_pool2d/_adaptive_avg_pool2d_backwardnative_batch_norm/native_batch_norm_backward_log_softmax/_log_softmax_backward_datanll_loss_forward/nll_loss_backward_to_copy这些名称均不等于旧白名单中的公开 API 名称。因此真实算子会进入
enable_autograd(),但白名单命中次数为 0,torch._C._dispatch_tls_set_dispatch_key_excluded(..., False)真分支不会执行。该逻辑已成为无效兼容路径,并在每个普通 ATen 算子被 Sanitizer 拦截时增加一次无效的名称解析、函数调用和列表查询。
建议方案
删除:
self.npu_adjust_autograd白名单;enable_autograd();aten_api临时变量;self.enable_autograd(aten_api)调用;保留 Sanitizer 的 TorchDispatchMode 注册、输入/输出分析、真实算子执行、Stream 获取、数据竞争检查及 record_stream 检查流程。
验证结果
在 PyTorch
2.13.0a0+gitfad7424、torch_npu2.13.0+git19cd51d、Ascend 910B2 上,从同一源码提交构建保留版和删除版 wheel:enable_autograd()的过期测试;git diff --check和相关 Python 文件py_compile检查。预期结果
删除不可达兼容代码,降低 NPU Sanitizer 与 PyTorch Dispatcher 的维护差异,不改变现有 Sanitizer 和 Autograd 行为。