Repository navigation
Language modeling on Nemotron-ClimbMix: WeLT vs. the baseline from 1.6M to 1B - #93
Merged
Merged
Conversation
…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
force-pushed
the
experiment/welt-vs-baseline
branch
from
October 11, 2026 11:24
99560e0 to
d93c477
Compare
…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
marked this pull request as ready for review
October 13, 2026 06:29
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 (atokenscolumn, 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.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
Results (validation bits per byte after 10,000 steps; details in the README)
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
continueshandling 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-*.yamlconfigs, latent/bytes model JSONs (matched params and matched FLOPs),modal_1b.pyfor H100 runs, and scaling results in the README.Long-document packing now matches the baseline’s overlapping token chunks:
pack_wordsyields acontinuesflag per sequence, chunks overlap by one word, andprocess_single_examplesuppresses 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_tokenizerto decode streamedtokenscolumns (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.