Reports · 2026-09-19

The scaled run is prepared: the paper's network fits three minutes on this GPU

Sizing

Each candidate trained three iterations from scratch on the GPU (scripts/size_presets.py); the seconds are whole iterations, collection plus update, and the memory is torch.cuda.max_memory_allocated over the three iterations.

CandidateMove networkEnvironmentsSeconds per iterationPeak memorySteps per second
small192, 6 layers1,02431.5 mean (25.5, 32.6, 36.4)5.96 GiB10,350
medium256, 8 layers1,53676.4 mean (63.7, 72.1, 93.4)9.51 GiB5,970
large, the paper's numbers384, 8 layers1,536135.4 mean (95.2, 168.0, 143.1)12.14 GiB3,900

The scaled preset in training/armies_train/config.py is the large candidate: the paper's 1,536 environments, move network at 384 by 8 and setup network at 512 by 4, a 1,000-setup pool and 202 moves per iteration, with the measurement in its docstring. At 135 seconds per iteration the run reaches about 1,280 iterations by hour 48 and 2,560 by hour 96.

The schedule

The run checkpoints and evaluates every twenty iterations. The checkpoints named by evaluations.jsonl are never pruned, so every checkpoint of the run survives: about 128 by hour 96, 458 MB each in the dry run, about 60 GB of disk. The evaluation series (40 games against greedy and 40 against expectimax at sixteen worlds and depth two, seat alternating, eval seeds from 1000) is the score-against-time curve the study reports either way.

Two diagnostics watch the run's health beside the score. Move entropy and clip rate come from the update, and the draw share (draws over finished games, in metrics.jsonl since the run layout) is first class: the smoke run stalled into battleless draws, and a draw share above half for a sustained stretch is the registered disproof's second clause. The training rules preset carries the paper's Table 17 draw rule exactly (a draw after 100 consecutive battleless moves and after 4,000 moves, crates/engine/src/state.rs Rules::TRAINING), and the advantage filter is on (top quartile of advantages with a 0.01 magnitude floor), so the smoke's stalling is an early-training artefact the run is expected to grow out of, not a rule the objective must change for.

The registered milestones

The 48-hour milestone plays the checkpoint nearest 48 hours of run wall clock against greedy, and the 96-hour milestone the same hours against expectimax at sixteen worlds and depth two, each 200 paired games under the training rules, seeds 2000 to 2099, both seats per seed on matched setups. The decision rule is the per-seed contrast with its 95% interval above zero. Nothing runs until the user launches the training run and the hours elapse; scripts/milestone.sh plays the match, writes the run output and files the record when it does.

Results

Not yet run: no game has been played under either registration, and the launch command below starts the training run.

Launch, watch, milestones, resume

All commands run from ~/armies/research with the virtualenv from just setup and the bindings from just build-env.

just launch scaled-1 " --preset scaled --iterations 100000 --seed 0 --save-every 20 --evaluate-every 20 --eval-games 40 --opponents 'greedy,expectimax:{\"samples\":16,\"depth\":2}'"
just watch watch.toml
scripts/milestone.sh runs/scaled-1 48 greedy
scripts/milestone.sh runs/scaled-1 96 expectimax

Stop the run with just stop scaled-1; a resume must repeat the schedule flags, or the resumed process checkpoints and evaluates on the defaults:

just launch scaled-1 " --resume runs/scaled-1 --iterations 100000 --save-every 20 --evaluate-every 20 --eval-games 40 --opponents 'greedy,expectimax:{\"samples\":16,\"depth\":2}'"

The dry run of this exact schedule (runs/scaled-dry, six iterations, stopped by signal mid-run and resumed) proved the checkpoints, the evaluations file, the stop and the resume on 2026-09-19.