Skip to content

Language modeling on Nemotron-ClimbMix: WeLT vs. the baseline from 1.6M to 1B - #93

Merged
AmitMY merged 6 commits into
mainfrom
experiment/welt-vs-baseline
Oct 13, 2026
Merged

AmitMY merged 6 commits into
mainfrom
experiment/welt-vs-baseline

Conversation

@AmitMY

@AmitMY AmitMY commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

Language modeling on Nemotron-ClimbMix, WeLT against the subword baseline: five models, six latent transformer sizes (1.6M to 1.07B), and the encoder and decoder sizes at a fixed latent transformer.

Data

  • data.dataset_tokenizer: datasets of token ids (a tokens column, e.g. ClimbMix's GPT-2 ids) are decoded back to text while streaming; each model then segments the text its own way. Test with a GPT-2-encoded English + Hebrew text.
  • Long documents: chunks overlap by one word, and the last word of a continued chunk has no label, so every word is a label exactly once (as in the baseline's token chunks). Oracle test across chunks.

Configs

  • climbmix-{baseline,welt-pythia,welt}.yaml: the same text per example (340 Pythia tokens = 256 words), no image encoder; validation = the first 32 documents (one micro batch, the same bytes for all).
  • models/latent-{14m,31m,160m,410m,1b}.json: latent transformers with Pythia's dimensions.
  • models/bytes-<size>.json: byte models as large as the embedding tables they replace (matched params); models/bytes-flops-<size>.json: sized so that FLOPs per step match the baseline's (within 5%); plus the byte sizes of the encoder/decoder study.
  • modal_1b.py: the 1B runs on Modal H100s.

Baseline

  • Vocabulary padded to a multiple of 128 (as Pythia's 50,304) and Transformer Engine's fused cross entropy: 2x faster steps (70m: 473 → 230 ms), the same losses.

Results (validation bits per byte after 10,000 steps; details in the README)

Latent Baseline WeLT, Pythia tokens WeLT, words WeLT, matched params WeLT, matched FLOPs
1.6M 1.238 1.203 1.194 1.165 1.242
6.3M 1.145 1.146 1.145 1.097 1.156
25M 1.077 1.088 1.098 1.043 1.083
113M 1.038 1.057 1.075 1.020 1.040
403M 1.009 1.024 1.049 1.007 1.015
1.07B 1.024 1.038 1.036

At equal parameters WeLT is ahead up to 403M (by a shrinking margin), at equal FLOPs slightly behind everywhere; the decoder carries most of the byte models' effect; WeLT overtakes the baseline with 3x the training steps.

🤖 Generated with Claude Code

https://claude.ai/code/session_015Xm62qoeaTunFSU5GYCQ1f


Note

Medium Risk
Packing and label-mask changes affect all WeLT training data paths; incorrect continues handling would skew loss and metrics, though coverage is strong in tests.

Overview
Adds Nemotron-ClimbMix language-modeling benchmarks comparing WeLT to the Pythia subword baseline from ~1.6M to 1B parameters, with new climbmix-*.yaml configs, latent/bytes model JSONs (matched params and matched FLOPs), modal_1b.py for H100 runs, and scaling results in the README.

Long-document packing now matches the baseline’s overlapping token chunks: pack_words yields a continues flag per sequence, chunks overlap by one word, and process_single_example suppresses labels on the last word when the document continues in the next packed block so each word is scored exactly once. Tests and oracles are updated accordingly.

Data loading adds data.dataset_tokenizer to decode streamed tokens columns (e.g. GPT-2 ids) back to text before each model segments on its own.

Baseline training pads vocabulary to a multiple of 128 and enables Transformer Engine fused cross-entropy (~2× faster steps, same loss).

Reviewed by Cursor Bugbot for commit 485e2ac. Bugbot is set up for automated code reviews on this repo. Configure here.

@AmitMY
AmitMY changed the base branch from perf/signwriting to main October 11, 2026 11:24
…reamed); latent transformers at Pythia's sizes; WeLT over Pythia tokens

- data.dataset_tokenizer decodes datasets of token ids (a "tokens" column) back to texts, e.g. gpt2 for ClimbMix
- climbmix-{welt,welt-pythia,baseline}.yaml: the same text per example (256 words, 340 Pythia tokens), validation of
  32 documents (one micro batch for every model: the same bytes scored)
- models/latent-{14m,31m,160m}.json: Llama-style, with Pythia's dimensions (as latent-70m.json)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Xm62qoeaTunFSU5GYCQ1f
@AmitMY
AmitMY force-pushed the experiment/welt-vs-baseline branch from 99560e0 to d93c477 Compare October 11, 2026 11:24
autoresearch and others added 5 commits October 11, 2026 07:50
…ued chunk has no label

Documents longer than seq_length were split into independent chunks: each chunk's last word was trained to predict the
end of the document, and the next chunk's first word was never predicted (nor its bytes scored). Chunks now overlap by
one word, like the baseline's token chunks: every word is a label exactly once, and WeLT and the baseline score the
same bytes also for long documents (test).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Xm62qoeaTunFSU5GYCQ1f
…put section)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Xm62qoeaTunFSU5GYCQ1f
…g tables they replace

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Xm62qoeaTunFSU5GYCQ1f
…s fused cross entropy (2x faster steps)

On a GB10, the 70m baseline's step goes from 473 ms to 423 ms (padded) to 230 ms (+ TE cross entropy),
with the same losses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Xm62qoeaTunFSU5GYCQ1f
…s models, encoder and decoder sizes; results

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Xm62qoeaTunFSU5GYCQ1f
@AmitMY AmitMY changed the title Language modeling on Nemotron-ClimbMix: WeLT vs. the baseline at four sizes Language modeling on Nemotron-ClimbMix: WeLT vs. the baseline from 1.6M to 1B Oct 13, 2026
@AmitMY
AmitMY marked this pull request as ready for review October 13, 2026 06:29
@AmitMY
AmitMY merged commit 0e3dea7 into main Oct 13, 2026
3 checks passed
@AmitMY
AmitMY deleted the experiment/welt-vs-baseline branch October 13, 2026 06:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant