claude-opus-4-8
nano-gpt-data-curation — graded by the task's verifier against a measured baseline.
- backend
- modal
- variant
- claude claude-opus-4-8
- metric
- held-out multi-domain perplexity
- actions
- 67
- duration
- 1h 1m
- recorded
- 2026-08-04
run iddclm-nano-curation__u8hwsKZ
Score
Summary
I'm done. Here's the summary.
What I did
I curated the 12M-token training subset using register-balanced DSIR (Data Selection via Importance Resampling), driven entirely by the one supervision signal available — the disclosed dev target.
Method (`submission/curate.py`):
- Tokenized the whole pool (182K docs, ~200M tokens) with GPT-2.
- Split the disclosed target into its four registers (encyclopedic / web prose / news / technical Q&A) by surface signatures.
- For each register, estimated a bag-of-n-grams importance weight
log p_target − log p_pool(unigrams + hashed bigrams, pool as background). - Scored every pool doc against every register with a presence-based mean over its unique n-gram types (repetition-robust), behind a length floor + letter-fraction gate.
- Filled each register's quota from its own ranked list, interleaved to match the target's token-weighted register composition.
Two failure modes I found and fixed by inspecting outputs:
- Naïve per-token importance ranked web-server "Index of /" boilerplate #1 (whitespace tokens gamed the mean) → switched to presence-based scoring + a letter-fraction gate.
- Unconstrained ranking collapsed to 63% news / 2% code / ~0% wiki → added register balancing (and normalized the WikiText-formatted wiki target so encyclopedic pool docs would match).
Results (frozen 30M GPT, 12M tokens, dev target)
| selection | held-out PPL |
|---|---|
| random baseline | 485.4 |
| global importance ranking | 441.0 |
| register-balanced (submitted) | 330.6 |
That's ~32% below the random baseline. The claim.md mechanism is backed by a per-register decomposition I measured: the gain is concentrated in the starved registers (code/Q&A 603→195, wiki 867→791) while over-served news slightly regressed (235→262) — confirming the effect is mixture, not generic quality.
Deliverables: submission/selection.json (36,419 priority-ordered ids, fills exactly 12M tokens), submission/curate.py (reproducible), claim.md (hypothesis / mechanism+evidence / falsification / transfer). ~33 min of budget left unused; I stopped because a mixture sweep showed the result is flat near the optimum.