From b633f513904bcb17ccdd791a02a2806c4750d8f3 Mon Sep 17 00:00:00 2001 From: xadupre Date: Thu, 26 Jun 2025 00:03:24 +0200 Subject: [PATCH 1/3] More unit tests --- .../ut_xrun_doc/test_command_lines_exe.py | 17 +++++++++- _unittests/ut_xrun_doc/test_doc_doc.py | 13 ++++++++ _unittests/ut_xrun_doc/test_unit_test.py | 5 +++ onnx_diagnostic/_command_lines_parser.py | 2 +- onnx_diagnostic/helpers/log_helper.py | 31 +++++++++++++------ 5 files changed, 57 insertions(+), 11 deletions(-) create mode 100644 _unittests/ut_xrun_doc/test_doc_doc.py diff --git a/_unittests/ut_xrun_doc/test_command_lines_exe.py b/_unittests/ut_xrun_doc/test_command_lines_exe.py index 4ecd9a6d..47216ccc 100644 --- a/_unittests/ut_xrun_doc/test_command_lines_exe.py +++ b/_unittests/ut_xrun_doc/test_command_lines_exe.py @@ -2,8 +2,9 @@ import unittest from contextlib import redirect_stdout from io import StringIO -from onnx_diagnostic.ext_test_case import ExtTestCase +from onnx_diagnostic.ext_test_case import ExtTestCase, ignore_warnings from onnx_diagnostic._command_lines_parser import main +from onnx_diagnostic.helpers.log_helper import enumerate_csv_files class TestCommandLines(ExtTestCase): @@ -66,6 +67,20 @@ def test_parser_validate(self): text = st.getvalue() self.assertIn("model_clas", text) + @ignore_warnings(UserWarning) + def test_parser_agg(self): + path = os.path.abspath( + os.path.join(os.path.dirname(__file__), "..", "ut_helpers", "data") + ) + assert list(enumerate_csv_files([f"{path}/*.zip"])) + output = self.get_dump_file("test_parser_agg.xlsx") + st = StringIO() + with redirect_stdout(st): + main(["agg", output, f"{path}/*.zip", "--filter", ".*.csv", "-v", "1"]) + text = st.getvalue() + self.assertIn("[CubeLogs.to_excel] plots 1 plots", text) + self.assertExists(output) + if __name__ == "__main__": unittest.main(verbosity=2) diff --git a/_unittests/ut_xrun_doc/test_doc_doc.py b/_unittests/ut_xrun_doc/test_doc_doc.py new file mode 100644 index 00000000..986d9696 --- /dev/null +++ b/_unittests/ut_xrun_doc/test_doc_doc.py @@ -0,0 +1,13 @@ +import unittest +from onnx_diagnostic.ext_test_case import ExtTestCase +from onnx_diagnostic.doc import reset_torch_transformers + + +class TestDocDoc(ExtTestCase): + + def test_reset(self): + reset_torch_transformers(None, None) + + +if __name__ == "__main__": + unittest.main(verbosity=2) diff --git a/_unittests/ut_xrun_doc/test_unit_test.py b/_unittests/ut_xrun_doc/test_unit_test.py index ca2dfa08..61faeaf8 100644 --- a/_unittests/ut_xrun_doc/test_unit_test.py +++ b/_unittests/ut_xrun_doc/test_unit_test.py @@ -16,6 +16,7 @@ has_cuda, has_onnxscript, ) +from onnx_diagnostic.api import TensorLike class TestUnitTest(ExtTestCase): @@ -110,6 +111,10 @@ def test_measure_time_max(self): }, ) + def test_exc(self): + self.assertRaise(lambda: TensorLike().dtype, NotImplementedError) + self.assertRaise(lambda: TensorLike().shape, NotImplementedError) + if __name__ == "__main__": unittest.main(verbosity=2) diff --git a/onnx_diagnostic/_command_lines_parser.py b/onnx_diagnostic/_command_lines_parser.py index 5714c053..6170d34c 100644 --- a/onnx_diagnostic/_command_lines_parser.py +++ b/onnx_diagnostic/_command_lines_parser.py @@ -765,7 +765,7 @@ def _cmd_agg(argv: List[Any]): args.inputs, verbose=args.verbose, filtering=lambda name: bool(reg.search(name)) ) ) - assert csv, f"No csv files in {args.inputs}, csv={csv}" + assert csv, f"No csv files in {args.inputs}, args.filter={args.filter!r}, csv={csv}" if args.verbose: from tqdm import tqdm diff --git a/onnx_diagnostic/helpers/log_helper.py b/onnx_diagnostic/helpers/log_helper.py index 55f61a09..47f0a554 100644 --- a/onnx_diagnostic/helpers/log_helper.py +++ b/onnx_diagnostic/helpers/log_helper.py @@ -1253,7 +1253,11 @@ def to_excel( df.to_excel(writer, sheet_name=main, freeze_panes=(1, 1)) for name, view in views.items(): + if view is None: + continue df, tview = self.view(view, return_view_def=True, verbose=max(verbose - 1, 0)) + if tview is None: + continue memory = df.memory_usage(deep=True).sum() if verbose: print( @@ -1668,8 +1672,11 @@ def view( :param verbose: verbosity level :return: dataframe """ + assert view_def is not None, "view_def is None, this is not allowed." if isinstance(view_def, str): view_def = self.make_view_def(view_def) + if view_def is None: + return (None, None) if return_view_def else None return super().view(view_def, return_view_def=return_view_def, verbose=verbose) def make_view_def(self, name: str) -> CubeViewDef: @@ -1892,14 +1899,6 @@ def mean_geo(gr): f_highlight=f_bucket, order=order, ), - "cmd": lambda: CubeViewDef( - key_index=index_cols, - values=self._filter_column(["CMD"], self.values), - ignore_unique=True, - keep_columns_in_index=["suite"], - name="cmd", - order=order, - ), "onnx": lambda: CubeViewDef( key_index=index_cols, values=self._filter_column( @@ -1927,11 +1926,25 @@ def mean_geo(gr): no_index=True, ), } - assert name in implemented_views, ( + + cmd_col = self._filter_column(["CMD"], self.values, can_be_empty=True) + if cmd_col: + implemented_views["cmd"] = lambda: CubeViewDef( + key_index=index_cols, + values=cmd_col, + ignore_unique=True, + keep_columns_in_index=["suite"], + name="cmd", + order=order, + ) + + assert name in implemented_views or name in {"cmd"}, ( f"Unknown view {name!r}, expected a name in {sorted(implemented_views)}," f"\n--\nkeys={pprint.pformat(sorted(self.keys_time))}, " f"\n--\nvalues={pprint.pformat(sorted(self.values))}" ) + if name not in implemented_views: + return None return implemented_views[name]() def post_load_process_piece( From a55f3d5c10dfa786701e4a78d13eb98854432b3e Mon Sep 17 00:00:00 2001 From: xadupre Date: Thu, 26 Jun 2025 00:06:34 +0200 Subject: [PATCH 2/3] mypy --- onnx_diagnostic/helpers/log_helper.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/onnx_diagnostic/helpers/log_helper.py b/onnx_diagnostic/helpers/log_helper.py index 47f0a554..69233f38 100644 --- a/onnx_diagnostic/helpers/log_helper.py +++ b/onnx_diagnostic/helpers/log_helper.py @@ -1661,7 +1661,9 @@ def view( view_def: Union[str, CubeViewDef], return_view_def: bool = False, verbose: int = 0, - ) -> Union[pandas.DataFrame, Tuple[pandas.DataFrame, CubeViewDef]]: + ) -> Union[ + Optional[pandas.DataFrame], Tuple[Optional[pandas.DataFrame], Optional[CubeViewDef]] + ]: """ Returns a dataframe, a pivot view. @@ -1679,12 +1681,12 @@ def view( return (None, None) if return_view_def else None return super().view(view_def, return_view_def=return_view_def, verbose=verbose) - def make_view_def(self, name: str) -> CubeViewDef: + def make_view_def(self, name: str) -> Optional[CubeViewDef]: """ Returns a view definition. :param name: name of the view - :return: a CubeViewDef + :return: a CubeViewDef or None if name does not make sense Available views: From ea28c7e87f28a291059acbbcc9da2c8969e52c69 Mon Sep 17 00:00:00 2001 From: xadupre Date: Thu, 26 Jun 2025 00:08:21 +0200 Subject: [PATCH 3/3] mypy --- onnx_diagnostic/helpers/log_helper.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/onnx_diagnostic/helpers/log_helper.py b/onnx_diagnostic/helpers/log_helper.py index 69233f38..510d52f4 100644 --- a/onnx_diagnostic/helpers/log_helper.py +++ b/onnx_diagnostic/helpers/log_helper.py @@ -1658,7 +1658,7 @@ def unbiased_export(df): def view( self, - view_def: Union[str, CubeViewDef], + view_def: Optional[Union[str, CubeViewDef]], return_view_def: bool = False, verbose: int = 0, ) -> Union[ @@ -1672,7 +1672,8 @@ def view( :param view_def: view definition or a string :param return_view_def: returns the view definition as well :param verbose: verbosity level - :return: dataframe + :return: dataframe or a couple (dataframe, view definition), + both of them can be one if view_def cannot be interpreted """ assert view_def is not None, "view_def is None, this is not allowed." if isinstance(view_def, str):