DWS Research

DWSLM-256M: model card and technical report

Version 1.1 · 13 November 2026 · DWS Research

DWSLM-256M is a small language model we trained from scratch on one GPU. The corpus, tokenizer, model code and training loop are our own, and no pretrained weights were used anywhere. It comes in three variants: a base model with a 4,096-token context, a base model extended to 32,768 tokens, and a chat model fine-tuned from the 4K base.

The name counts compute. 286M parameters do work on every token. Another 369M sit in lookup tables (the token embedding and ten value-embedding tables) that cost almost nothing per token, so 655M are stored in total.

It trained on 23.6B tokens, one pass over the corpus, about 83 tokens per compute parameter. On a six-task cloze suite (HellaSwag, ARC-Easy, ARC-Challenge, PIQA, WinoGrande, MMLU) it averages 40.6% length-normalized accuracy. Gemma 3 270M scores 46.8% on the same harness and SmolLM2-360M scores 54.6%, after training on roughly 250 and 170 times as many tokens. On held-out text from its own corpus the base model reaches 0.996 bits per byte.

The chat model is a demonstration, not an assistant. It talks in a casual chat register and is usually wrong, off topic or both. It has had no safety training. Version 1.1 of the chat model adds the benchmarks' own train splits, merged in by task arithmetic: it averages 43.4% on the same suite (v1.0: 40.5%). That gain is disclosed and broken down in section 6.4; the base models never saw that data. You can talk to it at /llm/try. The two base models are on Hugging Face under Apache-2.0, with their reference code: DWSLM-256M-Base and DWSLM-256M-Base-32K.

01Model overview.

Developer
DWS Research
Released
13 November 2026: base weights on Hugging Face (DWSLM-256M-Base, DWSLM-256M-Base-32K, Apache-2.0); the chat model as a live demo
Variants
DWSLM-256M Base (4K), DWSLM-256M Base 32K, DWSLM-256M Chat (v1.0, v1.1)
Architecture
decoder-only hybrid: linear-attention (KDA) layers with a global attention layer every fourth
Parameters
286M compute (252M in blocks, 34M head) + 369M lookup (34M token embedding, 336M value embeddings) = 655M
Context
4,096 tokens (Base, Chat), 32,768 (Base 32K)
Tokenizer
DWSLMTok32.3, byte-level BPE, 32,768 tokens
Languages
English, 16 other languages, code
Training tokens
23.61B pretraining; +0.50B at 32K (Base 32K); +0.37B fine-tuning (Chat); +0.13B benchmark train splits (Chat v1.1)
Compute
about 4.1 × 10¹⁹ FLOPs for pretraining (6·N·D over compute parameters, attention excluded); about 35 GPU-hours from first step to chat model, one GPU, not counting proxy runs
Demo
/llm/try serves DWSLM-256M Chat v1.1
Intended use
research on small-model training; a baseline for the 1B model
compute 286M lookup 369M blocks 252M head 34M token embedding 34M value embeddings 336M
Fig. 1 Where the 655M parameters are. Compute parameters do work on every token; lookup parameters are table reads.

02Architecture.

  • Local layers use Kimi Delta Attention (KDA), a gated linear-attention layer with a fixed-size state per head. KDA won a bake-off on an 8-layer proxy at 1B tokens: 1.313 bits per byte against 1.342 for Gated DeltaNet and 1.401 for sliding-window attention, and it also led on loss per GPU-hour.
  • Global layers (3, 7, 11, 15, 19) are grouped-query attention with QK-norm, a per-head sigmoid output gate and LeRoPE, rotary embeddings with one learned frequency scale per band.
  • Residual stream: block attention residuals in the Kimi form. Each group of four layers reads a learned, per-token mix of the embedding and the finished groups, and learned scalars add the raw embedding back into each sublayer's input.
  • Value embeddings: ten lookup tables, one per alternating layer, add a token-indexed vector into the attention values.
  • Head: tied to the input embedding for the first two thirds of training, then untied. Logits are scaled by 1/d and soft-capped at 20.
  • Init: CompleteP depth scaling, small nonzero output projections, and an init scale of 0.5.

