From 1873d7bc7bd4c409d0d1e83afb17352e6d60e4a4 Mon Sep 17 00:00:00 2001 From: rohitgr7 Date: Thu, 29 Oct 2020 23:21:58 +0530 Subject: [PATCH 1/8] update logging docs --- docs/source/logging.rst | 7 ++++++- pytorch_lightning/loggers/wandb.py | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/source/logging.rst b/docs/source/logging.rst index ae1a0487a468b..1c09c1436439f 100644 --- a/docs/source/logging.rst +++ b/docs/source/logging.rst @@ -128,13 +128,17 @@ decorator to make sure that only the first process in DDP training logs data. class MyLogger(LightningLoggerBase): + @property def name(self): return 'MyLogger' + @property + @rank_zero_only def experiment(self): # Return the experiment object associated with this logger. pass - + + @property def version(self): # Return the experiment version, int or str. return '0.1' @@ -151,6 +155,7 @@ decorator to make sure that only the first process in DDP training logs data. # your code to record metrics goes here pass + @rank_zero_only def save(self): # Optional. Any code necessary to save logger data goes here # If you implement this, remember to call `super().save()` diff --git a/pytorch_lightning/loggers/wandb.py b/pytorch_lightning/loggers/wandb.py index 5786a52a8e371..2a14fb2eb06d5 100644 --- a/pytorch_lightning/loggers/wandb.py +++ b/pytorch_lightning/loggers/wandb.py @@ -159,6 +159,7 @@ def version(self) -> Optional[str]: # don't create an experiment if we don't have one return self._experiment.id if self._experiment else self._id + @rank_zero_only def finalize(self, status: str) -> None: # offset future training logged on same W&B run if self._experiment is not None: From d6e2f2e7ce6956e437d80877142245d77e1520b4 Mon Sep 17 00:00:00 2001 From: rohitgr7 Date: Sat, 31 Oct 2020 03:03:42 +0530 Subject: [PATCH 2/8] experiment --- docs/source/logging.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/logging.rst b/docs/source/logging.rst index 1c09c1436439f..9aaa6aa8bb013 100644 --- a/docs/source/logging.rst +++ b/docs/source/logging.rst @@ -133,7 +133,7 @@ decorator to make sure that only the first process in DDP training logs data. return 'MyLogger' @property - @rank_zero_only + @rank_zero_experiment def experiment(self): # Return the experiment object associated with this logger. pass From 048537945d38532ad3c8fae5e820f902acf934e1 Mon Sep 17 00:00:00 2001 From: rohitgr7 Date: Sat, 7 Nov 2020 01:40:57 +0530 Subject: [PATCH 3/8] add decorators to base and csv logger methods --- pytorch_lightning/loggers/base.py | 3 +++ pytorch_lightning/loggers/csv_logs.py | 1 + 2 files changed, 4 insertions(+) diff --git a/pytorch_lightning/loggers/base.py b/pytorch_lightning/loggers/base.py index 2246d02bc9bcb..20549a01005a9 100644 --- a/pytorch_lightning/loggers/base.py +++ b/pytorch_lightning/loggers/base.py @@ -393,12 +393,15 @@ def __init__(self): self._experiment = DummyExperiment() @property + @rank_zero_experiment def experiment(self): return self._experiment + @rank_zero_only def log_metrics(self, metrics, step): pass + @rank_zero_only def log_hyperparams(self, params): pass diff --git a/pytorch_lightning/loggers/csv_logs.py b/pytorch_lightning/loggers/csv_logs.py index 2d478855eb1b5..2e021fc81534c 100644 --- a/pytorch_lightning/loggers/csv_logs.py +++ b/pytorch_lightning/loggers/csv_logs.py @@ -156,6 +156,7 @@ def save_dir(self) -> Optional[str]: return self._save_dir @property + @rank_zero_experiment def experiment(self) -> ExperimentWriter: r""" From 43b9cdb226f4224b0a3eb17196b9010a63bab2bc Mon Sep 17 00:00:00 2001 From: rohitgr7 Date: Sat, 7 Nov 2020 01:51:44 +0530 Subject: [PATCH 4/8] fix --- pytorch_lightning/loggers/base.py | 22 +++++++++++----------- pytorch_lightning/loggers/csv_logs.py | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pytorch_lightning/loggers/base.py b/pytorch_lightning/loggers/base.py index 20549a01005a9..ce345b16c73ed 100644 --- a/pytorch_lightning/loggers/base.py +++ b/pytorch_lightning/loggers/base.py @@ -27,6 +27,17 @@ from pytorch_lightning.utilities import rank_zero_only +def rank_zero_experiment(fn: Callable) -> Callable: + """ Returns the real experiment on rank 0 and otherwise the DummyExperiment. """ + @wraps(fn) + def experiment(self): + @rank_zero_only + def get_experiment(): + return fn(self) + return get_experiment() or DummyExperiment() + return experiment + + class LightningLoggerBase(ABC): """ Base class for experiment loggers. @@ -466,14 +477,3 @@ def merge_dicts( d_out[k] = (fn or default_func)(values_to_agg) return d_out - - -def rank_zero_experiment(fn: Callable) -> Callable: - """ Returns the real experiment on rank 0 and otherwise the DummyExperiment. """ - @wraps(fn) - def experiment(self): - @rank_zero_only - def get_experiment(): - return fn(self) - return get_experiment() or DummyExperiment() - return experiment diff --git a/pytorch_lightning/loggers/csv_logs.py b/pytorch_lightning/loggers/csv_logs.py index 2e021fc81534c..390723e93de82 100644 --- a/pytorch_lightning/loggers/csv_logs.py +++ b/pytorch_lightning/loggers/csv_logs.py @@ -29,7 +29,7 @@ from pytorch_lightning import _logger as log from pytorch_lightning.core.saving import save_hparams_to_yaml -from pytorch_lightning.loggers.base import LightningLoggerBase +from pytorch_lightning.loggers.base import LightningLoggerBase, rank_zero_experiment from pytorch_lightning.utilities.distributed import rank_zero_only, rank_zero_warn From fc6fad251792f107f561fae7e9957d635a16ccd2 Mon Sep 17 00:00:00 2001 From: rohitgr7 Date: Sat, 7 Nov 2020 02:17:27 +0530 Subject: [PATCH 5/8] doc fix --- docs/source/logging.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/logging.rst b/docs/source/logging.rst index 9aaa6aa8bb013..51522eac89650 100644 --- a/docs/source/logging.rst +++ b/docs/source/logging.rst @@ -125,6 +125,7 @@ decorator to make sure that only the first process in DDP training logs data. from pytorch_lightning.utilities import rank_zero_only from pytorch_lightning.loggers import LightningLoggerBase + from pytorch_lightning.loggers.base import rank_zero_experiment class MyLogger(LightningLoggerBase): From 21039cb4964e505416a4769528300e13e5941a06 Mon Sep 17 00:00:00 2001 From: rohitgr7 Date: Mon, 16 Nov 2020 01:55:20 +0530 Subject: [PATCH 6/8] update docs --- docs/source/logging.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/source/logging.rst b/docs/source/logging.rst index 2579c6fc2a122..c07bc9fd1311d 100644 --- a/docs/source/logging.rst +++ b/docs/source/logging.rst @@ -118,8 +118,9 @@ Make a custom logger ******************** You can implement your own logger by writing a class that inherits from -:class:`LightningLoggerBase`. Use the :func:`~pytorch_lightning.loggers.base.rank_zero_only` -decorator to make sure that only the first process in DDP training logs data. +:class:`LightningLoggerBase`. Use the :func:`~pytorch_lightning.loggers.base.rank_zero_experiment` +and :func:`~pytorch_lightning.utilities.distributed.base.rank_zero_only` decorators to make sure +that only the first process in DDP training creates the experiment and logs the data respectively. .. testcode:: From 1e6c4854caa7d27671c2512b4470a88832b7557c Mon Sep 17 00:00:00 2001 From: rohitgr7 Date: Mon, 16 Nov 2020 02:18:40 +0530 Subject: [PATCH 7/8] update docs --- docs/source/logging.rst | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/source/logging.rst b/docs/source/logging.rst index c07bc9fd1311d..604319ccbbeec 100644 --- a/docs/source/logging.rst +++ b/docs/source/logging.rst @@ -117,10 +117,8 @@ Once your training starts, you can view the logs by using your favorite logger o Make a custom logger ******************** -You can implement your own logger by writing a class that inherits from -:class:`LightningLoggerBase`. Use the :func:`~pytorch_lightning.loggers.base.rank_zero_experiment` -and :func:`~pytorch_lightning.utilities.distributed.base.rank_zero_only` decorators to make sure -that only the first process in DDP training creates the experiment and logs the data respectively. +You can implement your own logger by writing a class that inherits from :class:`~pytorch_lightning.loggers.base.LightningLoggerBase`. +Use the :func:`~pytorch_lightning.loggers.base.rank_zero_experiment` and :func:`~pytorch_lightning.utilities.distributed.rank_zero_only` decorators to make sure that only the first process in DDP training creates the experiment and logs the data respectively. .. testcode:: From 2962f188349efdfd83e30189438ddb1f8a157a8e Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sun, 22 Nov 2020 19:05:32 +0530 Subject: [PATCH 8/8] Update pytorch_lightning/loggers/base.py --- pytorch_lightning/loggers/base.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pytorch_lightning/loggers/base.py b/pytorch_lightning/loggers/base.py index 4ebf315a87561..60ab221e91a1c 100644 --- a/pytorch_lightning/loggers/base.py +++ b/pytorch_lightning/loggers/base.py @@ -406,7 +406,6 @@ def __init__(self): self._experiment = DummyExperiment() @property - @rank_zero_experiment def experiment(self): return self._experiment