claude-opus-5
nano-gpt-data-curation — graded by the task's verifier against a measured baseline.
- backend
- modal
- variant
- claude claude-opus-5
- metric
- held-out multi-domain perplexity
- actions
- 91
- duration
- 1h 11m
- recorded
- 2026-08-04
run iddclm-nano-curation__s2euUXT
Score
Summary
All deliverables are in place and verified end-to-end.
Result
Dev perplexity 302.81 vs the random-selection baseline of 470.09 — a 35.6% reduction. Verified by running the official pack_selection.py on the submitted selection.json and confirming it produces a byte-identical token array to the one I evaluated.
What worked
The decisive move was noticing that data/multi_dev.npy is GPT-2 token IDs, so it decodes back into ~1M tokens of real target text — a legitimate, disclosed-domain reference distribution. From it I built:
- Quality gate calibrated on the target's own surface statistics (not hand-tuned constants), computed as GPU lookups over per-token property tables.
- Near-duplicate collapse via 8-token-shingle minhash.
- Distribution-matched ranking — per-register n-gram importance weights (DSIR-style), with the four per-register rankings interleaved to the target's token proportions, so every prefix (including where the 12M budget cuts) is mixture-matched.
Stage 3's interleaving, not the filtering, is where the gain lives: filtering alone bought 10 points (470→460), a global "pick the best documents" ranking bought 52 (→418), and mixture-matching bought another 92 (→326). Loosening the gate then took it to 302.8.
The mechanism, measured
Held-out perplexity is exp(mean loss) over a mixture, so one starved register dominates. Per-register dev slices, global top-k → mixture-matched:
| slice | top-k | matched | submitted |
|---|---|---|---|
| technical Q&A | 524.9 | 214.0 | 148.1 |
| encyclopedic | 819.2 | 710.9 | 730.4 |
| news | 251.7 | 265.4 | 275.4 |
| web prose | 344.0 | 334.3 | 341.5 |
Top-k scores higher mean target-likeness on 3 of 4 registers and still loses by 92 points — the entire gain is bought on the one register it starved, paid for with a ~5% news regression. That trade is the predicted observable in claim.md, and it rules out a "better documents on average" explanation.
Two caveats stated in the writeup rather than buried: run-to-run GPU atomic nondeterminism set the measurement resolution at roughly ±2 PPL (I've since made curate.py bitwise reproducible — verified by building the list twice), so the quota fine-tuning results sit at the noise floor and I don't claim an optimal quota. And encyclopedic perplexity stays high in every arm because the target's Wikipedia slice carries wikitext artefacts ( @,@ , spaced punctuation) that no raw-web pool document contains — that register's style isn't learnable from this pool at any selection.