Record: 4096-Vocab + 4.0-MLP-mult + 0.085-WD + Simplifications — val_bpb 1.09785 (3-seed mean)#1218
Conversation
…pb 1.09785 (3-seed mean)
|
Awesome results @clarkkev! |
Strip complexity, bigger model, higher weight decay: MLP 3x → 4x (32.2M params vs 27M) MUON_WD 0.04 → 0.085 (better int6 compression) ADAM_WD 0.04 → 0.02 (scalars) BigramHash removed, VE removed QK_GAIN_INIT=4.0 PR openai#1218 proved this approach works: simplify + regularize = 1.098 on sp4096. On Scylla (998 tokens): should fit ~15.9MB at high WD.
|
so elegant, thing of beauty my friend. |
I am not the author of this PR, but I have spent some time on the same quantization-and-compression pipeline to have views on the moving parts. Mostly I think the discovery itself is the boring part, and the mechanism is the interesting part. The boring part is: you just instrument the exact export path matrix by matrix. For each tensor, log raw MB, quantized-and-compressed MB, and a few simple statistics on the float weights. Then scatter The reason it jumps out is that, in this pipeline, RMS sits upstream of almost everything the exporter cares about. GPTQ is using rowwise scales, so if a matrix has lower RMS, its rows usually get smaller scales and therefore a finer effective grid. That pushes more coefficients into small quantized values, especially I suspect the reason the R² got so absurdly high is that, in that regime, the matrices were fairly self-similar apart from scale. If the row max/RMS ratio and general histogram shape do not vary too much, then one scalar, RMS, ends up predicting most of the row-scale distribution seen by the quantizer, and from there a lot of the final compressed size is basically determined. I would not overstate it as a universal law, though. It is a very strong empirical regularity for this specific setup: rowwise low-bit quantization, pruning of small codes, byte shuffle, then Brotli. It can break if two matrices have the same RMS but different outlier structure, different max/RMS, different scale distributions, different bit assignments, or if one tensor bypasses the low-bit path. In short, RMS is an excellent first-order proxy for the rate term of the deployed artifact. The deeper point, to me, is that this is really a rate-distortion problem. RMS tells you a lot about the rate side, meaning how many bytes the matrix will want after quantization and compression. It does not tell you the whole distortion side, meaning how much loss you incur if you make that matrix smaller. I have seen cases where a matrix looks benign by raw MSE but is catastrophic by Hessian-weighted error. What I would recommend is to use weight decay as a crude shadow price on bytes, then spend the saved bytes on the matrices whose Hessian-weighted quantization damage is worst.
The simplifications make sense in the local logic of that PR, though not all for the same reason. Once you have the compression lever via RMS and a 4096 vocab, removing lexical auxiliaries like hash embeddings and the smear gate becomes much easier to justify, because some of what they were buying is now being bought more directly by the tokenizer and by the larger core model. Likewise, if stronger regularization is making the main weight banks cheaper to quantize and compress, then spending the recovered budget on a wider MLP is a very coherent move. At the same time, I do not think all of those removals should be read as settled truths. Some of them, especially the lexical extras, follow pretty naturally from the larger vocab; others feel more like strong empirical bets that also hand-wave away interactions that I suspect matter, particularly around matrix-specific quantization sensitivity and export behavior. My own not-yet-submitted SOTA PR has led me to somewhat different conclusions on a few of these choices. The space of good recipes is larger than any single record PR might suggest. My own framing I keep coming back to is that Parameter Golf is not about training a model and then compressing it, although so far most PRs read like that is exactly what it is. It is about learning an equivalence class of functions, then choosing the member of that class whose quantized, side-informed, bank-packed serialization has the lowest task loss at 16MB. Or, if you prefer it in fewer syllables: the true parameters are the bits. Train weights that the quantizer will thank you for. This submission is what it looks like when someone starts pulling on that thread. There is a lot more to find in this direction. Go further: shape the training dynamics from the ground up so the learned solution already lives in a compression-friendly, distortion-stable basin. You can push a surprisingly large model through the 16 MB bottleneck and have it come out the other side intact. |
…1.0929 (3-seed mean) Adds three techniques to PR openai#1218's 4096-vocab high-WD stack: - MuonEq-R optimizer (row-norm before NS5 orthogonalization) - Depth recurrence on layers 4,5 (shared MLP, zero extra params) - Mixed int5/int6 GPTQ via Hessian sensitivity ranking 3-seed mean: 1.0929 BPB / 2.5145 nats All seeds under 16MB (max: 15,981,324 bytes) No TTT, no SLOT, no eval-time adaptation.
|
I'm so happy V4096 is back |
… (3-seed mean) Improves PR openai#1260 (1.0929) by using N_INT6=61 (one more int6 layer) with a smaller mini runner (21,396 bytes) that creates enough headroom. 3-seed mean: 1.0924 BPB / 2.5133 nats (seeds 42, 0, 7) All seeds under 16MB (max: 15,996,591 bytes) No TTT, no SLOT, no eval-time adaptation. Techniques: MuonEq-R optimizer, depth recurrence (layers 4,5 shared MLP), 61 int6 + 5 int5 Hessian-ranked GPTQ, brotli-11 compression. Built on PR openai#1218 by @clarkkev.
….0912 (3-seed mean) WD-quantization synergy: higher weight decay (0.090 vs 0.085) compresses 5% better, creating headroom for ALL 66 layers at int6 precision. The extra quantization quality more than recovers the WD BPP cost. 3-seed mean: 1.0912 BPB / 2.5106 nats (seeds 42, 0, 1337) All seeds under 16MB with 32K+ margins. No TTT, no SLOT, no eval-time adaptation. Built on PR openai#1218 by @clarkkev. Improves PR openai#1260 (1.0929) by 0.0017 BPP.
|
Thanks everyone! To answer @abaybektursun's questions
I agree with a lot of your points @NoesisGenesis and I do think there is a lot left to explore here. I basically deleted things that I felt weren't needed and made sure there wasn't a regression, but that doesn't mean some version of QAT, hashing, etc. might still be useful. Looking forward to see your PR when it is ready! I also looked a bit deeper into the RMS and compression ratio correlation to see what is really going on.
|
…base Based on PR openai#1218 (clarkkev) SP4096/MLP4x/WD0.085 stack. Added: Polar Express NS (4 steps), MuonEq-R, depth recurrence (layers 4,5), SLOT eval-time delta. Target: sub-1.09 BPB. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…b 1.0900 (3-seed mean) 3-layer depth recurrence (layers 3,4,5) with WD-LR synergy: higher WD (0.095) compresses for all-int6 headroom, higher MLR (0.022) recovers quality. All 66 layers at int6 precision. 3-seed mean: 1.0900 BPP / 2.5077 nats (seeds 42, 0, 7) All seeds under 16MB with 36K+ margins. No TTT, no SLOT, no eval-time adaptation. Improves PR openai#1285 (1.0912) by 0.0013 BPP. Beats PR openai#1218 by 0.0079. Built on PR openai#1218 by @clarkkev.
…el spectral test-time training Base: clarkkev openai#1218 (1.0974 BPB, 4096 vocab, brotli, 34M params) Added: depth recurrence L4,5 (from openai#1285), MuonEq-R, WD=0.09 Novel: Spectral TTT — adapt singular values at eval time (8192 params) Target: ~1.085 BPB
…mult4-wd085 Record: 4096-Vocab + 4.0-MLP-mult + 0.085-WD + Simplifications — val_bpb 1.09785 (3-seed mean)
….0912 (3-seed mean) WD-quantization synergy: higher weight decay (0.090 vs 0.085) compresses 5% better, creating headroom for ALL 66 layers at int6 precision. The extra quantization quality more than recovers the WD BPP cost. 3-seed mean: 1.0912 BPB / 2.5106 nats (seeds 42, 0, 1337) All seeds under 16MB with 32K+ margins. No TTT, no SLOT, no eval-time adaptation. Built on PR openai#1218 by @clarkkev. Improves PR openai#1260 (1.0929) by 0.0017 BPP.
….0912 (3-seed mean) WD-quantization synergy: higher weight decay (0.090 vs 0.085) compresses 5% better, creating headroom for ALL 66 layers at int6 precision. The extra quantization quality more than recovers the WD BPP cost. 3-seed mean: 1.0912 BPB / 2.5106 nats (seeds 42, 0, 1337) All seeds under 16MB with 32K+ margins. No TTT, no SLOT, no eval-time adaptation. Built on PR openai#1218 by @clarkkev. Improves PR openai#1260 (1.0929) by 0.0017 BPP.
….0912 (3-seed mean) WD-quantization synergy: higher weight decay (0.090 vs 0.085) compresses 5% better, creating headroom for ALL 66 layers at int6 precision. The extra quantization quality more than recovers the WD BPP cost. 3-seed mean: 1.0912 BPB / 2.5106 nats (seeds 42, 0, 1337) All seeds under 16MB with 32K+ margins. No TTT, no SLOT, no eval-time adaptation. Built on PR openai#1218 by @clarkkev. Improves PR openai#1260 (1.0929) by 0.0017 BPP.
Improve post-training quantization on PR openai#1218 base (SP4096, MLP 4x, WD 0.085). Three changes: sequential cross-layer error propagation, groupwise int6 scales (group_size=128), and Hessian-weighted scale selection. Expected -0.004 to -0.008 dBPB with zero training-time cost. Made-with: Cursor
Three improvements to the post-training quantization pipeline on PR openai#1218: 1. Sequential cross-layer GPTQ: quantize layers one at a time, injecting quantized weights back before collecting later layers' Hessians. This propagates quantization error forward so later Hessians are accurate. 2. Groupwise int6 scales (group_size=128): per-group fp16 scales instead of per-row, giving finer control over weight variance within rows. 3. Hessian-weighted scale selection: minimize H_diag-weighted error instead of MSE when selecting per-row clip percentiles. Zero training-time cost. Expected -0.004 to -0.008 dBPB. Made-with: Cursor
- Match heading, table, and section format from openai#1218/openai#1394 - Add Post-quant BPB column, bold Sliding BPB values - Add missing submission.json fields (hardware, bytes_total, bytes_code) - Remove Deltas and Reproducibility sections - Round val_bpb to 5 decimal places consistently Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
….0912 (3-seed mean) WD-quantization synergy: higher weight decay (0.090 vs 0.085) compresses 5% better, creating headroom for ALL 66 layers at int6 precision. The extra quantization quality more than recovers the WD BPP cost. 3-seed mean: 1.0912 BPB / 2.5106 nats (seeds 42, 0, 1337) All seeds under 16MB with 32K+ margins. No TTT, no SLOT, no eval-time adaptation. Built on PR openai#1218 by @clarkkev. Improves PR openai#1260 (1.0929) by 0.0017 BPP.
Frontier records (PR openai#1285 MuonEq-R + WD=0.090, PR openai#1218 WD=0.085) use AdamW-style decoupled weight decay on the Muon optimizer. Add the knob with default 0.0 (backward-compatible). Applied as p.data.mul_(1 - lr * wd) before the Muon matrix update. MuonEq-R (row-normalized) variant is not ported — it would need more line budget than we have on this branch. WD alone accounts for the majority of that record's improvement per the commit notes. dev/run_frontier.sh sets MUON_WEIGHT_DECAY=0.09 by default. Also inlined restore_low_dim_params_to_fp32 at its single call site to free lines for this change. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Record: 4096-Vocab + Larger Model + High WD + Simplifications — val_bpb 1.09785
val bpb: 1.09785 (3-seed mean, std=0.0004)
Overview
This script builds on the 03-23 leaderboard record. The main changes are:
Fixes
window_starts = [ws for ws in range(0, total_tokens, stride) if min(ws + seq_len, total_tokens) - ws >= 1], and it should be:window_starts = [ws for ws in range(0, total_tokens, stride) if ws + seq_len - stride < total_tokens]Simplifications
Additions
data/download_hf_docs_and_tokenize.pyto build the sentencepiece tokenizer and pre-tokenized data. The tokenizer model grew by ~50kb, but even with that added, the final artifacts would be below the 16MB cap. A larger vocab means the model sees more context for the same sequence length and more train data per step.torch.sqrt(torch.mean(x**2))) with an R^2 near 0.99. This suggests that the weight decay is a good lever for reducing the compressed size, which can let us add more parameters to the model. In particular this script uses:mlp_mult3 -> 4.qk_gain_init1.5 -> 4 following #1125.