CSVLogger: deduplicate epochs on resume (replace, not append duplicates)

On resume, the same epoch may be re-run. Now log_train/log_val remove
existing entries for the same epoch before appending, preventing
duplicate rows in train.csv/val.csv.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
pikaliov
2026-04-22 07:54:33 +03:00
parent f382325ac6
commit 1638b250a4

View File

@@ -288,14 +288,18 @@ class CSVLogger:
)
def log_train(self, epoch: int, metrics: dict, lr: float, elapsed: float) -> None:
"""Log epoch-level train averages."""
"""Log epoch-level train averages. Replaces existing entry for same epoch on resume."""
row = {"epoch": epoch, "lr": lr, "elapsed_s": round(elapsed, 1), **metrics}
# Remove previous entry for this epoch (resume may re-run it).
self.train_rows = [r for r in self.train_rows if r.get("epoch") != epoch]
self.train_rows.append(row)
pd.DataFrame(self.train_rows).to_csv(self.log_dir / "train.csv", index=False)
pd.DataFrame([row]).to_csv(self.log_dir / f"epoch_{epoch:03d}_train.csv", index=False)
def log_val(self, epoch: int, metrics: dict) -> None:
"""Log val metrics. Replaces existing entry for same epoch on resume."""
row = {"epoch": epoch, **metrics}
self.val_rows = [r for r in self.val_rows if r.get("epoch") != epoch]
self.val_rows.append(row)
pd.DataFrame(self.val_rows).to_csv(self.log_dir / "val.csv", index=False)
pd.DataFrame([row]).to_csv(self.log_dir / f"epoch_{epoch:03d}_val.csv", index=False)