已关闭
【Sanitizer】删除失效的 Autograd Dispatch Key 兼容逻辑 #3596
No_neck创建于  7月31日关闭于  8月7日
No_neck成员
7月31日 创建

问题背景

NPU Stream Sanitizer 在启用时创建 NPUSanitizerDispatchMode 并将其压入当前线程的 TorchDispatchMode 栈。之后每个被拦截的 ATen 算子都会自动进入 NPUSanitizerDispatchMode.__torch_dispatch__()。

当前 torch_npu/npu/_stream_check.py 在执行真实算子前调用 enable_autograd(aten_api),尝试对以下五个公开名称重新启用 AutogradFunctionality:

  • adaptive_avg_pool2d
  • batch_norm
  • log_softmax
  • nll_loss
  • to

调用链为:

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_backward
  • native_batch_norm / native_batch_norm_backward
  • _log_softmax / _log_softmax_backward_data
  • nll_loss_forward / nll_loss_backward
  • _to_copy

这些名称均不等于旧白名单中的公开 API 名称。因此真实算子会进入 enable_autograd(),但白名单命中次数为 0,torch._C._dispatch_tls_set_dispatch_key_excluded(..., False) 真分支不会执行。

该逻辑已成为无效兼容路径,并在每个普通 ATen 算子被 Sanitizer 拦截时增加一次无效的名称解析、函数调用和列表查询。

建议方案

删除:

  1. self.npu_adjust_autograd 白名单;
  2. enable_autograd();
  3. aten_api 临时变量;
  4. self.enable_autograd(aten_api) 调用;
  5. 仅验证上述旧字段和函数的过期单元测试。

保留 Sanitizer 的 TorchDispatchMode 注册、输入/输出分析、真实算子执行、Stream 获取、数据竞争检查及 record_stream 检查流程。

验证结果

在 PyTorch 2.13.0a0+gitfad7424、torch_npu 2.13.0+git19cd51d、Ascend 910B2 上,从同一源码提交构建保留版和删除版 wheel:

  • 五个目标算子的前向、反向、输出及梯度全部通过;
  • 删除前后有序 Dispatch 序列和各 operator 调用次数一致;
  • 输出、梯度、dtype、device、BatchNorm running stats 一致;
  • Sanitizer 启用前后及用例结束后的 TLS 状态一致;
  • 五个真实用例旧白名单命中和 TLS 状态修改次数均为 0;
  • torch_npu 官方 Sanitizer 测试:保留版 38/38 通过,删除版 37/37 通过;
  • 数量差异来自删除一个只验证旧 enable_autograd() 的过期测试;
  • 当前 master 已通过 git diff --check 和相关 Python 文件 py_compile 检查。

预期结果

删除不可达兼容代码,降低 NPU Sanitizer 与 PyTorch Dispatcher 的维护差异,不改变现有 Sanitizer 和 Autograd 行为。

likedislike
NNo_neck成员
7月31日 关联了pull request:refactor: remove obsolete sanitizer autograd workaround
TorchNPU-BotTorchNPU-Bot成员
7月31日 添加了label:bot-triaged
TorchNPU-Bot
TorchNPU-Bot成员
7月31日 评论:

检测到当前 issue 已关联 PR,自动添加标签:bot-triaged

likedislike
ascend-robotascend-robot成员
8月7日 关闭了 issue
ascend-robotascend-robot成员
8月7日 添加了label:resolved
NNo_neck成员
8月11日 issue状态由 TODO 改变为 DONE
NNo_neck成员
8月19日 将 No_neck 设为负责人