已合并
use torch_npu._C instead of option #43704
huangyunlong创建于 23 天前
use torch_npu._C instead of option #43704
已合并
huangyunlong创建于 23 天前
7 个文件变更+59-10
Mtest/npu/test_torch_fill_uninitialized_memory.py+1-1
@@ -122,7 +122,7 @@ class TorchFillUninitializedMemoryTestCase(TestCase):
122 self.assertTrue(res.eq(max_val).all())122 self.assertTrue(res.eq(max_val).all())
123 123 
124 124 
125-instantiate_device_type_tests(TorchFillUninitializedMemoryTestCase, globals(), only_for='privateuse1')125+instantiate_device_type_tests(TorchFillUninitializedMemoryTestCase, globals(), only_for=('privateuse1',))
126 126 
127 127 
128if __name__ == '__main__':128if __name__ == '__main__':
Mtorch_npu/csrc/aten/common/ResizeNpu.cpp+2-1
@@ -3,6 +3,7 @@
3#include <ATen/native/ResizeCommon.h>3#include <ATen/native/ResizeCommon.h>
4 4 
5#include "torch_npu/csrc/framework/FormatHelper.h"5#include "torch_npu/csrc/framework/FormatHelper.h"
6+#include "torch_npu/csrc/framework/interface/EnvVariables.h"
6#include "torch_npu/csrc/aten/NPUNativeFunctions.h"7#include "torch_npu/csrc/aten/NPUNativeFunctions.h"
7#include "torch_npu/csrc/aten/common/ResizeNpu.h"8#include "torch_npu/csrc/aten/common/ResizeNpu.h"
8 9 
@@ -62,7 +63,7 @@ const at::Tensor& NPUNativeFunctions::resize_(
62 // fill newly added storage section with NaN/MAX_INT when requested.63 // fill newly added storage section with NaN/MAX_INT when requested.
63 if (C10_UNLIKELY(at::globalContext().deterministicAlgorithms() &&64 if (C10_UNLIKELY(at::globalContext().deterministicAlgorithms() &&
64 at::globalContext().deterministicFillUninitializedMemory() &&65 at::globalContext().deterministicFillUninitializedMemory() &&
65- at_npu::native::env::CheckFillUninitializedMemory())) {66+ at_npu::native::env::globalNpuContext().npuFillUninitializedMemory())) {
66 at::native::fill_resize_deterministic_(self, static_cast<int64_t>(old_storage_nbytes));67 at::native::fill_resize_deterministic_(self, static_cast<int64_t>(old_storage_nbytes));
67 }68 }
68 return self;69 return self;
Mtorch_npu/csrc/aten/common/TensorFactories.cpp+1-1
@@ -120,7 +120,7 @@ inline bool should_fill_empty_deterministic()
120{120{
121 return at::globalContext().deterministicAlgorithms() &&121 return at::globalContext().deterministicAlgorithms() &&
122 at::globalContext().deterministicFillUninitializedMemory() &&122 at::globalContext().deterministicFillUninitializedMemory() &&
123- at_npu::native::env::CheckFillUninitializedMemory();123+ at_npu::native::env::globalNpuContext().npuFillUninitializedMemory();
124}124}
125 125 
126void window_function_checks(126void window_function_checks(
Mtorch_npu/csrc/framework/interface/EnvVariables.cpp+13-3
@@ -320,9 +320,6 @@ bool CheckCompatibleImplFor(CompatibleKey compatible_key)
320 return CheckCompatibleImpl();320 return CheckCompatibleImpl();
321}321}
322 322 
323-TORCH_NPU_REGISTER_OPTION(TORCH_NPU_FILL_UNINITIALIZED_MEMORY)
324-REGISTER_OPTION_BOOL_FUNCTION(CheckFillUninitializedMemory, TORCH_NPU_FILL_UNINITIALIZED_MEMORY, "0", "1")
325- 
326REGISTER_OPTION_HOOK(ALLOW_CONV_HF32, [](const std::string &val) {323REGISTER_OPTION_HOOK(ALLOW_CONV_HF32, [](const std::string &val) {
327 static const std::string mm_hf32_option_name = "ALLOW_MATMUL_HF32";324 static const std::string mm_hf32_option_name = "ALLOW_MATMUL_HF32";
328 auto mm_hf32_val = c10_npu::option::GetOption(mm_hf32_option_name);325 auto mm_hf32_val = c10_npu::option::GetOption(mm_hf32_option_name);
@@ -363,6 +360,19 @@ REGISTER_OPTION_HOOK(ACL_OP_DEBUG_OPTION, [](const std::string &val) {
363 360 
364TORCH_NPU_REGISTER_OPTION(CUBE_MATH_TYPE)361TORCH_NPU_REGISTER_OPTION(CUBE_MATH_TYPE)
365 362 
363+NpuContext& globalNpuContext() {
364+ static NpuContext globalNpuContext_;
365+ return globalNpuContext_;
366+}
367+ 
368+bool NpuContext::npuFillUninitializedMemory() const {
369+ return _npu_fill_uninitialized_memory;
370+}
371+ 
372+void NpuContext::setNpuFillUninitializedMemory(bool b) {
373+ _npu_fill_uninitialized_memory = b;
374+}
375+ 
366} // namespace env376} // namespace env
367} // namespace native377} // namespace native
368} // namespace at_npu378} // namespace at_npu
Mtorch_npu/csrc/framework/interface/EnvVariables.h+11-1
@@ -32,12 +32,22 @@ enum class CompatibleKey {
32bool CheckCompatibleImpl();32bool CheckCompatibleImpl();
33bool CheckCompatibleImplFor(CompatibleKey compatible_key);33bool CheckCompatibleImplFor(CompatibleKey compatible_key);
34bool CheckCompatibleImplBlackListFor(CompatibleKey compatible_key);34bool CheckCompatibleImplBlackListFor(CompatibleKey compatible_key);
35-bool CheckFillUninitializedMemory();
36 35 
37bool IsAllowFP32ToFP16();36bool IsAllowFP32ToFP16();
38bool IsAllowConvHF32();37bool IsAllowConvHF32();
39bool IsAllowMatmulHF32();38bool IsAllowMatmulHF32();
40 39 
40+class NpuContext {
41+ public:
42+ bool npuFillUninitializedMemory() const;
43+ void setNpuFillUninitializedMemory(bool /*b*/);
44+ 
45+ private:
46+ bool _npu_fill_uninitialized_memory = false;
47+};
48+ 
49+NpuContext& globalNpuContext();
50+ 
41} // namespace env51} // namespace env
42} // namespace native52} // namespace native
43} // namespace at_npu53} // namespace at_npu
Mtorch_npu/csrc/npu/Module.cpp+29-0
@@ -2533,6 +2533,27 @@ PyObject* THNPModule_get_deterministic_level(PyObject* self, PyObject* noargs) {
2533 END_HANDLE_TH_ERRORS2533 END_HANDLE_TH_ERRORS
2534}2534}
2535 2535 
2536+static PyObject* THNPModule_setNpuFillUninitializedMemory(
2537+ PyObject* _unused,
2538+ PyObject* arg) {
2539+ HANDLE_TH_ERRORS
2540+ TORCH_CHECK(
2541+ PyBool_Check(arg), "expected a bool, but got ", THPUtils_typename(arg));
2542+ at_npu::native::env::globalNpuContext().setNpuFillUninitializedMemory(
2543+ arg == Py_True);
2544+ Py_RETURN_NONE;
2545+ END_HANDLE_TH_ERRORS
2546+}
2547+ 
2548+static PyObject* THNPModule_npuFillUninitializedMemory(
2549+ PyObject* _unused,
2550+ PyObject* noargs) {
2551+ if (at_npu::native::env::globalNpuContext().npuFillUninitializedMemory())
2552+ Py_RETURN_TRUE;
2553+ else
2554+ Py_RETURN_FALSE;
2555+}
atomgit-bot
atomgit-botatomgit-bot23 天前

🟡 Medium Priority

变更行:Module.cpp 第 2548-2555 行新增的 THNPModule_npuFillUninitializedMemory 函数。

该函数是 CPython 扩展方法(通过 PyMethodDef 注册为 _npu_get_fill_uninitialized_memoryMETH_NOARGS),但其函数体中缺少 HANDLE_TH_ERRORS / END_HANDLE_TH_ERRORS 异常处理宏。

问题链条:

  • 同一文件中所有其他 CPython 导出函数(包括同类型的 THNPModule_get_deterministic_level 第 2529-2534 行、THNPModule_npu_get_sync_debug_mode 第 1975 行、以及配对的 setter THNPModule_setNpuFillUninitializedMemory 第 2539-2545 行)均使用 HANDLE_TH_ERRORS / END_HANDLE_TH_ERRORS 包裹函数体。
  • 这是一个可靠性缺陷:该函数与代码库中所有其他导出函数的失败模式不一致,作为已暴露的公共 API,其异常安全性不可靠。

建议:在函数体首尾添加 HANDLE_TH_ERRORSEND_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
  }