Removing pieces one at a time from the 8-layer proxy cost: value embeddings +0.029 bits per byte, QK-norm +0.005, LeRoPE +0.003, the λ scalars +0.001. Attention residuals came out even per GPU-hour (+0.005 bits per byte, but 7.9% faster without them) and were kept because their reported gains grow with depth.

token ids token embedding 32,768 × 1024 b0 KDA layer mixer, then MLP KDA layer mixer, then MLP KDA layer mixer, then MLP global layer mixer, then MLP group × 5 b1 … b5 the outputs become sources for every routing site final routing mix of b0 … b5 λ_x0 · b0 added into every sublayer RMSNorm LM head, untied 1024 → 32,768, scaled by 1/d tanh softcap at 20 logits 20 layers KDA global (3, 7, 11, 15, 19) value embedding (even layers)
Fig. 2 The model. Each group is three KDA layers and one global layer, five times. Every routing site reads the embedding b0 and the outputs of the finished groups. 286M compute parameters, 369M lookup.
sources b0, b1 … bk (finished groups), p (partial sum) route 8-head softmax over the sources: block attention residuals + λ_x0 · b0 the raw embedding added back in RMSNorm sublayer 1: the mixer (KDA or global) 2: ReLU² MLP, 1024 → 4096 → 1024 × 0.4 CompleteP depth scaling p = λ_res · p + o o is the scaled output p Two sublayers per layer. At the end of a group, p becomes the next source b(k+1).
Fig. 3 One sublayer, of which each layer has two. The routed input is a softmax mix of the sources, the embedding is added back in, and the scaled output joins the partial sum.
KDA (local layers) global layers qkv projection 8 heads × 128; value embedding added into V on even layers (2·sigmoid gate, starts at 1) short causal conv kernel 4 gated delta rule per-channel decay from a low- rank map (1024 → 128 → 1024); fixed-size state per head sigmoid-gated RMSNorm output projection q, k, v projections 8 query heads, 2 key-value heads, head dim 128 QK-norm LeRoPE rotary with a learned scale per frequency band attention masked at document boundaries per-head sigmoid gate output projection
Fig. 4 The two mixers. KDA keeps a fixed-size state per head; the global layers attend over the whole context.

03Pretraining data.

The corpus is 15.7M documents from 18 openly licensed sources, 23.2B tokens:

By language, 25% is English, 26% is code and 49% is spread over 16 other languages. MinHash deduplication removed 181,089 near-duplicates and an OCR quality gate removed 2,129 pages of scanner noise.

  • Rephrased data: 289M tokens of synthetic rewrites (FAQ, tutorial, table, math, Q&A and dialogue formats) of FineWeb-Edu, science and OpenWebMath documents, written by SmolLM2-1.7B-Instruct. They train beside the corpus at weight 1.
  • Held out: about 0.1% of documents, stratified by source and language, are never trained on. All bits-per-byte numbers are measured on that split.
  • Decontamination: every training document sharing a rare 13-token sequence with an evaluation item was dropped before training (2,802 documents).
typetokenssources
web8.53BFineWeb-Edu, FineWeb-2
code5.95BThe Stack v3, permissive licenses
books4.79Bpublic-domain books in ten languages
encyclopedia2.27BWikipedia in 16 languages
science0.72BpeS2o papers
government0.39BSEC filings
news0.37Bhistorical US newspapers
math0.19BOpenWebMath
web 8.53B code 5.95B books 4.79B encyclopedia 2.27B science 0.72B government 0.39B news 0.37B math 0.19B by language English 5.85B · 25% code 5.95B · 26% 16 other languages 11.41B · 49%
Fig. 5 Training tokens by data type, then the language split.

04Pretraining.

The learning rate comes from a five-point sweep on the 8-layer proxy at 1B tokens (optimum 1 × 10⁻², confirmed at 20 layers), scaled to 23B tokens with HyperP's η ∝ T^-0.32 rule. 370 steps were skipped (0.8%), mostly on gradient spikes in the global layers' attention projections. Attention-logit checks at 14K and 29K steps stayed well inside our limits.

