Pokemon TCG training status — rendered 2026-07-17 07:20 UTC

541,640
trainer step
4,403 steps/h
541
checkpoints
541 published
361,480
replay files
≈games
250
worker jobs
1.238
eval policy
2.568
eval draft
uniform = 7.14
1.555
eval value
random ≈ 1.0
series: policy · draft · value
Training loss (by step, log y)
7.141.70.4060.09690.0231 policy 1.27draft 2.59value 0.117 step
Holdout eval loss (by step)
7.145.483.832.170.508 policy 1.24draft 2.57value 1.55 step
Trainer progress (steps over hours)
5.42e+054.06e+052.71e+051.35e+0520 345678910111213141516171819202122232425262728 step 541,640 hours since start
Replay window (samples over hours)
2.7e+072.03e+071.36e+076.82e+069.43e+04 345678910111213141516171819202122232425262728 window samples 9,244,367 hours since start
Learning rate (by step, log y)
0.0010.0005620.0003160.0001780.0001 lr 7.01e-05 step

Knobs — fleet config, applied to new workers on save

loading…
change log

    Deployment probe (argmax, no search) vs training agent

    42
    energy count
    76.0%
    winrate
    0.0%
    cap rate
    352
    perplexity
    Draft health (by checkpoint)
    6795093391700 energy count 42P(energy) mean × 1000 679distinct names 13 checkpoint step
    Game outcomes (by checkpoint)
    8261.54120.50 winrate % 76cap rate % 0avg turns / 3 9.05 checkpoint step
    Meta similarity (by checkpoint, log y)
    6.84e+045.76e+0348640.93.45 perplexity 352nearest jaccard % 30.4 checkpoint step
    run provenance (markers on the hour charts)
    1. 11:51 fleet launch (Phase 7): 350 draft workers, 3 servers, trainer, exporter
    2. 12:18 OMP/MKL thread caps; GPU containers restarted (load 379 -> 54)
    3. 12:49 trainer B=1024 + pacing v1, fresh start; servers restarted to purge overfit weights; unpaced checkpoints archived
    4. 15:58 pacing v2: cumulative generated-samples basis (window-slide stall fix)
    5. 20:29 driver: 10-game jobs (was 20; 4h-timeout wave fix)
    6. 21:45 draft evals: 8-leaf virtual-loss waves + interleaved seats (RPCs/game 61.5k -> 3.8k)
    7. 21:55 replay window: disk-backed sampler, 500k-game cap, first 10k games excluded, holdout eval rotated to newest
    8. 23:05 trainer sampler: batch draws concentrated to 64 files (parse-fanout fix; steps/h 960 -> pacing rate)
    9. 23:35 4th inference server (tg-infer3, GPU 5 colocated with trainer, keeper-managed via services.toml); driver on 4 endpoints
    10. 23:45 batching experiment matrix across the 4 servers (512/5, 512/10, 2048/10, 2048/20) — flat per-state cost; 2048 caps rejected
    11. 00:45 single-pass heads (forward_full) + uniform 512/6ms + worker-pin rebalance: ~106k evals/s aggregate, waits 42-46ms
    12. 04:14 run 1 complete: cosine LR exhausted at step 200,000 (default --total-steps, never overridden); trainer exited, ckpt_00200000 published, fleet kept generating
    13. 06:53 forced-energy draft curriculum ON: force_energy_p=1.0 (per-seat Bernoulli, E~U(0,30) via legality mask); knobs.json + dashboard knobs panel + driver pass-through; worker image rebuilt
    14. 07:41 run 2 launch: generation mode (--gen-steps 100k, fresh AdamW + warmup+cosine per generation, no terminal step), resumed from ckpt_00200000
    15. 08:30 driver scaled 350 -> 250 workers (rollouts inference-bound; load 65/384 cores)
    16. 09:25 replay window 500k -> 10k files; window_files added as a dynamic knob (trainer re-reads knobs.json each refresh; <=0 = unbounded)
    17. 09:54 pacing v3 after restart stall (lifetime samples_seen had drifted to 2.1M vs ~28M real): generated-samples counted from replay dir per-file, ckpt high-water floor
    18. 10:28 probe keeper launched (tg-probe tmux): probes newest unprobed published ckpt, ~3h cadence; probe kit synced to ~/tg-probe; winrate/cap-rate chart double-scaling fixed
    19. 04:48 forced-aggression + turn-count-penalty staged (neutral): selfplay --force-aggression-p/-c (per-seat Bernoulli, per-decision attack-only root mask pre-MCTS, samples recorded) and --turn-count-penalty (win z = max(0, 1 - k*turns); losses/draws unshaped); worker image rebuilt, driver restarted with knob pass-through, knobs pinned 0/0/0
    20. 06:27 forced-aggression ON at step 325k (ckpt_00325000): force_aggression_p=0.5, force_aggression_c=0.5, turn_count_penalty=0.002; trainer kept running through the flip; fleet converges via container turnover
    21. 21:55 forced-energy E range knobs deployed (~step 393k): force_energy_min/max (E ~ uniform inclusive) via knobs.json + driver pass-through + dashboard panel; set 0/30 matching the prior hardcode; worker image rebuilt, driver restarted
    22. 23:08 400k pause executed by armed stop_at_400k.sh: ckpt_00400000 published; tg-train, tg-driver, and all tgjob workers killed; inference servers + probe keeper left running
    23. 23:37 resume after 400k pause: driver fleet relaunched (250 workers, same params/knobs: energy p=1 E~U(0,30), aggression 0.5/0.5, turn penalty 0.002); trainer container had survived the stop (docker outlives tmux) ~40 steps past 400k, stalled on the pacing gate, unblocked on fresh samples; train.log pipe reattached (tg-trainlog)
    24. 23:49 knob flip: force_energy_min 0->5 (kill dead-deck tail, keep E contrast), force_aggression_c 0.5->1.0 (coherent attack behavior in forced seats; p=0.5 preserves contrast), window_files 10000->5000 (faster regime tracking)
    25. 07:26 full-distribution forced targets ON: trainer relaunched with --draft-full-softmax --draft-weight 0.2 (draft CE over full 1267-card vocab, zero-target ids now pushed down; draft_loss rescaled, non-comparable with history); resumed mid-generation (400k gen cosine)
    26. 07:29 worker fleet cutover to full-candidate recording: masked (forced-aggression) decisions now store the full pre-mask candidate list with visit mass on attacks and zero on non-attacks - direct attack-vs-pass policy targets; trainer needs no change (candidate softmax unchanged)
    27. 21:20 pipelines recadenced: probe keeper -> 25k-step grid from 500k (lowest unprobed first); auto-submitter -> 50k step multiple (~2.2 submissions/day of the 5/day cap)
    28. 21:54 500k anneal executed by armed anneal_at_500k.sh: knobs -> energy p=0.5 E~U(5,15), aggression p=0.25 c=1.0, window_files 50000; trainer relaunched --gen-steps 50000 (LR sawtooth now 50k-period), generation start at 500000; fleet converged via turnover (flags verified)
    eval table (last 25)
    steppolicydraftvalue value t0value t1
    5415001.23832.56781.55461.32581.6701
    5410001.21872.53861.64431.43741.7359
    5405001.27292.56721.53181.14051.7294
    5400001.23252.62461.44611.18081.5896
    5395001.25882.63061.26030.90721.4672
    5390001.19912.64891.46991.07271.6622
    5385001.28822.61901.27790.71781.5869
    5380001.28222.62251.30350.73411.6176
    5375001.29892.62451.42000.94221.7099
    5370001.30192.59871.37080.98371.5843
    5365001.24052.57251.52231.28941.6350
    5360001.31342.60211.48271.11581.6508
    5355001.28522.59891.37251.10011.5044
    5350001.29522.59621.39991.24221.4757
    5345001.16362.55541.49451.33701.5609
    5340001.19802.53031.30621.03561.4142
    5335001.23632.52961.44471.20981.5454
    5330001.19392.57511.53451.24331.6952
    5325001.22102.59671.57851.25601.7563
    5320001.14012.64891.53761.16581.7426
    5315001.22032.65351.56201.35131.6639
    5310001.32812.64191.46681.45471.4738
    5305001.27222.67871.77541.73461.8040
    5300001.25132.67721.48701.44371.5176
    5295001.19842.68871.24181.07331.3347