From d4cb46d8c7f3d7521cba4101af69d9c3aad6e2bd Mon Sep 17 00:00:00 2001 From: Harish B Date: Mon, 18 Dec 2023 16:10:58 +0530 Subject: [PATCH] Sort column headers for csv logger (#19159) Co-authored-by: awaelchli --- src/lightning/fabric/CHANGELOG.md | 3 +++ src/lightning/fabric/loggers/csv_logs.py | 1 + src/lightning/pytorch/CHANGELOG.md | 3 +++ tests/tests_fabric/loggers/test_csv.py | 18 ++++++++++++++++++ 4 files changed, 25 insertions(+) diff --git a/src/lightning/fabric/CHANGELOG.md b/src/lightning/fabric/CHANGELOG.md index cf424eee95bd4..81b01cbe7774e 100644 --- a/src/lightning/fabric/CHANGELOG.md +++ b/src/lightning/fabric/CHANGELOG.md @@ -26,6 +26,9 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - Changed the `TransformerEnginePrecision(dtype=)` argument to `weights_dtype` and made it required ([#19082](https://github.com/Lightning-AI/lightning/pull/19082)) +- The columns in the `metrics.csv` file produced by `CSVLogger` are now sorted alphabetically ([#19159](https://github.com/Lightning-AI/lightning/pull/19159)) + + ### Deprecated - diff --git a/src/lightning/fabric/loggers/csv_logs.py b/src/lightning/fabric/loggers/csv_logs.py index 009edf97cd853..d7bbf1ad720e8 100644 --- a/src/lightning/fabric/loggers/csv_logs.py +++ b/src/lightning/fabric/loggers/csv_logs.py @@ -253,6 +253,7 @@ def _record_new_keys(self) -> Set[str]: current_keys = set().union(*self.metrics) new_keys = current_keys - set(self.metrics_keys) self.metrics_keys.extend(new_keys) + self.metrics_keys.sort() return new_keys def _rewrite_with_new_header(self, fieldnames: List[str]) -> None: diff --git a/src/lightning/pytorch/CHANGELOG.md b/src/lightning/pytorch/CHANGELOG.md index 5d0b03a742812..b8aaaff72b77f 100644 --- a/src/lightning/pytorch/CHANGELOG.md +++ b/src/lightning/pytorch/CHANGELOG.md @@ -41,6 +41,9 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - Changed the `TransformerEnginePrecision(dtype=)` argument to `weights_dtype` and made it required ([#19082](https://github.com/Lightning-AI/lightning/pull/19082)) +- The columns in the `metrics.csv` file produced by `CSVLogger` are now sorted alphabetically ([#19159](https://github.com/Lightning-AI/lightning/pull/19159)) + + ### Deprecated - Deprecated all precision plugin classes under `lightning.pytorch.plugins` with the suffix `Plugin` in the name ([#18840](https://github.com/Lightning-AI/lightning/pull/18840)) diff --git a/tests/tests_fabric/loggers/test_csv.py b/tests/tests_fabric/loggers/test_csv.py index 8590822edd906..8bb4476785a0c 100644 --- a/tests/tests_fabric/loggers/test_csv.py +++ b/tests/tests_fabric/loggers/test_csv.py @@ -183,3 +183,21 @@ def test_rewrite_with_new_header(tmp_path): assert header == new_columns logs = file.readline().strip().split(",") assert logs == ["0", "1", "22", ""] + + +def test_log_metrics_column_order_sorted(tmp_path): + """Test that the columns in the output metrics file are sorted by name.""" + logger = CSVLogger(tmp_path) + logger.log_metrics({"c": 0.1}) + logger.log_metrics({"c": 0.2}) + logger.log_metrics({"b": 0.3}) + logger.log_metrics({"a": 0.4}) + logger.save() + logger.log_metrics({"d": 0.5}) + logger.save() + + path_csv = os.path.join(logger.log_dir, _ExperimentWriter.NAME_METRICS_FILE) + with open(path_csv) as fp: + lines = fp.readlines() + + assert lines[0].strip() == "a,b,c,d,step"