Steps
45,030 × 524,288 tokens = 23.61B tokens, one epoch
Context
512 → 1,024 → 2,048 → 4,096 at 5%, 15% and 35% of tokens; documents packed with no attention across boundaries
Optimizer
MuonH (Hyperball) on matrices; AdamW on embeddings, head, norms and scalars; no weight decay
Learning rate
MuonH peak 3.7 × 10⁻³; every group scales by one shared multiplier
Schedule
warmup-stable-decay: 1% warmup, linear decay over the last 20% to 5% of peak
Anneal
from 75% of tokens, high-quality sources upsampled 2×
Precision
BF16 mixed precision, FP32 master weights
Stability
gradient clip 1.0; a step is skipped when the matrix and embedding gradient norm spikes; scalars clipped on their own
Throughput
about 215K tokens/s; 32.8 hours wall clock
1.0 1.5 2.0 2.5 0B 5B 10B 15B 20B tokens bits per byte 1K 2K 4K untie anneal decay 0.996
Fig. 6 Held-out bits per byte against tokens trained (log scale). Marks: context steps to 1K, 2K and 4K, the head untied, the anneal mix and the learning-rate decay.
2.0 3.0 4.0 0B 5B 10B 15B 20B tokens train loss 1K 2K 4K untie anneal decay
Fig. 7 Training loss, mean per logging interval. The first part of the run is above the top of the plot.
0.30 0.40 0.50 0B 5B 10B 15B 20B tokens average accuracy chance 0.333 Gemma 3 0.468 SmolLM2 0.546 0.406
Fig. 8 Cloze average at ten checkpoints: the first nine on a 500-example subset per task (about ±0.01 on the average), the last on the full sets. Chance and two reference models for scale.

05Long-context extension (Base 32K).

Starting from the final 4K checkpoint, we trained 953 more steps (500M tokens) at 32K context on documents of at least 16K tokens, with YaRN ×8 over the learned rotary frequencies and a learning rate starting at the base's final floor (1.85 × 10⁻⁴).

Bits per byte by position in the document, early in the phase (step 95) and at its end:

Short-context quality held: overall held-out bits per byte went from 0.9963 to 0.9957 and the cloze average from 0.4063 to 0.4066. On the proxy, YaRN beat plain extension at 16K to 32K (1.038 against 1.068) and cost nothing below 8K.

positionsstep 95step 953
0 to 4K0.8310.822
4K to 8K0.8040.793
8K to 16K0.8060.795
16K to 32K0.7910.780
0.78 0.80 0.82 0.84 bits per byte 0-4K 4-8K 8-16K 16-32K 0.822 0.831 0.793 0.804 0.795 0.806 0.780 0.791 step 95 step 953
Fig. 9 Bits per byte by position in the document, early in the 32K phase and at its end. Every bin improves, the longest most.

06Post-training (Chat).

6.1 Data

Conversations are rendered with reserved role tokens (system, user, assistant, tool, call, end) into 4K windows. Loss falls only on assistant tokens, so the model learns to write its own turns and never anyone else's.

Agent traces dominate by volume. The three conversational sources are 7.2% of the loss tokens, upweighted on purpose to make the model chattier. Assistant turns in the Gemini, Fable and Open-SWE data were written by larger models; we use them under each dataset's terms.

Privacy processing. Every source was scanned for secrets (API keys, assigned credentials, email addresses) and those were redacted. In the Discord data, every participant's handle, every mention and channel tag, every URL and phone number, and a list of real names were replaced with "someone", and bot messages were dropped. Other people's messages appear only as the user side of a conversation, which carries no loss. Exact and prefix duplicates were removed across exports.

6.2 Fine-tuning

A full fine-tune of Base (4K): one pass over the mix, 706 steps of 524K tokens, the pretraining optimizers at a tenth of the pretraining learning rate (3.7 × 10⁻⁴), 2% warmup then linear decay to zero. It took 36 minutes. Loss on a held-out 1% of conversations per source, mostly agent traces, fell from 2.389 (the base model reading the same template) to 1.627.

