Abstract
This report introduces Kolibri, an English–German Mixture-of-Experts transformer with 78.1B total parameters and 3.46B active parameters per token, released as open weights under the Apache 2.0 licence. We built Kolibri for sovereign and specialised deployment, with a particular focus on German and on regulated domains such as public administration, industry, and aerospace. To support these settings, we control the full model-development process, including data, architecture, training infrastructure, post-training, and evaluation.
We train Kolibri on 24T tokens across pre-training, mid-training, and long-context extension, with German accounting for more than 20 % of the data mix. To reach this share, we complement German datasets with more than 2T German tokens that we curate from the web with our own pipeline and generate synthetically. Post-training combines supervised fine-tuning on curated German and English data with reinforcement learning on more than 1.2M internally curated tasks, which cover reasoning, tool use, instruction following, code, and retrieval. The model activates 4.4 % of its parameters per token, and among the open models evaluated in this report, it lies on the Pareto frontier of quality and serving cost in English and German.
Kolibri builds on Kolibri Origin, an earlier iteration that validated our full pipeline at scale. Both models come from our Model Factory, which connects data, experimentation, training, evaluation, and deployment through version-controlled workflows.
Figure 1. Average English and German benchmark scores of base (top) and post-trained (bottom) models against decoded bytes of text per second and GPU, where higher and further right is better. Every model runs in its fastest configuration on eight B200 GPUs at a sequence length of 4k (base) or 16k (post-trained). Scores taken from Tables 17, 28 and 29; eval description in Section 3.3.1; plot description in Appendix A.
Introduction
Organisations in public administration, industry, and aerospace process sensitive data under regulation. For these domains, a language model has to run on infrastructure that the organisation controls, rest on training in line with European values, and serve German as well as English. In addition, the serving cost of the model limits the scale at which an organisation can deploy it.
Kolibri, which we built for these requirements, is an English–German MoE transformer with 78.1B total parameters, of which 3.46B, or 4.4 %, are active per token. The Apache 2.0 licence of the open weights permits the deploying organisation to operate the model on its own infrastructure. Among the open models we evaluate, Kolibri lies on the Pareto frontier of quality and serving cost in English and German, both as a base and as a post-trained model (Figure 1). Figure 2 shows that Kolibri scores higher than three open models on most benchmarks across Agentic, Industry, Math, Code and General Knowledge. The model processes contexts of up to 1M tokens, and users set a reasoning effort per request to trade cost and latency against answer quality.
We designed the development pipeline of Kolibri with applicable regulation, such as the EU AI Act, its General-Purpose AI Code of Practice and the General Data Protection Regulation in mind from the ground up. Our data pipeline filters against illegal, harmful, and pirated content and redacts personal data from data sources. In addition, we align the answers of the model with the values of the democratic consensus in Europe and train the model to abstain when the provided context does not support an answer.
Teams in Germany developed Kolibri end to end and train it on infrastructure in Germany and Finland. Training spans 24T tokens across pre-training, mid-training, and long-context extension, with a German share of more than 20 % and sequences of up to 256k tokens in the final stage. To reach this share, we complement German datasets with more than 2T German tokens that we curate from the web with our own pipeline and generate synthetically. Post-training combines SFT on curated German and English data with RL on more than 1.2M internally curated tasks, which cover reasoning, tool use, instruction following, code, and retrieval. The predecessor of Kolibri, Kolibri Origin, is an internal model that we used to validate the full development pipeline at scale. From Kolibri Origin to Kolibri, we scaled the data, the model size, the context length, and post-training, and we refined the architecture and the training recipe (Table 1).
The entire pipeline, from data curation through pre- and post-training to evaluation, runs in our Model Factory, which comprises the infrastructure, tooling, and development processes that connect data, experimentation, training, evaluation, and deployment. The Model Factory expresses these workflows as version-controlled code, which makes every experiment reproducible, composable, and traceable. A new model generation, an additional language, or a further specialisation thus becomes a change to this code.
The remainder of this report follows the development of Kolibri. Part 2 describes the architecture, the optimisation, the data, and the stages of pre-training, mid-training, and long-context extension, together with the experiments behind the design choices, and evaluates the base model. Post-training follows in Part 3, which covers SFT and RL and evaluates the post-trained model. Part 4 describes the Model Factory, and Part 5 summarises the results. The appendices in Part 6 give the details of the individual stages and the quality-cost analysis.
Figure 2. Post-training benchmark scores of Kolibri, Kolibri Origin and three open models in four domains, from Tables 28 and 29. Badges mark the English (EN) and German (DE) version of a benchmark; the scale runs from 0 % at the centre to 100 % at the outer ring.
| Property |
Kolibri Origin |
Kolibri |
| Size |
30.6A3B |
78.1A3B |
| Pre-training tokens |
8T |
24T |
| Supported context length |
64k tokens |
1M tokens |
Table 1. Main differences between Kolibri Origin, an internal model that is not released, and Kolibri. Active parameters exclude the embeddings. Table 2 lists the full architecture of both models.
Pre-Training
This part covers the three stages that produce the Kolibri base model: pre-training, mid-training and long-context extension.
After pre-training for 20T tokens at a 16k context length on data from nine domains (Section 2.3), mid-training continues for 3.4T tokens at a context length of 64k tokens, on a mix drawn mostly from curated datasets rather than from web text (Section 2.3.3). The long-context extension then adds 200B training tokens at 256k token context length (Section 2.3.4). Figure 3 shows the training loss throughout pre-training.
Every stage was scaled with respect to Kolibri Origin, which pre-trained on 7.5T tokens at a context of 4k tokens, mid-trained on 122B tokens at 8k and extended the context on 96B tokens at 64k. Kolibri trains on about three times as many tokens in total, at four times the maximum context. Mid-training grows the most, by a factor of about 28.
We start by describing the model architecture and how we run the pre-training in Sections 2.1 and 2.1.6, followed by our specific optimisation settings in Section 2.2. Section 2.3 describes the pre-training data: the Common Crawl pipeline, the mixing of the data sources, PII redaction and decontamination. Sections 2.3.3 and 2.3.4 describe the data of the two later stages and the ablations that selected their mixes. Section 2.4 defines the evaluation suite that the ablations of the following sections report scores on and describes the benchmark scores of the resulting base model.
2.1 Model Architecture
Kolibri is a decoder-only causal Transformer (Vaswani et al. 2017) with hybrid attention, which interleaves SWA and full-attention blocks, and sparse MoE layers of FFNs (Shazeer et al. 2017). It has 78.1B total parameters and 3.46B active parameters per token. Therefore, each token uses 4.4 % of the parameters, keeping the computation per token small at a large total capacity (Section 2.1.4). Figure 4 shows one block and Table 2 lists its dimensions. Each block uses sandwich normalisation (M. Ding et al. 2021; V. Singh et al. 2026), applying RMS normalisation (B. Zhang and Sennrich 2019) before and after both the attention and MoE layers.
The tokeniser vocabulary of 128 000 tokens is trained with UniBPE (Section 2.1.2), which builds merges bottom-up like BPE but selects each merge by Unigram loss. Compared with the GPT-5 tokeniser, it places more token boundaries on morpheme boundaries, in German 65 % against 47 %, and needs 11.2 % fewer tokens on German web text.
Attention uses GQA (Ainslie et al. 2023) with 48 query heads, 4 KV heads and head dimension 128. The blocks combine SWA and full attention at a 4:1 ratio: every fifth block uses full attention, and the other blocks use SWA (Beltagy, Peters, and Cohan 2020) over the 512 preceding tokens. Positional information is injected only in the SWA blocks using RoPE (Jianlin Su et al. 2024) with θ = 10 000. The full-attention blocks use no positional encoding. Queries and keys are normalised per head with RMS normalisation (Henry et al. 2020) before RoPE. Section 2.1.3 compares the hybrid attention pattern with full attention, selects the window size and gives the reasons for the positional encoding and QK normalisation.
Every MoE layer routes each token to 6 of 384 routed experts and also evaluates one shared expert (Dai et al. 2024). The experts are SiLU-gated FFNs (Shazeer 2020). The total parameter count follows from the sparsity sweep of Section 2.1.4. The routing scores are sigmoids of the router logits (DeepSeek-AI 2024b), but are not renormalised after top-k selection. Expert loads are balanced with Exact Quantile Balancing (EQB) and Load-Error Injection (LEI) (Neitemeier et al. 2026) (Section 2.1.5).
Kolibri Origin has a simpler architecture (Table 2), in which every block uses full attention with RoPE, the first two blocks are dense, and each MoE layer routes a token to 8 of 128 experts. It is less sparse, with 10.7 % of its parameters active per token against 4.4 % for Kolibri. Its expert loads are balanced with the combination of Soft-Clamped Momentum Expert Bias Updates (SMEBU) (V. Singh et al. 2026) expert-bias updates and a GShard-style auxiliary loss (Lepikhin et al. 2021).
| Property |
Kolibri |
Kolibri Origin |
| Transformer blocks |
50 |
50 |
| Leading dense layers |
0 |
2 |
| Full attention / SWA blocks |
10 / 40 |
50 / 0 |
| SWA window size |
512 preceding tokens |
— |
| Model width |
2560 |
2048 |
| Vocabulary |
128 000 |
96 000 |
| Attention heads / KV heads |
48 / 4 |
32 / 4 |
| Attention head dimension |
128 |
128 |
| Dense FFN hidden dimension |
— |
6144 |
| Routed experts per MoE layer |
384 |
128 |
| Experts per token |
6 routed and 1 shared |
8 routed and 1 shared |
| Routed-expert hidden dimension |
512 |
768 |
| Total parameters |
78.1B |
30.6B |
| Active parameters per token |
3.46B |
3.27B |
| Trained maximum context |
256k tokens |
64k tokens |
Table 2. Architecture of Kolibri and, for comparison, Kolibri Origin. Active parameters exclude the embeddings.
2.1.1 Ablation Methodology
We compare recipe choices through controlled proxy-scale ablations before validating at larger scale. Each study specifies its resource-matching criteria, training budget and evaluation stage, with checkpoints compared at a common training horizon.
Proxy Models
We run ablations on two smaller proxy models: versions of Kolibri which share the main architectural choices but fewer parameters (Table 3). Both proxy models differ in width and have fewer routed experts per layer at a lower dimension compared to the target Kolibri. The proxy at scale M has 0.6B active out of 7.8B total parameters trained on 97.6B tokens. The proxy at scale L has 2.1B active out of 30.6B total parameters trained on 327.6B tokens.
| Scale |
M |
L |
Target (Kolibri) |
| Transformer blocks |
50 |
50 |
50 |
| Model width |
1024 |
2048 |
2560 |
| Attention heads / KV heads |
16 / 2 |
32 / 4 |
48 / 4 |
| Routed experts per layer |
256 |
256 |
384 |
| Routed experts per token |
6 |
6 |
6 |
| Routed-expert hidden dimension |
192 |
384 |
512 |
| Total parameters |
7.8B |
30.6B |
78.1B |
| Active parameters per token |
0.6B |
2.1B |
3.46B |
| Pre-training tokens (steps) |
97.6B (10 342) |
327.6B (13 016) |
20T |
| Long-context tokens (steps) |
5B (299) |
15B (448) |
200B |
Table 3. Scale M and L proxy models, used for ablation studies next to the target configuration of Kolibri (Table 2). Tokens are the pre-training horizon of each scale, in batches of 576 (M) and 1536 (L) sequences of 16k tokens.
Evaluation
We evaluate every candidate change along three axes: modelling quality, stability in the attention and MoE layers, and efficiency, both in training and decode during inference. To assess modelling quality, we use validation loss and a suite of benchmarks, which are described in Section 2.4.1. Because we broadened the evaluation suite as the model was developed, aggregates are not directly comparable across studies. To ablate the impact on long-context performance, some studies applied a shortened long-context phase directly after pre-training.
Learning-Rate Selection
Architectural changes can shift the optimal learning rate, so using only the scaling-law prediction can confound shape quality with a suboptimal learning rate. For model-shape sweeps, we tune learning rates at the smallest ablation scale using η ∈ {η0/√2, η0, √2η0}, where η0 is the predicted learning rate.
2.1.2 Tokeniser
We designed the Kolibri tokeniser to capture the specificity of the German language, without compromising on English efficiency and downstream model performance.
The model uses a vocabulary of 128 000 tokens, up from 96 000 tokens used by Kolibri Origin. We train both Kolibri tokenisers with UniBPE, a new hybrid tokeniser training method: it keeps the greedy bottom-up approach of BPE (Gage 1994; Sennrich, Haddow, and Birch 2016) and scores merges with the Unigram loss objective (Kudo 2018).
UniBPE Merge Score
A tokeniser state assigns every token t a count ct over the training corpus, with N = ∑t ct tokens in total. The Unigram model puts probability ct/N on t, and the negative log-likelihood of the corpus under it is
L = −∑t ct log(ct/N) = h(N) − ∑t h(ct), h(x) = x log x, h(0) = 0. (1)
This is the quantity Unigram tokenisers minimise top-down by pruning tokens. UniBPE minimises it bottom-up: at each step it applies the merge that lowers L the most, and otherwise runs exactly like BPE, producing an ordinary vocabulary and merge list.
Merging the pair (a, b) into a new token ab, where the pair occurs cab times, moves cab counts out of a and out of b, creates a token with count cab, and shortens the corpus by cab tokens. Every other count is untouched, so for a ≠ b the change of the loss
∆L = h(ca) − h(ca − cab) + h(cb) − h(cb − cab) − h(cab) + h(N − cab) − h(N). (2)
is closed-form. BPE ranks candidates by cab alone; UniBPE ranks them by ∆L, the most negative first. Both only need the pair count and the two parent counts, so no new information is required over BPE.
Training
We train the tokeniser on a shuffled 100 GB slice of the pre-training dataset (Section 2.3) without Unicode normalisation. For pre-tokenisation we adapt the GPT4 pre-tokeniser (OpenAI 2023), changing the regex to split every digit into its own token. The tokeniser has byte fallback, starting with 256 byte tokens. The next 120 000 − 256 = 119 744 merges use the UniBPE algorithm, standard BPE performs the next 7900 merges, and we then add 100 reserved and special tokens, for a total vocabulary of 128 000 tokens. The second stage of standard BPE has two purposes. First, some useful merges are difficult under UniBPE, such as .., preventing ... from being a single token. Second, Kolibri Origin used a pure UniBPE algorithm, leading to degraded compression. This hybrid approach matches the compression of standard BPE in our experiments.
Compression
On German text, the Kolibri tokeniser reaches 4.90 bytes per token, the highest compression across twelve evaluated tokenisers in Figure 5, with the best of the nine other tokenisers being 4.35 for GPT-5, and is on par with BPE trained on the same pre-training corpus. On English, Kolibri reaches 4.58 bytes per token, against 4.67 for GPT-5, the best tokeniser on English. This lowers the cost of training on and serving German text, and leads to shorter context lengths in long-context tasks while staying competitive in English.
Morphology
UniBPE consistently improves on morphological alignment compared to plain BPE. In the first 60 merges each performs on the pre-training dataset, UniBPE creates the units of three or more letters ing, the, ion, tion, for, and, ation, pro, that, con, ent, ment, with, ther and the German und, ung, ver, and the German characters ü, ä, ö, ß. BPE has no German units or characters, and only five units of three or more letters, the, ing, ion, ent and and by merge 60.
We quantify this morphological alignment in Appendix B.1.1. Kolibri creates splits at morpheme boundaries with a precision of 65 % in German and 50 % in English, compared to 49 % and 42 % respectively for the best of the external tokenisers.
Downstream Model Performance
We ran a Kolibri tokeniser vs BPE ablation at scale M (see Table 3). For both training runs, Figure 6 compares the Bits per Byte (BPB) after pre-training and the recall on two retrieval tasks after the long-context stage. Both runs reach the same BPB in English and German, so the two tokenisers are matched in language-modelling quality, while the Kolibri tokeniser improves recall on long-context Variable Tracking (VT) and KV retrieval at every length.
2.1.3 Hybrid Sliding-Window Attention
One target of Kolibri is to improve long-context inference efficiency compared to Kolibri Origin which uses full attention in every block: each token attends to all preceding tokens, so the compute grows quadratically with the sequence length in all layers. During inference, the KV cache grows linearly with the sequence length, leading to increased memory usage and computational cost. A mitigation is to use a hybrid of full attention and SWA (Beltagy, Peters, and Cohan 2020) layers, which restrict attention to a fixed-size window of preceding tokens, reducing both memory usage and computational cost. We integrate SWA into Kolibri, increasing long-context inference efficiency and benchmark performance.
Hybrid Attention
Kolibri uses full attention in every fifth block (10 of 50) and SWA in the other 40. First experiments at proxy scale M (Table 3) showed improvements in long-context tasks without a loss on pre-training benchmarks. At matched training compute, the hybrid model supports sequences four times as long as the full-attention model. Moreover, the hybrid model is generally more efficient during inference.
Positional Encoding
The SWA blocks apply RoPE (Jianlin Su et al. 2024) with base θ = 10 000 to queries and keys; the full-attention blocks use No Positional Encoding (NoPE). In early experiments, removing RoPE from the full-attention blocks improved long-context performance, in line with B. Yang et al. (2025).
QK Normalisation
Every block normalises queries and keys per head with RMS normalisation before RoPE (Henry et al. 2020; B. Zhang and Sennrich 2019) which bounds the attention logits and keeps training stable at higher learning rates. We refer to Appendix B.2 for an analysis of QK normalisation effects. During RL, assuming sufficiently small gain parameters, the QK normalisation also bounds every query and key element below the FP8 range, so the FP8 KV cache cannot overflow (Appendix I.4.1).
2.1.3.1 Window Size
We select the window size w∗ ∈ {128, 256, . . . , 4096} by running ablations at scale M and validating the best two variants at scale L (Table 3).
After the pre-training stage, we add a long-context stage of 5B tokens on sequences of 256k tokens. We evaluate the pre-training benchmarks at the last pre-training checkpoint and the long-context benchmarks after the long-context stage. Across windows, we approximately match total FLOPs, KV-cache size and parameter count (Table 4).
Ablations at Scale M
We select the window for long-context score and inference efficiency, and also compare the scores on the pre-training benchmarks.
Table 4 also reports the average accuracy and BPB of our pre-training benchmarks at the last pre-training checkpoint. While the scores are generally similar across window sizes, the configuration with window size 256 achieves the highest scores.
Figure 8 shows the pooled long-context score for each window size configuration depending on the context length. At scale M, w = 128 yields the highest pooled score and leads from 8k to 64k tokens, but degrades at context length 128k. w = 512 follows closely and degrades the least with context length.
Validation at Scale L
Based on the ablations at scale M, we validate w = 128 and w = 512 at scale L (Table 3). Figure 8 also reports the pooled long-context score for these models. Their average accuracies on the pre-training benchmarks are 48.0 % for w = 128 and 47.8 % for w = 512, while their pooled long-context scores are 76.2 % and 77.1 %. Through 128k tokens, the two windows are generally close, with the largest absolute difference being 3.1 percentage points. At context length 256k, however, w = 512 scores 6.7 percentage points higher than w = 128.
We therefore use a sliding window of w = 512 in Kolibri, at the cost of 0.2 pp of accuracy on the pre-training benchmarks.
2.1.4 Scaling Sparsity
Sparse MoE architectures are able to increase model capacity at matched compute by routing each token through a subset of experts. We measure their sparsity as the share of the parameters that is active for a token. At fixed expert width and routing top-k, adding experts increases the total parameter count while leaving the number of FLOPs per token approximately unchanged. A larger total parameter count increases parameter storage, communication volume and optimiser states, and makes expert balance harder to maintain. Downstream performance, however, improves substantially with total capacity (A. Clark et al. 2022; Frantar et al. 2024; Ludziejewski et al. 2024; Abnar et al. 2025; Tian, K. Chen, et al. 2025; Kimi Team 2025), a trend we confirm in our own ablations. We compare configurations of different sparsity by their quality, inference efficiency and deployment cost.
Quality
We vary sparsity by increasing the number of routed experts from 128 to 256 and 384 at 3.4B active parameters, which gives 42.1B, 82.3B and 122.6B total parameters.
Moving from 42.1B to 82.3B improves loss and aggregate eval accuracy. The 122.6B configuration improves loss and aggregate eval accuracy only slightly further. The load balancing of Section 2.1.5 keeps the expert loads well balanced in all three configurations, including the 122.6B one. A preliminary sweep at 0.9B active parameters shows the same ordering. Appendix B.4 shows the loss and accuracy of both sweeps and the deployment footprint of each configuration.
Inference Efficiency
We focus on the inference regime that is most interesting for the RL phase, where most of the runtime is spent decoding rollouts. We therefore compare the configurations by their decode throughput: the tokens generated per second, summed over all concurrent requests. Since the decode phase is mainly memory-bound, increasing total parameters can increase inference cost through greater parameter storage and weight movement, as well as additional communication overhead. To capture these effects, we measure this throughput for the three configurations with 3.4B active parameters on 8 H100 SXM5 GPUs in BF16, using for each model and context length the best tensor-, data- and expert-parallel configuration identified through a combinatorial search.
The main sources of memory traffic are the active model weights and the KV cache. Weight reads increase with the total parameter count, although they can be amortised across tokens routed to the same experts within a large batch. KV-cache reads, by contrast, remain specific to each request and grow with its live context. At 4K context length, where weight reads account for a larger share of memory traffic, the 82.3B and 122.6B configurations are 13 % and 32 % slower than the 42.1B configuration. At 256k, the gaps narrow to 4 % and 12 % as KV-cache reads account for a larger share of total memory traffic. Most of this long-context traffic comes from the 10 full-attention layers, while the 40 sliding-window layers read a fixed window and contribute negligibly.
Deployment Footprint
In resource-constrained deployments, total parameter count directly reduces the memory available for activations and KV cache, limiting request concurrency at long context lengths (Table 31). For example, on two H100s, the 122.6B configuration fits only 3 concurrent 256k-token requests, compared with 18 for 82.3B.
The 82.3B configuration improves all reported quality metrics over 42.1B, while increasing capacity to 122.6B yields only a small further improvement, reduces decode throughput and fits far fewer long requests. We therefore target 80B total parameters at 3.4B active parameters. With the total size fixed, further ablations set the number and width of the experts and the other shape parameters. Appendix B.5.1 compares three expert configurations at this size. Informed by a preliminary sweep at 0.9B active parameters, we choose to widen the residual stream (Appendix B.5.2).
2.1.5 MoE Load Balancing
An MoE layer combines a shared expert, evaluated for every token, with E routed experts, of which only K are selected per token. For T tokens and E routed experts, each MoE layer computes router logits Z ∈ Rᵀˣᴱ. Expert biases β ∈ Rᴱ are added to the router logits Z to produce the biased logits B used for balanced expert selection:
B = Z + 1Tβ⊤,
It = Top-K(Bt,:, K),
St,e = sigmoid(Zt,e). (3)
Here Bt,: denotes the row of the biased logits for token t, and S denotes the routing scores that weight the outputs of the selected experts; 1T is the all-ones column vector, and Top-K(x, K) returns the indices of the K largest entries.
For an input representation xt, the layer output is
yt = fshared(xt) + ∑e∈It St,e fe(xt). (4)
The selected scores are not renormalised, and the biases affect selection only; the mixture weights use the unbiased sigmoid scores.
Load balancing ensures sufficient learning signal for every expert and efficient expert-parallel execution. The former requires balance across the global optimiser-step batch; the latter requires balance within each local microbatch. For either batch B, we measure the maximum relative excess load by MaxVio:
MaxVio(B) = maxe [ ce(B) / (K|B|/E) − 1 ]. (5)
where ce(B) counts the tokens assigned to expert e.
Balancing methods include auxiliary losses (Lepikhin et al. 2021) and expert-bias updates, either with a fixed step (DeepSeek-AI 2024b) or based on quantiles (Kimi Team 2026b).
Kolibri combines Exact Quantile Balancing (EQB) for global balance with Load-Error Injection (LEI) for local balance (Neitemeier et al. 2026). EQB maintains stable global load balance without a tunable balancing hyperparameter. The LEI coefficient therefore primarily controls local balance and training efficiency, giving the recipe fewer and less sensitive hyperparameter choices than the recipe of Kolibri Origin, which combines SMEBU bias updates (V. Singh et al. 2026) with a GShard-style auxiliary loss (Lepikhin et al. 2021).
Over the Kolibri pre-training run, the global MaxVio averaged over layers stays at 0.31. Only the first two layers, whose routing the bias overrides (Section 2.1.5.3), reach 2.39 on average.
2.1.5.1 Exact Quantile Balancing (EQB)
Quantile Balancing (QB) (Kimi Team 2026b) computes token biases α ∈ Rᵀ and expert biases β through alternating quantile updates:
αt ← −QK(Zt,: + β⊤),
βe ← −Qr(Z:,e + α),
r = TK/E, (6)
where Qm denotes the (m + 1)th largest entry. Subtracting this cutoff leaves m positive entries, so the token bias update targets K assignments per token and the expert bias update r assignments per expert.
Training performs one token-bias update followed by one expert-bias update per optimiser step. The resulting expert biases β are centred by subtracting their mean and we use the top-K of the biased logits for routing. Using top-K per token approximates the token biases computed by the first step of the QB iteration during training and inference.
The global batch is partitioned across data-parallel ranks and gradient-accumulation microbatches. Each rank holds the router scores Zt,: for all experts for its local tokens, together with the shared expert biases β. The token bias αt can therefore be computed locally from Zt,: + β⊤. Updating an expert bias βe, however, requires a quantile of Z:,e + α across all tokens in the global batch. These values are distributed across ranks and microbatches, so their statistics must be combined.
Marin (Dial 2026) averages quantiles computed separately on each rank, which generally differs from the quantile of the combined batch. Kimi (Kimi Team 2026b) accumulates a 1000-bin histogram per expert over local microbatches and sums the counts across ranks with an all-reduce. The resulting histogram represents the global batch, but its quantile estimate is limited by the bin width.
EQB (Neitemeier et al. 2026) computes this global quantile exactly for bfloat16 adjusted logits using two-pass radix selection (Yifei Li et al. 2024). Each rank encodes its local values as order-preserving 16 bit keys. In the first pass, we build 256-bin histograms over the high byte and sum the counts across microbatches to locate the bin containing the global quantile. In the second pass, we repeat this for the histogram of the low byte of values in that bin to recover the exact quantile. Each layer requires two all-reduces of 256E int32 counts per optimiser step, independent of T.
2.1.5.2 Load-Error Injection (LEI)
A shared global bias cannot balance all microbatches individually. A GShard-style auxiliary loss is a common choice for local balancing, originally formulated for normalised softmax probabilities (Lepikhin et al. 2021). With sigmoid scores, models such as DeepSeek-V3 and Arcee Trinity add a separate normalisation for this loss (DeepSeek-AI 2024b; V. Singh et al. 2026). We introduce LEI to balance each microbatch, which directly injects each expert’s deviation from its target into the score gradients. Neitemeier et al. (2026, App. D) derive the LEI update as the straight-through estimate for unnormalised sigmoid scores, while the GShard loss is the corresponding estimate for normalised softmax probabilities.
For a local microbatch Bl, with ce(Bl) assignments to expert e, the relative load and relative load error are
fe = ce(Bl) / (K|Bl|/E),
ρe = fe − 1. (7)
We inject a rescaled version of the load-error vector into the sigmoid-score gradient of every token in the microbatch:
Gt,e ← Gt,e + λ tanh(ξ)/ξ ρe,
ξ = ‖ρ‖∞/τ,
t ∈ Bl. (8)
Here Gt,e is the incoming gradient with respect to St,e, λ > 0 controls the correction strength, and τ > 0 bounds the rescaled load error, which we found to help training stability. At ξ = 0, the scaling factor is 1 by continuity. Kolibri uses λ = 1 × 10−5 and τ = 1.
2.1.5.3 Leading Dense Layers
Unlike Kolibri Origin, which has dense FFNs in its first two blocks, Kolibri uses MoE layers in all 50 blocks. This is motivated by an ablation of the Kolibri architecture over the 327.6B-token budget of scale L that found slightly lower loss and BPB and higher accuracy when replacing leading dense blocks with MoE layers.
Diagnostics of the full Kolibri run, however, show that while the expert loads are balanced, its first two MoE layers make almost no use of their routed experts. Appendix B.6 gives the routing diagnostics of the full run and an analysis of the first two MoE layers.
2.1.6 Infrastructure
Pre-training ran on 768 NVIDIA B200 GPUs, across 96 nodes with 8 GPUs per node. The cluster has an NVIDIA SuperPOD™ topology. Within each node, the GPUs share an NVLink™ Generation 5 interconnect with 1.8 TB s−1 bidirectional bitrate. The nodes are connected via InfiniBand by 8 NVIDIA ConnectX-7® network adapters per node, so each GPU can sustain a cross-node bidirectional bitrate of 100 GB s−1.
Our parallelism setup for pre-training is EP 8, FSDP 16, DP 6. With this, we make use of the hierarchical interconnect in pre-training: Expert parallel across the 8 GPUs within each node and (fully-sharded) data parallel across nodes. Thus, dense parameters are sharded across EP × FSDP = 128 GPUs (one full replica), while sparse expert parameters are sharded across FSDP = 16 GPUs—the same local GPU on each node in one full replica. Mid-training and long-context extension use FSDP 128, DP 6.
We leverage several existing libraries, namely PyTorch 2.14 (Ansel et al. 2024), DeepEP v2 (C. Zhao et al. 2025) for expert parallelism, and FlashAttention 4 (Zadouri et al. 2026) for both SWA and full attention computations. Ablations without EP use SonicMoE (W. Guo et al. 2025) as an efficient MoE implementation.
For further details, see Appendix B.7, including Appendix B.7.1 on straggler detection.
2.2 Optimisation
Kolibri is trained with a Warmup-Stable-Merge (WSM) recipe (Tian, J. Wang, et al. 2025). The learning rate warms up linearly over the first 100B tokens and then stays constant through pre-training, mid-training and long-context training. In our experiments, a constant learning rate with checkpoint merging improves post-trained performance over a learning-rate cooldown (Maskey et al. 2026). Each stage (except pre-training) continues with the optimiser state after finishing the previous one and therefore needs no further warmup. We then determine the base model weights as the average of the last 20 checkpoints of the long-context stage (Yunshui Li et al. 2025), which are 10B tokens apart. Over the three stages the context length grows from 16k to 256k tokens and the token batch from 75.5M to 201M tokens per step.
The architecture improvements, particularly the hybrid of sliding-window and full attention, enable longer training sequences than in Kolibri Origin, which pre-trains at 4k tokens and reaches 64k tokens only in its long-context stage (Sections 2.1 and 2.1.3.1). Sequences are assembled online from a Random Sequential Document Buffer (RSDB) (V. Singh et al. 2026), which spreads the chunks of a long document over many optimiser steps, by bin packing these chunks without padding tokens or unnecessary document cuts (Appendices C.1, C.1.1 and C.1.2).
We optimise attention and expert weights with Muon (Jordan et al. 2024), embedding weights and norm scales with Adam (Kingma and Ba 2015), and LM head and router weights with AdamW (Loshchilov and Hutter 2019). In contrast to the commonly used convention of matching Muon’s update RMS to that of AdamW (Jingyuan Liu et al. 2025; Kimi Team 2025), we adopt the spectral convention (Bernstein 2025), which keeps the Muon learning rate independent of model width. We use decoupled weight decay for all optimiser groups except the embedding and norm scales. Adam and AdamW use ϵ = 1 × 10−15, small enough that the updates of parameters with small gradients, such as the LM head and the routers, stay independent of the gradient scale, as Muon updates are by construction.
| Optimiser |
Peak learning rate |
Weight decay |
Parameters |
Initialisation |
| Muon, spectral |
1 × 10−3 |
2−12 |
Q, K, V; expert up and gate |
std 1/√din |
|
|
|
Attention output; expert down |
zero |
| AdamW |
2.5 × 10−5 |
2−12 |
Router gates |
std 1/din |
|
|
|
LM head |
zero |
| Adam |
2 × 10−3 |
none |
Token embedding |
std 1 |
|
|
|
Norm scales |
1 |
|
|
|
Post-sublayer (sandwich) norm scales |
1/√L |
Table 6. Optimiser and initialisation of Kolibri by parameter group. Muon uses momentum μ = 0.95 with Nesterov and spectral scaling, which multiplies the orthogonalised update by √(dout/din); Adam and AdamW use β1 = 0.9, β2 = 0.95 and ϵ = 1 × 10−15. Decoupled weight decay multiplies the decayed weights by 1 − 2−12 in every step, independent of the learning rate. Normal initialisations are truncated at three standard deviations and rescaled to the stated standard deviation; din is the fan-in of a layer, L = 50 the number of layers, and expert biases start at zero.
2.2.1 Hyperparameter Transfer
The optimal hyperparameters depend on model size and token horizon (G. Yang, E. J. Hu, et al. 2021; McCandlish et al. 2018; Bjorck et al. 2024; Porian et al. 2024; Bergsma et al. 2025), but a sweep at the scale of the target run is infeasible. Proxy runs on smaller models and shorter horizons therefore guide the choice of hyperparameters for the full-scale run. A common approach fits scaling laws that extrapolate along both dimensions jointly (DeepSeek-AI 2024a; H. Li et al. 2025; Porian et al. 2024; Poolside 2026), which requires sweeps at many points of a 2D grid over model size and horizon. Instead, we factorise the transfer across model size and token horizon, and vary model size only through the width, at the 50 layers of the target model.
For the width transfer we use Maximal Update Parametrisation (μP) (G. Yang, E. J. Hu, et al. 2021; G. Yang, Simon, and Bernstein 2024), which makes the optimal base learning rate of every parameter group approximately width-independent, so that hyperparameters found on narrower models carry over to the full-scale model (Dey et al. 2025; Meituan LongCat Team 2025). The dependence on the token horizon can then be studied at a single narrower width. Instead of scaling laws for the optimal learning rate and batch (DeepSeek-AI 2024a; H. Li et al. 2025; Bjorck et al. 2024; Bergsma et al. 2025), we use loss extrapolation (Domhan, Springenberg, and Hutter 2015) to predict the learning-rate landscape at the target horizon and pick the best cell of a grid of Muon learning rates and batch sizes on a narrower proxy.
The remainder of this section fixes the learning-rate ratios between the parameter groups (Section 2.2.1.1), introduces the width transfer with μP (Section 2.2.1.2) and the horizon transfer by loss extrapolation (Section 2.2.1.3) for learning rate, batch size and weight decay.
2.2.1.1 Learning-Rate Ratios
We find that different parameter groups require different learning-rate scales to achieve optimal performance. To avoid an explosion of the grid in later sweeps we optimise the ratios between the learning rates of the different embedding, norm and head parameter groups as a factor of the Muon learning rate in a preliminary sweep. In internal sweeps, we find these ratios to be relatively stable across widths and token horizons, and therefore assume that they can be held fixed when transferring hyperparameters. The router learning rate is set equal to the head learning rate, based on internal ablations. The resulting production learning rates are listed in Table 6.
2.2.1.2 Transfer Across Width
While there is work on joint width and depth transfer with μP (Bordelon et al. 2023; G. Yang, D. Yu, et al. 2023; Dey et al. 2025), it is less established and introduces additional complexity, and we therefore restrict ourselves to width transfer only. We keep the number of experts and top-k fixed and scale the size of every expert, so that the routing and load-balancing dynamics of the proxy match the production model. Attention heads keep their dimension of 128 and we only scale the number of heads, as in μP (G. Yang, E. J. Hu, et al. 2021). We assume the optimal batch size to be only dependent on token horizon (H. Li et al. 2025).
As described in Section 2.2, Muon runs in the spectral convention: after the Newton–Schulz orthogonalisation the update is scaled by √(dout/din), so that every layer receives an update of unit RMS operator norm times the learning rate regardless of its shape (Bernstein 2025). This ensures that the optimisation dynamics satisfy the spectral condition (G. Yang, Simon, and Bernstein 2024), and makes the Muon learning rate width-independent. The learning rates of embedding and norm scales are width-independent as well, whereas those of the LM head and router scale with 1/d. μP also shrinks the initialisation of the output layers with width.
We initialise the LM head at the infinite-width limit of this scaling, zero, which removes the width dependence of the initial outputs and brings the optimal hyperparameters of narrow and wide models closer together (G. Yang, E. J. Hu, et al. 2021, App. D.2). The attention output and expert down projections also start at zero, so that every block starts as the identity map (Hongyi Zhang, Dauphin, and T. Ma 2019); in our ablations this converged faster and still transfers across width. The router is initialised with standard deviation 1/din (Vankadara et al. 2026).
To validate the transfer we swept the base learning rate on the proxies M and L (Table 3), where L is M scaled to twice the width, both trained for 97.6B tokens, the horizon of M, with a batch of 576 sequences of 16k tokens and with learning rates scaled according to the rules described above. They are not scaled down from the production model, since the width sweep is an earlier ablation. Results are visualised in Figure 10a, with the loss averaged over the trailing 3B tokens of each run. We see a shift of the optimal learning rate by √2, which we deem acceptable. The loss differences within a √2 learning rate factor of the optimum are less than 0.1 %.
2.2.1.3 Transfer Across Token Horizon
Transferring the optimal learning rate and batch size to a target token horizon is often done via scaling laws (DeepSeek-AI 2024a; H. Li et al. 2025; Bjorck et al. 2024; Porian et al. 2024). These necessitate a large grid of values to have enough points for a reliable power-law fit, making them expensive. Additionally, they complicate transferring other hyperparameters such as weight decay from short to long horizons, as this would combinatorially explode the grid.
For Kolibri Origin, we fit power laws to the optimal learning rate and batch size at horizons from 100B to 430B tokens and extrapolate them to its pre-training budget of 7.5T tokens. Extrapolating those laws to the Kolibri setting gives unrealistic hyperparameter predictions, motivating a method that uses the observed loss trajectories of the candidate configurations.
We employ loss extrapolation (Domhan, Springenberg, and Hutter 2015) to predict the hyperparameters with the lowest loss at longer token horizons based on the observed training dynamics at shorter horizons. This allows us to use smaller grids for the search and employ coordinate descent to tune further hyperparameters iteratively. Since the sweep uses the batch size, warmup, learning-rate schedule and data of the production run on the width-scaled proxy, it doubles as a test of the production configuration, and its runs are reused for the weight-decay sweep described below.
We use a power law with floor (Hoffmann et al. 2022) in the cumulative-learning-rate coordinate (Tissue, V. Wang, and L. Wang 2025),
L(D) = E + A(D − W/2)−α, (9)
where D is the number of tokens, W the length of the linear warmup in tokens, E the irreducible loss, and A and α the scale and exponent of the reducible part. After a linear warmup of W tokens at a constant learning rate, the cumulative learning rate is proportional to D − W/2. We validated the method on internal loss curves, not reported here, and find an average prediction error at the target token horizon below 1 %.
All tested methods are fairly sensitive to the fit start point. For the method used, we discard the first 20 % of the post-warmup prefix before fitting. We find that the optimal grid point is robust to the specific form of the power law used for extrapolation: we cross-checked with a shifted power law with floor (Domhan, Springenberg, and Hutter 2015) and a one-break broken power law (Caballero et al. 2023) and obtained the same ranking.
Learning Rate and Batch Size
We sweep a grid of Muon learning rates from 5 × 10−4 to 8 × 10−3 and two batch sizes on the width-scaled proxy model, which halves the width of the production model with the same rules as in Section 2.2.1.2, for 500B tokens. The observed loss is averaged over the trailing 2B tokens of each run and, at 500B tokens, is still lowest at the largest learning rate for both batches. The prediction at 20T tokens is visualised in Figure 10b, with an optimal Muon learning rate of 1 × 10−3 and a batch size of 4608 sequences of 16k tokens each. The selected batch is the smaller of the two, so while a further reduction in batch size might be beneficial, we prioritise maintaining training efficiency.
|
Width |
Heads / KV heads |
Expert hidden |
Experts, top-k |
Layers |
| Kolibri |
2560 |
48 / 4 |
512 |
384, 6 |
50 |
| Proxy |
1280 |
24 / 2 |
256 |
384, 6 |
50 |
Table 7. Production model and the width-scaled proxy used for the loss-extrapolation sweeps over learning rate, batch and weight decay. Layers, experts, head dimension and the attention pattern are shared.
Weight Decay
We use the same loss extrapolation to set the weight decay in a one-dimensional sweep. Starting from the selected learning rate and batch size, we vary the weight decay and compare the predicted loss at 20T tokens. The baseline cell was trained with a weight decay of 2−13. Doubling the weight decay to 2−12 lowers both the observed loss and the forecasts at every horizon, whereas halving it raises them. All estimators agree on this order, and we use 2−12 for Kolibri. Larger values were not tested.
Limitations
This optimisation is done purely with respect to the training loss under a warmup-stable learning-rate schedule. While evidence shows that a WSM schedule can lead to better post-trained performance (Maskey et al. 2026), merging and post-trained performance are not considered here. Additionally, uncertainties are not modelled and some of the differences between grid points may be within the noise level of the measurements, although all three forms of the extrapolation law select the same cell (Section 2.2.1.3). We leave modelling merged-checkpoint and post-trained performance, as well as uncertainty of the forecasts, to future iterations of the recipe.
2.3 Data and Training Stages
2.3.1 Overview
Kolibri Base is trained in three stages: pre-training, mid-training, and long-context extension. Pre-training consumes 20T tokens from a broad English-German data pool and establishes the model’s general capabilities. Mid-training shifts the data distribution towards higher-quality reasoning, mathematics, code, and instruction-following data, training on 3.4T tokens. Finally, long-context extension trains on 200B tokens and extends the context length to 256k tokens.
Across these stages, data selection progressively becomes more selective and task-oriented. Pre-training emphasises breadth and coverage, mid-training concentrates on capabilities that benefit from higher-quality and more structured data, and long-context extension adapts these capabilities to substantially longer sequences.
In addition to filtering illegal, harmful, toxic and pirated content, we redact PII from all training sources. Each category is detected by a regular expression, checked by a validator that rejects false positives, and replaced by a special token. A document whose redacted bytes exceed 15 % of its length is dropped. In one illustrative run on a mid-training data sample, 5.3 % of scanned documents received at least one redaction, with PDF data accounting for 92 % of all redactions. We report these numbers only as an example of the redaction behaviour; the sample is not representative of the overall training corpus.
The following sections describe the data construction, mixing, and evaluation choices for each stage.
2.3.2 Stage 1: Pre-training Data
The pre-training dataset pool consists of 78 English- and German-language datasets with approximately 29.3T materialised tokens, from which the final training mix consumes 20T. The pool spans web text, code, instruction data, scientific and technical text, and legal and public-sector data.
We group datasets into nine domains according to language, subject, and degree of structure. Datasets spanning several domains are assigned to the domain containing the majority of their tokens. Table 8 summarises the resulting pool.
Web data makes up the largest part of the pool. Its largest individual source comes from our internally developed CC pipeline, which processes and filters Common Crawl snapshots to produce more than 308B quality-scored documents for downstream data mixing.
German accounts for 21.3 % of the final pre-training tokens and is treated separately in the data construction process because its availability and filtering requirements differ from English.
Approximately 24 % (4.8T tokens) of our pre-training data is synthetic in origin (including rephrases and translations). We produced synthetic data in English, using our deduplicated English CC data (see Section 2.3.2.1) as seeds for rephrasing with Gemma-4-26B-A4B. We followed a Nemotron-CC-style recipe (D. Su et al. 2025), using five prompt templates applied to each seed document: diverse QA pairs, distillation, knowledge list, knowledge extraction, and encyclopedia-style rewriting. The outputs were post-processed and filtered to remove LLM-generation artefacts and erroneous generations. In Section 2.3.2.2 we describe our work on German synthetic data.
The following subsections describe key decisions around the Common Crawl (Common Crawl Foundation 2026) pipeline, the construction of the German data pool, quality annotation, and the final data-source mixing procedure in more detail.
| Domain |
Short |
Datasets |
Tokens (B) |
| English web and documents |
EN web |
23 |
12,248 |
| German web and documents |
DE web |
16 |
6,712 |
| English instruction and reasoning |
EN instr. |
7 |
3,548 |
| German instruction and reasoning |
DE instr. |
3 |
139 |
| Code |
Code |
3 |
4,323 |
| Agentic code and tool use |
Agentic |
1 |
1 |
| STEM (documents) |
STEM docs |
7 |
1,462 |
| STEM (QA-style) |
STEM QA |
9 |
789 |
| Specialized domains |
Spec. |
9 |
80 |
| Total |
|
78 |
29,301 |
Table 8. The pre-training pool by domain, in billions of materialised tokens.
2.3.2.1 Common Crawl Pipeline
The CC pipeline is designed to process Common Crawl snapshots to curate high quality pre-training data at scale. Text is extracted from the raw archives with Resiliparse (Bevendorff et al. 2018), yielding more than 308B documents.
Language-agnostic heuristic filters and language identification route each document to an English or a German branch, which apply separate thresholds. Exact deduplication removes byte-identical documents across all snapshots, which yields 21.16B distinct documents. Fuzzy deduplication, which compares MinHash signatures of documents bucketed by locality-sensitive hashing, removes a further 25.9 % as near-duplicates (Appendix D.1.3).
Substring deduplication cuts repeated blocks of at least 500 bytes, such as navigation menus and page templates, out of the remaining documents, removing 21.3 % of text bytes (Appendix D.1.4). Appendix D.1 describes the stages in more detail.
2.3.2.2 German Pre-Training Data
At our 20 T token budget, our ablations show strong German benchmark performance with around 20 % German data in the training mix. This leaves us with a lower bound of 4 T German tokens needed for training. Note that this refers to training tokens, not unique tokens. Since datasets are commonly upsampled during training, the underlying data pool can be smaller than 4 T, though not arbitrarily so, because repeating data can have diminishing returns after roughly four epochs (Muennighoff, Rush, et al. 2023).
To put the scale of this requirement into context, we first look at the amount of German pre-training data available in existing open datasets. Table 9 summarises several major open German datasets. These datasets are shown only as a reference point for the scale of publicly available German data and does not describe our training set. For further details on training data, refer to the Public Summary of Training Content.
The open datasets in the upper part of Table 9 add up to around 1.94T tokens. This token count does not account for filtering, deduplication, or overlap between datasets, so the amount of usable unique data would in practice be smaller. This comparison illustrates the challenge of sourcing German data at the scale implied by our 4T-token training target. In the following, we describe the three approaches we considered to construct our German data pool.
First, we process raw Common Crawl dumps with a pipeline that is parameterised by language, since German and English web data cannot be filtered in exactly the same way. In particular, we retune several filtering parameters for German. For example, web-data pipelines commonly remove documents with unusually long words. However, German administrative prose often contains substantially longer words than English, so applying English thresholds can disproportionately remove this register. We therefore use FineWeb2’s German word-length settings, which allow a mean word length between 0 and 15 characters, instead of the 3 to 10 character range used by Gopher for English. With these language-specific adjustments, our pipeline produces 0.8T unique tokens of organic German web data.
Our second approach to augmenting our German corpus is to rephrase German documents. We use Mistral-Nemo-Instruct-2407 to rewrite organic German documents as an encyclopedia entry, a Q&A dialogue or an educational-style passage, preserving its semantic information. This teaches the model the same facts in several surface forms and multiplies scarce organic data, and it is a different operation from translation: the source is German, so the subject matter, the institutions and the register stay German. Rephrasing gave us about 1.1T unique tokens, making it the single largest source of German in the model. This data had already been produced for the Aleph-Alpha-GermanWeb project (T. F. Burns et al. 2026).
The third approach is translation. Translating English into German can expand the available data when the model, prompts, and chunking are chosen carefully, but it does not provide the same kind of German data as organically sourced text. Translated output can retain traces of the source language, such as literal renderings of idioms; for example, “Drive safe!” may become “Fahre sicher!” rather than the more natural “Komm gut an!”. More importantly, translation preserves much of the source corpus’s cultural and institutional distribution. A corpus translated from English therefore remains, in many respects, an English-language view of the world expressed in German. We experimented with translated data at scale for Kolibri Origin, but for Kolibri we relied on organic and rephrased German data alongside a carefully curated set of translated German data.
One side-effect of us building our own CC pipeline is that we can incorporate new crawls as they arrive so that the resulting data pool remains up-to-date. Table 9 also lists the year from which the latest source data of each listed dataset comes from. Using our own pipeline, we can ensure that the most recent data in the pool dates from 2026.
German benchmarks are also limited in coverage and sensitivity. We therefore built a dedicated German evaluation suite, combining hand-crafted and model-generated tasks, to better measure the impact of our German data. See Section 2.4.
| Dataset |
Size (B tokens) |
Latest source data |
| Klettermix |
500 |
2024 |
| HPLT 3.0 (German slice) |
609 |
2025 |
| FinePDFs (German slice) |
177 |
2025 |
| German Commons |
154 |
2025 |
| MT-Nemotron-CC |
117 |
2024 |
| FineWeb2 (German slice) |
378 |
2024 |
| Our organic web data |
1300 |
2026 |
| Rephrased German data |
1100 |
2025 |
Table 9. Sizes of selected German pre-training data sources in billions of tokens to illustrate German dataset scale. Note that this table does not describe our training set.
2.3.2.3 Quality Annotation
Method
Prior works (J. Li, Fang, Smyrnis, et al. 2024; Ettinger et al. 2025) have shown that simple, single fastText classifiers (Joulin et al. 2017) trained to distinguish, e.g., SFT-style data vs. random CC samples, can be a successful method for curating CC data for quality, leading to improved model performance on evaluation benchmarks. Other works have reported methods of ensembling classifier scores in ways which appear to outperform using individual classifiers alone (D. Su et al. 2025; T. F. Burns et al. 2026). We therefore experimented with ensembling approaches and compared this with a strong single-classifier baseline.
Simultaneously, we wanted to keep in mind scalability, e.g., it could be wasteful to apply an LLM-as-a-judge to tens of billions of documents. For German, we built upon our public work introduced in GermanWeb (T. F. Burns et al. 2026) by ensembling quality and grammar fastText classifiers using an average of their scores. To score the English documents, we developed the following method.
We first scored a fixed 1M-document English sample of our curated CC data with a judge, Qwen3-32B (Qwen Team 2025a), using more than 20 prompts. Prompts include educational value, chat-likeness, encyclopedia-likeness, content versus format properties, binary ‘quality’ judgements, and benchmark usefulness (Penedo, Kydlíček, Ben Allal, et al. 2024; J. Li, Fang, Smyrnis, et al. 2024; Sachdeva et al. 2026; Wettig et al. 2024). For each prompt, the judge returns structured JSON, enforced via constrained decoding against a schema.
We noted that disagreement between judged axes was asymmetric. Low-scoring documents did so on multiple (sometimes all) prompts, whereas high-scoring documents scored well on some prompts but not others. This implies that the properties by which documents were judged as ‘good’ were more distinctive than the absence of those properties. Document-level Spearman correlations among the judge scores was also structured into groups of highly-correlated scores, e.g., content versus format, conversational, maths, code, and evaluation- or task-usefulness.
To score the rest of the crawl, we distil each scalar judgement axis into a binary task (top quartile versus bottom quartile, discarding the middle two) and train three families of classifiers: fastText (Joulin et al. 2017), a frozen Luxical-one embedding (Datolog