From 2b5af92890c8a55bc87678783ccf8cbb840f99bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20W=C3=A4lchli?= Date: Sun, 7 Mar 2021 21:12:42 +0100 Subject: [PATCH 1/6] fix dummy logger --- pytorch_lightning/loggers/base.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pytorch_lightning/loggers/base.py b/pytorch_lightning/loggers/base.py index 4fdb5e8c437bf..bdef412e8016d 100644 --- a/pytorch_lightning/loggers/base.py +++ b/pytorch_lightning/loggers/base.py @@ -425,8 +425,10 @@ def __getitem__(self, idx): class DummyLogger(LightningLoggerBase): - """ Dummy logger for internal use. Is usefull if we want to disable users - logger for a feature, but still secure that users code can run """ + """ + Dummy logger for internal use. It is useful if we want to disable user's + logger for a feature, but still ensure that user code can run + """ def __init__(self): super().__init__() @@ -436,12 +438,10 @@ def __init__(self): def experiment(self): return self._experiment - @rank_zero_only - def log_metrics(self, metrics, step): + def log_metrics(self, *args, **kwargs): pass - @rank_zero_only - def log_hyperparams(self, params): + def log_hyperparams(self, *args, **kwargs): pass @property From 6f2f405c83249bb03fe5196885b95b42197e856b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20W=C3=A4lchli?= Date: Sun, 7 Mar 2021 21:16:37 +0100 Subject: [PATCH 2/6] docs --- pytorch_lightning/loggers/base.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pytorch_lightning/loggers/base.py b/pytorch_lightning/loggers/base.py index bdef412e8016d..127b5497e8d22 100644 --- a/pytorch_lightning/loggers/base.py +++ b/pytorch_lightning/loggers/base.py @@ -418,9 +418,8 @@ def nop(*args, **kw): def __getattr__(self, _): return self.nop - def __getitem__(self, idx): - # enables self.logger[0].experiment.add_image - # and self.logger.experiment[0].add_image(...) + def __getitem__(self, idx) -> "DummyExperiment": + # enables self.logger.experiment[0].add_image(...) return self @@ -435,7 +434,7 @@ def __init__(self): self._experiment = DummyExperiment() @property - def experiment(self): + def experiment(self) -> DummyExperiment: return self._experiment def log_metrics(self, *args, **kwargs): @@ -452,7 +451,8 @@ def name(self): def version(self): pass - def __getitem__(self, idx): + def __getitem__(self, idx) -> "DummyLogger": + # enables self.logger[0].experiment.add_image(...) return self From ac98427a4f88ac8f23f81b9375e6792e15e2922e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20W=C3=A4lchli?= Date: Sun, 7 Mar 2021 21:27:16 +0100 Subject: [PATCH 3/6] update docs --- pytorch_lightning/loggers/base.py | 4 +++- tests/loggers/test_base.py | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/pytorch_lightning/loggers/base.py b/pytorch_lightning/loggers/base.py index 127b5497e8d22..af08758750fdc 100644 --- a/pytorch_lightning/loggers/base.py +++ b/pytorch_lightning/loggers/base.py @@ -279,12 +279,14 @@ def _sanitize_params(params: Dict[str, Any]) -> Dict[str, Any]: return params @abstractmethod - def log_hyperparams(self, params: argparse.Namespace): + def log_hyperparams(self, params: argparse.Namespace, *args, **kwargs): """ Record hyperparameters. Args: params: :class:`~argparse.Namespace` containing the hyperparameters + args: Optional positional arguments, depends on the specific logger being used + kwargs: Optional keywoard arguments, depends on the specific logger being used """ def log_graph(self, model: LightningModule, input_array=None) -> None: diff --git a/tests/loggers/test_base.py b/tests/loggers/test_base.py index c48fef5e04b49..cf3a0cb74b3f4 100644 --- a/tests/loggers/test_base.py +++ b/tests/loggers/test_base.py @@ -229,15 +229,24 @@ def log_metrics(self, metrics, step): def test_dummyexperiment_support_indexing(): + """ Test that the DummyExperiment can imitate indexing the experiment in a LoggerCollection. """ experiment = DummyExperiment() assert experiment[0] == experiment def test_dummylogger_support_indexing(): + """ Test that the DummyLogger can imitate indexing of a LoggerCollection. """ logger = DummyLogger() assert logger[0] == logger +def test_dummylogger_noop_method_calls(): + """ Test that the DummyLogger methods can be called with arbitrary arguments. """ + logger = DummyLogger() + logger.log_hyperparams("1", 2, three="three") + logger.log_metrics("1", 2, three="three") + + def test_np_sanitization(): class CustomParamsLogger(CustomLogger): From 52b81d9cff2523c1d248115d7b78f9ca4d5b04db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20W=C3=A4lchli?= Date: Sun, 7 Mar 2021 21:34:55 +0100 Subject: [PATCH 4/6] add changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed7eec7cff7f9..56f87493f5085 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -110,7 +110,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - Fixed PyTorch Profiler with `emit_nvtx` ([#6260](https://github.com/PyTorchLightning/pytorch-lightning/pull/6260)) -- Fixed `trainer.test` from `best_path` hangs after calling `trainer.fit` ([#6272](https://github.com/PyTorchLightning/pytorch-lightning/pull/6272)) +- Fixed `DummyLogger.log_hyperparams` raising a `TypeError` when running with `fast_dev_run=True` ([#6398](https://github.com/PyTorchLightning/pytorch-lightning/pull/6398)) ## [1.2.2] - 2021-03-02 From 5d6937a3d44f187b16c009dd7429fe298518c76f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20W=C3=A4lchli?= Date: Sun, 7 Mar 2021 22:52:21 +0100 Subject: [PATCH 5/6] add none return annotation --- pytorch_lightning/loggers/base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pytorch_lightning/loggers/base.py b/pytorch_lightning/loggers/base.py index af08758750fdc..b494c82518333 100644 --- a/pytorch_lightning/loggers/base.py +++ b/pytorch_lightning/loggers/base.py @@ -439,10 +439,10 @@ def __init__(self): def experiment(self) -> DummyExperiment: return self._experiment - def log_metrics(self, *args, **kwargs): + def log_metrics(self, *args, **kwargs) -> None: pass - def log_hyperparams(self, *args, **kwargs): + def log_hyperparams(self, *args, **kwargs) -> None: pass @property From dda6c6faf1d485dac1abd2fba16e311b29feaaab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20W=C3=A4lchli?= Date: Mon, 8 Mar 2021 05:03:21 +0100 Subject: [PATCH 6/6] return empty string for name, version --- pytorch_lightning/loggers/base.py | 8 ++++---- tests/trainer/flags/test_fast_dev_run.py | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/pytorch_lightning/loggers/base.py b/pytorch_lightning/loggers/base.py index b494c82518333..035a42338fe68 100644 --- a/pytorch_lightning/loggers/base.py +++ b/pytorch_lightning/loggers/base.py @@ -446,12 +446,12 @@ def log_hyperparams(self, *args, **kwargs) -> None: pass @property - def name(self): - pass + def name(self) -> str: + return "" @property - def version(self): - pass + def version(self) -> str: + return "" def __getitem__(self, idx) -> "DummyLogger": # enables self.logger[0].experiment.add_image(...) diff --git a/tests/trainer/flags/test_fast_dev_run.py b/tests/trainer/flags/test_fast_dev_run.py index 09c5b58d363d9..9160d8d0f3d61 100644 --- a/tests/trainer/flags/test_fast_dev_run.py +++ b/tests/trainer/flags/test_fast_dev_run.py @@ -71,6 +71,7 @@ def test_step(self, batch, batch_idx): checkpoint_callback = ModelCheckpoint() early_stopping_callback = EarlyStopping() trainer_config = dict( + default_root_dir=tmpdir, fast_dev_run=fast_dev_run, val_check_interval=2, logger=True,