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
53m
recorded
2026-08-04

run iddclm-nano-curation__MDUDMmY

Score

reward
329.340
compare against every run on this task →

Summary

Done. All three deliverables are in place and verified.

Result

Dev perplexity 328.5 vs the random baseline's 458.0 — a 28% reduction. Verified end-to-end through the frozen harness (bash dev_eval.shHELDOUT_PPL 328.457), packing exactly 12,000,000 tokens from 44,986 ids.

What the criterion is

Rank documents by a per-token target/pool n-gram log density ratio (DSIR-style), but fit that ratio per target register and fill the budget by a quota proportional to each register's share of the target, behind a deliberately permissive quality gate plus near-duplicate removal. curate.py reproduces selection.json exactly from defaults; every ablation is one env var.

The finding that drove it

My first attempt — global top-k by density ratio — scored 544.9, worse than random. The budget is only ~6% of the pool, so a scalar ranking is a hard subset decision and collapses onto one register. Same scoring function, same 6% selectivity, register quota enforced: 328.5. Once balance is enforced, aggressive selection helps monotonically (35% → 461.7, 12% → 405.8, strict rank → 328.5); without it, selectivity is catastrophic.

Two mechanism observables (predicted before measuring, both independent of the score) confirmed it: the unbalanced selection is better on the register it over-served (266.4 vs 268.7) and 6.2× worse on the one it starved (1331.0 vs 213.7); and it achieves the highest mean density ratio — best on its own objective — while being the worst model.

Three things worth flagging

  • The noise floor is large. Re-shuffling one fixed document set moved PPL from 422.9 to 399.3. Gaps under ~25 points aren't interpretable, which makes the K sweep (K=3→30 spanning only 341.7→325.9) a flat plateau. I therefore submitted K=16, the plateau midpoint, rather than the dev argmin K=20 — picking argmin off a noisy flat curve fits the dev sample, and the official target is a different draw.
  • I revised the headline claim after a control run. A random K-way partition of the target already recovers 544.9 → 381.5, with real registers adding 381.5 → 328.5. So ~75% of the gain is that the ranking stops being scalar, and ~25% is genuine register matching. claim.md states this correction up front rather than only in the falsification section.
  • A quota can't buy coverage the pool lacks. The pool holds almost no markup-bearing Q&A (203 docs) or spaced-punctuation Wikipedia (764), which is why the encyclopedic register stays near PPL 697 for every selection I tried. Also, strict C4-style prose gates hurt (385.7) — they discard the number-dense news and markup the target actually contains.

Unexplored: whether pushing to K in the hundreds (per-target-segment retrieval) helps — the per-cluster scoring loop was too slow in Python to test within the time budget.

Transcript