Prefix iteration-scoped log lines with [i=N]

Make traversal progress and iteration-complete summary lines easier to
visually scan during long runs by leading with [i=N]. Drop the redundant
"iteration=N" kv from the body to keep lines short.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-07 17:11:34 +09:00
co-authored by Claude Opus 4.7
parent 618d5f8167
commit 5687435f84
2 changed files with 7 additions and 7 deletions
@@ -131,8 +131,7 @@ class IterationMetrics:
def _format_iteration_summary(metrics: IterationMetrics, data: dict[str, float | int]) -> str:
parts = [
"Iteration complete:",
f"iteration={metrics.iteration}",
f"[i={metrics.iteration}] Iteration complete",
f"traversal_nodes={metrics.traversal_nodes}",
f"nodes_per_second={_format_summary_value(data['nodes_per_second'])}",
f"advantage_loss={_format_summary_value(metrics.advantage_loss)}",
@@ -422,7 +421,7 @@ class DeepCFRTrainer:
if progress_every > 0 and completed >= progress_every:
elapsed = time.perf_counter() - progress_started
self.tracker.log_event(
f"Traversal progress iteration={iteration} completed={completed} "
f"[i={iteration}] Traversal progress completed={completed} "
f"elapsed_seconds={elapsed:.2f} total_nodes={total_stats.nodes} "
f"nodes_per_second={total_stats.nodes / max(elapsed, 1.0e-12):.1f}"
)
@@ -436,13 +435,13 @@ class DeepCFRTrainer:
requested_workers = self.config.traversal.resolved_num_workers()
max_workers = self.config.traversal.resolved_num_workers(len(batches))
self.tracker.log_event(
f"Traversal multiprocessing enabled iteration={iteration} "
f"[i={iteration}] Traversal multiprocessing enabled "
f"requested_workers={requested_workers} effective_workers={max_workers} "
f"batches={len(batches)} chunk_size={self.config.traversal.worker_chunk_size}"
)
if max_workers < requested_workers:
self.tracker.log_event(
f"Traversal worker count capped iteration={iteration} "
f"[i={iteration}] Traversal worker count capped "
f"requested_workers={requested_workers} effective_workers={max_workers} "
f"available_batches={len(batches)}"
)
@@ -482,7 +481,7 @@ class DeepCFRTrainer:
if next_progress_at is not None and progress_traversals >= next_progress_at:
elapsed = time.perf_counter() - progress_started
self.tracker.log_event(
f"Traversal multiprocessing progress iteration={iteration} "
f"[i={iteration}] Traversal multiprocessing progress "
f"completed_batches={completed_batches}/{total_batches} "
f"completed_traversals={progress_traversals} "
f"elapsed_seconds={elapsed:.2f} "
+2 -1
View File
@@ -666,7 +666,8 @@ def test_deep_cfr_trainer_saves_loads_and_evaluates_checkpoint(tmp_path) -> None
assert (checkpoint_dir / "train.log").exists()
train_log = (checkpoint_dir / "train.log").read_text(encoding="utf-8")
assert re.search(r"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}", train_log)
assert "Iteration complete:" in train_log
assert "Iteration complete" in train_log
assert "[i=1]" in train_log
assert "reservoir memories and RNG state are not restored" in train_log
assert restored.iteration == 1
assert "eval_random_games" in metrics[0].eval_metrics