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
- 61
- duration
- 53m
- recorded
- 2026-08-04
run iddclm-nano-curation__MDUDMmY
Score
Summary
Done. All three deliverables are in place and verified.
Result
Dev perplexity 328.5 vs the random baseline's 458.0 — a 28% reduction. Verified end-to-end through the frozen harness (bash dev_eval.sh → HELDOUT_PPL 328.457), packing exactly 12,000,000 tokens from 44,986 ids.
What the criterion is
Rank documents by a per-token target/pool n-gram log density ratio (DSIR-style), but fit that ratio per target register and fill the budget by a quota proportional to each register's share of the target, behind a deliberately permissive quality gate plus near-duplicate removal. curate.py reproduces selection.json exactly from defaults; every ablation is one env var.
The finding that drove it
My first attempt — global top-k by density ratio — scored 544.9, worse than random. The budget is only ~6% of the pool, so a scalar ranking is a hard subset decision and collapses onto one register. Same scoring function, same 6% selectivity, register quota enforced: 328.5. Once balance is enforced, aggressive selection helps monotonically (35% → 461.7, 12% → 405.8, strict rank → 328.5); without it, selectivity is catastrophic.
Two mechanism observables (predicted before measuring, both independent of the score) confirmed it: the unbalanced selection is better on the register it over-served (266.4 vs 268.7) and 6.2× worse on the one it starved (1331.0 vs 213.7); and it achieves the highest mean density ratio — best on its own objective — while being the worst model.
Three things worth flagging
- The noise floor is large. Re-shuffling one fixed document set moved PPL from 422.9 to 399.3. Gaps under ~25 points aren't interpretable, which makes the K sweep (K=3→30 spanning only 341.7→325.9) a flat plateau. I therefore submitted K=16, the plateau midpoint, rather than the dev argmin K=20 — picking argmin off a noisy flat curve fits the dev sample, and the official target is a different draw.
- I revised the headline claim after a control run. A random K-way partition of the target already recovers 544.9 → 381.5, with real registers adding 381.5 → 328.5. So ~75% of the gain is that the ranking stops being scalar, and ~25% is genuine register matching.
claim.mdstates this correction up front rather than only in the falsification section. - A quota can't buy coverage the pool lacks. The pool holds almost no markup-bearing Q&A (203 docs) or spaced-punctuation Wikipedia (764), which is why the encyclopedic register stays near PPL 697 for every selection I tried. Also, strict C4-style prose gates hurt (385.7) — they discard the number-dense news and markup the target actually contains.
Unexplored: whether pushing to K in the hundreds (per-target-segment retrieval) helps — the per-cluster scoring loop was too slow in Python to test within the time budget.