6.3 Weight-space post-processing

After fine-tuning we tried three kinds of weight edits. The selection rules were written down before any result came in: candidates are scored on the even-numbered items of the cloze suite (selection half) and reported on the odd-numbered ones (report half). A candidate must stay within 3% of the best held-out loss (all sources, mostly agent traces); among those, the best selection-half score wins.

  • Tail average: the mean of the last five kept checkpoints (steps 550 to 706). It matched the last step.
  • Blends interpolate back toward the base, θ = base + α(tuned − base). Lower α buys back up to 0.4 points of cloze and gives up 14% of held-out loss. That trade isn't worth it here: the whole spread is inside the suite's noise (about ±0.4 points on the average), and the held-out loss is what the chat model is for.
  • Loop edits. Under greedy decoding, 13.3% of replies to 128 held-out prompts fall into a loop (some 6-token sequence repeats three or more times). Following recent work on weight-space editing, we took the mean hidden state inside loops minus the mean over loop-free replies, and projected that direction out of either the output head or every write into the residual stream, at strengths 0.5 and 1. Every variant made looping worse: 17.2% and 36.7% at the head, 15.6% and 44.5% in the stream. All four were rejected. Our reading is that loop-free replies end and looping ones don't, so the contrast also captures the model's "time to stop" signal, and removing it removes the stop. A contrast between positions matched for distance from the end would avoid that.

Fine-tuning on chat data left the benchmark scores where pretraining put them. That is the expected result for a cloze suite: it measures what the model knows and how it reads the task's format, and chat data teaches neither. Section 6.4 moves them with data built for the task.

6.4 Benchmark train splits and task arithmetic (Chat v1.1)

The cloze suite never asks the model to write. It compares how likely the model finds each option, so a model that has never seen a task's format or subject matter can have nearly random preferences between options even when it knows the words. Version 1.1 teaches those formats with the benchmarks' own training data, then merges that change into the chat model.

Data. Every split the suite doesn't score on, in the eval's own prompt format, with loss only on the gold answer:

OpenBookQA's train split turned out to be inside MMLU's auxiliary set already. Two filters ran against every evaluation item: 940 items sharing a rare 13-token run were dropped, then 123 more whose question text (normalized) matches an eval question exactly, which catches short questions that 13-grams miss. A run trained before the second filter scored the same (0.4512 against 0.4513 on the full suite), so the filter changed nothing measurable.

Bench fine-tune. From Base, three passes over that data (248 steps of 524K tokens, 46 minutes), with the chat fine-tune's learning rate and schedule. Alone it scores 0.451 on the full suite, but its conversation is worse than the base model's.

Merge. Task arithmetic: θ = θ_base + (θ_chat − θ_base) + λ(θ_bench − θ_base), with θ_chat = Chat v1.0 and λ in {0.25, 0.5, 0.75, 1}. The rule, fixed before scoring: loss on held-out conversations (the Discord, reply-pair and Gemini sources) within 2% of Chat v1.0, overall held-out loss within 3%, then the best selection-half score; report the other half.

λ = 0.5 is the last weight inside the 2% limit (+1.8%). It adds 3.4 points on the report half, well outside the suite's noise. λ = 0.75 and 1 score higher still, but cost 4% and 8% of conversation loss. These numbers come from a second scoring pass with a different attention kernel; Base scores 0.4067 there against 0.4063 in section 7.1, so the two passes agree within 0.0004.

