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
61
duration
57m
recorded
2026-08-04

run iddclm-nano-curation__phgXX4s

Score

reward
303.510
compare against every run on this task →

Summary

All three deliverables are in place and validated.

Result

Dev perplexity 317.04 vs. random-selection baseline 485.46 — a 34.7% reduction.

Approach

The key realization: data/multi_dev.npy is 1M GPT-2 tokens of the actual target distribution. Decoding it gives labeled positives for free, turning "guess what quality means" into supervised importance estimation. Decoding also revealed the target's exact composition — wiki 24.9% / web+news 50.1% / technical Q&A 25.0% by token, matching the disclosed "equal parts of four domains".

Three components, ranked by measured effect:

  1. Target-similarity ranking — one hashed-n-gram logistic regression per register (torch EmbeddingBag, since sklearn/scipy are absent), target segments vs. random pool docs.
  2. Junk gate — Gopher/C4-style surface filters, looser for the code-bearing register. Worth ~24 PPL.
  3. Mixture-matched round-robin — makes every prefix of the list correctly mixed, so the selection is robust to wherever the 12M budget cuts (verified: 0.22/0.43/0.35 at every prefix).

I pre-tokenized the whole pool once up front, which made candidate packing instant and let me run 14 training variants (3 concurrently per batch) instead of ~5.

Two findings worth flagging

  • Falsification test passed decisively. A selection of only the cleanest encyclopedic register scores 445.9 — barely better than random — despite every document being individually high-quality. Coverage beats single-axis quality.
  • My own prior was wrong, and I kept the data's answer. I expected stripping HTML markup from the Q&A positives to help (markup can't transfer to plain-text pool docs). It measurably hurt: 329.7 vs 322.1. curate.py keeps the markup, with the ablation documented in the docstring.

The mechanism claim rests on a zero-training observable: unigram/bigram cross-entropy of the target under a candidate training set. It rank-orders all four key selections identically to trained PPL, and correctly predicts the wiki-only failure (8.1299 vs random's 8.1343) before any training runs.

Two honest caveats, both stated in claim.md: the mixture tilt away from the target's own 25/50/25 is the weakest claim — neighboring mixtures cluster at 321–326, so run-level variance is a few PPL and 317.04 likely sits at the lucky end of that band. Three further tweaks (stricter gate, length cap, higher minimum length) each came out 4–5 PPL worse, so the recipe is saturated at this budget. Separating tilt from noise needs multiple seeds per mixture, which didn't fit the compute budget.

curate.py was run end-to-end from the raw pool and reproduces selection.json bit-identically (18,543 ids / 13.50M tokens, 12.5% budget headroom), retraining to the same 317.04.

Transcript