已合并
use torch_npu._C instead of option #43705
huangyunlong创建于 25 天前
use torch_npu._C instead of option #43705
已合并
huangyunlong创建于 25 天前
7 个文件变更+59-10
@@ -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__':
@@ -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;
@@ -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(
@@ -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
@@ -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
@@ -2534,6 +2534,27 @@ PyObject* THNPModule_get_deterministic_level(PyObject* self, PyObject* noargs) {
2534 END_HANDLE_TH_ERRORS2534 END_HANDLE_TH_ERRORS
2535}2535}
2536 2536 
2537+static PyObject* THNPModule_setNpuFillUninitializedMemory(
2538+ PyObject* _unused,
2539+ PyObject* arg) {
2540+ HANDLE_TH_ERRORS
2541+ TORCH_CHECK(
2542+ PyBool_Check(arg), "expected a bool, but got ", THPUtils_typename(arg));
2543+ at_npu::native::env::globalNpuContext().setNpuFillUninitializedMemory(
2544+ arg == Py_True);
2545+ Py_RETURN_NONE;
2546+ END_HANDLE_TH_ERRORS
2547+}
2548+ 
2549+static PyObject* THNPModule_npuFillUninitializedMemory(
2550+ PyObject* _unused,
2551+ PyObject* noargs) {
2552+ if (at_npu::native::env::globalNpuContext().npuFillUninitializedMemory())
2553+ Py_RETURN_TRUE;
2554+ else
2555+ Py_RETURN_FALSE;
2556+}
atomgit-bot
atomgit-botatomgit-bot25 天前

🟡 Medium Priority

THNPModule_npuFillUninitializedMemory(第 2549-2556 行)是一个 Python C API 函数,注册为 METH_NOARGS,但其函数体缺少 HANDLE_TH_ERRORS / END_HANDLE_TH_ERRORS 宏包裹。

证据链:

  • 变更行:第 2549-2556 行新增的函数体未包含 HANDLE_TH_ERRORS / END_HANDLE_TH_ERRORS
  • 对比证据:同一文件中所有其他 METH_NOARGS 函数都正确使用了这对宏。特别地,紧邻的 THNPModule_get_deterministic_level(第 2530-2535 行)和同批新增的 THNPModule_setNpuFillUninitializedMemory(第 2537-2547 行)都正确使用了 HANDLE_TH_ERRORS / END_HANDLE_TH_ERRORS。这是整个 Module.cpp 中唯一缺少这对宏的 METH_NOARGS 函数。

建议:在函数体首尾添加 HANDLE_TH_ERRORS / END_HANDLE_TH_ERRORS 宏,与项目中所有其他 METH_NOARGS 函数保持一致。

改动建议
2556
+ static PyObject* THNPModule_npuFillUninitializedMemory(
2557
+ PyObject* _unused,
2558
+ PyObject* noargs) {
2559
+ HANDLE_TH_ERRORS
2560
+ if (at_npu::native::env::globalNpuContext().npuFillUninitializedMemory())
2561
+ Py_RETURN_TRUE;
2562
+ else
2563
+ Py_RETURN_FALSE;
2564
+ END_HANDLE_TH_ERRORS
2556
2565
  }
应用建议
likedislike
huangyunlong
25 天前 评论:
2557+ 
2537PyObject* THNPModule_hasPrimaryContext_wrap(PyObject* self, PyObject* arg) {2558PyObject* THNPModule_hasPrimaryContext_wrap(PyObject* self, PyObject* arg) {
2538 HANDLE_TH_ERRORS2559 HANDLE_TH_ERRORS
2539 TORCH_CHECK(2560 TORCH_CHECK(
@@ -2864,6 +2885,14 @@ static struct PyMethodDef THNPModule_methods[] = {
2864 (PyCFunction)THNPModule_get_deterministic_level,2885 (PyCFunction)THNPModule_get_deterministic_level,
2865 METH_NOARGS,2886 METH_NOARGS,
2866 nullptr},2887 nullptr},
2888+ {"_npu_set_fill_uninitialized_memory",
2889+ (PyCFunction)THNPModule_setNpuFillUninitializedMemory,
2890+ METH_O,
2891+ nullptr},
2892+ {"_npu_get_fill_uninitialized_memory",
2893+ (PyCFunction)THNPModule_npuFillUninitializedMemory,
2894+ METH_NOARGS,
2895+ nullptr},
2867 {"_npu_sleep",2896 {"_npu_sleep",
2868 (PyCFunction)THNPModule_npuSleep,2897 (PyCFunction)THNPModule_npuSleep,
2869 METH_O,2898 METH_O,
@@ -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)