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
- 85
- duration
- 1h 7m
- recorded
- 2026-08-04
run iddclm-nano-curation__kmNk7VX
Score
Summary
Done. Final state of the three deliverables:
submission/selection.json
41,285 ids, priority-ordered, 36.1M tokens (3.0× budget — packer fills 12,000,000 exactly from the first 16,620 docs). Validity checks pass: list of ints, all unique, all in-pool. Bit-identical across two independent runs of the curator.
submission/curate.py
Self-contained, no workspace imports, no seeds or hand-picked ids. Criterion in the header docstring: minimize unigram CE(p_target ‖ q_S) in GPT-2 token space, subject to documents being well-formed prose except that gate-failing documents may supply at most junk_frac of the budget — because they are the pool's only source of scarce target token types. junk_frac itself is swept and chosen by that same CE, so nothing is tuned against perplexity.
Two determinism bugs found and fixed along the way, both invisible in the score:
- sparse mat-vec in float32 → gains wobble in the last bits → near-ties permute within a greedy batch;
topkorder is then unstable, and order decides which document the packer cuts at 12M.
Fix: float64 mat-vec plus a batch sort on the float32-rounded gain with doc index as final tie-break. The selected set was never affected (100% prefix overlap even in float32) — only the emitted order, which is exactly the part that matters at the truncation boundary.
claim.md
Hypothesis → Mechanism (M1 CE-as-mediator, M2 per-register token deficits, M2b tier table showing the mass is unreachable by any quality filter, M3 the U-shaped allowance) → Falsification F1–F4 → Transfer. Every mechanism observable is something other than the final perplexity. Added this pass: the corrected CE row (7.741), the CE-vs-log-PPL mediation r = 0.925 over n = 18 trained selections, the full CE sweep with the CE_TOL tie-break rationale, and the determinism/validity notes.
Measured
| selection | dev PPL |
|---|---|
| random baseline | 477.8 |
| quality/domain classifier (97.5% register acc) | 365.0 |
| greedy CE, hard prose gate | 296.1 |
| submitted (greedy CE + CE-chosen 28% non-prose allowance) | 278.3 |
Per register: wiki 591.9, web 264.7, news 282.3, Q&A 135.3.
Two caveats I left in the write-up rather than smoothing over: the 272–281 band is one band, not a ranking (a 6% change in the document set moves PPL ±7), and the encyclopedic block is floored around ~450–600 by the pool itself — it holds 0.018% " ," tokens against a 4.63% target share, so that deficit is unbuyable at any budget. ~28 minutes remain on the timer; I'm stopping here rather than spending it on runs that can't resolve differences inside the noise floor.