Skip to content

Commit 7ed3dbf

Browse files
authored
Fix evaluation logging on epoch end with multiple dataloaders (#11132)
1 parent 61eb623 commit 7ed3dbf

File tree

5 files changed

+19
-13
lines changed

5 files changed

+19
-13
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,9 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
317317
- Fixed bug where `Trainer(track_grad_norm=..., logger=False)' would fail ([#11114](https://github.com/PyTorchLightning/pytorch-lightning/pull/11114))
318318

319319

320+
- Fixed logging on `{test,validation}_epoch_end` with multiple dataloaders ([#11132](https://github.com/PyTorchLightning/pytorch-lightning/pull/11132))
321+
322+
320323
- Fixed double evaluation bug with fault-tolerance enabled where the second call was completely skipped ([#11119](https://github.com/PyTorchLightning/pytorch-lightning/pull/11119))
321324

322325
## [1.5.6] - 2021-12-15

pytorch_lightning/loops/dataloader/evaluation_loop.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,9 @@ def on_run_end(self) -> List[_OUT_DICT]:
147147

148148
logged_outputs, self._logged_outputs = self._logged_outputs, [] # free memory
149149
# include any logged outputs on epoch_end
150-
if self.num_dataloaders < 2: # TODO: remove this check
151-
epoch_end_logged_outputs = self.trainer.logger_connector.update_eval_epoch_metrics()
152-
for dl_outputs in logged_outputs:
153-
dl_outputs.update(epoch_end_logged_outputs)
150+
epoch_end_logged_outputs = self.trainer.logger_connector.update_eval_epoch_metrics()
151+
for dl_outputs in logged_outputs:
152+
dl_outputs.update(epoch_end_logged_outputs)
154153

155154
# log metrics
156155
self.trainer.logger_connector.log_eval_end_metrics()

pytorch_lightning/trainer/connectors/logger_connector/logger_connector.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,11 @@ def update_eval_epoch_metrics(self) -> _OUT_DICT:
157157
assert self._epoch_end_reached
158158
if self.trainer.sanity_checking:
159159
return {}
160-
return self.metrics["callback"]
160+
metrics = self.metrics
161+
self._progress_bar_metrics.update(metrics["pbar"])
162+
self._callback_metrics.update(metrics["callback"])
163+
self._logged_metrics.update(metrics["log"])
164+
return metrics["callback"]
161165

162166
def log_eval_end_metrics(self) -> None:
163167
assert self._epoch_end_reached

pytorch_lightning/trainer/connectors/logger_connector/result.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -529,8 +529,7 @@ def valid_items(self) -> Generator:
529529
return (
530530
(k, v)
531531
for k, v in self.items()
532-
if not (isinstance(v, _ResultMetric) and v.has_reset)
533-
and self.dataloader_idx in (None, v.meta.dataloader_idx)
532+
if not (isinstance(v, _ResultMetric) and v.has_reset) and self.dataloader_idx == v.meta.dataloader_idx
534533
)
535534

536535
def _forked_name(self, result_metric: _ResultMetric, on_step: bool) -> Tuple[str, str]:

tests/trainer/logging_/test_eval_loop_logging.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -747,16 +747,17 @@ def test_dataloader(self):
747747
def test_logging_multi_dataloader_on_epoch_end(tmpdir):
748748
class CustomBoringModel(BoringModel):
749749
def test_step(self, batch, batch_idx, dataloader_idx):
750-
self.log("foo", 12.0)
750+
self.log("foo", dataloader_idx + 1)
751+
return dataloader_idx + 1
751752

752753
def test_epoch_end(self, outputs) -> None:
753-
self.log("foobar", 23.0)
754+
self.log("foobar", sum(sum(o) for o in outputs))
754755

755756
def test_dataloader(self):
756-
return [torch.utils.data.DataLoader(RandomDataset(32, 64)) for _ in range(2)]
757+
return [super().val_dataloader(), super().val_dataloader()]
757758

758759
model = CustomBoringModel()
759760
trainer = Trainer(default_root_dir=tmpdir, fast_dev_run=1)
760-
logged_results = trainer.test(model)
761-
# TODO: what's logged in `test_epoch_end` should be included in the results of each dataloader
762-
assert logged_results == [{"foo/dataloader_idx_0": 12.0}, {"foo/dataloader_idx_1": 12.0}]
761+
results = trainer.test(model)
762+
# what's logged in `test_epoch_end` gets included in the results of each dataloader
763+
assert results == [{"foo/dataloader_idx_0": 1, "foobar": 3}, {"foo/dataloader_idx_1": 2, "foobar": 3}]

0 commit comments

Comments
 (0)