Pull Request已成功合入, 合并人@ascend-robot
(感谢 huangyunlong 的贡献)变更摘要
此 PR 将 NPU 侧填充未初始化内存(TORCH_NPU_FILL_UNINITIALIZED_MEMORY)的控制机制从基于 OBS 选项系统(_npu_setOption)切换为通过 NpuContext 单例类直接管理,并在 Python 层暴露专用的 torch_npu._C._npu_set_fill_uninitialized_memory / _npu_get_fill_uninitialized_memory 接口。核心目的为消除对选项字符串注册机制的依赖,改用更直接的内存布尔标志。
主要改动
- 引入
NpuContext类管理填充未初始化内存标志:在EnvVariables.h中新增NpuContext类,包含npuFillUninitializedMemory()和setNpuFillUninitializedMemory(bool)接口,私有成员_npu_fill_uninitialized_memory默认为false;同时提供globalNpuContext()获取全局单例。 - 移除旧的 OBS 选项注册:删除
EnvVariables.cpp中的TORCH_NPU_REGISTER_OPTION(TORCH_NPU_FILL_UNINITIALIZED_MEMORY)宏和REGISTER_OPTION_BOOL_FUNCTION(CheckFillUninitializedMemory, ...)注册,移除EnvVariables.h中对应的CheckFillUninitializedMemory()函数声明。 - 调用点同步更新:在
ResizeNpu.cpp和TensorFactories.cpp中,将at_npu::native::env::CheckFillUninitializedMemory()替换为at_npu::native::env::globalNpuContext().npuFillUninitializedMemory()。 - 新增 Python 绑定接口:在
Module.cpp中增加THNPModule_setNpuFillUninitializedMemory和THNPModule_npuFillUninitializedMemory两个 C 函数,并注册为 Python 方法_npu_set_fill_uninitialized_memory(接受 bool 参数)和_npu_get_fill_uninitialized_memory(无参)。 - Python 层确定性补丁适配:
_deterministic.py中将原先通过torch_npu._C._npu_setOption({"TORCH_NPU_FILL_UNINITIALIZED_MEMORY": "1"/"0"})同步选项的方式,改为直接调用torch_npu._C._npu_set_fill_uninitialized_memory(mode)。


代码审查
收尾总结
各文件审查结论
| 文件 | 结论 |
|---|---|
test/npu/test_torch_fill_uninitialized_memory.py |
无问题(only_for 参数由字符串改为元组是合法的 API 用法变更) |
torch_npu/csrc/aten/common/ResizeNpu.cpp |
无问题(CheckFillUninitializedMemory() → globalNpuContext().npuFillUninitializedMemory() 替换正确) |
torch_npu/csrc/aten/common/TensorFactories.cpp |
无问题(同上替换正确) |
torch_npu/csrc/framework/interface/EnvVariables.cpp |
无问题(移除旧 option 注册,新增 NpuContext 实现,静态局部对象用法正确) |
torch_npu/csrc/framework/interface/EnvVariables.h |
无问题(新增 NpuContext 类与 globalNpuContext() 声明,默认值 false 与旧行为一致) |
torch_npu/csrc/npu/Module.cpp |
1 个 P2 问题(getter 缺少 HANDLE_TH_ERRORS/END_HANDLE_TH_ERRORS) |
torch_npu/utils/_deterministic.py |
无问题(同步方式从 _npu_setOption 切换到专用 API,逻辑等价) |
问题统计
- P0: 0
- P1: 0
- P2: 1(
THNPModule_npuFillUninitializedMemory缺少异常处理宏) - P3: 0
整体风险判断
该变更风险较低。重构将填充未初始化内存的配置从环境变量/option 机制迁移到专用的 NpuContext 单例 + Python 绑定,内部同步路径已全部更新,且 Python 侧 patch 也已适配。唯一需要修复的是新增 getter 函数缺少 C++ 异常处理宏,这是一个可靠性缺陷,建议在合入前修复。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 1 |
💬 仅评论


Thanks for your pull-request.
The full list of commands accepted by me can be found at here。
You can get sig-info at here
PR Approval Progress
✅ Congratulations! All modules have met the lgtm and approve requirements.
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| repo-Ascend/pytorch | ✅ li_jing_hw, liangsongwei (2/2) | ✅ li_jing_hw, liangsongwei (2/1) |
| test | ✅ li_jing_hw, liangsongwei (2/2) | ✅ li_jing_hw, liangsongwei (2/1) |
| torch_npu/utils | ✅ li_jing_hw, liangsongwei (2/2) | ✅ li_jing_hw, liangsongwei (2/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
huangyunlong2022, thanks for your pull request. All authors of the commits have signed the CLA. 👍


Linking Issue Notice
@huangyunlong2022 , the pull request must be linked to at least one issue.
If an issue has already been linked, but the needs-issue label remains, you can remove the label by commenting /check-issue .


当前仓库存在以下 保护分支 :
| Protected Branch | Version | Release |
|---|---|---|
| master | ||
| v2.7.1 | ||
| v2.12.0 | ||
| v2.9.0 | ||
| v2.11.0 | ||
| v2.10.0 | ||
| v2.7.1-26.1.0 | ||
| v2.9.0-26.1.0 | ||
| v2.11.0-26.1.0 | ||
| v2.10.0-26.1.0 | ||
| v2.12.0-26.1.0 | ||
| ci-test |
评论 /sync <branch1> <branch2> ... 可将当前 PR 修改同步到其它分支(创建同步 PR):
a) 如果当前 PR 是 Open 状态,同步操作将延迟到 PR 被合并时执行
b) 如果当前 PR 已经 Merged,将立即执行同步操作
注意:
- /sync 命令可以指定同步到多个分支,仅最后一个 /sync 命令生效
- 如果创建的同步 PR 不正确,可通过向同步 PR 的源分支提交轻量级 PR 完善,或使用 /close 命令关闭


