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
91
duration
1h 11m
recorded
2026-08-04

run iddclm-nano-curation__s2euUXT

Score

reward
309.650
compare against every run on this task →

Summary

All deliverables are in place and verified end-to-end.

Result

Dev perplexity 302.81 vs the random-selection baseline of 470.09 — a 35.6% reduction. Verified by running the official pack_selection.py on the submitted selection.json and confirming it produces a byte-identical token array to the one I evaluated.

What worked

The decisive move was noticing that data/multi_dev.npy is GPT-2 token IDs, so it decodes back into ~1M tokens of real target text — a legitimate, disclosed-domain reference distribution. From it I built:

  1. Quality gate calibrated on the target's own surface statistics (not hand-tuned constants), computed as GPU lookups over per-token property tables.
  2. Near-duplicate collapse via 8-token-shingle minhash.
  3. Distribution-matched ranking — per-register n-gram importance weights (DSIR-style), with the four per-register rankings interleaved to the target's token proportions, so every prefix (including where the 12M budget cuts) is mixture-matched.

Stage 3's interleaving, not the filtering, is where the gain lives: filtering alone bought 10 points (470→460), a global "pick the best documents" ranking bought 52 (→418), and mixture-matching bought another 92 (→326). Loosening the gate then took it to 302.8.

The mechanism, measured

Held-out perplexity is exp(mean loss) over a mixture, so one starved register dominates. Per-register dev slices, global top-k → mixture-matched:

slicetop-kmatchedsubmitted
technical Q&A524.9214.0148.1
encyclopedic819.2710.9730.4
news251.7265.4275.4
web prose344.0334.3341.5

Top-k scores higher mean target-likeness on 3 of 4 registers and still loses by 92 points — the entire gain is bought on the one register it starved, paid for with a ~5% news regression. That trade is the predicted observable in claim.md, and it rules out a "better documents on average" explanation.

Two caveats stated in the writeup rather than buried: run-to-run GPU atomic nondeterminism set the measurement resolution at roughly ±2 PPL (I've since made curate.py bitwise reproducible — verified by building the list twice), so the quota fine-tuning results sit at the noise floor and I don't claim an optimal quota. And encyclopedic perplexity stays high in every arm because the target's Wikipedia slice carries wikitext artefacts ( @,@ , spaced punctuation) that no raw-web pool document contains — that register's style isn't learnable from this pool at any selection.

Transcript