From 43b1f75b82a74c67965db20bdfadf82a2816d948 Mon Sep 17 00:00:00 2001 From: myron Date: Mon, 30 Oct 2023 01:01:51 -0700 Subject: [PATCH 1/7] autorunner params from config Signed-off-by: myron --- monai/apps/auto3dseg/auto_runner.py | 76 +++++++++++++++++++---------- 1 file changed, 50 insertions(+), 26 deletions(-) diff --git a/monai/apps/auto3dseg/auto_runner.py b/monai/apps/auto3dseg/auto_runner.py index 2105f051bd..17b370f8f5 100644 --- a/monai/apps/auto3dseg/auto_runner.py +++ b/monai/apps/auto3dseg/auto_runner.py @@ -211,21 +211,11 @@ def __init__( allow_skip: bool = True, **kwargs: Any, ): - logger.info(f"AutoRunner using work directory {work_dir}") - os.makedirs(work_dir, exist_ok=True) - - self.work_dir = os.path.abspath(work_dir) - self.data_src_cfg = dict() - self.data_src_cfg_name = os.path.join(self.work_dir, "input.yaml") - self.algos = algos - self.templates_path_or_url = templates_path_or_url - self.allow_skip = allow_skip - self.kwargs = deepcopy(kwargs) - - if input is None and os.path.isfile(self.data_src_cfg_name): - input = self.data_src_cfg_name + if input is None and os.path.isfile(os.path.join(os.path.abspath(work_dir), "input.yaml")): + input = os.path.join(os.path.abspath(work_dir), "input.yaml") logger.info(f"Input config is not provided, using the default {input}") + self.data_src_cfg = dict() if isinstance(input, dict): self.data_src_cfg = input elif isinstance(input, str) and os.path.isfile(input): @@ -234,6 +224,49 @@ def __init__( else: raise ValueError(f"{input} is not a valid file or dict") + if "work_dir" in self.data_src_cfg: # override from config + work_dir = self.data_src_cfg["work_dir"] + + self.work_dir = os.path.abspath(work_dir) + self.algos = algos + self.templates_path_or_url = templates_path_or_url + self.allow_skip = allow_skip + + self.not_use_cache = not_use_cache + self.cache_filename = os.path.join(self.work_dir, "cache.yaml") + self.cache = self.read_cache() + self.export_cache() + + # determine if we need to analyze, algo_gen or train from cache, unless manually provided + self.analyze = not self.cache["analyze"] if analyze is None else analyze + self.algo_gen = not self.cache["algo_gen"] if algo_gen is None else algo_gen + self.train = train + self.ensemble = ensemble # last step, no need to check + self.hpo = hpo and has_nni + self.hpo_backend = hpo_backend + self.kwargs = deepcopy(kwargs) + + # parse input config for AutoRunner param overrides + for param in [ + "analyze", + "algo_gen", + "train", + "hpo", + "ensemble", + "not_use_cache", + "allow_skip", + ]: # override from config + if param in self.data_src_cfg and isinstance(self.data_src_cfg[param], bool): + setattr(self, param, self.data_src_cfg[param]) + + for param in ["algos", "hpo_backend", "templates_path_or_url"]: # override from config + if param in self.data_src_cfg: + setattr(self, param, self.data_src_cfg[param]) + + logger.info(f"AutoRunner using work directory {self.work_dir}") + os.makedirs(self.work_dir, exist_ok=True) + self.data_src_cfg_name = os.path.join(self.work_dir, "input.yaml") + missing_keys = {"dataroot", "datalist", "modality"}.difference(self.data_src_cfg.keys()) if len(missing_keys) > 0: raise ValueError(f"Config keys are missing {missing_keys}") @@ -252,6 +285,8 @@ def __init__( # inspect and update folds num_fold = self.inspect_datalist_folds(datalist_filename=datalist_filename) + if "num_fold" in self.data_src_cfg: + num_fold = int(self.data_src_cfg["num_fold"]) # override from config self.data_src_cfg["datalist"] = datalist_filename # update path to a version in work_dir and save user input ConfigParser.export_config_file( @@ -262,17 +297,6 @@ def __init__( self.datastats_filename = os.path.join(self.work_dir, "datastats.yaml") self.datalist_filename = datalist_filename - self.not_use_cache = not_use_cache - self.cache_filename = os.path.join(self.work_dir, "cache.yaml") - self.cache = self.read_cache() - self.export_cache() - - # determine if we need to analyze, algo_gen or train from cache, unless manually provided - self.analyze = not self.cache["analyze"] if analyze is None else analyze - self.algo_gen = not self.cache["algo_gen"] if algo_gen is None else algo_gen - self.train = train - self.ensemble = ensemble # last step, no need to check - self.set_training_params() self.set_device_info() self.set_prediction_params() @@ -284,9 +308,9 @@ def __init__( self.gpu_customization_specs: dict[str, Any] = {} # hpo - if hpo_backend.lower() != "nni": + if self.hpo_backend.lower() != "nni": raise NotImplementedError("HPOGen backend only supports NNI") - self.hpo = hpo and has_nni + self.hpo = self.hpo and has_nni self.set_hpo_params() self.search_space: dict[str, dict[str, Any]] = {} self.hpo_tasks = 0 From 3ae3a3dbf3361852026bd04db0d461217105f822 Mon Sep 17 00:00:00 2001 From: myron Date: Thu, 2 Nov 2023 12:00:05 -0700 Subject: [PATCH 2/7] cache Signed-off-by: myron --- monai/apps/auto3dseg/auto_runner.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/monai/apps/auto3dseg/auto_runner.py b/monai/apps/auto3dseg/auto_runner.py index f6b7c48940..6b4f5c5675 100644 --- a/monai/apps/auto3dseg/auto_runner.py +++ b/monai/apps/auto3dseg/auto_runner.py @@ -216,9 +216,6 @@ def __init__( ): if input is None and os.path.isfile(os.path.join(os.path.abspath(work_dir), "input.yaml")): input = os.path.join(os.path.abspath(work_dir), "input.yaml") - - if input is None and os.path.isfile(self.data_src_cfg_name): - input = self.data_src_cfg_name logger.info(f"Input config is not provided, using the default {input}") self.data_src_cfg = dict() @@ -237,12 +234,8 @@ def __init__( self.algos = algos self.templates_path_or_url = templates_path_or_url self.allow_skip = allow_skip - self.not_use_cache = not_use_cache - self.cache_filename = os.path.join(self.work_dir, "cache.yaml") - self.cache = self.read_cache() - self.export_cache() - + # determine if we need to analyze, algo_gen or train from cache, unless manually provided self.analyze = not self.cache["analyze"] if analyze is None else analyze self.algo_gen = not self.cache["algo_gen"] if algo_gen is None else algo_gen @@ -274,6 +267,11 @@ def __init__( os.makedirs(self.work_dir, exist_ok=True) self.data_src_cfg_name = os.path.join(self.work_dir, "input.yaml") + # cache.yaml + self.cache_filename = os.path.join(self.work_dir, "cache.yaml") + self.cache = self.read_cache() + self.export_cache() + missing_keys = {"dataroot", "datalist", "modality"}.difference(self.data_src_cfg.keys()) if len(missing_keys) > 0: raise ValueError(f"Config keys are missing {missing_keys}") From 0e2e5c54ab467bdcd998a66184dc87fa25aa990e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 2 Nov 2023 19:00:37 +0000 Subject: [PATCH 3/7] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- monai/apps/auto3dseg/auto_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monai/apps/auto3dseg/auto_runner.py b/monai/apps/auto3dseg/auto_runner.py index 6b4f5c5675..b814cea1f8 100644 --- a/monai/apps/auto3dseg/auto_runner.py +++ b/monai/apps/auto3dseg/auto_runner.py @@ -235,7 +235,7 @@ def __init__( self.templates_path_or_url = templates_path_or_url self.allow_skip = allow_skip self.not_use_cache = not_use_cache - + # determine if we need to analyze, algo_gen or train from cache, unless manually provided self.analyze = not self.cache["analyze"] if analyze is None else analyze self.algo_gen = not self.cache["algo_gen"] if algo_gen is None else algo_gen From 5e8f5a3df3f5ee0e1c903841cd63cf45d46cbdc1 Mon Sep 17 00:00:00 2001 From: myron Date: Thu, 2 Nov 2023 13:12:58 -0700 Subject: [PATCH 4/7] cache Signed-off-by: myron --- monai/apps/auto3dseg/auto_runner.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/monai/apps/auto3dseg/auto_runner.py b/monai/apps/auto3dseg/auto_runner.py index 6b4f5c5675..578c2f7a43 100644 --- a/monai/apps/auto3dseg/auto_runner.py +++ b/monai/apps/auto3dseg/auto_runner.py @@ -234,8 +234,13 @@ def __init__( self.algos = algos self.templates_path_or_url = templates_path_or_url self.allow_skip = allow_skip + + # cache.yaml self.not_use_cache = not_use_cache - + self.cache_filename = os.path.join(self.work_dir, "cache.yaml") + self.cache = self.read_cache() + self.export_cache() + # determine if we need to analyze, algo_gen or train from cache, unless manually provided self.analyze = not self.cache["analyze"] if analyze is None else analyze self.algo_gen = not self.cache["algo_gen"] if algo_gen is None else algo_gen @@ -257,20 +262,16 @@ def __init__( "allow_skip", ]: # override from config if param in self.data_src_cfg and isinstance(self.data_src_cfg[param], bool): - setattr(self, param, self.data_src_cfg[param]) + setattr(self, param, self.data_src_cfg[param]) # e.g. self.analyze = self.data_src_cfg["analyze"] for param in ["algos", "hpo_backend", "templates_path_or_url", "mlflow_tracking_uri"]: # override from config if param in self.data_src_cfg: - setattr(self, param, self.data_src_cfg[param]) + setattr(self, param, self.data_src_cfg[param]) # e.g. self.algos = self.data_src_cfg["algos"] logger.info(f"AutoRunner using work directory {self.work_dir}") os.makedirs(self.work_dir, exist_ok=True) self.data_src_cfg_name = os.path.join(self.work_dir, "input.yaml") - # cache.yaml - self.cache_filename = os.path.join(self.work_dir, "cache.yaml") - self.cache = self.read_cache() - self.export_cache() missing_keys = {"dataroot", "datalist", "modality"}.difference(self.data_src_cfg.keys()) if len(missing_keys) > 0: From c5404c83596060e011c5d651f1d850a31d6cf41d Mon Sep 17 00:00:00 2001 From: myron Date: Thu, 2 Nov 2023 13:16:58 -0700 Subject: [PATCH 5/7] cache Signed-off-by: myron --- monai/apps/auto3dseg/auto_runner.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/monai/apps/auto3dseg/auto_runner.py b/monai/apps/auto3dseg/auto_runner.py index 578c2f7a43..69a988e96a 100644 --- a/monai/apps/auto3dseg/auto_runner.py +++ b/monai/apps/auto3dseg/auto_runner.py @@ -229,8 +229,12 @@ def __init__( if "work_dir" in self.data_src_cfg: # override from config work_dir = self.data_src_cfg["work_dir"] - self.work_dir = os.path.abspath(work_dir) + + logger.info(f"AutoRunner using work directory {self.work_dir}") + os.makedirs(self.work_dir, exist_ok=True) + self.data_src_cfg_name = os.path.join(self.work_dir, "input.yaml") + self.algos = algos self.templates_path_or_url = templates_path_or_url self.allow_skip = allow_skip @@ -268,9 +272,7 @@ def __init__( if param in self.data_src_cfg: setattr(self, param, self.data_src_cfg[param]) # e.g. self.algos = self.data_src_cfg["algos"] - logger.info(f"AutoRunner using work directory {self.work_dir}") - os.makedirs(self.work_dir, exist_ok=True) - self.data_src_cfg_name = os.path.join(self.work_dir, "input.yaml") + missing_keys = {"dataroot", "datalist", "modality"}.difference(self.data_src_cfg.keys()) From 4c85ca413a6a9c2153ed93b74823e45b3cbb868e Mon Sep 17 00:00:00 2001 From: monai-bot Date: Fri, 3 Nov 2023 08:44:25 +0000 Subject: [PATCH 6/7] [MONAI] code formatting Signed-off-by: monai-bot --- monai/apps/auto3dseg/auto_runner.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/monai/apps/auto3dseg/auto_runner.py b/monai/apps/auto3dseg/auto_runner.py index 69a988e96a..e4c2d908b7 100644 --- a/monai/apps/auto3dseg/auto_runner.py +++ b/monai/apps/auto3dseg/auto_runner.py @@ -266,14 +266,11 @@ def __init__( "allow_skip", ]: # override from config if param in self.data_src_cfg and isinstance(self.data_src_cfg[param], bool): - setattr(self, param, self.data_src_cfg[param]) # e.g. self.analyze = self.data_src_cfg["analyze"] + setattr(self, param, self.data_src_cfg[param]) # e.g. self.analyze = self.data_src_cfg["analyze"] for param in ["algos", "hpo_backend", "templates_path_or_url", "mlflow_tracking_uri"]: # override from config if param in self.data_src_cfg: - setattr(self, param, self.data_src_cfg[param]) # e.g. self.algos = self.data_src_cfg["algos"] - - - + setattr(self, param, self.data_src_cfg[param]) # e.g. self.algos = self.data_src_cfg["algos"] missing_keys = {"dataroot", "datalist", "modality"}.difference(self.data_src_cfg.keys()) if len(missing_keys) > 0: From 93ad99e74ad505fe98c88bd91077f1911c0bce92 Mon Sep 17 00:00:00 2001 From: Wenqi Li Date: Fri, 3 Nov 2023 09:01:11 +0000 Subject: [PATCH 7/7] skip large test Signed-off-by: Wenqi Li --- tests/test_vis_gradcam.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_vis_gradcam.py b/tests/test_vis_gradcam.py index f5ba188082..4b554de0aa 100644 --- a/tests/test_vis_gradcam.py +++ b/tests/test_vis_gradcam.py @@ -20,7 +20,7 @@ from monai.networks.nets import DenseNet, DenseNet121, SEResNet50 from monai.visualize import GradCAM, GradCAMpp -from tests.utils import assert_allclose +from tests.utils import assert_allclose, skip_if_quick class DenseNetAdjoint(DenseNet121): @@ -147,6 +147,7 @@ def __call__(self, x, adjoint_info): TESTS_ILL.append([cam]) +@skip_if_quick class TestGradientClassActivationMap(unittest.TestCase): @parameterized.expand(TESTS) def test_shape(self, cam_class, input_data, expected_shape):