ascend docs pipeline is running...


✅ 跳过 docs ci 检查,没有需要检查的文档文件


🟡 Medium Priority
变更行:Module.cpp 第 2548-2555 行新增的 THNPModule_npuFillUninitializedMemory 函数。
该函数是 CPython 扩展方法(通过 PyMethodDef 注册为 _npu_get_fill_uninitialized_memory,METH_NOARGS),但其函数体中缺少 HANDLE_TH_ERRORS / END_HANDLE_TH_ERRORS 异常处理宏。
问题链条:
- 同一文件中所有其他 CPython 导出函数(包括同类型的
THNPModule_get_deterministic_level第 2529-2534 行、THNPModule_npu_get_sync_debug_mode第 1975 行、以及配对的 setterTHNPModule_setNpuFillUninitializedMemory第 2539-2545 行)均使用HANDLE_TH_ERRORS/END_HANDLE_TH_ERRORS包裹函数体。 - 这是一个可靠性缺陷:该函数与代码库中所有其他导出函数的失败模式不一致,作为已暴露的公共 API,其异常安全性不可靠。
建议:在函数体首尾添加 HANDLE_TH_ERRORS 和 END_HANDLE_TH_ERRORS 宏,与代码库中所有其他 CPython 导出函数保持一致。
|
2555 | + static PyObject* THNPModule_npuFillUninitializedMemory( |
|
2556 | + PyObject* _unused, |
|
2557 | + PyObject* noargs) { |
|
2558 | + HANDLE_TH_ERRORS |
|
2559 | + if (at_npu::native::env::globalNpuContext().npuFillUninitializedMemory()) |
|
2560 | + Py_RETURN_TRUE; |
|
2561 | + else |
|
2562 | + Py_RETURN_FALSE; |
|
2563 | + END_HANDLE_TH_ERRORS |
| 2555
2564 | } |


| 阶段 | 任务名 | 状态 | 详情 |
|---|---|---|---|
| 编译构建 | Build_X86 | ✅ | >>> |
| Build_ARM | ✅ | >>> | |
| Build_LibTorch_x86 | ✅ | >>> | |
| Build_LibTorch_ARM | ✅ | >>> | |
| Build_X86_torchair | 🛑 | >>> | |
| Build_ARM_torchair | 🛑 | >>> | |
| patch_test | 🛑 | >>> | |
| 恶意代码检查 | Antipoison | ✅ | >>> |
| 编码安全与规范检查 | codecheck_pre-commit | ✅ | >>> |
| check_error | ✅ | >>> | |
| lintrunner | ✅ | >>> | |
| 开源片段检查 | SCA | ✅ | >>> |
| 开发者测试 | UT_ARM_A3_Part_01 | ✅ | >>> |
| UT_ARM_A3_Part_02 | ✅ | >>> | |
| UT_ARM_A2_Part_01 | ✅ | >>> | |
| UT_ARM_A2_Part_02 | ✅ | >>> | |
| UT_ARM_A2_Part_03 | ✅ | >>> | |
| UT_inductor_Part_01 | ✅ | >>> | |
| UT_inductor_Part_02 | ✅ | >>> | |
| UT_inductor_Part_03 | ✅ | >>> | |
| UT_inductor_Part_04 | ✅ | >>> | |
| UT_DIST_ARM_Part_01 | 🛑 | >>> | |
| UT_DIST_ARM_Part_02 | 🛑 | >>> | |
| UT_DIST_ARM_Part_03 | 🛑 | >>> | |
| UT_DIST_ARM_Part_04 | 🛑 | >>> | |
| UT_ARM_A2_Select_Part_01 | ✅ | >>> | |
| UT_ARM_A2_Select_Part_02 | ✅ | >>> | |
| 流水线 | PR-pipeline_pytorch | ✅ | >>> |
- compile、compile_inductor、compile_torchair : 运行流水线
- retry : 重试流水线所有失败子任务
- retry <任务名> : 仅重试指定失败子任务
- stop : 停止流水线


/approve


/approve


Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.




【合入来源】
【修改方案】
使用torch_npu._C接口替换option接口
【资料变更】
【接口变更】
【功能验证】
【CheckList】