From fe9648790f745639d91af3d0a4b7b7cff56c2533 Mon Sep 17 00:00:00 2001 From: s30048155 Date: Fri, 8 Dec 2023 11:11:50 +0800 Subject: [PATCH 1/4] add ut --- .../online_dispatch/test_dispatch_compare.py | 95 ++++++++++++++++++ .../ut/online_dispatch/test_dispatch_util.py | 97 +++++++++++++++++++ 2 files changed, 192 insertions(+) create mode 100644 debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_compare.py create mode 100644 debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_util.py diff --git a/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_compare.py b/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_compare.py new file mode 100644 index 00000000000..976d0eee4a7 --- /dev/null +++ b/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_compare.py @@ -0,0 +1,95 @@ +import unittest +import torch +import numpy as np +from unittest.mock import patch, MagicMock,Mock +from ptdbg_ascend.online_dispatch.dump_compare import * +class TestDumpCompare(unittest.TestCase): + + def setUp(self): + self.run_param = DispatchRunParam( + debug_flag=True, + device_id=0, + root_npu_path='/npu/path', + root_cpu_path='/cpu/path', + process_num=1 + ) + + @patch('ptdbg_ascend.online_dispatch.dump_compare.logger_debug') + def test_TimeStatistics(self, mock_logger_debug): + with TimeStatistics("test_tag", self.run_param): + pass + mock_logger_debug.assert_called() + + @patch('ptdbg_ascend.online_dispatch.dump_compare.logger_user') + def test_save_summery(self, mock_logger_user): + npu_data = torch.tensor([1.0, 2.0]) + cpu_data = torch.tensor([1.0, 2.0]) + summery_list = [] + save_summery(self.run_param, npu_data, cpu_data, 'prefix', summery_list, True) + self.assertTrue(len(summery_list) > 0) + + def test_support_basic_type(self): + self.assertTrue(support_basic_type(1)) + self.assertTrue(support_basic_type(1.0)) + self.assertTrue(support_basic_type(True)) + self.assertTrue(support_basic_type(torch.tensor([1.0]))) + + @patch('ptdbg_ascend.online_dispatch.dump_compare.np_save_data') + def test_dump_data(self, mock_np_save_data): + dump_data(torch.tensor([1.0]), 'prefix', '/path') + mock_np_save_data.assert_called_once() + + @patch('ptdbg_ascend.online_dispatch.dump_compare.save_summery') + def test_compare_data(self, mock_save_summery): + npu_data = torch.tensor([1.0]) + cpu_data = torch.tensor([1.0]) + summery_list = [] + result = compare_data(self.run_param, npu_data, cpu_data, 'prefix', summery_list, True) + self.assertTrue(result) + + @patch('ptdbg_ascend.online_dispatch.dump_compare.FileOpen') + @patch('ptdbg_ascend.online_dispatch.dump_compare.json.dump') + def test_save_temp_summery(self, mock_json_dump, mock_file_open): + lock = MagicMock() + save_temp_summery(0, [], '/path', lock) + mock_json_dump.assert_called_once() + + @patch('ptdbg_ascend.online_dispatch.dump_compare.getattr') + def test_get_torch_func(self, mock_getattr): + mock_getattr.return_value = MagicMock() + self.run_param.func_namespace = 'namespace' + self.run_param.aten_api = 'api' + self.run_param.aten_api_overload_name = 'overload' + result = get_torch_func(self.run_param) + self.assertTrue(result) + + @patch('ptdbg_ascend.online_dispatch.dump_compare.dispatch_workflow') + @patch('ptdbg_ascend.online_dispatch.dump_compare.get_torch_func') + def test_dispatch_multiprocess(self, mock_get_torch_func, mock_dispatch_workflow): + mock_get_torch_func.return_value = MagicMock() + cpu_args = (torch.tensor([1.0]),) + cpu_kwargs = {} + all_summery = [] + npu_out_cpu = torch.tensor([1.0]) + cpu_out = torch.tensor([1.0]) + lock = MagicMock() + dispatch_multiprocess(self.run_param, cpu_args, cpu_kwargs, all_summery, npu_out_cpu, cpu_out, lock) + mock_get_torch_func.assert_called_once() + + @patch('ptdbg_ascend.online_dispatch.dump_compare.logger_error') + def test_error_call(self, mock_logger_error): + error_call('test error') + mock_logger_error.assert_called_once_with('multiprocess test error') + + @patch('ptdbg_ascend.online_dispatch.dump_compare.pd.DataFrame') + @patch('ptdbg_ascend.online_dispatch.dump_compare.change_mode') + def test_save_csv(self, mock_change_mode, mock_data_frame): + all_summery = [[{'npu_name': 'test'}]] + call_stack_list = ['stack'] + csv_path = '/path/to/csv' + save_csv(all_summery, call_stack_list, csv_path) + mock_data_frame.assert_called() + mock_change_mode.assert_called_with(csv_path, '644') + + if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_util.py b/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_util.py new file mode 100644 index 00000000000..8531ac0f798 --- /dev/null +++ b/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_util.py @@ -0,0 +1,97 @@ +import unittest +from unittest.mock import patch, MagicMock +from ptdbg_ascend.online_dispatch.utils import * +import torch +import numpy as np +import os +import logging +from ptdbg_ascend.common.utils import CompareConst + +COLOR_YELLOW='\033[33m' +COLOR_RED='\033[31m' +COLOR_RESET='\033[0m' + +class TestUtils(unittest.TestCase): + + def test_get_callstack(self): + stack = get_callstack() + self.assertTrue(isinstance(stack, list)) + self.assertTrue(all(isinstance(item, list) for item in stack)) + + @patch('numpy.save') + def test_np_save_data(self, mock_save): + data = np.array([1, 2, 3]) + np_save_data(data, 'test', '/tmp') + mock_save.assert_called_once() + data = torch.tensor([1, 2, 3]) + np_save_data(data, 'test', '/tmp') + mock_save.assert_called() + + def test_data_to_cpu(self): + tensor = torch.tensor([1, 2, 3], device='npu:0') + result = data_to_cpu(tensor, 0, []) + self.assertTrue(result.device.type == 'cpu') + + @patch('logging.getLogger') + def test_get_mp_logger(self, mock_get_logger): + mock_logger = MagicMock() + mock_get_logger.return_value = mock_logger + logger = get_mp_logger() + self.assertTrue(callable(logger)) + + @patch('ptdbg_ascend.online_dispatch.utils.get_mp_logger') + def test_logger_debug(self, mock_get_logger): + mock_logger = MagicMock() + mock_get_logger.return_value = mock_logger + logger_debug('test') + mock_logger.assert_called_once_with('DEBUG test') + + @patch('ptdbg_ascend.online_dispatch.utils.get_mp_logger') + def test_logger_info(self, mock_get_logger): + mock_logger = MagicMock() + mock_get_logger.return_value = mock_logger + logger_info('test') + mock_logger.assert_called_once_with('INFO test') + + @patch('ptdbg_ascend.online_dispatch.utils.get_mp_logger') + def test_logger_warn(self, mock_get_logger): + mock_logger = MagicMock() + mock_get_logger.return_value = mock_logger + logger_warn('test') + mock_logger.assert_called_once_with(f'{COLOR_YELLOW}WARNING test {COLOR_RESET}') + + @patch('ptdbg_ascend.online_dispatch.utils.get_mp_logger') + def test_logger_error(self, mock_get_logger): + mock_logger = MagicMock() + mock_get_logger.return_value = mock_logger + logger_error('test') + mock_logger.assert_called_once_with(f'{COLOR_RED}ERROR test {COLOR_RESET}') + + @patch('ptdbg_ascend.online_dispatch.utils.get_mp_logger') + def test_logger_user(self, mock_get_logger): + mock_logger = MagicMock() + mock_get_logger.return_value = mock_logger + logger_user('test') + mock_logger.assert_called_once_with('test') + + @patch('ptdbg_ascend.online_dispatch.utils.get_mp_logger') + def test_logger_logo(self, mock_get_logger): + mock_logger = MagicMock() + mock_get_logger.return_value = mock_logger + logger_logo() + mock_logger.assert_called_once() + + @patch('psutil.virtual_memory') + @patch('psutil.cpu_percent') + def test_get_sys_info(self, mock_cpu_percent, mock_virtual_memory): + mock_virtual_memory.return_value = MagicMock(total=8*1024*1024, available=4*1024*1024, used=4*1024*1024) + mock_cpu_percent.return_value = 50 + sys_info = get_sys_info() + self.assertIn('Total:', sys_info) + self.assertIn('Free:', sys_info) + self.assertIn('Used:', sys_info) + self.assertIn('CPU:', sys_info) + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file -- Gitee From 79cd3ffeb31a84c7bcdb5e8344ac376391b8a50f Mon Sep 17 00:00:00 2001 From: s30048155 Date: Fri, 8 Dec 2023 11:53:17 +0800 Subject: [PATCH 2/4] clean code --- .../online_dispatch/test_dispatch_compare.py | 7 ++++--- .../ut/online_dispatch/test_dispatch_util.py | 18 ++++++++---------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_compare.py b/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_compare.py index 976d0eee4a7..ac2b6390d5b 100644 --- a/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_compare.py +++ b/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_compare.py @@ -1,8 +1,9 @@ import unittest import torch -import numpy as np -from unittest.mock import patch, MagicMock,Mock +from unittest.mock import patch, MagicMock from ptdbg_ascend.online_dispatch.dump_compare import * + + class TestDumpCompare(unittest.TestCase): def setUp(self): @@ -26,7 +27,7 @@ class TestDumpCompare(unittest.TestCase): cpu_data = torch.tensor([1.0, 2.0]) summery_list = [] save_summery(self.run_param, npu_data, cpu_data, 'prefix', summery_list, True) - self.assertTrue(len(summery_list) > 0) + self.assertNotEqual(len(summery_list), 0) def test_support_basic_type(self): self.assertTrue(support_basic_type(1)) diff --git a/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_util.py b/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_util.py index 8531ac0f798..1c6aa6f007a 100644 --- a/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_util.py +++ b/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_util.py @@ -1,15 +1,13 @@ import unittest from unittest.mock import patch, MagicMock -from ptdbg_ascend.online_dispatch.utils import * -import torch import numpy as np -import os -import logging -from ptdbg_ascend.common.utils import CompareConst +import torch +from ptdbg_ascend.online_dispatch.utils import * + +COLOR_YELLOW = '\033[33m' +COLOR_RED = '\033[31m' +COLOR_RESET = '\033[0m' -COLOR_YELLOW='\033[33m' -COLOR_RED='\033[31m' -COLOR_RESET='\033[0m' class TestUtils(unittest.TestCase): @@ -30,7 +28,7 @@ class TestUtils(unittest.TestCase): def test_data_to_cpu(self): tensor = torch.tensor([1, 2, 3], device='npu:0') result = data_to_cpu(tensor, 0, []) - self.assertTrue(result.device.type == 'cpu') + self.assertEqual(result.device.type, 'cpu') @patch('logging.getLogger') def test_get_mp_logger(self, mock_get_logger): @@ -84,7 +82,7 @@ class TestUtils(unittest.TestCase): @patch('psutil.virtual_memory') @patch('psutil.cpu_percent') def test_get_sys_info(self, mock_cpu_percent, mock_virtual_memory): - mock_virtual_memory.return_value = MagicMock(total=8*1024*1024, available=4*1024*1024, used=4*1024*1024) + mock_virtual_memory.return_value = MagicMock(total = 8 * 1024 * 1024, available = 4 * 1024 * 1024, used = 4 * 1024 * 1024) mock_cpu_percent.return_value = 50 sys_info = get_sys_info() self.assertIn('Total:', sys_info) -- Gitee From 2af8732558254ce0b778daa39cb035ca11360924 Mon Sep 17 00:00:00 2001 From: s30048155 Date: Fri, 8 Dec 2023 17:40:27 +0800 Subject: [PATCH 3/4] clean code --- .../python/ptdbg_ascend/online_dispatch/ut.py | 46 +++++++++++++++++++ .../online_dispatch/test_dispatch_compare.py | 2 +- .../ut/online_dispatch/test_dispatch_util.py | 4 +- 3 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 debug/accuracy_tools/ptdbg_ascend/src/python/ptdbg_ascend/online_dispatch/ut.py diff --git a/debug/accuracy_tools/ptdbg_ascend/src/python/ptdbg_ascend/online_dispatch/ut.py b/debug/accuracy_tools/ptdbg_ascend/src/python/ptdbg_ascend/online_dispatch/ut.py new file mode 100644 index 00000000000..3d8efc16944 --- /dev/null +++ b/debug/accuracy_tools/ptdbg_ascend/src/python/ptdbg_ascend/online_dispatch/ut.py @@ -0,0 +1,46 @@ +import unittest +import torch +import numpy as np +from unittest.mock import patch, MagicMock,Mock +from ptdbg_ascend.online_dispatch.dump_compare import * +class TestDumpCompare(unittest.TestCase): + + def setUp(self): + self.run_param = DispatchRunParam( + debug_flag=True, + device_id=0, + root_npu_path='/npu/path', + root_cpu_path='/cpu/path', + process_num=1 + ) + + @patch('ptdbg_ascend.online_dispatch.dump_compare.cosine_similarity') + @patch('ptdbg_ascend.online_dispatch.dump_compare.get_max_abs_err') + @patch('ptdbg_ascend.online_dispatch.dump_compare.get_max_relative_err') + def test_get_compare_result(self, mock_get_max_relative_err, mock_get_max_abs_err, mock_cosine_similarity): + mock_get_max_abs_err.return_value = (0.1, None) + mock_get_max_relative_err.return_value = (0.01, None) + mock_cosine_similarity.return_value = (0.999, None) + npu_data = MagicMock(spec=torch.Tensor) + cpu_data = MagicMock(spec=torch.Tensor) + npu_data.detach().numpy.return_value = np.array([1.0, 2.0]) + cpu_data.detach().numpy.return_value = np.array([1.0, 2.0]) + result = get_compare_result(npu_data, cpu_data) + self.assertEqual(result[0], 0.999) + + @patch('ptdbg_ascend.online_dispatch.dump_compare.compare_data') + @patch('ptdbg_ascend.online_dispatch.dump_compare.dump_data') + @patch('ptdbg_ascend.online_dispatch.dump_compare.TimeStatistics') + def test_dispatch_workflow(self, mock_time_statistics, mock_dump_data, mock_compare_data): + mock_compare_data.return_value = True + func = MagicMock() + cpu_args = (torch.tensor([1.0]),) + cpu_kwargs = {} + all_summery = [] + lock = MagicMock() + dispatch_workflow(self.run_param, cpu_args, cpu_kwargs, all_summery, func, torch.tensor([1.0]), torch.tensor([1.0]), lock) + mock_compare_data.assert_called() + + + if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_compare.py b/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_compare.py index ac2b6390d5b..d6ad31094d8 100644 --- a/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_compare.py +++ b/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_compare.py @@ -1,6 +1,6 @@ import unittest -import torch from unittest.mock import patch, MagicMock +import torch from ptdbg_ascend.online_dispatch.dump_compare import * diff --git a/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_util.py b/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_util.py index 1c6aa6f007a..e233bdd03e3 100644 --- a/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_util.py +++ b/debug/accuracy_tools/ptdbg_ascend/test/ut/online_dispatch/test_dispatch_util.py @@ -13,7 +13,7 @@ class TestUtils(unittest.TestCase): def test_get_callstack(self): stack = get_callstack() - self.assertTrue(isinstance(stack, list)) + self.assertIsInstance(stack, list) self.assertTrue(all(isinstance(item, list) for item in stack)) @patch('numpy.save') @@ -82,7 +82,7 @@ class TestUtils(unittest.TestCase): @patch('psutil.virtual_memory') @patch('psutil.cpu_percent') def test_get_sys_info(self, mock_cpu_percent, mock_virtual_memory): - mock_virtual_memory.return_value = MagicMock(total = 8 * 1024 * 1024, available = 4 * 1024 * 1024, used = 4 * 1024 * 1024) + mock_virtual_memory.return_value = MagicMock(total=8 * 1024 * 1024, available=4 * 1024 * 1024, used=4 * 1024 * 1024) mock_cpu_percent.return_value = 50 sys_info = get_sys_info() self.assertIn('Total:', sys_info) -- Gitee From 05949fc3b88d834774ee3640170c7ec93b381dc5 Mon Sep 17 00:00:00 2001 From: s30048155 Date: Fri, 8 Dec 2023 17:42:59 +0800 Subject: [PATCH 4/4] revert --- .../python/ptdbg_ascend/online_dispatch/ut.py | 46 ------------------- 1 file changed, 46 deletions(-) delete mode 100644 debug/accuracy_tools/ptdbg_ascend/src/python/ptdbg_ascend/online_dispatch/ut.py diff --git a/debug/accuracy_tools/ptdbg_ascend/src/python/ptdbg_ascend/online_dispatch/ut.py b/debug/accuracy_tools/ptdbg_ascend/src/python/ptdbg_ascend/online_dispatch/ut.py deleted file mode 100644 index 3d8efc16944..00000000000 --- a/debug/accuracy_tools/ptdbg_ascend/src/python/ptdbg_ascend/online_dispatch/ut.py +++ /dev/null @@ -1,46 +0,0 @@ -import unittest -import torch -import numpy as np -from unittest.mock import patch, MagicMock,Mock -from ptdbg_ascend.online_dispatch.dump_compare import * -class TestDumpCompare(unittest.TestCase): - - def setUp(self): - self.run_param = DispatchRunParam( - debug_flag=True, - device_id=0, - root_npu_path='/npu/path', - root_cpu_path='/cpu/path', - process_num=1 - ) - - @patch('ptdbg_ascend.online_dispatch.dump_compare.cosine_similarity') - @patch('ptdbg_ascend.online_dispatch.dump_compare.get_max_abs_err') - @patch('ptdbg_ascend.online_dispatch.dump_compare.get_max_relative_err') - def test_get_compare_result(self, mock_get_max_relative_err, mock_get_max_abs_err, mock_cosine_similarity): - mock_get_max_abs_err.return_value = (0.1, None) - mock_get_max_relative_err.return_value = (0.01, None) - mock_cosine_similarity.return_value = (0.999, None) - npu_data = MagicMock(spec=torch.Tensor) - cpu_data = MagicMock(spec=torch.Tensor) - npu_data.detach().numpy.return_value = np.array([1.0, 2.0]) - cpu_data.detach().numpy.return_value = np.array([1.0, 2.0]) - result = get_compare_result(npu_data, cpu_data) - self.assertEqual(result[0], 0.999) - - @patch('ptdbg_ascend.online_dispatch.dump_compare.compare_data') - @patch('ptdbg_ascend.online_dispatch.dump_compare.dump_data') - @patch('ptdbg_ascend.online_dispatch.dump_compare.TimeStatistics') - def test_dispatch_workflow(self, mock_time_statistics, mock_dump_data, mock_compare_data): - mock_compare_data.return_value = True - func = MagicMock() - cpu_args = (torch.tensor([1.0]),) - cpu_kwargs = {} - all_summery = [] - lock = MagicMock() - dispatch_workflow(self.run_param, cpu_args, cpu_kwargs, all_summery, func, torch.tensor([1.0]), torch.tensor([1.0]), lock) - mock_compare_data.assert_called() - - - if __name__ == '__main__': - unittest.main() \ No newline at end of file -- Gitee