The gain is uneven in the way format training predicts: ARC-Easy +10 points and ARC-Challenge +3 (grade-school science, which MMLU's auxiliary set is full of), HellaSwag +1.6, PIQA +1.3, MMLU +0.8, WinoGrande flat. It reflects the tasks' format and subject matter, not broader ability, and it isn't comparable with models that trained on none of these splits.

Loop edits, again. On Chat v1.1, 12.5% of greedy test replies loop. We repeated the loop-direction edit with a second contrast: positions inside a loop against the same replies' positions before the loop, which removes the "reply is ending" signal. It did better than the original contrast (13.3% to 18.0% against 16.4% to 91.4%) but still never reduced looping, so no edit was kept again. Removing one direction doesn't stop this model from repeating itself.

sourceconversationstokensloss tokenspasses
our own coding-agent sessions1,678216.6M93.7M2
Open-SWE-Traces (resolved coding-agent runs)3,116127.0M51.1M1.4% sampled
Gemini conversation history (our own)1,62711.1M9.8M3
Fable 5.1 reasoning traces2,3476.1M1.2M25% sampled
Discord, our own messages1,3812.6M0.8M6
Discord, older reply pairs18,5761.8M0.7M4
total28,725365.2M157.3M
candidateheld-out losscloze (select)cloze (report)cloze (all)
Base2.3890.4080.4050.406
fine-tune, last step1.6270.4130.3960.405
tail average (Chat v1.0)1.6300.4130.3970.405
blend 0.851.6650.4130.3980.406
blend 0.71.7290.4150.4000.407
blend 0.51.8600.4180.4000.409
sourcesplititems
HellaSwagtrain39,499
ARC-Easy, ARC-Challengetrain + validation2,790 + 1,391
PIQAtrain15,928
WinoGrande (XL)train40,390
MMLUvalidation + dev; auxiliary train1,472; 95,065
SciQtrain11,623
CommonsenseQAtrain9,741
total217,900 (43.0M tokens)
candidateconversation losscloze (select)cloze (report)cloze (all)
Base2.6860.4090.4040.407
Chat v1.02.2400.4140.3970.406
bench fine-tune alone2.8140.4530.4500.451
chat + 0.25 · bench2.2510.4290.4190.424
chat + 0.5 · bench (Chat v1.1)2.2800.4370.4310.434
chat + 0.75 · bench2.3310.4430.4410.442
chat + 1 · bench2.4100.4480.4480.448
conversational 7.2% loss tokens, 157.3M own coding-agent sessions 93.7M · 59.6% Open-SWE-Traces 51.1M · 32.5% Fable 5.1 reasoning 1.2M · 0.8% Gemini history 9.8M · 6.2% Discord, own messages 0.8M · 0.5% Discord, reply pairs 0.7M · 0.4%
Fig. 10 Fine-tuning loss tokens by source. The three conversational sources are 7.2% of the loss tokens, upweighted on purpose.
0 2 4 6 0 200 400 600 step dev loss Discord 3.89 pairs 3.99 Gemini 2.12 agent traces
Fig. 11 Held-out loss by source during fine-tuning. Discord starts at 5.8 and the reply pairs at 7.0, far above the agent traces: the base model had never seen that register.
0.390 0.400 0.410 0.420 1.6 1.8 2.0 2.2 2.4 cloze held-out loss, lower is better ±0.4 points: suite noise 1 2 3 4 5 6 1 base · 2 last step · 3 tail average, released · 4 blend 0.85 · 5 blend 0.7 · 6 blend 0.5 selection half report half
Fig. 12 Weight-space candidates: held-out loss against cloze, selection half (ring) and report half (dot). The shaded band is the suite's noise.
head 0.5 17.2% head 1.0 36.7% stream 0.5 15.6% stream 1.0 44.5% no edit 13.3%
Fig. 13 Share of greedy replies that fall into a loop, by edit. Every edit made it worse.
0.400 0.420 0.440 2.2 2.4 2.6 2.8 cloze, report half conversation loss, lower is better 2% limit 1 2 3 4 5 6 7 1 Base · 2 Chat v1.0 · 3 bench fine-tune alone · 4 λ 0.25 · 5 λ 0.5 (Chat v1.1) · 6 λ 0.75 · 7 λ 1
Fig. 14 Task arithmetic: report-half cloze against conversation loss. The dashed line is the 2% limit on Chat v1.0's loss. Chat v1.1 (accent) is the last merge inside it.
replies head 0.5 16.4% replies head 1.0 91.4% replies stream 0.5 17.2% replies stream 1.0 82.0% within head 0.5 14.8% within head 1.0 18.0% within stream 0.5 13.3% within stream 1.0 13.3% no edit 12.5%
Fig. 15 Loop rate on Chat v1.1 for the original contrast (replies) and the second one (within). At full strength the original loops on 82% to 91% of replies; no edit beat the unedited model.

07Evaluation.

7.1 Benchmarks

Length-normalized accuracy (log-likelihood per UTF-8 byte of each option), full evaluation sets, all models scored by the same harness in BF16:

Prompts follow lm-evaluation-harness and OLMES cloze formats; MMLU uses SmolLM's cloze prompt with no lettered choices. Splits: HellaSwag, PIQA and WinoGrande validation; ARC and MMLU test. The average is the unweighted mean of the six tasks, with a standard error of about ±0.4 points. Token counts for the baselines are from their own model cards where published. † Chat v1.1 trained on these benchmarks' train splits (section 6.4) and was scored in the second pass; the other columns saw none of that data.

MMLU at 27% is barely above chance (25%), and ARC-Challenge at 25% is at chance. The gap to the baselines is about what the token budgets predict.

7.2 Held-out text

Bits per byte on the held-out split of our corpus (lower is better). Each model tokenizes the text itself.

This comparison favors us in one way and the baselines in another. The split comes from our own training distribution, which no other model was tuned for. But the sources are public, and the baselines may have trained on these very documents (SmolLM2's corpus includes FineWeb-Edu and The Stack outright). Read it as a sanity check, not a ranking.

7.3 Chat

We ran no chat benchmark. At this size, judge-scored suites like MT-Bench sit at their floor. Two real replies from the demo, at the default settings:

User: What is the capital of France?
DWSLM-256M Chat: i mean
User: rust vs go
DWSLM-256M Chat: i'm going to say the same for this game, which is what i did today

The casual voice from the conversational data came through. The knowledge to back it up did not. Chat v1.1, greedy:

User: What is the capital of France?
DWSLM-256M Chat v1.1: Paris
User: rust vs go?
DWSLM-256M Chat v1.1: go is a better build for this
User: Which gas do plants take in from the air?
DWSLM-256M Chat v1.1: sodium nitrate

Shorter and more direct, as the benchmark data's one-line answers would suggest, and still wrong often.

task (items)BaseBase 32KChat v1.0Chat v1.1†Gemma 3 270MSmolLM2-360MLFM2.5-350MQwen3.5-0.8B
HellaSwag (10,042)0.3520.3490.3500.3660.4150.5640.4530.537
ARC-Easy (2,376)0.4440.4470.4350.5350.5790.6710.6990.625
ARC-Challenge (1,172)0.2490.2510.2530.2850.2850.3710.4130.391
PIQA (1,838)0.6140.6150.6140.6260.6880.7250.6750.710
WinoGrande (1,267)0.5060.5080.5080.5110.5430.5930.5580.582
MMLU (14,042)0.2720.2710.2710.2810.3000.3520.3490.350
average0.4060.4070.4050.4340.4680.5460.5240.532
parameters286M + 369M lookup268M362M354M752M
training tokens23.6B24.1B24.0B24.1Babout 6Tabout 4T
sourceBaseGemma 3 270MSmolLM2-360MQwen3.5-0.8B
FineWeb-2 (multilingual web)0.9511.0321.3921.018
The Stack v3 (code)0.3890.4630.3750.336
FineWeb-Edu0.8970.8510.7650.812
Wikipedia0.9011.0051.3580.931
books, English1.2721.4251.3331.229
science0.8220.8410.7780.776
math0.9410.9990.7680.783
all0.9961.1011.1670.982
0 0.2 0.4 0.6 hella arc-e arc-c piqa wino mmlu avg DWSLM-256M Base DWSLM-256M Chat v1.1† Gemma 3 270M SmolLM2-360M LFM2.5-350M Qwen3.5-0.8B dashed: chance · † trained on these benchmarks' train splits
Fig. 16 Length-normalized cloze accuracy per task, full sets, same harness. Dashed ticks are chance. Chat v1.1 (outlined) trained on these benchmarks' train splits, so its bars are not comparable with the other models.
0.5 1.0 1.5 2.0 bits per byte, lower is better fineweb-2 stack-v3 fineweb-edu wikipedia books-en science math-owm gov-sec news-us all DWSLM-256M Base Gemma 3 270M SmolLM2-360M LFM2.5-350M Qwen3.5-0.8B
Fig. 17 Held-out bits per byte per source on our corpus's held-out split. The baselines may have seen these documents; read it as a sanity check.

08Safety and responsible use.

  • No safety training. There was no refusal training, preference tuning or red-teaming, and no safety, bias or toxicity benchmark was run. The model refuses nothing, and it can produce offensive, false or nonsensical text, especially in the chat register it learned from Discord.
  • Low capability. At this size it can't reliably follow multi-step instructions, write working code beyond fragments, or state technical facts accurately. That limits misuse, and it also means nothing it says should be trusted.
  • Privacy. The chat data includes our own messages and agent sessions, processed as described in section 6.1. Small models memorize less than large ones, but the model could still reproduce fragments of its training conversations.
  • The demo serves DWSLM-256M Chat v1.1 and keeps no conversations: the page holds the messages, and the server holds only a session slot. Three people can chat at once, the rest wait in a queue, and sessions last ten minutes. Inputs are capped in length and count, and the server logs request routes and status codes, never content or addresses.

09Limitations.

  • Knowledge: well below models trained on a hundred times more data; MMLU and ARC-Challenge are at or near chance.
  • Coherence: replies are short and often unrelated to the question. 12.5% of Chat v1.1's greedy replies loop; the demo samples at temperature 0.7 with a repetition penalty of 1.1, which hides most of it.
  • Languages: half the pretraining corpus is not English, but nearly all the chat data is. Chat in other languages is untested.
  • Context: the chat model has a 4K context. The 32K base is not chat-tuned yet, because our fine-tuning code doesn't load YaRN checkpoints.
  • Benchmark scores: Chat v1.1's 3-point gain comes from training on the benchmarks' train splits. Compare it only with models that did the same; the base models' scores are the clean comparison.
  • Evaluation coverage: cloze accuracy and bits per byte only. Generative, code and multilingual benchmarks are still to come.

10What's next.

DWSLM-256M is the first model in the DWSLM line. Its runs set the recipe for the 1B model, which will use a layout llama.cpp and MLX already support (most likely Qwen3.8's). Lessons carried forward: chunk long books and interleave them across the data order, since streaming them whole skewed some training steps; budget evaluation noise before reading small differences; fix selection rules before seeing results.

ARejected ideas and measured negatives.

idearesultdecision
StochasTok (random token splits)+0.042 bits per byte; spelling up, arithmetic and counting downout
Soft multi-token predictionloses to next-token training below 689M in its own paperdropped before testing
n-gram count tablesworse at 190M in its own paper; needs a 30 to 50 GB tabledropped before testing
FP8 MLP matmuls+0.7% throughput on the main run, under the 2% barBF16
Fused router kernelbackward drifted from the reference on trained weightsrolled back
CUDA graphsout of memory at the main run's batch; slower at half batchoff
Base/chat blendsup to +0.4 points of cloze (inside noise) for 14% worse chat lossnot released
Loop-direction editsloops rose from 13% to between 16% and 45%rejected
Loop edits, within-reply contrast (v1.1)13.3% to 18.0% against a 12.5% baselinerejected
Merges at λ 0.75 and 1+0.8 and +1.4 points over λ 0.5, for 4% and 8% worse conversation lossnot released

BEvaluation details.

  • Cloze: each option is scored as the log-likelihood of its text given the prompt; accuracy takes the highest raw score, and length-normalized accuracy divides by the option's UTF-8 bytes. The suite is decontaminated against the training corpus at 13 tokens.
  • Bits per byte: total negative log-likelihood in bits over the total UTF-8 bytes of about 5M held-out tokens. Our model scores 4,096-token packed rows that restart at row edges; the baselines score each document from its start with up to a 32K window. Both choices slightly favor the baselines.
  • Selection and report halves: even- and odd-indexed items of every task, fixed before any post-training candidate was scored.