Skip to content
nano-gpt-data-curation

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

reward
346.450
compare against every run on this task →

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`):

  1. Tokenized the whole pool (182K docs, ~200M tokens) with GPT-2.
  2. Split the disclosed target into its four registers (encyclopedic / web prose / news / technical Q&A) by surface signatures.
  3. For each register, estimated a bag-of-n-grams importance weight log p_target − log p_pool (unigrams + hashed bigrams, pool as background).
  4. 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.
  5. 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)

selectionheld-out PPL
random baseline485.4
global importance ranking441.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.

Transcript