Skip to content
nano-gpt-data-curation

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
80
duration
1h 6m
recorded
2026-08-03

run iddclm-nano-curation__xNCncBo

Score

reward
315.490
compare against every run on this task →

Summary

All three deliverables are in place, verified, and reproducible.

Result

Dev held-out perplexity 477.8 → 321.0 (−32.8% vs the random-selection baseline), verified end-to-end through the official dev_eval.sh (pack_selection.py → frozen train_nano.py), which reproduced 320.991 exactly.

What drove it

I decoded the disclosed dev target and found it was four contiguous, exactly equal quarters: WikiText-style encyclopedic, general web prose, news, and StackExchange Q&A. Everything followed from that. I pre-tokenized the whole pool once (2 min), then fit a 5-way linear classifier — four register classes vs. a random-pool "background" — and filled the budget with 25% of tokens from each register, gated and deduplicated.

Two details were the difference between working and not:

  • Canonicalizing the vocabulary. The wiki quarter is detokenized (" ,", " 's", " @-@ "). On raw GPT-2 ids the classifier separates target from pool purely on whitespace artifacts, learning nothing about register. Mapping each vocab entry through decode(t).strip().lower() removes the shortcut.
  • Stripping HTML from the technical quarter before fitting. Fit on raw markup, the top-ranked "technical" pool docs were scraped JavaScript boilerplate — symbol soup with the angle brackets and none of the language. After stripping, the same register selects genuine technical discussion (SVN dev threads, SharePoint deployment).

Measured, not assumed

I ran ~20 frozen-script evaluations. The mechanism is verified through a per-register perplexity decomposition — an observable separate from the score:

ablationdev PPL
submitted321.0
no quality gate332.7
tech share 10% instead of 25%349.4
random order within register (quotas+gate only)369.5
one global quality score, no quotas395.1

The decomposition separates two failure modes by fingerprint: starving a register damages that register (tech 234→305) and spares the others (news 267→259), while losing within-register quality damages all four proportionally (+14–23% each).

Three things I'd flag rather than bury:

  • λ=8 is a noise spike. The sweep gives 331/326/325/329/331/321/327/328/327 — λ=8's neighbors are 331 and 327, so it's a lucky draw, not a basin. Turning the style term on is worth ~4 points; the specific value isn't. Expect regression toward ~327 on the hidden sample; read the headline as 478 → ~325.
  • Dedup is neutral here (324.9 without vs 325.2 with) despite ~20% near-duplicates. Retained for robustness, not because it measured as helping.
  • The strong form of my hypothesis is falsified. Mixture structure is worth 108 points and within-register ranking 48 — so mixture dominates ~2.2:1, but calling the ranking a rounding error would have been wrong. I ran that experiment specifically because I had initially written it up as out of budget.

The wiki quarter remains ~2.7x harder than the others (661 vs ~250) and is the binding constraint: its detokenized surface form is essentially absent from the pool, and buying format match costs content quality roughly one-for-one, so selection can't close that gap.

Transcript