状态(Status): - 作者(Authors): @周楠 创建日期(Created): 2026-08-11 更新日期(Updated): 2026-08-11 相关 Issue/PR: https://gitcode.com/Ascend/pytorch/pull/43782
移除 torch_npu 对 6 个 PyTorch 模块方法(nn.Module.share_memory 与 torch.jit.ScriptModule.add_module / bfloat16 / register_buffer / register_parameter / register_module)的 monkey-patch 拦截机制,并整体删除torch_npu/utils/npu_intercept.py。其中仍被使用的 CANN 包检测逻辑(_cann_package_check() 与 cann_pytorch_version_map)迁移至 torch_npu/_init/registry/registry_manager.py(其唯一调用点所在)。
nn.Module.share_memory
torch.jit.ScriptModule.add_module / bfloat16 / register_buffer / register_parameter / register_module
torch_npu/utils/npu_intercept.py
_cann_package_check()
cann_pytorch_version_map
torch_npu/_init/registry/registry_manager.py
217f26d6d
967ed515b
Tensor.share_memory_
ScriptModule.bfloat16()
unsupport_api.py
npu_patches.py
registry_manager.py
share_memory
bfloat16
model.share_memory()
.bfloat16()
import torch_npu
DFX 要求:可维护性(删除死代码与误导性错误消息、模块职责归位)、兼容性(不改变原生 torch 对 ScriptModule 的保护语义、CANN 检查行为不变)、可测试性(测试改为验证真实行为)。
torch_npu/_init/registry/registry_manager.py(迁入 CANN 检查):
import os
from torch_npu.utils.collect_env import get_cann_version
from torch_npu.utils._error_code import ErrCode, pta_error
npu_intercept.py
_register_npu_backend()
from torch_npu.utils.npu_intercept import _cann_package_check
torch_npu.__version__
torch_npu/__init__.py:44
_register_components()
:52
registry_manager
torch_npu/utils/unsupport_api.py(整个文件删除):
torch_npu/utils/unsupport_api.py
unsupported_Tensor_api = {}
unsupported_nn_api
torch_npu/utils/npu_intercept.py(整体删除):
_create_wrap_func
_is_tensor_npu_supported
_is_module_parameters_supported
_apply_wrap_func_to_modules
_add_intercept_methods
os
torch_npu
get_cann_version
ErrCode/pta_error
torch_npu/_init/patches/npu_patches.py(删除注册):
torch_npu/_init/patches/npu_patches.py
apply_npu_intercept_patch
@PatchManager.register_patch("npu")
测试更新:
test/npu/test_unsupport_api.py
*_runtimeerror
test_Module_share_memory_runtimeerror
test/jit/test_script_module.py
TestScriptModuleShareMemory.test_share_memory_on_npu_raises
TestScriptModuleMetadata
删除/迁移后:
nn.Module.share_memory()
storage.is_shared()=True
ScriptModule.add_module / register_module
RuntimeError: Cannot re-assign modules in a ScriptModule with non-scripted module...
ScriptModule.register_parameter / register_buffer
AttributeError: cannot assign parameter/buffer before Module.__init__() call
性能:删除纯 Python 包装层,无编译/算子开销差异,每次调用省去一层 wrapper(无回退); CANN 检查无性能影响。
纯内部删除/迁移,无对外 API 变更:相关函数均为私有(下划线)且 npu_intercept.__all__ = []; torch.nn.Module / ScriptModule 方法签名与调用方式不变。无编程手册变更。
npu_intercept.__all__ = []
torch.nn.Module
ScriptModule
原有测试:
candidate 的 9 项失败全部为原拦截 raise 测试:
add_module
register_module
register_parameter
register_buffer
test_module_share_memory
@onlyPRIVATEUSE1
test/test_torch.py
test_share_memory
test/test_nn.py
test_jit.py
检查了torch.nn.Module.share_memory() 以及 ScriptModule调用'add_module/register_buffer/register_parameter/register_module'的行为一致性。
torch.jit._script
检测到当前 issue 已关联 PR,自动添加标签:bot-triaged
bot-triaged
RFC:移除 unsupport API 拦截补丁并整体删除 npu_intercept.py
状态(Status): -
作者(Authors): @周楠
创建日期(Created): 2026-08-11
更新日期(Updated): 2026-08-11
相关 Issue/PR: https://gitcode.com/Ascend/pytorch/pull/43782
1. 概述
1.1 简介
移除 torch_npu 对 6 个 PyTorch 模块方法(
nn.Module.share_memory与torch.jit.ScriptModule.add_module / bfloat16 / register_buffer / register_parameter / register_module)的 monkey-patch 拦截机制,并整体删除torch_npu/utils/npu_intercept.py。其中仍被使用的 CANN 包检测逻辑(_cann_package_check()与cann_pytorch_version_map)迁移至torch_npu/_init/registry/registry_manager.py(其唯一调用点所在)。1.2 动机
217f26d6d,2023-08)最初用于在 torch_npu 尚不支持某些 API 时抛出明确的 "xxx is not supported in npu."。
自 commit
967ed515b(2025-07,IPC 内存通信)起 torch_npu 已支持Tensor.share_memory_,且ScriptModule.bfloat16()在 NPU 2.13 实测可用。_cann_package_check()与cann_pytorch_version_map迁移至torch_npu/_init/registry/registry_manager.py。1.3 目标
unsupport_api.py整文件、npu_patches.py注册、相关测试);_cann_package_check()与cann_pytorch_version_map迁入registry_manager.py(行为零变化,调用点改为本地调用);torch_npu/utils/npu_intercept.py;share_memory/bfloat16在 NPU 上恢复可用;2. 用例分析
model.share_memory().bfloat16()import torch_npu(CANN 检查)DFX 要求:可维护性(删除死代码与误导性错误消息、模块职责归位)、兼容性(不改变原生
torch 对 ScriptModule 的保护语义、CANN 检查行为不变)、可测试性(测试改为验证真实行为)。
3. 方案设计
3.1 总体方案(迁移 + 删除范围)
torch_npu/_init/registry/registry_manager.py(迁入 CANN 检查):import os、from torch_npu.utils.collect_env import get_cann_version、from torch_npu.utils._error_code import ErrCode, pta_error;cann_pytorch_version_map与_cann_package_check()定义(自npu_intercept.py原样搬迁);
_register_npu_backend()中删除from torch_npu.utils.npu_intercept import _cann_package_check,改为直接调用本地
_cann_package_check();torch_npu.__version__在torch_npu/__init__.py:44定义,_register_components()在:52才调用;registry_manager顶部已import torch_npu。torch_npu/utils/unsupport_api.py(整个文件删除):unsupported_Tensor_api = {}(空 dict,包装零个方法,死代码);unsupported_nn_api(6 个条目:share_memory / add_module / bfloat16 /register_buffer / register_parameter / register_module)。
torch_npu/utils/npu_intercept.py(整体删除):_create_wrap_func、_is_tensor_npu_supported、_is_module_parameters_supported、_apply_wrap_func_to_modules、_add_intercept_methods→ 删除;_cann_package_check()、cann_pytorch_version_map及依赖(
os、torch_npu、get_cann_version、ErrCode/pta_error)→ 迁入registry_manager.py;torch_npu/_init/patches/npu_patches.py(删除注册):apply_npu_intercept_patch函数(@PatchManager.register_patch("npu")注册)。测试更新:
test/npu/test_unsupport_api.py:删除 6 项*_runtimeerror拦截测试;test_Module_share_memory_runtimeerror改为断言 NPU 上正常执行;test/jit/test_script_module.py:TestScriptModuleShareMemory.test_share_memory_on_npu_raises改为断言 NPU 上正常执行;
TestScriptModuleMetadata的 2 项 raise 测试删除。3.2 技术选型
npu_intercept.py可整体清空npu_intercept.py承载 CANN 检查3.3 功能与影响
删除/迁移后:
nn.Module.share_memory():返回 self、参数保持 NPU、storage.is_shared()=True;ScriptModule.bfloat16():无异常,参数 dtype 实际变为bfloat16;ScriptModule.add_module / register_module:原生RuntimeError: Cannot re-assign modules in a ScriptModule with non-scripted module...;ScriptModule.register_parameter / register_buffer:原生AttributeError: cannot assign parameter/buffer before Module.__init__() call;性能:删除纯 Python 包装层,无编译/算子开销差异,每次调用省去一层 wrapper(无回退);
CANN 检查无性能影响。
3.4 安全隐私与 DFX
已实测)。
npu_intercept.py整体删除,CANN 检查归位 registry 初始化,职责清晰。3.5 编程与调用设计
纯内部删除/迁移,无对外 API 变更:相关函数均为私有(下划线)且
npu_intercept.__all__ = [];torch.nn.Module/ScriptModule方法签名与调用方式不变。无编程手册变更。4. 测试设计
4.1 A/B 测试
原有测试:
test/npu/test_unsupport_api.pytest/jit/test_script_module.py(ShareMemory/Metadata 类)candidate 的 9 项失败全部为原拦截 raise 测试:
share_memory/bfloat16:不再抛错(功能可用)——预期行为变更;add_module/register_module:原生 RuntimeError(消息不同);register_parameter/register_buffer:原生 AttributeError(类型不同)。4.2 官方用例对照
test_module_share_memory(@onlyPRIVATEUSE1,NPU )test/test_torch.pytest_share_memory(CPU storage shared 语义)test/test_nn.pytest_jit.py中与3个本修改相关的官方报错( Cannot re-assign ...)测试用例全部通过4.3 gpu行为一致性验证
检查了torch.nn.Module.share_memory() 以及 ScriptModule调用'add_module/register_buffer/register_parameter/register_module'的行为一致性。
4.4 registry_manager正常运行
5. 缺点和风险
6. 现有技术
nn.Module.share_memory委托Tensor.share_memory_(CUDA 为 no-op);ScriptModule 在
torch.jit._script中限制模块变更(原生抛错),与设备无关。967ed515b在 IPC 支持落地后删除 Tensor 层拦截条目,证明"能力支持后删除拦截"是既定模式;
registry_manager已集中 backend / distributed / dynamo 注册,CANN 检查归位与其设计一致。