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:
@@ -131,8 +131,7 @@ class IterationMetrics:
|
|||||||
|
|
||||||
def _format_iteration_summary(metrics: IterationMetrics, data: dict[str, float | int]) -> str:
|
def _format_iteration_summary(metrics: IterationMetrics, data: dict[str, float | int]) -> str:
|
||||||
parts = [
|
parts = [
|
||||||
"Iteration complete:",
|
f"[i={metrics.iteration}] Iteration complete",
|
||||||
f"iteration={metrics.iteration}",
|
|
||||||
f"traversal_nodes={metrics.traversal_nodes}",
|
f"traversal_nodes={metrics.traversal_nodes}",
|
||||||
f"nodes_per_second={_format_summary_value(data['nodes_per_second'])}",
|
f"nodes_per_second={_format_summary_value(data['nodes_per_second'])}",
|
||||||
f"advantage_loss={_format_summary_value(metrics.advantage_loss)}",
|
f"advantage_loss={_format_summary_value(metrics.advantage_loss)}",
|
||||||
@@ -422,7 +421,7 @@ class DeepCFRTrainer:
|
|||||||
if progress_every > 0 and completed >= progress_every:
|
if progress_every > 0 and completed >= progress_every:
|
||||||
elapsed = time.perf_counter() - progress_started
|
elapsed = time.perf_counter() - progress_started
|
||||||
self.tracker.log_event(
|
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"elapsed_seconds={elapsed:.2f} total_nodes={total_stats.nodes} "
|
||||||
f"nodes_per_second={total_stats.nodes / max(elapsed, 1.0e-12):.1f}"
|
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()
|
requested_workers = self.config.traversal.resolved_num_workers()
|
||||||
max_workers = self.config.traversal.resolved_num_workers(len(batches))
|
max_workers = self.config.traversal.resolved_num_workers(len(batches))
|
||||||
self.tracker.log_event(
|
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"requested_workers={requested_workers} effective_workers={max_workers} "
|
||||||
f"batches={len(batches)} chunk_size={self.config.traversal.worker_chunk_size}"
|
f"batches={len(batches)} chunk_size={self.config.traversal.worker_chunk_size}"
|
||||||
)
|
)
|
||||||
if max_workers < requested_workers:
|
if max_workers < requested_workers:
|
||||||
self.tracker.log_event(
|
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"requested_workers={requested_workers} effective_workers={max_workers} "
|
||||||
f"available_batches={len(batches)}"
|
f"available_batches={len(batches)}"
|
||||||
)
|
)
|
||||||
@@ -482,7 +481,7 @@ class DeepCFRTrainer:
|
|||||||
if next_progress_at is not None and progress_traversals >= next_progress_at:
|
if next_progress_at is not None and progress_traversals >= next_progress_at:
|
||||||
elapsed = time.perf_counter() - progress_started
|
elapsed = time.perf_counter() - progress_started
|
||||||
self.tracker.log_event(
|
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_batches={completed_batches}/{total_batches} "
|
||||||
f"completed_traversals={progress_traversals} "
|
f"completed_traversals={progress_traversals} "
|
||||||
f"elapsed_seconds={elapsed:.2f} "
|
f"elapsed_seconds={elapsed:.2f} "
|
||||||
|
|||||||
@@ -666,7 +666,8 @@ def test_deep_cfr_trainer_saves_loads_and_evaluates_checkpoint(tmp_path) -> None
|
|||||||
assert (checkpoint_dir / "train.log").exists()
|
assert (checkpoint_dir / "train.log").exists()
|
||||||
train_log = (checkpoint_dir / "train.log").read_text(encoding="utf-8")
|
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 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 "reservoir memories and RNG state are not restored" in train_log
|
||||||
assert restored.iteration == 1
|
assert restored.iteration == 1
|
||||||
assert "eval_random_games" in metrics[0].eval_metrics
|
assert "eval_random_games" in metrics[0].eval_metrics
|
||||||
|
|||||||
Reference in New Issue
Block a user