DWSLM-256M-Base

The 4K-context base model: the end of DWSLM-256M's pretraining run (step 45,030, 23.6B tokens).

A small language model trained from scratch by DWS Research: our corpus, our tokenizer, our model code and training loop, no pretrained weights anywhere. This is a base model. It continues text; it was not instruction-tuned and has had no safety training. The full technical report is at research.dws.rip/llm/report.

Parameters 286M compute (252M in blocks, 34M head) + 369M lookup (34M token embedding, 336M value embeddings) = 655M stored
Architecture 20 layers, d = 1024: five groups of three Kimi Delta Attention (linear attention) layers and one global attention layer
Context 4,096 tokens
Training tokens 23.61B (one epoch of a 23.2B-token corpus plus 289M rephrased tokens)
Tokenizer DWSLMTok32.3, byte-level BPE, 32,768 tokens
Languages English, 16 others (ar, de, es, fr, hi, id, it, ja, ko, nl, pl, pt, ru, tr, vi, zh), code
Weights model.safetensors, fp32 (the training master weights)
License Apache-2.0 (weights and code); training data keeps its own licenses, below

Also available: DWSLM-256M-Base-32K, this model extended to 32K tokens.

Use

The architecture isn't in transformers, so this repo ships its own reference code in dwslm/ (the training model code, copied verbatim). It needs an NVIDIA GPU: the linear-attention and convolution kernels come from flash-linear-attention (Triton).

hf download dwsllc/DWSLM-256M-Base --local-dir DWSLM-256M-Base && cd DWSLM-256M-Base
pip install -r requirements.txt
python generate.py "The three primary colors are"
from dwslm import load, next_logits, EOS_ID

model, tok = load(".")  # this folder
ids = [EOS_ID] + tok.encode("The capital of France is").ids  # every training document began with <eos>
logits = next_logits(model, [ids])  # (1, 32768) next-token logits
print(tok.decode([int(logits[0].argmax())]))

next_logits takes several sequences at once and packs them into one forward pass, each as its own segment. Scoring multiple-choice options works the same way: sum the log-probabilities of each option's tokens. There is no KV cache, so generation re-runs the prefix for every new token.

Notes:

  • config.json sets attn: flash (PyTorch's FlashAttention-2 varlen path, Ampere or newer). Training used cudnn, which only runs on Hopper and Blackwell datacenter GPUs; both give the same attention.
  • The tokenizer must keep encode_special_tokens = True (load sets it), so a literal <eos> in text is encoded as text, as it was in training.
  • Fine-tuning: the weights are the fp32 masters. The training recipe used MuonH on matrices and AdamW elsewhere; any optimizer works, but use a learning rate near the end of pretraining's schedule (see the report).

Architecture

  • Local layers (15): Kimi Delta Attention, 8 heads × 128, a short causal convolution (kernel 4) on q/k/v, per-channel decay from a low-rank map, and a sigmoid-gated RMSNorm on the output. The state per head has a fixed size, so cost grows linearly with length.
  • Global layers (5, at 3, 7, 11, 15, 19): grouped-query attention with 8 query and 2 KV heads, head dim 128, QK-norm, LeRoPE (learned per-band rotary scales), document-masked varlen attention and a per-head sigmoid output gate.
  • Residual stream: block attention residuals. Each sublayer reads an 8-head softmax mix of the token embedding, every finished group's output and the current group's running sum; a learned λ adds the raw embedding back in. Branches are scaled by 8/20 (CompleteP).
  • Value embeddings: ten token-indexed tables, one per even layer, gated per head into the attention values.
  • MLP: ReLU², 1024 → 4096 → 1024. Norm: pre-RMSNorm. Head: untied, logits × 1/d, tanh softcap 20.

Training data

15.7M documents from 18 openly licensed sources, 23.2B tokens, deduplicated with MinHash (181,089 near-duplicates removed) and filtered for OCR noise:

type tokens sources (license)
web 8.53B FineWeb-Edu, FineWeb-2 (ODC-By 1.0)
code 5.95B The Stack v3, permissive licenses only (ODC-By 1.0)
books 4.79B PleIAs public-domain books in ten languages (public domain)
encyclopedia 2.27B Wikipedia, 16 languages (CC BY-SA 3.0)
science 0.72B peS2o (ODC-By 1.0)
government 0.39B PleIAs SEC filings (public domain)
news 0.37B PleIAs US public-domain newspapers (public domain)
math 0.19B OpenWebMath (ODC-By 1.0)

Plus 289M tokens of synthetic rewrites (FAQ, tutorial, table, math, Q&A and dialogue formats) of FineWeb-Edu, peS2o and OpenWebMath documents, written by SmolLM2-1.7B-Instruct (Apache-2.0). About 0.1% of documents were held out for evaluation, and every training document sharing a rare 13-token sequence with an evaluation item was removed (2,802 documents).

Training

Steps 45,030 × 524,288 tokens (one epoch)
Context ramp 512 → 1K → 2K → 4K at 5%, 15% and 35% of tokens
Optimizer MuonH (Hyperball) on matrices, AdamW elsewhere, no weight decay; MuonH peak LR 3.7 × 10⁻³
Schedule warmup-stable-decay: 1% warmup, linear decay over the last 20% to 5% of peak; high-quality sources upsampled 2× from 75%
Head tied to the embedding until 2/3 of training, then untied
Precision BF16 mixed precision, FP32 master weights
Compute about 4.1 × 10¹⁹ FLOPs, 32.8 hours on one GPU

Evaluation

Zero-shot cloze, length-normalized accuracy (log-likelihood per UTF-8 byte of each option), full evaluation sets, every model scored by the same harness in BF16. Prompts follow lm-evaluation-harness / OLMES; MMLU uses SmolLM's cloze prompt.

task DWSLM-256M-Base Gemma 3 270M SmolLM2-360M LFM2.5-350M Qwen3.5-0.8B
HellaSwag 0.352 0.415 0.564 0.453 0.537
ARC-Easy 0.444 0.579 0.671 0.699 0.625
ARC-Challenge 0.249 0.285 0.371 0.413 0.391
PIQA 0.614 0.688 0.725 0.675 0.710
WinoGrande 0.506 0.543 0.593 0.558 0.582
MMLU 0.272 0.299 0.351 0.349 0.350
average 0.406 0.468 0.546 0.524 0.532

Training tokens: 23.6B for this model, about 6T for Gemma 3 270M and about 4T for SmolLM2-360M. The six-task average has a standard error of about ±0.4 points. MMLU and ARC-Challenge are at or near chance (25%).

Held-out bits per byte on our corpus's held-out split: 0.9963 (Gemma 3 270M 1.101, SmolLM2-360M 1.167, Qwen3.5-0.8B 0.982 on the same text; the split comes from our own training distribution, and the baselines may have trained on these public documents, so read it as a sanity check, not a ranking).

Limitations and risks

  • A 256M base model: it is often wrong, and it states wrong things fluently. Don't use it for anything that matters.
  • No instruction tuning, no safety training, no red-teaming; it will continue any text, including harmful or offensive text, and may reproduce biases in web and book data (the public-domain books are old).
  • Half the corpus is not English, but quality is uneven across languages (Russian books score worst, at 2.57 bits per byte).
  • Evaluated on cloze accuracy and bits per byte only so far.

Citation

@misc{dwslm256m2026,
  title  = {DWSLM-256M: model card and technical report},
  author = {{DWS Research}},
  year   = {2026},
  url    = {https://research.dws.rip/llm/report}
}
Downloads last month
23
Safetensors
Model size
0.7B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Datasets used to train dwsllc/DWSLM-256M-Base

Evaluation results