vanilla-large-20B β€” dense baselines (24L / d=2048, 1.31B)

Dense (sparsity_mode=none) counterparts to the ParityTransformer large-chassis flagship markhenry/cayley-large-2L-mlp_in-20B. All checkpoints come from one 20B-token run, so both baseline definitions share a single trajectory.

Checkpoints

Files are named by iter. (They were previously named by the --save-at-val threshold that fired; those names misstated the actual loss β€” ckpt_val_2.8000.pt held a model at 2.7950 β€” so they were renamed. Two thresholds fired on the same eval and produced byte-identical files; only one copy is kept.)

file iter tokens measured val_loss vs flagship
ckpt_val_3400.pt 3400 5.35B 2.7981 +0.0023 worse (7Οƒ)
ckpt_val_3800.pt 3800 5.98B 2.7764 βˆ’0.0194 better (60Οƒ)
ckpt_final_20B.pt 12716 20.001B 2.5419 βˆ’0.2538 better (338Οƒ)

Reference, measured in the same pass on the same batches:

reference measured val_loss published (in-run)
cayley-large-2L-mlp_in-20B (flagship) 2.7957 2.8081
cayley-flagship-1.3b-20b (2L + aux losses) 2.8309 2.842

ckpt_val_3400.pt fired a --save-at-val trigger but is 0.0023 nats worse than the flagship (7Οƒ) β€” it does not clear it. It does clear the aux-loss variant by 0.0328 (86Οƒ). ckpt_val_3800.pt clears both.

ckpt_val_3800.pt being better than the flagship is the useful direction: a dense model that beats the ParityTransformer on val and is still less interpretable cannot be dismissed as a handicapped baseline.

ckpt_best.pt (iter 12400) is not uploaded β€” ckpt_final_20B.pt measures better, so the "best" label was a noise artifact of the 3.28M-token in-run eval and the file carries no information the final one lacks.

How these numbers were measured

evals/language_modeling/eval_val_loss.py over the entire FineWeb-Edu val split β€” contiguous non-overlapping windows, bf16 autocast, batch 8 Γ— 1024, --data fineweb-edu-25B, seed 0.

quantity value
tokens per model 25,161,728 (whole val split)
batches per model 3,072, byte-identical across all models
absolute SEM (single model) Β±0.0047
paired SEM (difference of two models) Β±0.0003

The paired SEM is ~17Γ— tighter because shared passage difficulty cancels. Quote the paired differences, not error bars added in quadrature.

Two reasons the run log disagrees, both of which bite if you mix sources:

source of disagreement effect
In-run evals are master-rank only, eval_iters Γ— bs Γ— seq_len = 3.28M tokens regardless of world size; adjacent evals wobble 0.005–0.017 nats. --save-at-val triggers and "best" labels inherit that noise.
best_val_loss inside a checkpoint is the run's best, not that checkpoint's val. Differencing it against a reference ckpt.pt saved at another iter is meaningless.

The flagship's published 2.8081 is an in-run number; on this protocol it is 2.7957. Use 2.7957 against these checkpoints and do not mix the two.

Alignment tax

Equal budget (20B tokens both sides):

pair dense cayley gap
vs cayley-large-2L 2.5419 2.7957 0.254 nats
vs cayley-large-2L+aux 2.5419 2.8309 0.289 nats

Token efficiency β€” where dense first reaches the flagship's measured val, interpolated between the two bracketing measured points:

sibling its measured val dense crossing tokens tax
cayley-large-2L 2.7957 iter ~3444 5.42B ~3.7Γ—

Caveats before this goes in a paper table:

caveat detail
not scale-invariant the small chassis gives 6.3–7.5Γ— on the same construction (vanilla-small-20B); the tax shrinks as the backbone grows
not comparable to vanilla-large-parity-3B's 6.7Γ— that run had a 3B budget and was warming down into the target, which buys val per token; this one passes the crossing at flat peak LR (warmdown starts iter 6358)
resolution eval spacing (100 iters = 157M tokens) caps it; two significant figures

Recipe: identical to the flagship except sparsity_mode

setting value
arch 24L / 16H / d=2048, learned abs. pos enc, bf16
muon lr 8e-3 β†’ 1e-4
adamw lr 3e-4 β†’ 1e-5
schedule linear_warmdown, wf=0.5, warmup 200
tokens/iter 32 Γ— 1024 Γ— 48 = 1,572,864 (12,716 iters)
data FineWeb-Edu sample-100BT, GPT-2 tok, 24.97B train tokens
run 4Γ— H200, 23h57m, ~252k tok/s, peak 67.8 GB/GPU
wandb 700d4i1i

Deltas vs the flagship:

delta note
--sparsity-mode none drops the five cayley flags β€” the only intended difference
--eval-interval 100 (vs 500) pins the val-matched crossing
--save-at-val writes the first-crossing checkpoints
4Γ— H200 instead of 8 no effect on optimization β€” --gradient-accumulation-steps is the global micro-step count, so ga stays 48 and tok/iter is identical

Loading

import torch
ck = torch.load("ckpt_val_3800.pt", map_location="cpu", weights_only=False)
ck["iter_num"]                              # 3800
cfg, sd = ck["model_config"], ck["model"]   # GPTConfig fields, 148 tensors

Checkpoints carry optimizer_states (Muon momentum + AdamW), so they are resumable, not inference-only.

Siblings


Measurements and card by Claude Code, from the run log and a paired re-evaluation of every checkpoint over the whole val split.

Downloads last month
125
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Dataset used to train markhenry/vanilla-large-20B