From f864eb052570d91fcd14c242d0277f484d4c702c Mon Sep 17 00:00:00 2001 From: shubhambhokare1 Date: Thu, 29 Aug 2024 16:46:17 +0000 Subject: [PATCH 01/14] Fix error 32 --- onnxscript/ir/_external_data.py | 1 + onnxscript/ir/_external_data_test.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/onnxscript/ir/_external_data.py b/onnxscript/ir/_external_data.py index 6152491b60..ddc049b144 100644 --- a/onnxscript/ir/_external_data.py +++ b/onnxscript/ir/_external_data.py @@ -170,6 +170,7 @@ def _save_external_data( if current_offset > file_size: data_file.write(b"\0" * (current_offset - file_size)) data_file.write(raw_data) + data_file.close() def _convert_as_external_tensors( diff --git a/onnxscript/ir/_external_data_test.py b/onnxscript/ir/_external_data_test.py index 3cf27aa0ca..bdf34f911d 100644 --- a/onnxscript/ir/_external_data_test.py +++ b/onnxscript/ir/_external_data_test.py @@ -229,6 +229,7 @@ def _model_with_external_data_same_path(self) -> ir.Model: file_path = os.path.join(self.base_path, self.external_data_name) with open(file_path, "wb") as f: f.write(raw_data) + f.close() tensor_same_file = ir.ExternalTensor( location=self.external_data_name, offset=0, @@ -250,6 +251,7 @@ def _model_with_external_data_diff_path(self) -> ir.Model: with open(file_path_1, "wb") as f: f.write(self.data_ext1_1.tobytes()) f.write(self.data_ext1_2.tobytes()) + f.close() tensor_ext1_1 = ir.ExternalTensor( location=self.ext_data_1, offset=0, @@ -272,6 +274,7 @@ def _model_with_external_data_diff_path(self) -> ir.Model: file_path_2 = os.path.join(self.base_path, self.ext_data_2) with open(file_path_2, "wb") as f: f.write(self.data_ext2_1.tobytes()) + f.close() tensor_ext2_1 = ir.ExternalTensor( location=self.ext_data_2, offset=0, @@ -543,6 +546,7 @@ def test_external_data_sorted(self): current_offset += tensor_length self.assertEqual(tensor_data, tensor_bytes) self.assertEqual(tensor_data, expected_tensor_order[i]) + data_file.close() if __name__ == "__main__": From 147b9ba4acee723d80729bcaf6ab941741623242 Mon Sep 17 00:00:00 2001 From: shubhambhokare1 Date: Thu, 29 Aug 2024 17:00:43 +0000 Subject: [PATCH 02/14] try2 --- onnxscript/ir/_external_data_test.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/onnxscript/ir/_external_data_test.py b/onnxscript/ir/_external_data_test.py index bdf34f911d..ccdfaf2cf0 100644 --- a/onnxscript/ir/_external_data_test.py +++ b/onnxscript/ir/_external_data_test.py @@ -116,10 +116,10 @@ class OffloadExternalTensorTest(unittest.TestCase): def setUp(self): # File paths self.temp_dir = tempfile.TemporaryDirectory() # pylint: disable=consider-using-with - self.external_data_name = "external_tensors.bin" + self.external_data_name = r"external_tensors.bin" self.base_path = self.temp_dir.name - self.ext_data_1 = "external_data_1.bin" - self.ext_data_2 = "external_data_2.bin" + self.ext_data_1 = r"external_data_1.bin" + self.ext_data_2 = r"external_data_2.bin" # Data for the tensors self.data = np.random.rand(2, 42).astype(np.float32) self.data_other = np.random.rand(2, 42).astype(np.float32) From 6c7ff0bf46257abc48eb7fcbcd5994ba1695db7a Mon Sep 17 00:00:00 2001 From: shubhambhokare1 Date: Fri, 30 Aug 2024 19:36:52 +0000 Subject: [PATCH 03/14] clean up temp file --- onnxscript/ir/_external_data.py | 7 ++++++- onnxscript/ir/_external_data_test.py | 12 ++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/onnxscript/ir/_external_data.py b/onnxscript/ir/_external_data.py index ddc049b144..682a10020b 100644 --- a/onnxscript/ir/_external_data.py +++ b/onnxscript/ir/_external_data.py @@ -170,7 +170,6 @@ def _save_external_data( if current_offset > file_size: data_file.write(b"\0" * (current_offset - file_size)) data_file.write(raw_data) - data_file.close() def _convert_as_external_tensors( @@ -271,6 +270,12 @@ def convert_tensors_to_external( external_tensors[i] for i in sorted(range(len(external_tensors)), key=lambda i: sorted_indices[i]) ] + + # Clean-up temporary file if it is created + tmp_path = os.path.join(base_path, "tmp", relative_path) + if os.path.exists(tmp_path): + os.remove(tmp_path) + return external_tensors diff --git a/onnxscript/ir/_external_data_test.py b/onnxscript/ir/_external_data_test.py index ccdfaf2cf0..92343b5a2e 100644 --- a/onnxscript/ir/_external_data_test.py +++ b/onnxscript/ir/_external_data_test.py @@ -115,11 +115,11 @@ class OffloadExternalTensorTest(unittest.TestCase): def setUp(self): # File paths - self.temp_dir = tempfile.TemporaryDirectory() # pylint: disable=consider-using-with - self.external_data_name = r"external_tensors.bin" + self.temp_dir = tempfile.TemporaryDirectory(ignore_cleanup_errors=True) # pylint: disable=consider-using-with + self.external_data_name = "external_tensors.bin" self.base_path = self.temp_dir.name - self.ext_data_1 = r"external_data_1.bin" - self.ext_data_2 = r"external_data_2.bin" + self.ext_data_1 = "external_data_1.bin" + self.ext_data_2 = "external_data_2.bin" # Data for the tensors self.data = np.random.rand(2, 42).astype(np.float32) self.data_other = np.random.rand(2, 42).astype(np.float32) @@ -229,7 +229,6 @@ def _model_with_external_data_same_path(self) -> ir.Model: file_path = os.path.join(self.base_path, self.external_data_name) with open(file_path, "wb") as f: f.write(raw_data) - f.close() tensor_same_file = ir.ExternalTensor( location=self.external_data_name, offset=0, @@ -251,7 +250,6 @@ def _model_with_external_data_diff_path(self) -> ir.Model: with open(file_path_1, "wb") as f: f.write(self.data_ext1_1.tobytes()) f.write(self.data_ext1_2.tobytes()) - f.close() tensor_ext1_1 = ir.ExternalTensor( location=self.ext_data_1, offset=0, @@ -274,7 +272,6 @@ def _model_with_external_data_diff_path(self) -> ir.Model: file_path_2 = os.path.join(self.base_path, self.ext_data_2) with open(file_path_2, "wb") as f: f.write(self.data_ext2_1.tobytes()) - f.close() tensor_ext2_1 = ir.ExternalTensor( location=self.ext_data_2, offset=0, @@ -546,7 +543,6 @@ def test_external_data_sorted(self): current_offset += tensor_length self.assertEqual(tensor_data, tensor_bytes) self.assertEqual(tensor_data, expected_tensor_order[i]) - data_file.close() if __name__ == "__main__": From 9592768bdce94a6b9095341e57182c57213489b5 Mon Sep 17 00:00:00 2001 From: shubhambhokare1 Date: Fri, 30 Aug 2024 19:38:26 +0000 Subject: [PATCH 04/14] reorder --- onnxscript/ir/_external_data.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/onnxscript/ir/_external_data.py b/onnxscript/ir/_external_data.py index 682a10020b..ed34c57675 100644 --- a/onnxscript/ir/_external_data.py +++ b/onnxscript/ir/_external_data.py @@ -261,6 +261,11 @@ def convert_tensors_to_external( current_offset = tensor_info.offset + tensor_info.length _save_external_data(external_data_info, path) + # Clean-up temporary file if it is created + tmp_path = os.path.join(base_path, "tmp", relative_path) + if os.path.exists(tmp_path): + os.remove(tmp_path) + # Convert initializers to ExternalTensors external_tensors = _convert_as_external_tensors( external_data_info, base_path, relative_path @@ -270,12 +275,6 @@ def convert_tensors_to_external( external_tensors[i] for i in sorted(range(len(external_tensors)), key=lambda i: sorted_indices[i]) ] - - # Clean-up temporary file if it is created - tmp_path = os.path.join(base_path, "tmp", relative_path) - if os.path.exists(tmp_path): - os.remove(tmp_path) - return external_tensors From 7aa6b9362e01faa711c86837e6376b53a6b8a82b Mon Sep 17 00:00:00 2001 From: shubhambhokare1 Date: Fri, 30 Aug 2024 19:49:46 +0000 Subject: [PATCH 05/14] reorder2 --- onnxscript/ir/_external_data.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/onnxscript/ir/_external_data.py b/onnxscript/ir/_external_data.py index ed34c57675..682a10020b 100644 --- a/onnxscript/ir/_external_data.py +++ b/onnxscript/ir/_external_data.py @@ -261,11 +261,6 @@ def convert_tensors_to_external( current_offset = tensor_info.offset + tensor_info.length _save_external_data(external_data_info, path) - # Clean-up temporary file if it is created - tmp_path = os.path.join(base_path, "tmp", relative_path) - if os.path.exists(tmp_path): - os.remove(tmp_path) - # Convert initializers to ExternalTensors external_tensors = _convert_as_external_tensors( external_data_info, base_path, relative_path @@ -275,6 +270,12 @@ def convert_tensors_to_external( external_tensors[i] for i in sorted(range(len(external_tensors)), key=lambda i: sorted_indices[i]) ] + + # Clean-up temporary file if it is created + tmp_path = os.path.join(base_path, "tmp", relative_path) + if os.path.exists(tmp_path): + os.remove(tmp_path) + return external_tensors From a075ab7661b5332c2e6e5f633465d6e8c2fa98bc Mon Sep 17 00:00:00 2001 From: shubhambhokare1 Date: Tue, 3 Sep 2024 22:29:27 +0000 Subject: [PATCH 06/14] Add copy function --- onnxscript/ir/_core.py | 12 ++++++++++++ onnxscript/ir/_external_data.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/onnxscript/ir/_core.py b/onnxscript/ir/_core.py index 1b1b4fb53a..e4c0a838e2 100644 --- a/onnxscript/ir/_core.py +++ b/onnxscript/ir/_core.py @@ -671,6 +671,18 @@ def tobytes(self) -> bytes: length = self._length or self.nbytes return self.raw[offset : offset + length] + def copy(self) -> np.ndarray: + """Creates a copy of the numpy array representing the tensor. + + This will also delete all references to the memory buffer and close the memory-mapped file. + """ + _copy = self.numpy().copy() + # Delete references + self._array = None + # Close mmap file + self.raw.close() + return _copy + @property def metadata_props(self) -> dict[str, str]: if self._metadata_props is None: diff --git a/onnxscript/ir/_external_data.py b/onnxscript/ir/_external_data.py index 682a10020b..346b5ade7c 100644 --- a/onnxscript/ir/_external_data.py +++ b/onnxscript/ir/_external_data.py @@ -99,7 +99,7 @@ def _load_external_data_file( external_tensor = tensor if os.path.samefile(tensor.path, os.path.join(base_path, relative_path)): # Copy the data as the .numpy() call references data from a file whose data is eventually modified - tensor_data = external_tensor.numpy().copy() + tensor_data = external_tensor.copy() tensor = _core.Tensor( tensor_data, name=external_tensor.name, dtype=external_tensor.dtype ) From fa3a0cf0ee5e7fb3e737f92962cd998d70d93cf5 Mon Sep 17 00:00:00 2001 From: shubhambhokare1 Date: Tue, 3 Sep 2024 22:35:24 +0000 Subject: [PATCH 07/14] Tmp file flag --- onnxscript/ir/_core.py | 1 + onnxscript/ir/_external_data.py | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/onnxscript/ir/_core.py b/onnxscript/ir/_core.py index e4c0a838e2..d8f7c5e1c9 100644 --- a/onnxscript/ir/_core.py +++ b/onnxscript/ir/_core.py @@ -680,6 +680,7 @@ def copy(self) -> np.ndarray: # Delete references self._array = None # Close mmap file + assert self.raw is not None self.raw.close() return _copy diff --git a/onnxscript/ir/_external_data.py b/onnxscript/ir/_external_data.py index 346b5ade7c..a0fce09fd7 100644 --- a/onnxscript/ir/_external_data.py +++ b/onnxscript/ir/_external_data.py @@ -223,6 +223,7 @@ def convert_tensors_to_external( path = os.path.join(base_path, relative_path) # Check if file path is valid, and create subsequent subdirectories within the path if they don't exist os.makedirs(os.path.dirname(path), exist_ok=True) + tmp_file_created = False # Check if file exists. Load pre-existing external data if it does. if os.path.exists(path): # Check if any tensor in the model is using the destination file @@ -241,6 +242,7 @@ def convert_tensors_to_external( os.makedirs(tmp_path, exist_ok=True) # If exisiting external tensors are not loaded to memory, copy the external data to a temporary location os.rename(path, os.path.join(tmp_path, relative_path)) + tmp_file_created = True for tensor in tensors: if ( isinstance(tensor, _core.ExternalTensor) @@ -273,7 +275,7 @@ def convert_tensors_to_external( # Clean-up temporary file if it is created tmp_path = os.path.join(base_path, "tmp", relative_path) - if os.path.exists(tmp_path): + if os.path.exists(tmp_path) and tmp_file_created: os.remove(tmp_path) return external_tensors From beb4f6d8e08ee45d4504e12dd3cb73b75f300035 Mon Sep 17 00:00:00 2001 From: shubhambhokare1 Date: Tue, 3 Sep 2024 22:47:13 +0000 Subject: [PATCH 08/14] close mmap --- onnxscript/ir/_external_data.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/onnxscript/ir/_external_data.py b/onnxscript/ir/_external_data.py index a0fce09fd7..a377c0e54b 100644 --- a/onnxscript/ir/_external_data.py +++ b/onnxscript/ir/_external_data.py @@ -164,7 +164,10 @@ def _save_external_data( for tensor, tensor_info in external_data_info: current_offset = tensor_info.offset assert tensor is not None - raw_data = tensor.tobytes() + if isinstance(tensor, _core.ExternalTensor): + raw_data = tensor.copy() + else: + raw_data = tensor.tobytes() # Pad file to required offset if needed file_size = data_file.tell() if current_offset > file_size: @@ -223,7 +226,7 @@ def convert_tensors_to_external( path = os.path.join(base_path, relative_path) # Check if file path is valid, and create subsequent subdirectories within the path if they don't exist os.makedirs(os.path.dirname(path), exist_ok=True) - tmp_file_created = False + tempfile_created = False # Check if file exists. Load pre-existing external data if it does. if os.path.exists(path): # Check if any tensor in the model is using the destination file From 74492a5e5839ce8ff36240bf47062c37f7fa17c0 Mon Sep 17 00:00:00 2001 From: shubhambhokare1 Date: Tue, 3 Sep 2024 22:48:06 +0000 Subject: [PATCH 09/14] fix naming --- onnxscript/ir/_external_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/onnxscript/ir/_external_data.py b/onnxscript/ir/_external_data.py index a377c0e54b..e41ab240f2 100644 --- a/onnxscript/ir/_external_data.py +++ b/onnxscript/ir/_external_data.py @@ -226,7 +226,7 @@ def convert_tensors_to_external( path = os.path.join(base_path, relative_path) # Check if file path is valid, and create subsequent subdirectories within the path if they don't exist os.makedirs(os.path.dirname(path), exist_ok=True) - tempfile_created = False + tmp_file_created = False # Check if file exists. Load pre-existing external data if it does. if os.path.exists(path): # Check if any tensor in the model is using the destination file From a22f47e1bd6b420d6ae5810e32797ea6d2260394 Mon Sep 17 00:00:00 2001 From: shubhambhokare1 Date: Tue, 3 Sep 2024 23:11:23 +0000 Subject: [PATCH 10/14] Handle exceptions --- onnxscript/ir/_core.py | 11 ++--------- onnxscript/ir/_external_data.py | 8 ++++---- onnxscript/ir/_external_data_test.py | 10 +++++++++- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/onnxscript/ir/_core.py b/onnxscript/ir/_core.py index d8f7c5e1c9..959998c5fa 100644 --- a/onnxscript/ir/_core.py +++ b/onnxscript/ir/_core.py @@ -671,18 +671,11 @@ def tobytes(self) -> bytes: length = self._length or self.nbytes return self.raw[offset : offset + length] - def copy(self) -> np.ndarray: - """Creates a copy of the numpy array representing the tensor. - - This will also delete all references to the memory buffer and close the memory-mapped file. - """ - _copy = self.numpy().copy() - # Delete references + def cleanup(self) -> None: + """Delete all references to the memory buffer and close the memory-mapped file.""" self._array = None - # Close mmap file assert self.raw is not None self.raw.close() - return _copy @property def metadata_props(self) -> dict[str, str]: diff --git a/onnxscript/ir/_external_data.py b/onnxscript/ir/_external_data.py index e41ab240f2..eef39a8268 100644 --- a/onnxscript/ir/_external_data.py +++ b/onnxscript/ir/_external_data.py @@ -99,7 +99,8 @@ def _load_external_data_file( external_tensor = tensor if os.path.samefile(tensor.path, os.path.join(base_path, relative_path)): # Copy the data as the .numpy() call references data from a file whose data is eventually modified - tensor_data = external_tensor.copy() + tensor_data = external_tensor.numpy().copy() + external_tensor.cleanup() tensor = _core.Tensor( tensor_data, name=external_tensor.name, dtype=external_tensor.dtype ) @@ -164,10 +165,9 @@ def _save_external_data( for tensor, tensor_info in external_data_info: current_offset = tensor_info.offset assert tensor is not None + raw_data = tensor.tobytes() if isinstance(tensor, _core.ExternalTensor): - raw_data = tensor.copy() - else: - raw_data = tensor.tobytes() + tensor.cleanup() # Pad file to required offset if needed file_size = data_file.tell() if current_offset > file_size: diff --git a/onnxscript/ir/_external_data_test.py b/onnxscript/ir/_external_data_test.py index 92343b5a2e..7b604ae3f5 100644 --- a/onnxscript/ir/_external_data_test.py +++ b/onnxscript/ir/_external_data_test.py @@ -136,7 +136,15 @@ def setUp(self): self.model_with_mixed_external_data = self._model_with_mixed_external_data() def tearDown(self) -> None: - self.temp_dir.cleanup() + # Handle exceptions for windows and python versions < 3.10 + try: + self.temp_dir.cleanup() + except PermissionError as e: + print(f"PermissionError: {e}") + except FileNotFoundError as e: + print(f"FileNotFoundError: {e}") + except Exception as e: # pylint: disable=broad-exception-caught + print(f"An unexpected error occurred: {e}") def _simple_model(self) -> ir.Model: tensor1 = ir.Tensor( From 77cabe91280a51317d3ad103b6a7c74b64024627 Mon Sep 17 00:00:00 2001 From: shubhambhokare1 Date: Tue, 3 Sep 2024 23:32:53 +0000 Subject: [PATCH 11/14] add py versioning --- onnxscript/ir/_external_data_test.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/onnxscript/ir/_external_data_test.py b/onnxscript/ir/_external_data_test.py index 7b604ae3f5..fc0611dd35 100644 --- a/onnxscript/ir/_external_data_test.py +++ b/onnxscript/ir/_external_data_test.py @@ -1,6 +1,7 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. import os +import sys import tempfile import typing import unittest @@ -115,7 +116,10 @@ class OffloadExternalTensorTest(unittest.TestCase): def setUp(self): # File paths - self.temp_dir = tempfile.TemporaryDirectory(ignore_cleanup_errors=True) # pylint: disable=consider-using-with + if sys.version_info == 3 and sys.version_info >= 10: + self.temp_dir = tempfile.TemporaryDirectory(ignore_cleanup_errors=True) # pylint: disable=consider-using-with + else: + self.temp_dir = tempfile.TemporaryDirectory() # pylint: disable=consider-using-with self.external_data_name = "external_tensors.bin" self.base_path = self.temp_dir.name self.ext_data_1 = "external_data_1.bin" From 5dcc6eb496754ce52d9c60d3d10d29199d7ce808 Mon Sep 17 00:00:00 2001 From: shubhambhokare1 Date: Wed, 4 Sep 2024 00:50:01 +0000 Subject: [PATCH 12/14] edits --- onnxscript/ir/_core.py | 5 +++-- onnxscript/ir/_external_data_test.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/onnxscript/ir/_core.py b/onnxscript/ir/_core.py index 959998c5fa..753a767a3e 100644 --- a/onnxscript/ir/_core.py +++ b/onnxscript/ir/_core.py @@ -674,8 +674,9 @@ def tobytes(self) -> bytes: def cleanup(self) -> None: """Delete all references to the memory buffer and close the memory-mapped file.""" self._array = None - assert self.raw is not None - self.raw.close() + if self.raw is not None: + self.raw.close() + self.raw = None @property def metadata_props(self) -> dict[str, str]: diff --git a/onnxscript/ir/_external_data_test.py b/onnxscript/ir/_external_data_test.py index fc0611dd35..afcf32b200 100644 --- a/onnxscript/ir/_external_data_test.py +++ b/onnxscript/ir/_external_data_test.py @@ -116,7 +116,7 @@ class OffloadExternalTensorTest(unittest.TestCase): def setUp(self): # File paths - if sys.version_info == 3 and sys.version_info >= 10: + if sys.version_info[:2] >= (3, 10): self.temp_dir = tempfile.TemporaryDirectory(ignore_cleanup_errors=True) # pylint: disable=consider-using-with else: self.temp_dir = tempfile.TemporaryDirectory() # pylint: disable=consider-using-with From ba58cbb0cc0a6854fe1874b1a637dd32174f8f8a Mon Sep 17 00:00:00 2001 From: shubhambhokare1 Date: Wed, 4 Sep 2024 01:07:45 +0000 Subject: [PATCH 13/14] add test --- onnxscript/ir/_core.py | 2 +- onnxscript/ir/_core_test.py | 19 +++++++++++++++++++ onnxscript/ir/_external_data.py | 4 ++-- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/onnxscript/ir/_core.py b/onnxscript/ir/_core.py index 753a767a3e..61dbf5f0bf 100644 --- a/onnxscript/ir/_core.py +++ b/onnxscript/ir/_core.py @@ -671,7 +671,7 @@ def tobytes(self) -> bytes: length = self._length or self.nbytes return self.raw[offset : offset + length] - def cleanup(self) -> None: + def release(self) -> None: """Delete all references to the memory buffer and close the memory-mapped file.""" self._array = None if self.raw is not None: diff --git a/onnxscript/ir/_core_test.py b/onnxscript/ir/_core_test.py index 79c4959985..bdbb1e1f40 100644 --- a/onnxscript/ir/_core_test.py +++ b/onnxscript/ir/_core_test.py @@ -244,6 +244,25 @@ def test_initialize(self): # Ensure repeated reads are consistent np.testing.assert_equal(tensor, self.data) + def test_release(self): + external_tensor = self.model.graph.initializer[0] + external_info = onnx.external_data_helper.ExternalDataInfo(external_tensor) + tensor = _core.ExternalTensor( + external_info.location, + offset=external_info.offset, + length=external_info.length, + dtype=ir.DataType.FLOAT, + base_dir=self.base_path, + name="input", + shape=_core.Shape(external_tensor.dims), + ) + self.assertEqual(tensor.dtype, ir.DataType.FLOAT) + self.assertEqual(tensor.tobytes(), self.data.tobytes()) + # Release tensor + tensor.release() + self.assertEqual(tensor.raw, None) + self.assertEqual(tensor.tobytes(), self.data.tobytes()) + def test_initialize_with_relative_path(self): external_tensor = self.model.graph.initializer[0] external_info = onnx.external_data_helper.ExternalDataInfo(external_tensor) diff --git a/onnxscript/ir/_external_data.py b/onnxscript/ir/_external_data.py index eef39a8268..75a7e34bc1 100644 --- a/onnxscript/ir/_external_data.py +++ b/onnxscript/ir/_external_data.py @@ -100,7 +100,7 @@ def _load_external_data_file( if os.path.samefile(tensor.path, os.path.join(base_path, relative_path)): # Copy the data as the .numpy() call references data from a file whose data is eventually modified tensor_data = external_tensor.numpy().copy() - external_tensor.cleanup() + external_tensor.release() tensor = _core.Tensor( tensor_data, name=external_tensor.name, dtype=external_tensor.dtype ) @@ -167,7 +167,7 @@ def _save_external_data( assert tensor is not None raw_data = tensor.tobytes() if isinstance(tensor, _core.ExternalTensor): - tensor.cleanup() + tensor.release() # Pad file to required offset if needed file_size = data_file.tell() if current_offset > file_size: From 9b3e82e8421da9b3b860162d26cc1aa7f7e2845d Mon Sep 17 00:00:00 2001 From: shubhambhokare1 Date: Wed, 4 Sep 2024 19:36:25 +0000 Subject: [PATCH 14/14] minor changes --- onnxscript/ir/_core_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/onnxscript/ir/_core_test.py b/onnxscript/ir/_core_test.py index bdbb1e1f40..802bf39deb 100644 --- a/onnxscript/ir/_core_test.py +++ b/onnxscript/ir/_core_test.py @@ -244,7 +244,7 @@ def test_initialize(self): # Ensure repeated reads are consistent np.testing.assert_equal(tensor, self.data) - def test_release(self): + def test_release_does_not_invalidate_tensor(self): external_tensor = self.model.graph.initializer[0] external_info = onnx.external_data_helper.ExternalDataInfo(external_tensor) tensor = _core.ExternalTensor( @@ -261,6 +261,7 @@ def test_release(self): # Release tensor tensor.release() self.assertEqual(tensor.raw, None) + # Tensor can be re-loaded after release self.assertEqual(tensor.tobytes(), self.data.tobytes()) def test_initialize_with_relative_path(self):