应用建议
likedislike
huangyunlong
23 天前 评论:
2556+ 
2536PyObject* THNPModule_hasPrimaryContext_wrap(PyObject* self, PyObject* arg) {2557PyObject* THNPModule_hasPrimaryContext_wrap(PyObject* self, PyObject* arg) {
2537 HANDLE_TH_ERRORS2558 HANDLE_TH_ERRORS
2538 TORCH_CHECK(2559 TORCH_CHECK(
@@ -2863,6 +2884,14 @@ static struct PyMethodDef THNPModule_methods[] = {
2863 (PyCFunction)THNPModule_get_deterministic_level,2884 (PyCFunction)THNPModule_get_deterministic_level,
2864 METH_NOARGS,2885 METH_NOARGS,
2865 nullptr},2886 nullptr},
2887+ {"_npu_set_fill_uninitialized_memory",
2888+ (PyCFunction)THNPModule_setNpuFillUninitializedMemory,
2889+ METH_O,
2890+ nullptr},
2891+ {"_npu_get_fill_uninitialized_memory",
2892+ (PyCFunction)THNPModule_npuFillUninitializedMemory,
2893+ METH_NOARGS,
2894+ nullptr},
2866 {"_npu_sleep",2895 {"_npu_sleep",
2867 (PyCFunction)THNPModule_npuSleep,2896 (PyCFunction)THNPModule_npuSleep,
2868 METH_O,2897 METH_O,
Mtorch_npu/utils/_deterministic.py+2-3
@@ -2,7 +2,7 @@ def _add_deterministic_patch():
2 """2 """
3 Patch torch.utils.deterministic.fill_uninitialized_memory setter so that3 Patch torch.utils.deterministic.fill_uninitialized_memory setter so that
4 setting it also synchronizes the NPU-side option4 setting it also synchronizes the NPU-side option
5- TORCH_NPU_FILL_UNINITIALIZED_MEMORY via torch_npu._C._npu_setOption.5+ _npu_fill_uninitialized_memory via torch_npu._C._npu_set_fill_uninitialized_memory.
6 """6 """
7 import torch_npu7 import torch_npu
8 import torch.utils.deterministic as det_mod8 import torch.utils.deterministic as det_mod
@@ -19,7 +19,6 @@ def _add_deterministic_patch():
19 # 1. call original setter: torch._C._set_deterministic_fill_uninitialized_memory(mode)19 # 1. call original setter: torch._C._set_deterministic_fill_uninitialized_memory(mode)
20 _orig_fset(self, mode)20 _orig_fset(self, mode)
21 # 2. sync NPU-side option21 # 2. sync NPU-side option
22- option = {"TORCH_NPU_FILL_UNINITIALIZED_MEMORY": "1" if mode else "0"}22+ torch_npu._C._npu_set_fill_uninitialized_memory(mode)
23- torch_npu._C._npu_setOption(option)
24 23 
25 _Deterministic.fill_uninitialized_memory = property(_orig_fget, _new_fset)24 _Deterministic.fill_uninitialized_memory = property(_orig_fget, _new_fset)