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.
| Candidate | Move network | Environments | Seconds per iteration | Peak memory | Steps per second |
|---|---|---|---|---|---|
| small | 192, 6 layers | 1,024 | 31.5 mean (25.5, 32.6, 36.4) | 5.96 GiB | 10,350 |
| medium | 256, 8 layers | 1,536 | 76.4 mean (63.7, 72.1, 93.4) | 9.51 GiB | 5,970 |
| large, the paper's numbers | 384, 8 layers | 1,536 | 135.4 mean (95.2, 168.0, 143.1) | 12.14 GiB | 3,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 expectimaxStop 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.