<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Writing — Tobias Falke</title><link>https://tobiasfalke.com/blog/</link><description>Writing — Tobias Falke</description><language>en-us</language><lastBuildDate>Fri, 02 Oct 2026 22:03:29 +0000</lastBuildDate><atom:link href="https://tobiasfalke.com/blog/feed.xml" rel="self" type="application/rss+xml"/><item><title>MoEs Over Time: What Changed And How Much Does it Matter?</title><link>https://tobiasfalke.com/blog/moe-uplift-history/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://tobiasfalke.com/blog/moe-uplift-history/</guid><description>&lt;p&gt;After having spent the majority of my work from 2023 to 2026 on pretraining MoE models, I&amp;rsquo;ve always wanted to look back and write down how the field evolved over that period and which changes ended up actually making a difference.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; That&amp;rsquo;s what this post is about. Today&amp;rsquo;s LLMs, especially the largest frontier models, are almost exclusively sparse MoE models. And while the idea of MoEs has been around for quite some time, it took a while for the field to arrive at this state. I will revisit the seminal papers and model releases that created that shift from dense to sparse.&lt;/p&gt;
&lt;p&gt;But more importantly, I will also try to quantify the benefit that MoEs brought. The &lt;a href="https://tobiasfalke.com/blog/moe-intro-flops/"&gt;first post&lt;/a&gt; of this series discussed the central promise of sparse MoE models, getting the quality of a larger model for the training and inference cost of a smaller model (and the fine print that comes with that promise). I will refer to that here as the &lt;strong&gt;uplift&lt;/strong&gt;: Given an MoE with $N_{a}$ active and $N_{t}$ total parameters, the model will show quality comparable to a dense model sized somewhere between those two; we&amp;rsquo;ll refer to that size as the effective size $N_{eff}$. The uplift factor is then defined as
$$uplift = \frac{ N_{eff} }{ N_{a} }$$
expressing how much better the MoE is than a dense model with matched active parameters. To illustrate that metric: An uplift factor of 2.5 at sparsity 4% means an MoE with 10B active parameters (and 250B total) would be as good as a dense model with 25B parameters.&lt;/p&gt;
&lt;p&gt;That uplift of course depends on the sparsity of the MoE. The sparser it is, the further the quality can increase beyond the active parameters, at the price of having to handle the total parameters. In this post, I will denote sparsity as &lt;em&gt;activation ratio&lt;/em&gt; $N_{a} / N_{t}$, so lower means sparser. If we keep the sparsity fixed, uplift becomes a function of how well an MoE is trained to make the most out of the total parameters, which comes down to the MoE architecture and the training recipe. And how these developed over time is what this post is about.&lt;/p&gt;
&lt;h2 id="a-brief-history-of-moes"&gt;A brief history of MoEs&lt;/h2&gt;
&lt;figure&gt;&lt;svg aria-label="Timeline of MoE models and papers from 2020 to 2026, in three eras" class="moe-chart" viewBox="0 0 700 258" xmlns="http://www.w3.org/2000/svg" role="img"&gt;
&lt;style&gt;.moe-chart{font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}.moe-chart .axis{stroke:var(--border,#e5e7eb);stroke-width:1.2}.moe-chart .dot{fill:currentColor;stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .dotu{fill:var(--bg,#fff);stroke:currentColor;stroke-width:1.6}.moe-chart .slabel{fill:currentColor;font-size:12.5px}.moe-chart .grid{stroke:var(--border,#e5e7eb);stroke-width:1}.moe-chart .tick{fill:var(--text-muted,#6b7280);font-size:13px}.moe-chart .atitle{fill:var(--text,#1a1a1a);font-size:14px}.moe-chart .series{fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .ref{fill:none;stroke:var(--text-light,#9ca3af);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .refdot{fill:var(--text-light,#9ca3af);stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .hit{fill:transparent;stroke:none;pointer-events:all;cursor:crosshair}.moe-chart .leader{stroke:currentColor;stroke-width:1;opacity:.55}.moe-chart .reflabel{fill:var(--text-muted,#6b7280);font-size:12.5px}.moe-chart .yr{fill:var(--text-muted,#6b7280);font-size:12px}.moe-chart .yrtick{stroke:var(--border,#e5e7eb);stroke-width:1}.moe-chart .era{fill:currentColor;font-size:13px;font-weight:600}.moe-chart .erarule{stroke:currentColor;stroke-width:2;opacity:.45;stroke-linecap:round}.moe-chart .e0{color:#5f9bd9}.moe-chart .e1{color:#2c6fbb}.moe-chart .e2{color:#1d4880}@media (prefers-color-scheme:dark){.moe-chart .e0{color:#cfe1f5}.moe-chart .e1{color:#93bce6}.moe-chart .e2{color:#5b93d0}}&lt;/style&gt;
&lt;g class="e0"&gt;
&lt;line class="erarule" x1="37.0" y1="24.0" x2="177.0" y2="24.0"/&gt;
&lt;text class="era" x="37.0" y="17.0"&gt;Research era&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e1"&gt;
&lt;line class="erarule" x1="268.0" y1="24.0" x2="394.0" y2="24.0"/&gt;
&lt;text class="era" x="268.0" y="17.0"&gt;ChatGPT/Llama era&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e2"&gt;
&lt;line class="erarule" x1="415.0" y1="24.0" x2="562.0" y2="24.0"/&gt;
&lt;text class="era" x="415.0" y="17.0"&gt;DeepSeek-V3 era&lt;/text&gt;
&lt;/g&gt;
&lt;line class="axis" x1="0" y1="230" x2="575.9" y2="230"/&gt;
&lt;line class="yrtick" x1="2.0" y1="230" x2="2.0" y2="235"/&gt;
&lt;text class="yr" x="2.0" y="248" text-anchor="start"&gt;2020&lt;/text&gt;
&lt;line class="yrtick" x1="86.0" y1="230" x2="86.0" y2="235"/&gt;
&lt;text class="yr" x="86.0" y="248" text-anchor="middle"&gt;2021&lt;/text&gt;
&lt;line class="yrtick" x1="170.0" y1="230" x2="170.0" y2="235"/&gt;
&lt;text class="yr" x="170.0" y="248" text-anchor="middle"&gt;2022&lt;/text&gt;
&lt;line class="yrtick" x1="254.0" y1="230" x2="254.0" y2="235"/&gt;
&lt;text class="yr" x="254.0" y="248" text-anchor="middle"&gt;2023&lt;/text&gt;
&lt;line class="yrtick" x1="338.0" y1="230" x2="338.0" y2="235"/&gt;
&lt;text class="yr" x="338.0" y="248" text-anchor="middle"&gt;2024&lt;/text&gt;
&lt;line class="yrtick" x1="422.0" y1="230" x2="422.0" y2="235"/&gt;
&lt;text class="yr" x="422.0" y="248" text-anchor="middle"&gt;2025&lt;/text&gt;
&lt;line class="yrtick" x1="506.0" y1="230" x2="506.0" y2="235"/&gt;
&lt;text class="yr" x="506.0" y="248" text-anchor="middle"&gt;2026&lt;/text&gt;
&lt;g class="e0"&gt;
&lt;circle class="dot" cx="37.0" cy="220.0" r="3.4"&gt;&lt;title&gt;GShard - 2020-06&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="43.0" y="224.2"&gt;GShard&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e0"&gt;
&lt;circle class="dot" cx="86.0" cy="201.0" r="3.4"&gt;&lt;title&gt;Switch - 2021-01&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="92.0" y="205.2"&gt;Switch&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e0"&gt;
&lt;circle class="dot" cx="100.0" cy="182.0" r="3.4"&gt;&lt;title&gt;BASE Layers - 2021-03&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="106.0" y="186.2"&gt;BASE Layers&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e0"&gt;
&lt;circle class="dot" cx="121.0" cy="220.0" r="3.4"&gt;&lt;title&gt;Hash Layers - 2021-06&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="127.0" y="224.2"&gt;Hash Layers&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e0"&gt;
&lt;circle class="dot" cx="163.0" cy="201.0" r="3.4"&gt;&lt;title&gt;Artetxe et al. - 2021-12&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="169.0" y="205.2"&gt;Artetxe et al.&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e0"&gt;
&lt;circle class="dot" cx="163.0" cy="163.0" r="3.4"&gt;&lt;title&gt;GLaM - 2021-12&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="169.0" y="167.2"&gt;GLaM&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e0"&gt;
&lt;circle class="dot" cx="177.0" cy="144.0" r="3.4"&gt;&lt;title&gt;Clark et al. - 2022-02&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="183.0" y="148.2"&gt;Clark et al.&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e0"&gt;
&lt;circle class="dot" cx="177.0" cy="125.0" r="3.4"&gt;&lt;title&gt;Expert Choice - 2022-02&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="183.0" y="129.2"&gt;Expert Choice&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e0"&gt;
&lt;circle class="dot" cx="177.0" cy="106.0" r="3.4"&gt;&lt;title&gt;ST-MoE - 2022-02&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="183.0" y="110.2"&gt;ST-MoE&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e1"&gt;
&lt;circle class="dotu" cx="268.0" cy="220.0" r="3.4"&gt;&lt;title&gt;GPT-4 (rumoured MoE) - 2023-03&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="274.0" y="224.2"&gt;GPT-4 (rumoured MoE)&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e1"&gt;
&lt;circle class="dot" cx="331.0" cy="201.0" r="3.4"&gt;&lt;title&gt;Mixtral - 2023-12&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="337.0" y="205.2"&gt;Mixtral&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e1"&gt;
&lt;circle class="dot" cx="338.0" cy="182.0" r="3.4"&gt;&lt;title&gt;DeepSeekMoE - 2024-01&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="344.0" y="186.2"&gt;DeepSeekMoE&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e1"&gt;
&lt;circle class="dot" cx="345.0" cy="163.0" r="3.4"&gt;&lt;title&gt;Gemini 1.5 - 2024-02&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="351.0" y="167.2"&gt;Gemini 1.5&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e1"&gt;
&lt;circle class="dot" cx="352.0" cy="144.0" r="3.4"&gt;&lt;title&gt;DBRX - 2024-03&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="358.0" y="148.2"&gt;DBRX&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e1"&gt;
&lt;circle class="dot" cx="352.0" cy="125.0" r="3.4"&gt;&lt;title&gt;Grok-1 - 2024-03&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="358.0" y="129.2"&gt;Grok-1&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e1"&gt;
&lt;circle class="dot" cx="352.0" cy="106.0" r="3.4"&gt;&lt;title&gt;Qwen1.5-MoE - 2024-03&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="358.0" y="110.2"&gt;Qwen1.5-MoE&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e1"&gt;
&lt;circle class="dot" cx="359.0" cy="87.0" r="3.4"&gt;&lt;title&gt;Snowflake Arctic - 2024-04&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="365.0" y="91.2"&gt;Snowflake Arctic&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e1"&gt;
&lt;circle class="dot" cx="366.0" cy="68.0" r="3.4"&gt;&lt;title&gt;DeepSeek-V2 - 2024-05&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="372.0" y="72.2"&gt;DeepSeek-V2&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e1"&gt;
&lt;circle class="dot" cx="394.0" cy="49.0" r="3.4"&gt;&lt;title&gt;OLMoE - 2024-09&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="400.0" y="53.2"&gt;OLMoE&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e2"&gt;
&lt;circle class="dot" cx="415.0" cy="201.0" r="3.4"&gt;&lt;title&gt;DeepSeek-V3 - 2024-12&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="421.0" y="205.2"&gt;DeepSeek-V3&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e2"&gt;
&lt;circle class="dot" cx="443.0" cy="220.0" r="3.4"&gt;&lt;title&gt;Llama 4 - 2025-04&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="449.0" y="224.2"&gt;Llama 4&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e2"&gt;
&lt;circle class="dot" cx="443.0" cy="182.0" r="3.4"&gt;&lt;title&gt;Qwen3 - 2025-04&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="449.0" y="186.2"&gt;Qwen3&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e2"&gt;
&lt;circle class="dot" cx="464.0" cy="163.0" r="3.4"&gt;&lt;title&gt;GLM-4.5 - 2025-07&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="470.0" y="167.2"&gt;GLM-4.5&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e2"&gt;
&lt;circle class="dot" cx="464.0" cy="144.0" r="3.4"&gt;&lt;title&gt;Kimi K2 - 2025-07&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="470.0" y="148.2"&gt;Kimi K2&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e2"&gt;
&lt;circle class="dot" cx="471.0" cy="125.0" r="3.4"&gt;&lt;title&gt;gpt-oss - 2025-08&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="477.0" y="129.2"&gt;gpt-oss&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e2"&gt;
&lt;circle class="dot" cx="506.0" cy="182.0" r="3.4"&gt;&lt;title&gt;LatentMoE - 2026-01&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="512.0" y="186.2"&gt;LatentMoE&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e2"&gt;
&lt;circle class="dot" cx="527.0" cy="220.0" r="3.4"&gt;&lt;title&gt;Arcee Trinity - 2026-04&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="533.0" y="224.2"&gt;Arcee Trinity&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e2"&gt;
&lt;circle class="dot" cx="527.0" cy="201.0" r="3.4"&gt;&lt;title&gt;Gemma 4 - 2026-04&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="533.0" y="205.2"&gt;Gemma 4&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e2"&gt;
&lt;circle class="dot" cx="541.0" cy="163.0" r="3.4"&gt;&lt;title&gt;MAI-Thinking-1 - 2026-06&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="547.0" y="167.2"&gt;MAI-Thinking-1&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e2"&gt;
&lt;circle class="dot" cx="548.0" cy="144.0" r="3.4"&gt;&lt;title&gt;Inkling - 2026-07&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="554.0" y="148.2"&gt;Inkling&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e2"&gt;
&lt;circle class="dot" cx="548.0" cy="125.0" r="3.4"&gt;&lt;title&gt;Kimi K3 - 2026-07&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="554.0" y="129.2"&gt;Kimi K3&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e2"&gt;
&lt;circle class="dot" cx="555.0" cy="106.0" r="3.4"&gt;&lt;title&gt;GLM-5.3-Flash - 2026-08&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="561.0" y="110.2"&gt;GLM-5.3-Flash&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e2"&gt;
&lt;circle class="dot" cx="555.0" cy="87.0" r="3.4"&gt;&lt;title&gt;Qwen3.8-Flash-Next - 2026-08&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="561.0" y="91.2"&gt;Qwen3.8-Flash-Next&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e2"&gt;
&lt;circle class="dot" cx="562.0" cy="68.0" r="3.4"&gt;&lt;title&gt;DeepSeek-V4.1-Flash - 2026-09&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="568.0" y="72.2"&gt;DeepSeek-V4.1-Flash&lt;/text&gt;
&lt;/g&gt;
&lt;g class="e2"&gt;
&lt;circle class="dot" cx="562.0" cy="49.0" r="3.4"&gt;&lt;title&gt;MiMo-V2.6-Flash - 2026-09&lt;/title&gt;&lt;/circle&gt;
&lt;text class="slabel" x="568.0" y="53.2"&gt;MiMo-V2.6-Flash&lt;/text&gt;
&lt;/g&gt;
&lt;/svg&gt;
&lt;figcaption&gt;A selection of influential MoE papers and representative MoE model releases from 2020 to today.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id="the-research-era-2017-2022"&gt;The research era (2017-2022)&lt;/h3&gt;
&lt;p&gt;Sparse MoEs as we know them today were first introduced by &lt;a href="https://arxiv.org/abs/1701.06538" target="_blank" rel="noopener noreferrer"&gt;Shazeer et al. (2017)&lt;/a&gt;, who tested the idea in LSTM-based models on language modeling and machine translation tasks, slightly predating the transformer architecture (June 2017) that would later dominate language modeling. GShard (&lt;a href="https://arxiv.org/abs/2006.16668" target="_blank" rel="noopener noreferrer"&gt;Lepikhin et al., 2020&lt;/a&gt;) adopted the idea into transformers and tested top-2 routing at various degrees of sparsity. Switch-Transformers (&lt;a href="https://arxiv.org/abs/2101.03961" target="_blank" rel="noopener noreferrer"&gt;Fedus et al., 2021&lt;/a&gt;), which became one of the most influential MoE papers of this era, simplified the setup to top-1 routing, which was previously believed to be unstable. GLaM (&lt;a href="https://arxiv.org/abs/2112.06905" target="_blank" rel="noopener noreferrer"&gt;Du et al., 2021&lt;/a&gt;) later scaled up the GShard top-2 setting and ST-MoE (&lt;a href="https://arxiv.org/abs/2202.08906" target="_blank" rel="noopener noreferrer"&gt;Zoph et al., 2022&lt;/a&gt;) discussed training stability challenges and proposed using z-loss for routers as one mitigation. Notably, all of that early fundamental work came out of Google. Concurrently, Meta (then Facebook) also contributed to the topic, introducing the linear assignment approach to token balancing in BASE layers (&lt;a href="https://arxiv.org/abs/2103.16716" target="_blank" rel="noopener noreferrer"&gt;Lewis et al., 2021&lt;/a&gt;), hash routing (&lt;a href="https://arxiv.org/abs/2106.04426" target="_blank" rel="noopener noreferrer"&gt;Roller et al., 2021&lt;/a&gt;) and thorough comparisons to dense models (&lt;a href="https://arxiv.org/abs/2112.10684" target="_blank" rel="noopener noreferrer"&gt;Artetxe et al., Dec 2021&lt;/a&gt;). Expert choice (&lt;a href="https://arxiv.org/abs/2202.09368" target="_blank" rel="noopener noreferrer"&gt;Zhou et al., 2022&lt;/a&gt;) challenged the dominant top-k routing paradigm, but it never caught on due to its difficulties with auto-regressive decoding. &lt;a href="https://arxiv.org/abs/2202.01169" target="_blank" rel="noopener noreferrer"&gt;Clark et al. (2022)&lt;/a&gt;, which I tend to cite heavily across my blog, combined much of that early work in a comprehensive scaling study of MoEs and dense models that precisely quantified the effect of sparsity. Also in this post, I will rely on it for measuring uplift.&lt;/p&gt;
&lt;p&gt;The work in these years has introduced, beyond the general concept of how to integrate sparse experts and routing into transformers, many of the core ideas and design decisions that MoEs have relied on since then: routing paradigms (token choice with top-k, expert choice, hash routing), expert parallelism, capacity factors and token dropping, MoE layer placement (e.g. every nth layer), token balancing approaches (auxiliary load balancing loss, BASE-style linear assignment, Sinkhorn approximation) and stability measures such as router z-loss. Unlike today, all of this was done purely as published research. The rise of LLMs and the regular release of such models had yet to start. Which is why I call it the research era.&lt;/p&gt;
&lt;h3 id="the-chatgpt-and-llama-era-2023-2024"&gt;The ChatGPT and Llama era (2023-2024)&lt;/h3&gt;
&lt;p&gt;In November 2022, ChatGPT was released, and language models transitioned from being a research problem to powering real-world products. Various companies started training their own LLMs and releasing them as either closed models behind APIs or as public checkpoints. And while that development somewhat reduced the willingness of companies to publish research as openly as they did before, the open-weights part of the LLM space filled that gap by providing (more or less) detailed tech reports. Meta&amp;rsquo;s Llama was the first such example. After the first open models were exclusively dense, Mixtral (&lt;a href="https://arxiv.org/abs/2401.04088" target="_blank" rel="noopener noreferrer"&gt;Jiang et al., 2024&lt;/a&gt;) in late 2023 was the first open MoE of this era, using top-2 routing over 8 experts with a Llama-inspired backbone. Right after, DeepSeek published DeepSeek-MoE (&lt;a href="https://arxiv.org/abs/2401.06066" target="_blank" rel="noopener noreferrer"&gt;Dai et al., 2024&lt;/a&gt;), which turned out to be the most influential MoE paper of this era. It introduced the key new ideas of this time, namely expert granularity and shared experts. Expert granularity, also known as fine-grained experts, replaces experts sized as FFNs in dense models, which previous work relied on, with experts smaller by a factor $G$, but at the same time increases the total number of experts as well as the number of active ones by the same factor $G$. That keeps both total and active parameters unchanged, but gives the router a much larger space to choose from, e.g. 4 out of 32 instead of 1 out of 8. Shared experts, on the other hand, are FFNs that are always selected in addition to the routed experts, hence a dense path in parallel to the MoE.&lt;/p&gt;
&lt;p&gt;Gemini 1.5 (&lt;a href="https://arxiv.org/abs/2403.05530" target="_blank" rel="noopener noreferrer"&gt;Gemini Team, 2024&lt;/a&gt;) was the first closed model publicly confirmed to be an MoE (while GPT-4 was always just rumoured to be so). Notable open MoEs in 2024, among many others, included Grok-1 (&lt;a href="https://x.ai/news/grok-os" target="_blank" rel="noopener noreferrer"&gt;xAI, 2024&lt;/a&gt;), still following Mixtral&amp;rsquo;s architecture closely, DBRX (&lt;a href="https://www.databricks.com/blog/introducing-dbrx-new-state-art-open-llm" target="_blank" rel="noopener noreferrer"&gt;Databricks, 2024&lt;/a&gt;), which was slightly more granular (2x), Snowflake Arctic (&lt;a href="https://www.snowflake.com/en/blog/engineering/arctic-open-efficient-foundation-language-models-snowflake/" target="_blank" rel="noopener noreferrer"&gt;Snowflake AI Research, 2024&lt;/a&gt;), featuring a parallel attention architecture variant, and OLMoE (&lt;a href="https://arxiv.org/abs/2409.02060" target="_blank" rel="noopener noreferrer"&gt;Muennighoff et al., 2024&lt;/a&gt;), which adopted DeepSeek&amp;rsquo;s ideas (but decided to not use shared experts) and was accompanied by a particularly detailed tech report. Another trend at the time, to produce MoEs quickly given their rising popularity, was to upcycle them from existing dense models, such as Qwen&amp;rsquo;s first MoE (&lt;a href="https://qwenlm.github.io/blog/qwen-moe/" target="_blank" rel="noopener noreferrer"&gt;Qwen Team, 2024&lt;/a&gt;). While that is obviously cheaper, it also leaves a significant part of the MoE&amp;rsquo;s potential untapped, resulting in lower uplift factors.&lt;/p&gt;
&lt;p&gt;Compared to the research era, this era did not introduce as many new ideas (though with granularity one of the most influential ones), but is rather characterized by the slow yet steady adoption of the MoE paradigm in the LLM landscape. Many released models still remained dense transformers though. The last missing piece, as it turned out, was a successful blueprint for delivering the MoE promise at scale considering both modeling and systems aspects for efficient training and inference (see &lt;a href="https://tobiasfalke.com/blog/moe-intro-flops/"&gt;this post&lt;/a&gt;). While DeepSeek-V2 (&lt;a href="https://arxiv.org/abs/2405.04434" target="_blank" rel="noopener noreferrer"&gt;DeepSeek-AI, 2024&lt;/a&gt;) already introduced some of these aspects, e.g. device-limited routing, only DeepSeek-V3 was that full holistic picture and marks the beginning of the next era.&lt;/p&gt;
&lt;h3 id="the-deepseek-v3-era-2025-2026"&gt;The DeepSeek V3 era (2025-2026)&lt;/h3&gt;
&lt;p&gt;DeepSeek-V3 was released in December 2024 (&lt;a href="https://arxiv.org/abs/2412.19437" target="_blank" rel="noopener noreferrer"&gt;DeepSeek-AI, 2024&lt;/a&gt;). On the modeling side, it kept DeepSeek-MoE&amp;rsquo;s ideas of fine-grained experts and shared experts, and added loss-free token balancing based on expert biases (and switched to sigmoid activations). But more importantly, it came with detailed discussions of the necessary engineering and systems work to train and inference an MoE of that size (670B parameters). Several other models followed that blueprint and modified it only slightly, such as Kimi K2 (&lt;a href="https://arxiv.org/abs/2507.20534" target="_blank" rel="noopener noreferrer"&gt;Kimi Team, 2025&lt;/a&gt;) which increased sparsity and trained with Muon, or GLM 4.5 (&lt;a href="https://arxiv.org/abs/2508.06471" target="_blank" rel="noopener noreferrer"&gt;GLM-4.5 Team, 2025&lt;/a&gt;) which varied the width-to-depth ratio, and Ant Group&amp;rsquo;s Ling/Ring family of models (&lt;a href="https://arxiv.org/abs/2510.22115" target="_blank" rel="noopener noreferrer"&gt;Ling Team, 2025&lt;/a&gt;). This continued in 2026, when several US open model releases also followed the DSV3 architecture closely (Arcee Trinity, Laguna, Inkling).&lt;/p&gt;
&lt;p&gt;Qwen 3 (&lt;a href="https://arxiv.org/abs/2505.09388" target="_blank" rel="noopener noreferrer"&gt;Yang et al., 2025&lt;/a&gt;), the first from-scratch MoE of the Qwen series (as opposed to being upcycled), differed more by using no shared experts and relying on the established auxiliary loss for balancing.&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt; In mid 2025, OpenAI released their first ever open-weights MoE, gpt-oss (&lt;a href="https://arxiv.org/abs/2508.10925" target="_blank" rel="noopener noreferrer"&gt;OpenAI, 2025&lt;/a&gt;), also featuring fine-grained but no shared experts. And 2025 had the last release of the Llama series, Llama 4 (&lt;a href="https://ai.meta.com/blog/llama-4-multimodal-intelligence/" target="_blank" rel="noopener noreferrer"&gt;Meta, 2025&lt;/a&gt;), but since its impact in the field remained far behind its predecessors, I would not want to put too much weight on its MoE architecture (it was the first (and only) MoE in the Llama series and made a few unorthodox choices). LatentMoE (&lt;a href="https://arxiv.org/abs/2601.18089" target="_blank" rel="noopener noreferrer"&gt;NVIDIA, 2026&lt;/a&gt;) was one of the rare new ideas of this era that found adoption, e.g. in &lt;a href="https://microsoft.ai/pdf/mai-thinking-1.pdf" target="_blank" rel="noopener noreferrer"&gt;MAI Thinking 1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In these (almost) two years following the DSV3 launch, MoE clearly became the dominant approach for at least the largest LLMs. Many new companies entered the field and contributed additional closed or open models. The models also grew in size, up to 2.8T total parameters in the latest Kimi K3, and the activation ratio settled at 3-5%. But in the architecture and training recipe itself, not much changed: All models use fine-grained experts, some add shared experts, some not, some have initial dense layers, others not, most use sigmoid or softmax for the router, and expert biases or the load balancing loss (globally in either case) for token balancing. Of course, a lot of other changes went into these models, such as various ideas for more efficient attention architectures, or increasingly lower precision training, but I want to focus here on the MoE architecture and training. On that side, even in the most recent models as of writing this in late September 2026, such as Qwen 3.8 Next Flash, GLM 5.3 Flash, DeepSeek V4.1 Flash and MiMo V2.6 Flash, nothing new enters the picture.&lt;/p&gt;
&lt;h2 id="measuring-uplift"&gt;Measuring uplift&lt;/h2&gt;
&lt;p&gt;Having reviewed the MoE models of the previous years and what went into them, I want to now turn to measuring the MoE uplift over dense models, $N_{eff} / N_{a}$, as introduced at the beginning of the post.&lt;/p&gt;
&lt;h3 id="controlled-scaling-studies"&gt;Controlled scaling studies&lt;/h3&gt;
&lt;p&gt;The best data source to measure MoE uplift is a controlled scaling study that compares MoE models with dense models. Luckily, several such studies have been done over the years. Since they train dense and MoE models under otherwise identical conditions, such as same training data, same backbone architecture (attention type, FFN type, width, depth, etc.), the loss difference between matched dense and MoE models can be fully attributed to the MoE architecture and training recipe and hence reflects what I call the uplift. And in addition, scaling studies typically sweep dimensions such as model size, data volume and sparsity, allowing us to measure uplift along these dimensions.&lt;/p&gt;
&lt;p&gt;As I already mentioned, &lt;a href="https://arxiv.org/abs/2202.01169" target="_blank" rel="noopener noreferrer"&gt;Clark et al. (2022)&lt;/a&gt; is a great example of such work, with the only caveat that they trained models of all sizes and sparsities on a single fixed amount of data. But since they released loss values for all models and all intermediate checkpoints, we can slice out a portion that holds tokens-per-parameter (tpp) constant as in Chinchilla-style scaling laws (at 315 tpp in this case). This yields the following plot of active parameters vs. validation loss at different sparsities:&lt;/p&gt;
&lt;figure&gt;&lt;svg aria-label="Validation loss versus active parameters at increasing sparsity, from Clark et al. 2022" class="moe-chart" viewBox="0 0 700 350" xmlns="http://www.w3.org/2000/svg" role="img"&gt;
&lt;style&gt;.moe-chart{font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}.moe-chart .axis{stroke:var(--border,#e5e7eb);stroke-width:1.2}.moe-chart .dot{fill:currentColor;stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .dotu{fill:var(--bg,#fff);stroke:currentColor;stroke-width:1.6}.moe-chart .slabel{fill:currentColor;font-size:12.5px}.moe-chart .grid{stroke:var(--border,#e5e7eb);stroke-width:1}.moe-chart .tick{fill:var(--text-muted,#6b7280);font-size:13px}.moe-chart .atitle{fill:var(--text,#1a1a1a);font-size:14px}.moe-chart .series{fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .ref{fill:none;stroke:var(--text-light,#9ca3af);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .refdot{fill:var(--text-light,#9ca3af);stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .hit{fill:transparent;stroke:none;pointer-events:all;cursor:crosshair}.moe-chart .leader{stroke:currentColor;stroke-width:1;opacity:.55}.moe-chart .reflabel{fill:var(--text-muted,#6b7280);font-size:12.5px}.moe-chart .anno{stroke:var(--text-muted,#6b7280);stroke-width:1.4;stroke-dasharray:2 3.5;fill:none}.moe-chart .annodot{fill:var(--bg,#fff);stroke:var(--text-muted,#6b7280);stroke-width:1.6}.moe-chart .annotext{fill:var(--text-muted,#6b7280);font-size:12px}.moe-chart .c2{color:#9ec1e8}.moe-chart .c4{color:#7fb0e2}.moe-chart .c8{color:#5f9bd9}.moe-chart .c16{color:#4385cc}.moe-chart .c32{color:#2c6fbb}.moe-chart .c64{color:#245a9e}.moe-chart .c128{color:#1d4880}.moe-chart .c256{color:#19406f}.moe-chart .c512{color:#153862}@media (prefers-color-scheme:dark){.moe-chart .c2{color:#cfe1f5}.moe-chart .c4{color:#b3d0ef}.moe-chart .c8{color:#93bce6}.moe-chart .c16{color:#74a8db}.moe-chart .c32{color:#5b93d0}.moe-chart .c64{color:#4a80c0}.moe-chart .c128{color:#3d6fae}.moe-chart .c256{color:#38689f}.moe-chart .c512{color:#33619c}}&lt;/style&gt;
&lt;g&gt;
&lt;line class="grid" x1="58.0" y1="291.5" x2="622.0" y2="291.5"/&gt;
&lt;text class="tick" x="49.0" y="295.5" text-anchor="end"&gt;2&lt;/text&gt;
&lt;line class="grid" x1="58.0" y1="248.8" x2="622.0" y2="248.8"/&gt;
&lt;text class="tick" x="49.0" y="252.8" text-anchor="end"&gt;2.2&lt;/text&gt;
&lt;line class="grid" x1="58.0" y1="209.9" x2="622.0" y2="209.9"/&gt;
&lt;text class="tick" x="49.0" y="213.9" text-anchor="end"&gt;2.4&lt;/text&gt;
&lt;line class="grid" x1="58.0" y1="174.1" x2="622.0" y2="174.1"/&gt;
&lt;text class="tick" x="49.0" y="178.1" text-anchor="end"&gt;2.6&lt;/text&gt;
&lt;line class="grid" x1="58.0" y1="141.0" x2="622.0" y2="141.0"/&gt;
&lt;text class="tick" x="49.0" y="145.0" text-anchor="end"&gt;2.8&lt;/text&gt;
&lt;line class="grid" x1="58.0" y1="110.1" x2="622.0" y2="110.1"/&gt;
&lt;text class="tick" x="49.0" y="114.1" text-anchor="end"&gt;3&lt;/text&gt;
&lt;line class="grid" x1="58.0" y1="81.2" x2="622.0" y2="81.2"/&gt;
&lt;text class="tick" x="49.0" y="85.2" text-anchor="end"&gt;3.2&lt;/text&gt;
&lt;line class="grid" x1="58.0" y1="54.1" x2="622.0" y2="54.1"/&gt;
&lt;text class="tick" x="49.0" y="58.1" text-anchor="end"&gt;3.4&lt;/text&gt;
&lt;line class="grid" x1="58.0" y1="28.5" x2="622.0" y2="28.5"/&gt;
&lt;text class="tick" x="49.0" y="32.5" text-anchor="end"&gt;3.6&lt;/text&gt;
&lt;/g&gt;
&lt;line class="axis" x1="58.0" y1="302.0" x2="622.0" y2="302.0"/&gt;
&lt;line class="axis" x1="58.0" y1="18.0" x2="58.0" y2="302.0"/&gt;
&lt;line class="axis" x1="78.9" y1="302.0" x2="78.9" y2="306.0"/&gt;
&lt;text class="tick" x="78.9" y="320.0" text-anchor="middle"&gt;16M&lt;/text&gt;
&lt;line class="axis" x1="163.2" y1="302.0" x2="163.2" y2="306.0"/&gt;
&lt;text class="tick" x="163.2" y="320.0" text-anchor="middle"&gt;27M&lt;/text&gt;
&lt;line class="axis" x1="288.3" y1="302.0" x2="288.3" y2="306.0"/&gt;
&lt;text class="tick" x="288.3" y="320.0" text-anchor="middle"&gt;57M&lt;/text&gt;
&lt;line class="axis" x1="428.7" y1="302.0" x2="428.7" y2="306.0"/&gt;
&lt;text class="tick" x="428.7" y="320.0" text-anchor="middle"&gt;132M&lt;/text&gt;
&lt;line class="axis" x1="601.1" y1="302.0" x2="601.1" y2="306.0"/&gt;
&lt;text class="tick" x="601.1" y="320.0" text-anchor="middle"&gt;368M&lt;/text&gt;
&lt;text class="atitle" x="340.0" y="342.0" text-anchor="middle"&gt;Active parameters&lt;/text&gt;
&lt;text class="atitle" x="16" y="160.0" text-anchor="middle" transform="rotate(-90 16 160.0)"&gt;Validation loss&lt;/text&gt;
&lt;g&gt;
&lt;path class="ref" d="M 78.9 34.4 L 163.2 64.8 L 288.3 105.9 L 428.7 146.0 L 601.1 196.8"/&gt;
&lt;circle class="refdot" cx="78.9" cy="34.4" r="3"/&gt;
&lt;circle class="hit" cx="78.9" cy="34.4" r="6"&gt;&lt;title&gt;dense - 16M active params - loss 3.553&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="refdot" cx="163.2" cy="64.8" r="3"/&gt;
&lt;circle class="hit" cx="163.2" cy="64.8" r="6"&gt;&lt;title&gt;dense - 27M active params - loss 3.320&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="refdot" cx="288.3" cy="105.9" r="3"/&gt;
&lt;circle class="hit" cx="288.3" cy="105.9" r="6"&gt;&lt;title&gt;dense - 57M active params - loss 3.028&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="refdot" cx="428.7" cy="146.0" r="3"/&gt;
&lt;circle class="hit" cx="428.7" cy="146.0" r="6"&gt;&lt;title&gt;dense - 132M active params - loss 2.769&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="refdot" cx="601.1" cy="196.8" r="3"/&gt;
&lt;circle class="hit" cx="601.1" cy="196.8" r="6"&gt;&lt;title&gt;dense - 368M active params - loss 2.471&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="c4"&gt;
&lt;path class="series" d="M 78.9 48.0 L 163.2 76.5 L 288.3 118.8 L 428.7 159.0 L 601.1 210.3"/&gt;
&lt;circle class="dot" cx="78.9" cy="48.0" r="3"/&gt;
&lt;circle class="hit" cx="78.9" cy="48.0" r="6"&gt;&lt;title&gt;50% activation (4 experts) - 16M active params - loss 3.447&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="163.2" cy="76.5" r="3"/&gt;
&lt;circle class="hit" cx="163.2" cy="76.5" r="6"&gt;&lt;title&gt;50% activation (4 experts) - 27M active params - loss 3.234&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="288.3" cy="118.8" r="3"/&gt;
&lt;circle class="hit" cx="288.3" cy="118.8" r="6"&gt;&lt;title&gt;50% activation (4 experts) - 57M active params - loss 2.942&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="428.7" cy="159.0" r="3"/&gt;
&lt;circle class="hit" cx="428.7" cy="159.0" r="6"&gt;&lt;title&gt;50% activation (4 experts) - 132M active params - loss 2.689&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="601.1" cy="210.3" r="3"/&gt;
&lt;circle class="hit" cx="601.1" cy="210.3" r="6"&gt;&lt;title&gt;50% activation (4 experts) - 368M active params - loss 2.398&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="c16"&gt;
&lt;path class="series" d="M 78.9 62.8 L 163.2 93.3 L 288.3 135.0 L 428.7 176.2 L 601.1 228.1"/&gt;
&lt;circle class="dot" cx="78.9" cy="62.8" r="3"/&gt;
&lt;circle class="hit" cx="78.9" cy="62.8" r="6"&gt;&lt;title&gt;17% activation (16 experts) - 16M active params - loss 3.335&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="163.2" cy="93.3" r="3"/&gt;
&lt;circle class="hit" cx="163.2" cy="93.3" r="6"&gt;&lt;title&gt;17% activation (16 experts) - 27M active params - loss 3.114&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="288.3" cy="135.0" r="3"/&gt;
&lt;circle class="hit" cx="288.3" cy="135.0" r="6"&gt;&lt;title&gt;17% activation (16 experts) - 57M active params - loss 2.837&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="428.7" cy="176.2" r="3"/&gt;
&lt;circle class="hit" cx="428.7" cy="176.2" r="6"&gt;&lt;title&gt;17% activation (16 experts) - 132M active params - loss 2.588&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="601.1" cy="228.1" r="3"/&gt;
&lt;circle class="hit" cx="601.1" cy="228.1" r="6"&gt;&lt;title&gt;17% activation (16 experts) - 368M active params - loss 2.304&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="c64"&gt;
&lt;path class="series" d="M 78.9 77.4 L 163.2 109.0 L 288.3 150.6 L 428.7 190.2 L 601.1 243.8"/&gt;
&lt;circle class="dot" cx="78.9" cy="77.4" r="3"/&gt;
&lt;circle class="hit" cx="78.9" cy="77.4" r="6"&gt;&lt;title&gt;4.5% activation (64 experts) - 16M active params - loss 3.228&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="163.2" cy="109.0" r="3"/&gt;
&lt;circle class="hit" cx="163.2" cy="109.0" r="6"&gt;&lt;title&gt;4.5% activation (64 experts) - 27M active params - loss 3.007&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="288.3" cy="150.6" r="3"/&gt;
&lt;circle class="hit" cx="288.3" cy="150.6" r="6"&gt;&lt;title&gt;4.5% activation (64 experts) - 57M active params - loss 2.740&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="428.7" cy="190.2" r="3"/&gt;
&lt;circle class="hit" cx="428.7" cy="190.2" r="6"&gt;&lt;title&gt;4.5% activation (64 experts) - 132M active params - loss 2.508&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="601.1" cy="243.8" r="3"/&gt;
&lt;circle class="hit" cx="601.1" cy="243.8" r="6"&gt;&lt;title&gt;4.5% activation (64 experts) - 368M active params - loss 2.225&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="c256"&gt;
&lt;path class="series" d="M 78.9 88.0 L 163.2 120.0 L 288.3 161.4 L 601.1 255.1"/&gt;
&lt;circle class="dot" cx="78.9" cy="88.0" r="3"/&gt;
&lt;circle class="hit" cx="78.9" cy="88.0" r="6"&gt;&lt;title&gt;1.2% activation (256 experts) - 16M active params - loss 3.151&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="163.2" cy="120.0" r="3"/&gt;
&lt;circle class="hit" cx="163.2" cy="120.0" r="6"&gt;&lt;title&gt;1.2% activation (256 experts) - 27M active params - loss 2.934&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="288.3" cy="161.4" r="3"/&gt;
&lt;circle class="hit" cx="288.3" cy="161.4" r="6"&gt;&lt;title&gt;1.2% activation (256 experts) - 57M active params - loss 2.675&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="601.1" cy="255.1" r="3"/&gt;
&lt;circle class="hit" cx="601.1" cy="255.1" r="6"&gt;&lt;title&gt;1.2% activation (256 experts) - 368M active params - loss 2.169&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g&gt;
&lt;line class="anno" x1="288.3" y1="150.6" x2="444.4" y2="150.6"/&gt;
&lt;circle class="annodot" cx="444.4" cy="150.6" r="4"/&gt;
&lt;text class="annotext" x="452.4" y="142.6"&gt;N_eff = 145M&lt;/text&gt;
&lt;/g&gt;
&lt;text class="reflabel" x="630.0" y="200.8"&gt;dense&lt;/text&gt;
&lt;g class="c4"&gt;&lt;text class="slabel" x="630.0" y="215.3"&gt;50%&lt;/text&gt;&lt;/g&gt;
&lt;g class="c16"&gt;&lt;text class="slabel" x="630.0" y="232.1"&gt;17%&lt;/text&gt;&lt;/g&gt;
&lt;g class="c64"&gt;&lt;text class="slabel" x="630.0" y="247.8"&gt;4.5%&lt;/text&gt;&lt;/g&gt;
&lt;g class="c256"&gt;
&lt;polyline class="leader" fill="none" points="624.0,255.1 628.0,258.3 630.0,258.3"/&gt;
&lt;/g&gt;
&lt;g class="c256"&gt;&lt;text class="slabel" x="630.0" y="262.3"&gt;1.2%&lt;/text&gt;&lt;/g&gt;
&lt;/svg&gt;
&lt;figcaption&gt;Validation loss as a function of active parameters and sparsity (as activation ratio), in log-log-space, based on Clark et al. 2022. The dotted line illustrates how MoEs, here at 57M active parameters and 4.5% activation ratio, are mapped to their dense equivalent size by matching at validation loss.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;To compute uplift, we can fit the dense model loss curve with a linear function in log-log-space that maps parameters to loss, invert it, take the loss of an MoE at a specific sparsity and parameters $N_{a}$ and compute the dense parameters showing that same loss, which gives us $N_{eff}$ and thereby the uplift factor $N_{eff} / N_{a}$. The following table shows the resulting uplift factors for Clark&amp;rsquo;s models that have between 15M and 370M active parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Act. Ratio&lt;/th&gt;
&lt;th&gt;Uplift Range&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;50.0%&lt;/td&gt;
&lt;td&gt;1.22x - 1.38x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16.7%&lt;/td&gt;
&lt;td&gt;1.62x - 1.88x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.5%&lt;/td&gt;
&lt;td&gt;2.15x - 2.54x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.2%&lt;/td&gt;
&lt;td&gt;2.64x - 3.12x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;As expected, the sparser the model (the lower the activation ratio), the higher the uplift is. For the nowadays typical sparsity range of 4%-8% activation ratio, the uplift is around 1.9 to 2.5. This uplift factor characterizes the effectiveness of the specific MoE setup used in that study: MoE in every second layer, top-1 routing, full-sized experts following the FFN sizing in dense models (expansion factor 4.0) and Sinkhorn balancing. That is very close to the Switch-Transformers recipe which was the most popular approach in the research era.&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Three years later, &lt;a href="https://arxiv.org/abs/2502.05172" target="_blank" rel="noopener noreferrer"&gt;Ludziejewski et al. (2025)&lt;/a&gt; ran a similar scaling study. The MoE setup was again Switch-style, in this case even closer&lt;sup id="fnref:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;, so it gives us a second data point for the effectiveness of that recipe. The table below compares the uplift factors, but also reveals that data volume (and hence tpp) is an important factor for uplift:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Act. Ratio&lt;/th&gt;
&lt;th&gt;Clark&lt;/th&gt;
&lt;th&gt;Ludz (A)&lt;/th&gt;
&lt;th&gt;Ludz (B)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;30.0%&lt;/td&gt;
&lt;td&gt;1.39x - 1.60x&lt;/td&gt;
&lt;td&gt;1.17x - 1.21x&lt;/td&gt;
&lt;td&gt;1.37x - 1.43x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16.7%&lt;/td&gt;
&lt;td&gt;1.62x - 1.88x&lt;/td&gt;
&lt;td&gt;1.30x - 1.37x&lt;/td&gt;
&lt;td&gt;1.72x - 1.83x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.8%&lt;/td&gt;
&lt;td&gt;1.90x - 2.22x&lt;/td&gt;
&lt;td&gt;1.45x - 1.55x&lt;/td&gt;
&lt;td&gt;2.24x - 2.41x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.5%&lt;/td&gt;
&lt;td&gt;2.15x - 2.54x&lt;/td&gt;
&lt;td&gt;1.62x - 1.77x&lt;/td&gt;
&lt;td&gt;2.98x - 3.19x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tpp&lt;/td&gt;
&lt;td&gt;315&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;23 - 64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$N_{act}$&lt;/td&gt;
&lt;td&gt;16.5M - 368M&lt;/td&gt;
&lt;td&gt;321M - 1.1B&lt;/td&gt;
&lt;td&gt;321M - 1.1B&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In setting A, the tpp for the active parameters is held constant, as we did for Clark, but here at the Chinchilla-derived value of 20 (the data does not allow using the same tpp for both studies). The uplift factors are lower, which I assume is primarily due to this undertraining aspect. But Ludziejewski&amp;rsquo;s data also lets us do something more interesting: Keeping the data volume fixed per active parameter underestimates the MoE&amp;rsquo;s potential since it scales data only with the lower active size, but not the true effective size, putting it at a disadvantage compared to the dense model. A more honest comparison would be a constant tpp against $N_{eff}$, which is what setting B shows (resulting in tpp w.r.t. $N_{a}$ of 23-64), leading to significantly higher MoE uplift of 2.2 - 3.2 at the previously mentioned sparsity range.&lt;/p&gt;
&lt;p&gt;As the third relevant data point, &lt;a href="https://arxiv.org/abs/2507.17702" target="_blank" rel="noopener noreferrer"&gt;Tian et al. (2025)&lt;/a&gt; published an MoE vs. dense scaling study in the same year. Their MoE setup is almost identical to Ludziejewski&amp;rsquo;s, but they add the two new ingredients DeepSeek proposed in 2024, fine-grained experts and shared experts, making it a representative of the second era. And, luckily, they model the influence of granularity directly in their study, which allows us to measure uplift at $G=1$ (full experts, resulting in Switch-style except with a shared expert), $G=4$ (DeepSeek-MoE&amp;rsquo;s granularity) and $G=24$ (the optimum in their sweep). The overtraining regime is comparable to setting B of Ludziejewski, scaling data with effective size.&lt;sup id="fnref:5"&gt;&lt;a href="#fn:5" class="footnote-ref" role="doc-noteref"&gt;5&lt;/a&gt;&lt;/sup&gt; The following figure shows the results next to the other two studies:&lt;/p&gt;
&lt;figure&gt;&lt;svg aria-label="Uplift versus activation ratio in three controlled MoE scaling studies" class="moe-chart" viewBox="0 0 700 380" xmlns="http://www.w3.org/2000/svg" role="img"&gt;
&lt;style&gt;.moe-chart{font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}.moe-chart .axis{stroke:var(--border,#e5e7eb);stroke-width:1.2}.moe-chart .dot{fill:currentColor;stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .dotu{fill:var(--bg,#fff);stroke:currentColor;stroke-width:1.6}.moe-chart .slabel{fill:currentColor;font-size:12.5px}.moe-chart .grid{stroke:var(--border,#e5e7eb);stroke-width:1}.moe-chart .tick{fill:var(--text-muted,#6b7280);font-size:13px}.moe-chart .atitle{fill:var(--text,#1a1a1a);font-size:14px}.moe-chart .series{fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .ref{fill:none;stroke:var(--text-light,#9ca3af);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .refdot{fill:var(--text-light,#9ca3af);stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .hit{fill:transparent;stroke:none;pointer-events:all;cursor:crosshair}.moe-chart .leader{stroke:currentColor;stroke-width:1;opacity:.55}.moe-chart .reflabel{fill:var(--text-muted,#6b7280);font-size:12.5px}.moe-chart .rng{stroke:currentColor;stroke-width:2;stroke-linecap:round}.moe-chart .mk{fill:currentColor;stroke:var(--bg,#fff);stroke-width:1.2}.moe-chart .mkhalo{fill:none;stroke:var(--bg,#fff);stroke-width:3}.moe-chart .s-sw-act{color:#17406f}.moe-chart .s-sw-eff{color:#4f8fd0}.moe-chart .s-ds-g4{color:#3fbf9b}.moe-chart .s-ds-g24{color:#0b6f55}@media (prefers-color-scheme:dark){.moe-chart .s-sw-act{color:#cfe1f5}.moe-chart .s-sw-eff{color:#7fb0e2}.moe-chart .s-ds-g4{color:#7ddcbd}.moe-chart .s-ds-g24{color:#2fa583}}&lt;/style&gt;
&lt;g&gt;
&lt;line class="grid" x1="60.0" y1="328.9" x2="680.0" y2="328.9"/&gt;
&lt;text class="tick" x="51.0" y="332.9" text-anchor="end"&gt;1x&lt;/text&gt;
&lt;line class="grid" x1="60.0" y1="277.6" x2="680.0" y2="277.6"/&gt;
&lt;text class="tick" x="51.0" y="281.6" text-anchor="end"&gt;1.5x&lt;/text&gt;
&lt;line class="grid" x1="60.0" y1="226.3" x2="680.0" y2="226.3"/&gt;
&lt;text class="tick" x="51.0" y="230.3" text-anchor="end"&gt;2x&lt;/text&gt;
&lt;line class="grid" x1="60.0" y1="175.0" x2="680.0" y2="175.0"/&gt;
&lt;text class="tick" x="51.0" y="179.0" text-anchor="end"&gt;2.5x&lt;/text&gt;
&lt;line class="grid" x1="60.0" y1="123.7" x2="680.0" y2="123.7"/&gt;
&lt;text class="tick" x="51.0" y="127.7" text-anchor="end"&gt;3x&lt;/text&gt;
&lt;line class="grid" x1="60.0" y1="72.4" x2="680.0" y2="72.4"/&gt;
&lt;text class="tick" x="51.0" y="76.4" text-anchor="end"&gt;3.5x&lt;/text&gt;
&lt;line class="grid" x1="60.0" y1="21.1" x2="680.0" y2="21.1"/&gt;
&lt;text class="tick" x="51.0" y="25.1" text-anchor="end"&gt;4x&lt;/text&gt;
&lt;/g&gt;
&lt;line class="axis" x1="60.0" y1="334.0" x2="680.0" y2="334.0"/&gt;
&lt;line class="axis" x1="60.0" y1="16.0" x2="60.0" y2="334.0"/&gt;
&lt;line class="axis" x1="75.1" y1="334.0" x2="75.1" y2="338.0"/&gt;
&lt;text class="tick" x="75.1" y="352.0" text-anchor="middle"&gt;75%&lt;/text&gt;
&lt;line class="axis" x1="124.1" y1="334.0" x2="124.1" y2="338.0"/&gt;
&lt;text class="tick" x="124.1" y="352.0" text-anchor="middle"&gt;50%&lt;/text&gt;
&lt;line class="axis" x1="185.7" y1="334.0" x2="185.7" y2="338.0"/&gt;
&lt;text class="tick" x="185.7" y="352.0" text-anchor="middle"&gt;30%&lt;/text&gt;
&lt;line class="axis" x1="254.3" y1="334.0" x2="254.3" y2="338.0"/&gt;
&lt;text class="tick" x="254.3" y="352.0" text-anchor="middle"&gt;17%&lt;/text&gt;
&lt;line class="axis" x1="333.8" y1="334.0" x2="333.8" y2="338.0"/&gt;
&lt;text class="tick" x="333.8" y="352.0" text-anchor="middle"&gt;8.8%&lt;/text&gt;
&lt;line class="axis" x1="414.7" y1="334.0" x2="414.7" y2="338.0"/&gt;
&lt;text class="tick" x="414.7" y="352.0" text-anchor="middle"&gt;4.5%&lt;/text&gt;
&lt;line class="axis" x1="495.8" y1="334.0" x2="495.8" y2="338.0"/&gt;
&lt;text class="tick" x="495.8" y="352.0" text-anchor="middle"&gt;2.3%&lt;/text&gt;
&lt;line class="axis" x1="574.3" y1="334.0" x2="574.3" y2="338.0"/&gt;
&lt;text class="tick" x="574.3" y="352.0" text-anchor="middle"&gt;1.2%&lt;/text&gt;
&lt;line class="axis" x1="658.0" y1="334.0" x2="658.0" y2="338.0"/&gt;
&lt;text class="tick" x="658.0" y="352.0" text-anchor="middle"&gt;0.6%&lt;/text&gt;
&lt;text class="atitle" x="370.0" y="372.0" text-anchor="middle"&gt;Activation ratio, non-embedding (sparser →)&lt;/text&gt;
&lt;text class="atitle" x="15" y="175.0" text-anchor="middle" transform="rotate(-90 15 175.0)"&gt;Uplift&lt;/text&gt;
&lt;g class="s-sw-act"&gt;
&lt;line class="rng" x1="84.8" y1="325.8" x2="84.8" y2="310.4"/&gt;
&lt;circle class="hit" cx="84.8" cy="318.4" r="8"&gt;&lt;title&gt;Switch + tpp-act 315 (Clark) - 75% activation - 1.03x to 1.18x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="133.8" y1="306.3" x2="133.8" y2="289.9"/&gt;
&lt;circle class="hit" cx="133.8" cy="298.3" r="8"&gt;&lt;title&gt;Switch + tpp-act 315 (Clark) - 50% activation - 1.22x to 1.38x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="195.5" y1="288.9" x2="195.5" y2="267.3"/&gt;
&lt;circle class="hit" cx="195.5" cy="278.5" r="8"&gt;&lt;title&gt;Switch + tpp-act 315 (Clark) - 30% activation - 1.39x to 1.60x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="266.2" y1="265.3" x2="266.2" y2="238.6"/&gt;
&lt;circle class="hit" cx="266.2" cy="252.4" r="8"&gt;&lt;title&gt;Switch + tpp-act 315 (Clark) - 16.7% activation - 1.62x to 1.88x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="343.5" y1="236.5" x2="343.5" y2="203.7"/&gt;
&lt;circle class="hit" cx="343.5" cy="220.8" r="8"&gt;&lt;title&gt;Switch + tpp-act 315 (Clark) - 8.8% activation - 1.90x to 2.22x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="424.5" y1="210.9" x2="424.5" y2="170.9"/&gt;
&lt;circle class="hit" cx="424.5" cy="191.7" r="8"&gt;&lt;title&gt;Switch + tpp-act 315 (Clark) - 4.5% activation - 2.15x to 2.54x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="505.5" y1="182.2" x2="505.5" y2="139.1"/&gt;
&lt;circle class="hit" cx="505.5" cy="161.5" r="8"&gt;&lt;title&gt;Switch + tpp-act 315 (Clark) - 2.3% activation - 2.43x to 2.85x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="584.0" y1="160.6" x2="584.0" y2="111.4"/&gt;
&lt;circle class="hit" cx="584.0" cy="137.0" r="8"&gt;&lt;title&gt;Switch + tpp-act 315 (Clark) - 1.2% activation - 2.64x to 3.12x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="667.7" y1="147.3" x2="667.7" y2="89.9"/&gt;
&lt;circle class="hit" cx="667.7" cy="119.9" r="8"&gt;&lt;title&gt;Switch + tpp-act 315 (Clark) - 0.6% activation - 2.77x to 3.33x&lt;/title&gt;&lt;/circle&gt;
&lt;path class="series" d="M 84.8 318.4 L 133.8 298.3 L 195.5 278.5 L 266.2 252.4 L 343.5 220.8 L 424.5 191.7 L 505.5 161.5 L 584.0 137.0 L 667.7 119.9"/&gt;
&lt;circle class="mk" cx="84.8" cy="318.4" r="3.2"/&gt;
&lt;circle class="mk" cx="133.8" cy="298.3" r="3.2"/&gt;
&lt;circle class="mk" cx="195.5" cy="278.5" r="3.2"/&gt;
&lt;circle class="mk" cx="266.2" cy="252.4" r="3.2"/&gt;
&lt;circle class="mk" cx="343.5" cy="220.8" r="3.2"/&gt;
&lt;circle class="mk" cx="424.5" cy="191.7" r="3.2"/&gt;
&lt;circle class="mk" cx="505.5" cy="161.5" r="3.2"/&gt;
&lt;circle class="mk" cx="584.0" cy="137.0" r="3.2"/&gt;
&lt;circle class="mk" cx="667.7" cy="119.9" r="3.2"/&gt;
&lt;/g&gt;
&lt;g class="s-sw-act"&gt;
&lt;line class="rng" x1="109.7" y1="320.7" x2="109.7" y2="319.6"/&gt;
&lt;circle class="hit" cx="109.7" cy="320.2" r="8"&gt;&lt;title&gt;Switch + tpp-act 20 (Ludz) - 59.1% activation - 1.08x to 1.09x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="181.9" y1="311.4" x2="181.9" y2="307.3"/&gt;
&lt;circle class="hit" cx="181.9" cy="309.4" r="8"&gt;&lt;title&gt;Switch + tpp-act 20 (Ludz) - 32.5% activation - 1.17x to 1.21x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="259.4" y1="298.1" x2="259.4" y2="290.9"/&gt;
&lt;circle class="hit" cx="259.4" cy="294.6" r="8"&gt;&lt;title&gt;Switch + tpp-act 20 (Ludz) - 17.1% activation - 1.30x to 1.37x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="339.9" y1="282.7" x2="339.9" y2="272.5"/&gt;
&lt;circle class="hit" cx="339.9" cy="277.7" r="8"&gt;&lt;title&gt;Switch + tpp-act 20 (Ludz) - 8.78% activation - 1.45x to 1.55x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="421.9" y1="265.3" x2="421.9" y2="249.9"/&gt;
&lt;circle class="hit" cx="421.9" cy="257.7" r="8"&gt;&lt;title&gt;Switch + tpp-act 20 (Ludz) - 4.45% activation - 1.62x to 1.77x&lt;/title&gt;&lt;/circle&gt;
&lt;path class="series" d="M 109.7 320.2 L 181.9 309.4 L 259.4 294.6 L 339.9 277.7 L 421.9 257.7"/&gt;
&lt;circle class="mk" cx="109.7" cy="320.2" r="3.2"/&gt;
&lt;circle class="mk" cx="181.9" cy="309.4" r="3.2"/&gt;
&lt;circle class="mk" cx="259.4" cy="294.6" r="3.2"/&gt;
&lt;circle class="mk" cx="339.9" cy="277.7" r="3.2"/&gt;
&lt;circle class="mk" cx="421.9" cy="257.7" r="3.2"/&gt;
&lt;/g&gt;
&lt;g class="s-sw-eff"&gt;
&lt;line class="rng" x1="105.8" y1="313.5" x2="105.8" y2="310.4"/&gt;
&lt;circle class="hit" cx="105.8" cy="312.0" r="8"&gt;&lt;title&gt;Switch + tpp-eff (Ludz) - 59.1% activation - 1.15x to 1.18x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="178.0" y1="290.9" x2="178.0" y2="284.8"/&gt;
&lt;circle class="hit" cx="178.0" cy="287.9" r="8"&gt;&lt;title&gt;Switch + tpp-eff (Ludz) - 32.5% activation - 1.37x to 1.43x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="255.5" y1="255.0" x2="255.5" y2="243.7"/&gt;
&lt;circle class="hit" cx="255.5" cy="249.5" r="8"&gt;&lt;title&gt;Switch + tpp-eff (Ludz) - 17.1% activation - 1.72x to 1.83x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="336.0" y1="201.7" x2="336.0" y2="184.2"/&gt;
&lt;circle class="hit" cx="336.0" cy="193.1" r="8"&gt;&lt;title&gt;Switch + tpp-eff (Ludz) - 8.78% activation - 2.24x to 2.41x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="418.0" y1="125.8" x2="418.0" y2="104.2"/&gt;
&lt;circle class="hit" cx="418.0" cy="115.2" r="8"&gt;&lt;title&gt;Switch + tpp-eff (Ludz) - 4.45% activation - 2.98x to 3.19x&lt;/title&gt;&lt;/circle&gt;
&lt;path class="series" d="M 105.8 312.0 L 178.0 287.9 L 255.5 249.5 L 336.0 193.1 L 418.0 115.2"/&gt;
&lt;circle class="mk" cx="105.8" cy="312.0" r="3.2"/&gt;
&lt;circle class="mk" cx="178.0" cy="287.9" r="3.2"/&gt;
&lt;circle class="mk" cx="255.5" cy="249.5" r="3.2"/&gt;
&lt;circle class="mk" cx="336.0" cy="193.1" r="3.2"/&gt;
&lt;circle class="mk" cx="418.0" cy="115.2" r="3.2"/&gt;
&lt;/g&gt;
&lt;g class="s-sw-eff"&gt;
&lt;line class="rng" x1="251.6" y1="244.8" x2="251.6" y2="213.0"/&gt;
&lt;circle class="hit" cx="251.6" cy="229.5" r="8"&gt;&lt;title&gt;Switch + tpp-eff, extrapolated (Tian) - 17.1% activation - 1.82x to 2.13x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="332.1" y1="233.5" x2="332.1" y2="192.4"/&gt;
&lt;circle class="hit" cx="332.1" cy="213.9" r="8"&gt;&lt;title&gt;Switch + tpp-eff, extrapolated (Tian) - 8.78% activation - 1.93x to 2.33x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="414.2" y1="222.2" x2="414.2" y2="174.0"/&gt;
&lt;circle class="hit" cx="414.2" cy="199.3" r="8"&gt;&lt;title&gt;Switch + tpp-eff, extrapolated (Tian) - 4.45% activation - 2.04x to 2.51x&lt;/title&gt;&lt;/circle&gt;
&lt;path class="series" d="M 251.6 229.5 L 332.1 213.9 L 414.2 199.3" stroke-dasharray="1.6 4.2"/&gt;
&lt;circle class="mk" cx="251.6" cy="229.5" r="3.2"/&gt;
&lt;circle class="mk" cx="332.1" cy="213.9" r="3.2"/&gt;
&lt;circle class="mk" cx="414.2" cy="199.3" r="3.2"/&gt;
&lt;/g&gt;
&lt;g class="s-ds-g4"&gt;
&lt;line class="rng" x1="247.7" y1="208.9" x2="247.7" y2="170.9"/&gt;
&lt;circle class="hit" cx="247.7" cy="190.6" r="8"&gt;&lt;title&gt;DeepSeek G=4 + tpp-eff (Tian) - 17.1% activation - 2.17x to 2.54x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="328.2" y1="182.2" x2="328.2" y2="130.9"/&gt;
&lt;circle class="hit" cx="328.2" cy="157.7" r="8"&gt;&lt;title&gt;DeepSeek G=4 + tpp-eff (Tian) - 8.78% activation - 2.43x to 2.93x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="410.3" y1="154.5" x2="410.3" y2="90.9"/&gt;
&lt;circle class="hit" cx="410.3" cy="124.3" r="8"&gt;&lt;title&gt;DeepSeek G=4 + tpp-eff (Tian) - 4.45% activation - 2.70x to 3.32x&lt;/title&gt;&lt;/circle&gt;
&lt;path class="series" d="M 247.7 190.6 L 328.2 157.7 L 410.3 124.3"/&gt;
&lt;path class="mk" d="M 247.7 186.5 L 251.8 190.6 L 247.7 194.7 L 243.6 190.6 Z"/&gt;
&lt;path class="mk" d="M 328.2 153.6 L 332.3 157.7 L 328.2 161.8 L 324.1 157.7 Z"/&gt;
&lt;path class="mk" d="M 410.3 120.2 L 414.4 124.3 L 410.3 128.4 L 406.2 124.3 Z"/&gt;
&lt;/g&gt;
&lt;g class="s-ds-g24"&gt;
&lt;line class="rng" x1="243.9" y1="184.2" x2="243.9" y2="142.2"/&gt;
&lt;circle class="hit" cx="243.9" cy="164.0" r="8"&gt;&lt;title&gt;DeepSeek G=24 + tpp-eff (Tian) - 17.1% activation - 2.41x to 2.82x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="324.3" y1="144.2" x2="324.3" y2="86.8"/&gt;
&lt;circle class="hit" cx="324.3" cy="116.8" r="8"&gt;&lt;title&gt;DeepSeek G=24 + tpp-eff (Tian) - 8.78% activation - 2.80x to 3.36x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="406.4" y1="104.2" x2="406.4" y2="29.3"/&gt;
&lt;circle class="hit" cx="406.4" cy="68.7" r="8"&gt;&lt;title&gt;DeepSeek G=24 + tpp-eff (Tian) - 4.45% activation - 3.19x to 3.92x&lt;/title&gt;&lt;/circle&gt;
&lt;path class="series" d="M 243.9 164.0 L 324.3 116.8 L 406.4 68.7"/&gt;
&lt;path class="mk" d="M 243.9 159.9 L 248.0 164.0 L 243.9 168.1 L 239.8 164.0 Z"/&gt;
&lt;path class="mk" d="M 324.3 112.7 L 328.4 116.8 L 324.3 120.9 L 320.2 116.8 Z"/&gt;
&lt;path class="mk" d="M 406.4 64.6 L 410.5 68.7 L 406.4 72.8 L 402.3 68.7 Z"/&gt;
&lt;/g&gt;
&lt;g class="s-ds-g24"&gt;
&lt;text class="slabel" x="414.4" y="72.9"&gt;DeepSeek G=24 + tpp-eff (Tian)&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s-sw-eff"&gt;
&lt;text class="slabel" x="426.0" y="103.4"&gt;Switch + tpp-eff (Ludz)&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s-ds-g4"&gt;
&lt;text class="slabel" x="418.3" y="132.5"&gt;DeepSeek G=4 + tpp-eff (Tian)&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s-sw-act"&gt;
&lt;text class="slabel" x="665.7" text-anchor="end" y="202.1"&gt;Switch + tpp-act 315 (Clark)&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s-sw-eff"&gt;
&lt;text class="slabel" x="422.2" y="231.5"&gt;Switch + tpp-eff, extrapolated (Tian)&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s-sw-act"&gt;
&lt;text class="slabel" x="429.9" y="261.9"&gt;Switch + tpp-act 20 (Ludz)&lt;/text&gt;
&lt;/g&gt;
&lt;/svg&gt;
&lt;figcaption&gt;MoE uplift at different activation ratios measured for Switch-style and DeepSeek-style MoE architectures at different tokens-per-parameter regimes scaled with either active (tpp-act) or effective (tpp-eff) model size.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;That picture illustrates what those three studies can tell us about MoE uplift in the first two eras of my MoE history above. Using the 9% activation ratio point as a reference:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;em&gt;Switch-style&lt;/em&gt; architecture and training recipe provides about 1.5x uplift at Chinchilla-optimal tpp=20 training and about 2.0x with stronger overtraining at tpp=315. Scaling data volume with $N_{eff}$ instead of $N_{a}$ puts it at 2.2x - 2.4x even in the Chinchilla regime.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;DeepSeek-style&lt;/em&gt; architecture with fine-grained and shared experts improves upon that, landing at 2.7x - 3.1x uplift with $N_{eff}$-based compute-optimal data scaling.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So clearly, from the first to the second era, the MoE benefit as measured by uplift increased and we can attribute it to DeepSeek&amp;rsquo;s architecture innovations. But beyond that, the existing data unfortunately cannot tell us much more, since there are no controlled studies that ablate every single decision (e.g. granularity without shared expert, Switch but no z-loss). As far as I know, those three are the only studies usable for our purpose here.&lt;sup id="fnref:6"&gt;&lt;a href="#fn:6" class="footnote-ref" role="doc-noteref"&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h3 id="released-models"&gt;Released models&lt;/h3&gt;
&lt;p&gt;A second data source for uplift is released models with their benchmark numbers. But, we can only use that data to measure uplift if a model family comes with both dense and MoE models, and with enough of them on the dense side to have a scaling law to map the MoE quality against. Such a comparison is somewhat clean, as models of the same family usually share a common backbone architecture and use the same training data, so we can attribute the difference to MoE&amp;rsquo;s sparsity and routing, but it remains less clean than the previously discussed scaling studies, especially because released models often don&amp;rsquo;t even disclose all relevant details.&lt;/p&gt;
&lt;p&gt;I use the following methodology: Given an MoE and multiple dense models from a model family, fit a function from $log_{10}(N)$ to score across the dense points, invert it at the MoE&amp;rsquo;s score and use the resulting $N_{eff}$ to compute uplift. I say score, because these models typically don&amp;rsquo;t report perplexities but accuracies on benchmarks. That&amp;rsquo;s why I do it per benchmark reported for both dense and MoE and then take the median out of these uplift factors. The MoE needs to score in between the dense points (to not land in the extrapolation region of the dense fit) and I skip benchmarks that are close to saturated (dense fit not improving at least 8 points across 10x parameters).&lt;sup id="fnref:7"&gt;&lt;a href="#fn:7" class="footnote-ref" role="doc-noteref"&gt;7&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;In fact, although plenty of models were released over the past years, many as open models (see the history section above), not many satisfy the requirement of having both MoEs and comparable dense models in a family. I found these to be usable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GLaM (12/2021)&lt;/strong&gt;: GLaM was trained by Google in 2021, and since this was the research era, it is strictly speaking not a released model of course, as only the paper was published. It comes with a 4-point dense ladder from 130M to 137B parameters, matching MoEs at 1.7B and 8B active and using top-2 routing over 64 experts every other layer with full-sized experts. A typical Switch-style recipe, though with top-2 routing instead of top-1, similar to the earlier GShard. The uplift factor computed for it is &lt;em&gt;1.80-1.92&lt;/em&gt;, with the caveat that the paper only reports already aggregated benchmark scores rather than individual ones.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Artetxe et al. (12/2021)&lt;/strong&gt;: This one is also a paper of the research era, similarly featuring four dense models with one suitable MoE that we can match against them. Different from the rest, it reports perplexities, so we can handle it akin to the scaling studies. The MoE is similar to GLaM, top-2, every other layer, and particularly sparse with 512 full-sized experts. The resulting uplift factor is &lt;em&gt;1.76&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DeepSeekMoE (01/2024)&lt;/strong&gt;: This data point is the first DeepSeek-style one, from the very paper that introduced it. Fine-grained experts with granularity 4, 64 routed experts in total, 6 active, plus 2 shared experts, in every layer but the first. The limitation is that the dense side has only two points, 7B and 67B, between which the MoE with 2.8B active lands. That means any uplift we can measure here is at least 2.5 and benchmarks with lower factors cannot be captured. The uplift, under these caveats, lands at &lt;em&gt;3.86&lt;/em&gt; as the median of 5 benchmarks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qwen 3 (04/2025)&lt;/strong&gt;: This is the cleanest data point, the dense ladder has six rungs, the 30B-A3B MoE lands within that range, data is the same, hyperparameters were tuned on either side. The architecture is as already mentioned earlier in the post: 128 experts, top-8, no shared expert, global batch load balancing via auxiliary loss, every layer MoE. The uplift of that recipe ends up being &lt;em&gt;5.3&lt;/em&gt; as the median of 12 benchmarks. All benchmarks measured on the base models (pretraining only).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qwen 3.5 (02/2026)&lt;/strong&gt;: Qwen 3.5 is similar to 3, except that I could only find results for the posttrained version of the models. Again, only the smallest MoE can be used because only that falls into the range covered by the dense ladder, it uses 256 experts, now also a shared one, and otherwise the same setup as Qwen 3 (when it comes to MoE). Here the resulting uplift factor is &lt;em&gt;6.47&lt;/em&gt; across 18 benchmarks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gemma 4 (04/2026)&lt;/strong&gt;: Gemma is similar to the Qwen 3.5 case: we also need to rely on posttraining numbers, and in addition, the dense side has only two data points. And worse, one of them even differs more by using a different multi-modal stack. The MoE architecture is similar to the other two, 128 experts, top-8, wide shared expert, unknown balancing. The uplift is &lt;em&gt;5.63&lt;/em&gt; across 10 benchmarks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Despite the limited number of suitable models, we have good coverage of the eras: Two examples of Switch-style MoEs from the research era (GLaM and Artetxe), one example of DeepSeek-style models from the ChatGPT/Llama-era (DeepSeek-MoE itself) and three examples from the most recent era (Qwen 3, 3.5 and Gemma). This is how it looks when placing the six uplift factors at their sparsity points in (a slightly simplified version of) the previous plot:&lt;/p&gt;
&lt;figure&gt;&lt;svg aria-label="Uplift versus activation ratio in three controlled MoE scaling studies, with released models as points" class="moe-chart" viewBox="0 0 700 470" xmlns="http://www.w3.org/2000/svg" role="img"&gt;
&lt;style&gt;.moe-chart{font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}.moe-chart .axis{stroke:var(--border,#e5e7eb);stroke-width:1.2}.moe-chart .dot{fill:currentColor;stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .dotu{fill:var(--bg,#fff);stroke:currentColor;stroke-width:1.6}.moe-chart .slabel{fill:currentColor;font-size:12.5px}.moe-chart .grid{stroke:var(--border,#e5e7eb);stroke-width:1}.moe-chart .tick{fill:var(--text-muted,#6b7280);font-size:13px}.moe-chart .atitle{fill:var(--text,#1a1a1a);font-size:14px}.moe-chart .series{fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .ref{fill:none;stroke:var(--text-light,#9ca3af);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .refdot{fill:var(--text-light,#9ca3af);stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .hit{fill:transparent;stroke:none;pointer-events:all;cursor:crosshair}.moe-chart .leader{stroke:currentColor;stroke-width:1;opacity:.55}.moe-chart .reflabel{fill:var(--text-muted,#6b7280);font-size:12.5px}.moe-chart .rng{stroke:currentColor;stroke-width:2;stroke-linecap:round}.moe-chart .mk{fill:currentColor;stroke:var(--bg,#fff);stroke-width:1.2}.moe-chart .mkhalo{fill:none;stroke:var(--bg,#fff);stroke-width:3}.moe-chart .slabel2{fill:currentColor;font-size:11px;opacity:.75}.moe-chart .slabel,.moe-chart .slabel2{paint-order:stroke;stroke:var(--bg,#fcfcfb);stroke-width:3.2;stroke-linejoin:round}.moe-chart .s-sw-act{color:#17406f}.moe-chart .s-sw-eff{color:#4f8fd0}.moe-chart .s-ds-g4{color:#3fbf9b}.moe-chart .s-ds-g24{color:#0b6f55}@media (prefers-color-scheme:dark){.moe-chart .s-sw-act{color:#cfe1f5}.moe-chart .s-sw-eff{color:#7fb0e2}.moe-chart .s-ds-g4{color:#7ddcbd}.moe-chart .s-ds-g24{color:#2fa583}}&lt;/style&gt;
&lt;g&gt;
&lt;line class="grid" x1="60.0" y1="417.4" x2="666.0" y2="417.4"/&gt;
&lt;text class="tick" x="51.0" y="421.4" text-anchor="end"&gt;1x&lt;/text&gt;
&lt;line class="grid" x1="60.0" y1="351.6" x2="666.0" y2="351.6"/&gt;
&lt;text class="tick" x="51.0" y="355.6" text-anchor="end"&gt;2x&lt;/text&gt;
&lt;line class="grid" x1="60.0" y1="285.8" x2="666.0" y2="285.8"/&gt;
&lt;text class="tick" x="51.0" y="289.8" text-anchor="end"&gt;3x&lt;/text&gt;
&lt;line class="grid" x1="60.0" y1="220.0" x2="666.0" y2="220.0"/&gt;
&lt;text class="tick" x="51.0" y="224.0" text-anchor="end"&gt;4x&lt;/text&gt;
&lt;line class="grid" x1="60.0" y1="154.2" x2="666.0" y2="154.2"/&gt;
&lt;text class="tick" x="51.0" y="158.2" text-anchor="end"&gt;5x&lt;/text&gt;
&lt;line class="grid" x1="60.0" y1="88.4" x2="666.0" y2="88.4"/&gt;
&lt;text class="tick" x="51.0" y="92.4" text-anchor="end"&gt;6x&lt;/text&gt;
&lt;line class="grid" x1="60.0" y1="22.6" x2="666.0" y2="22.6"/&gt;
&lt;text class="tick" x="51.0" y="26.6" text-anchor="end"&gt;7x&lt;/text&gt;
&lt;/g&gt;
&lt;line class="axis" x1="60.0" y1="424.0" x2="666.0" y2="424.0"/&gt;
&lt;line class="axis" x1="60.0" y1="16.0" x2="60.0" y2="424.0"/&gt;
&lt;line class="axis" x1="74.8" y1="424.0" x2="74.8" y2="428.0"/&gt;
&lt;text class="tick" x="74.8" y="442.0" text-anchor="middle"&gt;75%&lt;/text&gt;
&lt;line class="axis" x1="122.6" y1="424.0" x2="122.6" y2="428.0"/&gt;
&lt;text class="tick" x="122.6" y="442.0" text-anchor="middle"&gt;50%&lt;/text&gt;
&lt;line class="axis" x1="182.9" y1="424.0" x2="182.9" y2="428.0"/&gt;
&lt;text class="tick" x="182.9" y="442.0" text-anchor="middle"&gt;30%&lt;/text&gt;
&lt;line class="axis" x1="249.9" y1="424.0" x2="249.9" y2="428.0"/&gt;
&lt;text class="tick" x="249.9" y="442.0" text-anchor="middle"&gt;17%&lt;/text&gt;
&lt;line class="axis" x1="327.6" y1="424.0" x2="327.6" y2="428.0"/&gt;
&lt;text class="tick" x="327.6" y="442.0" text-anchor="middle"&gt;8.8%&lt;/text&gt;
&lt;line class="axis" x1="406.7" y1="424.0" x2="406.7" y2="428.0"/&gt;
&lt;text class="tick" x="406.7" y="442.0" text-anchor="middle"&gt;4.5%&lt;/text&gt;
&lt;line class="axis" x1="485.9" y1="424.0" x2="485.9" y2="428.0"/&gt;
&lt;text class="tick" x="485.9" y="442.0" text-anchor="middle"&gt;2.3%&lt;/text&gt;
&lt;line class="axis" x1="562.7" y1="424.0" x2="562.7" y2="428.0"/&gt;
&lt;text class="tick" x="562.7" y="442.0" text-anchor="middle"&gt;1.2%&lt;/text&gt;
&lt;line class="axis" x1="644.5" y1="424.0" x2="644.5" y2="428.0"/&gt;
&lt;text class="tick" x="644.5" y="442.0" text-anchor="middle"&gt;0.6%&lt;/text&gt;
&lt;text class="atitle" x="363.0" y="462.0" text-anchor="middle"&gt;Activation ratio (sparser →)&lt;/text&gt;
&lt;text class="atitle" x="15" y="220.0" text-anchor="middle" transform="rotate(-90 15 220.0)"&gt;Uplift&lt;/text&gt;
&lt;g class="s-sw-act"&gt;
&lt;line class="rng" x1="80.5" y1="415.4" x2="80.5" y2="405.6"/&gt;
&lt;circle class="hit" cx="80.5" cy="410.7" r="8"&gt;&lt;title&gt;Switch + tpp-act 315 - 75% activation - 1.03x to 1.18x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="128.3" y1="402.9" x2="128.3" y2="392.4"/&gt;
&lt;circle class="hit" cx="128.3" cy="397.8" r="8"&gt;&lt;title&gt;Switch + tpp-act 315 - 50% activation - 1.22x to 1.38x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="188.6" y1="391.8" x2="188.6" y2="377.9"/&gt;
&lt;circle class="hit" cx="188.6" cy="385.1" r="8"&gt;&lt;title&gt;Switch + tpp-act 315 - 30% activation - 1.39x to 1.60x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="257.7" y1="376.6" x2="257.7" y2="359.5"/&gt;
&lt;circle class="hit" cx="257.7" cy="368.4" r="8"&gt;&lt;title&gt;Switch + tpp-act 315 - 16.7% activation - 1.62x to 1.88x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="333.3" y1="358.2" x2="333.3" y2="337.1"/&gt;
&lt;circle class="hit" cx="333.3" cy="348.1" r="8"&gt;&lt;title&gt;Switch + tpp-act 315 - 8.8% activation - 1.90x to 2.22x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="412.4" y1="341.7" x2="412.4" y2="316.1"/&gt;
&lt;circle class="hit" cx="412.4" cy="329.4" r="8"&gt;&lt;title&gt;Switch + tpp-act 315 - 4.5% activation - 2.15x to 2.54x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="491.6" y1="323.3" x2="491.6" y2="295.7"/&gt;
&lt;circle class="hit" cx="491.6" cy="310.0" r="8"&gt;&lt;title&gt;Switch + tpp-act 315 - 2.3% activation - 2.43x to 2.85x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="568.4" y1="309.5" x2="568.4" y2="277.9"/&gt;
&lt;circle class="hit" cx="568.4" cy="294.4" r="8"&gt;&lt;title&gt;Switch + tpp-act 315 - 1.2% activation - 2.64x to 3.12x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="650.2" y1="300.9" x2="650.2" y2="264.1"/&gt;
&lt;circle class="hit" cx="650.2" cy="283.4" r="8"&gt;&lt;title&gt;Switch + tpp-act 315 - 0.6% activation - 2.77x to 3.33x&lt;/title&gt;&lt;/circle&gt;
&lt;path class="series" d="M 80.5 410.7 L 128.3 397.8 L 188.6 385.1 L 257.7 368.4 L 333.3 348.1 L 412.4 329.4 L 491.6 310.0 L 568.4 294.4 L 650.2 283.4"/&gt;
&lt;circle class="mk" cx="80.5" cy="410.7" r="3.2"/&gt;
&lt;circle class="mk" cx="128.3" cy="397.8" r="3.2"/&gt;
&lt;circle class="mk" cx="188.6" cy="385.1" r="3.2"/&gt;
&lt;circle class="mk" cx="257.7" cy="368.4" r="3.2"/&gt;
&lt;circle class="mk" cx="333.3" cy="348.1" r="3.2"/&gt;
&lt;circle class="mk" cx="412.4" cy="329.4" r="3.2"/&gt;
&lt;circle class="mk" cx="491.6" cy="310.0" r="3.2"/&gt;
&lt;circle class="mk" cx="568.4" cy="294.4" r="3.2"/&gt;
&lt;circle class="mk" cx="650.2" cy="283.4" r="3.2"/&gt;
&lt;/g&gt;
&lt;g class="s-sw-act"&gt;
&lt;line class="rng" x1="104.8" y1="412.2" x2="104.8" y2="411.5"/&gt;
&lt;circle class="hit" cx="104.8" cy="411.8" r="8"&gt;&lt;title&gt;Switch + tpp-act 20 - 59.1% activation - 1.08x to 1.09x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="175.3" y1="406.2" x2="175.3" y2="403.6"/&gt;
&lt;circle class="hit" cx="175.3" cy="404.9" r="8"&gt;&lt;title&gt;Switch + tpp-act 20 - 32.5% activation - 1.17x to 1.21x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="251.1" y1="397.7" x2="251.1" y2="393.1"/&gt;
&lt;circle class="hit" cx="251.1" cy="395.4" r="8"&gt;&lt;title&gt;Switch + tpp-act 20 - 17.1% activation - 1.30x to 1.37x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="329.8" y1="387.8" x2="329.8" y2="381.2"/&gt;
&lt;circle class="hit" cx="329.8" cy="384.6" r="8"&gt;&lt;title&gt;Switch + tpp-act 20 - 8.78% activation - 1.45x to 1.55x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="410.0" y1="376.6" x2="410.0" y2="366.7"/&gt;
&lt;circle class="hit" cx="410.0" cy="371.8" r="8"&gt;&lt;title&gt;Switch + tpp-act 20 - 4.45% activation - 1.62x to 1.77x&lt;/title&gt;&lt;/circle&gt;
&lt;path class="series" d="M 104.8 411.8 L 175.3 404.9 L 251.1 395.4 L 329.8 384.6 L 410.0 371.8"/&gt;
&lt;circle class="mk" cx="104.8" cy="411.8" r="3.2"/&gt;
&lt;circle class="mk" cx="175.3" cy="404.9" r="3.2"/&gt;
&lt;circle class="mk" cx="251.1" cy="395.4" r="3.2"/&gt;
&lt;circle class="mk" cx="329.8" cy="384.6" r="3.2"/&gt;
&lt;circle class="mk" cx="410.0" cy="371.8" r="3.2"/&gt;
&lt;/g&gt;
&lt;g class="s-ds-g4"&gt;
&lt;line class="rng" x1="247.3" y1="340.4" x2="247.3" y2="316.1"/&gt;
&lt;circle class="hit" cx="247.3" cy="328.7" r="8"&gt;&lt;title&gt;DeepSeek G=4 - 17.1% activation - 2.17x to 2.54x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="326.0" y1="323.3" x2="326.0" y2="290.4"/&gt;
&lt;circle class="hit" cx="326.0" cy="307.6" r="8"&gt;&lt;title&gt;DeepSeek G=4 - 8.78% activation - 2.43x to 2.93x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="406.2" y1="305.5" x2="406.2" y2="264.7"/&gt;
&lt;circle class="hit" cx="406.2" cy="286.2" r="8"&gt;&lt;title&gt;DeepSeek G=4 - 4.45% activation - 2.70x to 3.32x&lt;/title&gt;&lt;/circle&gt;
&lt;path class="series" d="M 247.3 328.7 L 326.0 307.6 L 406.2 286.2"/&gt;
&lt;path class="mk" d="M 247.3 324.6 L 251.4 328.7 L 247.3 332.8 L 243.2 328.7 Z"/&gt;
&lt;path class="mk" d="M 326.0 303.5 L 330.1 307.6 L 326.0 311.7 L 321.9 307.6 Z"/&gt;
&lt;path class="mk" d="M 406.2 282.1 L 410.3 286.2 L 406.2 290.3 L 402.1 286.2 Z"/&gt;
&lt;/g&gt;
&lt;g class="s-ds-g24"&gt;
&lt;line class="rng" x1="243.5" y1="324.6" x2="243.5" y2="297.7"/&gt;
&lt;circle class="hit" cx="243.5" cy="311.7" r="8"&gt;&lt;title&gt;DeepSeek G=24 - 17.1% activation - 2.41x to 2.82x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="322.2" y1="299.0" x2="322.2" y2="262.1"/&gt;
&lt;circle class="hit" cx="322.2" cy="281.4" r="8"&gt;&lt;title&gt;DeepSeek G=24 - 8.78% activation - 2.80x to 3.36x&lt;/title&gt;&lt;/circle&gt;
&lt;line class="rng" x1="402.4" y1="273.3" x2="402.4" y2="225.3"/&gt;
&lt;circle class="hit" cx="402.4" cy="250.5" r="8"&gt;&lt;title&gt;DeepSeek G=24 - 4.45% activation - 3.19x to 3.92x&lt;/title&gt;&lt;/circle&gt;
&lt;path class="series" d="M 243.5 311.7 L 322.2 281.4 L 402.4 250.5"/&gt;
&lt;path class="mk" d="M 243.5 307.6 L 247.6 311.7 L 243.5 315.8 L 239.4 311.7 Z"/&gt;
&lt;path class="mk" d="M 322.2 277.3 L 326.3 281.4 L 322.2 285.5 L 318.1 281.4 Z"/&gt;
&lt;path class="mk" d="M 402.4 246.4 L 406.5 250.5 L 402.4 254.6 L 398.3 250.5 Z"/&gt;
&lt;/g&gt;
&lt;g class="s-sw-act"&gt;
&lt;circle class="mkhalo" cx="354.6" cy="364.8" r="6.4"/&gt;
&lt;circle class="mk" cx="354.6" cy="364.8" r="3.2"/&gt;
&lt;circle class="hit" cx="354.6" cy="364.8" r="9"&gt;&lt;title&gt;GLaM 1.7B/64E (12/21, G=1) - 7% activation - 1.80x&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="s-sw-act"&gt;
&lt;circle class="mkhalo" cx="584.2" cy="367.4" r="6.4"/&gt;
&lt;circle class="mk" cx="584.2" cy="367.4" r="3.2"/&gt;
&lt;circle class="hit" cx="584.2" cy="367.4" r="9"&gt;&lt;title&gt;Artetxe MoE-15B (12/21, G=1) - 1% activation - 1.76x&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="s-ds-g24"&gt;
&lt;circle class="mkhalo" cx="249.2" cy="229.2" r="6.4"/&gt;
&lt;path class="mk" d="M 249.2 225.1 L 253.3 229.2 L 249.2 233.3 L 245.1 229.2 Z"/&gt;
&lt;circle class="hit" cx="249.2" cy="229.2" r="9"&gt;&lt;title&gt;DeepSeekMoE-16B (01/24, G=4) - 17.1% activation - 3.86x&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="s-ds-g24"&gt;
&lt;circle class="mkhalo" cx="303.4" cy="133.8" r="6.4"/&gt;
&lt;path class="mk" d="M 303.4 129.7 L 307.5 133.8 L 303.4 137.9 L 299.3 133.8 Z"/&gt;
&lt;circle class="hit" cx="303.4" cy="133.8" r="9"&gt;&lt;title&gt;Qwen3-30B-A3B (04/25, G=8) - 10.8% activation - 5.31x&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="s-ds-g24"&gt;
&lt;circle class="mkhalo" cx="330.3" cy="57.5" r="6.4"/&gt;
&lt;path class="mk" d="M 330.3 53.4 L 334.4 57.5 L 330.3 61.6 L 326.2 57.5 Z"/&gt;
&lt;circle class="hit" cx="330.3" cy="57.5" r="9"&gt;&lt;title&gt;Qwen3.5-35B-A3B (02/26, G=12) - 8.6% activation - 6.47x&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="s-ds-g24"&gt;
&lt;circle class="mkhalo" cx="261.6" cy="112.7" r="6.4"/&gt;
&lt;path class="mk" d="M 261.6 108.6 L 265.7 112.7 L 261.6 116.8 L 257.5 112.7 Z"/&gt;
&lt;circle class="hit" cx="261.6" cy="112.7" r="9"&gt;&lt;title&gt;Gemma 4 26B-A4B (04/26, G=16) - 15.4% activation - 5.63x&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="s-ds-g24"&gt;
&lt;text class="slabel" x="410.4" y="254.7"&gt;DeepSeek G=24&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s-ds-g4"&gt;
&lt;text class="slabel" x="414.2" y="286.4"&gt;DeepSeek G=4&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s-sw-act"&gt;
&lt;text class="slabel" x="648.2" text-anchor="end" y="329.6"&gt;Switch + tpp-act 315&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s-sw-act"&gt;
&lt;text class="slabel" x="418.0" y="376.0"&gt;Switch + tpp-act 20&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s-ds-g24"&gt;
&lt;text class="slabel" x="338.3" y="56.5"&gt;Qwen3.5-35B-A3B&lt;/text&gt;
&lt;text class="slabel2" x="338.3" y="69.5"&gt;02/26, G=12&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s-ds-g24"&gt;
&lt;text class="slabel" x="269.6" y="111.7"&gt;Gemma 4 26B-A4B&lt;/text&gt;
&lt;text class="slabel2" x="269.6" y="124.7"&gt;04/26, G=16&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s-ds-g24"&gt;
&lt;text class="slabel" x="311.4" y="148.8"&gt;Qwen3-30B-A3B&lt;/text&gt;
&lt;text class="slabel2" x="311.4" y="161.8"&gt;04/25, G=8&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s-ds-g24"&gt;
&lt;text class="slabel" x="257.2" y="228.2"&gt;DeepSeekMoE-16B&lt;/text&gt;
&lt;text class="slabel2" x="257.2" y="241.2"&gt;01/24, G=4&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s-sw-act"&gt;
&lt;text class="slabel" x="352.6" text-anchor="end" y="363.8"&gt;GLaM 1.7B/64E&lt;/text&gt;
&lt;text class="slabel2" x="352.6" text-anchor="end" y="376.8"&gt;12/21, G=1&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s-sw-act"&gt;
&lt;text class="slabel" x="592.2" y="366.4"&gt;Artetxe MoE-15B&lt;/text&gt;
&lt;text class="slabel2" x="592.2" y="379.4"&gt;12/21, G=1&lt;/text&gt;
&lt;/g&gt;
&lt;/svg&gt;
&lt;figcaption&gt;The six released MoEs placed at their activation ratio and measured uplift next to (a subset of) the uplift factors derived from scaling studies. From Switch-style to DeepSeek-style and with increasing granularity, the uplift increases significantly.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;What can we see? The two era 1 data points, GLaM and Artetxe, fall into the range that the scaling studies already established for Switch-style MoEs. DeepSeek-MoE from era 2 lands above that, as predicted by the scaling studies for fine-grained models, and shows even higher uplift at G=4 than Tian&amp;rsquo;s study, which most likely is due to higher overtraining. The most recent era 3 models bring uplift to new heights, with 6.5 for Qwen 3.5, and I attribute that to both overtraining and increased granularity. The MoE architecture and training recipe itself, apart from the granularity, is not different from the original DeepSeek after all. And that&amp;rsquo;s probably the most interesting finding of this data: While the last two years brought almost no new architecture or training innovations to the MoE setup, uplift still improved, indicating that the labs at least managed to squeeze more out of that established setup.&lt;/p&gt;
&lt;p&gt;That being said, these data points are also only somewhat reliable, for one because they rely on a particular selection of benchmarks that differs from model to model (but is consistent within the dense-MoE-family of course), second because we compare pretrained and posttrained models in some cases, and third we compare uplifts computed against perplexities with uplifts against benchmark accuracies. What is not a confound here though is the fact that models got better by other means (e.g. better data, attention, optimization, posttraining) since that tends to benefit both dense models and MoEs equally and therefore largely cancels out in the uplift.&lt;/p&gt;
&lt;h2 id="which-changes-matter"&gt;Which changes matter?&lt;/h2&gt;
&lt;p&gt;While uplift factors are a nice concept and we could collect them from quite a few sources, they still leave many questions unanswered. They simply don&amp;rsquo;t exist for all small single-factor ablations that we would want to have to judge all the MoE architectures and training recipes proposed over the years. Given those gaps in the data, here&amp;rsquo;s a more opinionated review, based on the existing data, adoption across the model landscape and personal experience:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is here to stay:&lt;/strong&gt; Expert granularity is undeniably the concept with the strongest positive evidence that was also adopted across the board. For shared experts, it&amp;rsquo;s a bit weaker, and the interaction with the MoE layer placement, as also pointed out in the MAI Thinking report, might have contributed to that lack of clarity. For all layers (but the first) MoE models, shared experts are adopted by the majority.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What disappeared:&lt;/strong&gt; Using MoEs in every nth layer, instead of all of them, was popular in the research era but has mostly disappeared lately. I&amp;rsquo;m not sure though if there are strong reasons against it; after all, it makes shared experts unnecessary and it provides more design flexibility by decoupling depth from sparsity. What definitely disappeared, probably due to the effectiveness of fine-grained experts, is increasing top-k independent of that, such as the top-2 with full-sized experts as in GShard, GLaM and ST-MoE. Token dropping is typically avoided as much as possible nowadays. And expert choice, given its shortcomings, never really got adopted in language modeling.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What&amp;rsquo;s less clear:&lt;/strong&gt; Token balancing remains crucial, but no single method dominates. While BASE&amp;rsquo;s linear assignment and Clark&amp;rsquo;s Sinkhorn mostly disappeared, the auxiliary loss as well as DeepSeek&amp;rsquo;s expert biases are both actively used. Both, or even all four, can be effective if used at the right token scope, which is the more important factor. I discuss that particular topic in-depth in this &lt;a href="https://tobiasfalke.com/blog/moe-testbed-part2/"&gt;post&lt;/a&gt;. What&amp;rsquo;s less clear is if initial dense layers, or fixed routed MoE layers as in the recent DeepSeek, are needed, and if so, how many of them. Models still vary in this regard. And similarly, both softmax and sigmoid, and even other activation functions, are still used for the router.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What&amp;rsquo;s next?&lt;/h2&gt;
&lt;p&gt;Given all that, the history of models and methods, the changes in uplift that we could measure, and my verdict on the methods above, one might ask what&amp;rsquo;s next for MoEs. One possible answer, supported by the most recent developments, would be &amp;ldquo;nothing at all&amp;rdquo;. While there is still a plethora of academic papers being published on MoE architecture and training, very little has found adoption in recent LLMs, and as I argued above, most details have not changed since DeepSeek-MoE almost three years ago. I&amp;rsquo;m very much looking forward to the paper that shows us how to obtain 10x or 20x uplift, but maybe that simply never comes and with what we have right now the potential of MoEs is fully leveraged already. Given the increasing focus on other aspects in recent years, such as efficient long-context attention methods or increased depth-wise information flow (e.g. mHC, attention residuals), this might turn out to be true.&lt;/p&gt;
&lt;p&gt;That being said, there are two related threads worth watching since they both bring in forms of sparsity in other parts of the model: First, extra embedding tables. Since an embedding is merely a lookup operation, it is sparse in the sense of every token just engaging with its own parameter row, and in terms of FLOPs even better than MoEs since a lookup requires no FLOPs at all. Gemma 3n, later &lt;a href="https://arxiv.org/abs/2607.02770" target="_blank" rel="noopener noreferrer"&gt;Gemma 4&lt;/a&gt;, and also &lt;a href="https://arxiv.org/abs/2601.10639" target="_blank" rel="noopener noreferrer"&gt;STEM&lt;/a&gt; added a table per layer. DeepSeek&amp;rsquo;s &lt;a href="https://arxiv.org/abs/2601.07372" target="_blank" rel="noopener noreferrer"&gt;Engram&lt;/a&gt; extended the idea from unigrams to n-grams, which DeepSeek V4.1 adopted. And second, looping. Varying the depth of a network per token is an old idea already explored with RNNs, e.g. by &lt;a href="https://arxiv.org/abs/1603.08983" target="_blank" rel="noopener noreferrer"&gt;Graves (2016)&lt;/a&gt;, and later integrated into transformers as &lt;a href="https://arxiv.org/abs/1807.03819" target="_blank" rel="noopener noreferrer"&gt;Universal Transformers&lt;/a&gt;. At the time, this was typically framed as adaptive compute or early exit to save compute on simpler inputs. But, the very same idea can also be used to increase compute dynamically. While MoEs add extra parameters at constant FLOPs, looping adds extra FLOPs at constant parameters. Two recent papers that look at this are &lt;a href="https://arxiv.org/abs/2605.09165" target="_blank" rel="noopener noreferrer"&gt;Lee et al. (2026)&lt;/a&gt; and &lt;a href="https://arxiv.org/abs/2609.01343" target="_blank" rel="noopener noreferrer"&gt;Wang et al. (2026)&lt;/a&gt;. Looping becomes particularly powerful when combined with MoEs: While a looped dense transformer can only repeatedly apply a fixed learned function, a looped MoE, since it routes based on input representations, can apply a different computation at each iteration of the loop even though the parameters are reused.&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;As I argued in &lt;a href="https://tobiasfalke.com/blog/single-paper-claims/"&gt;a previous post&lt;/a&gt;, this is often only fully clear in retrospect.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;But, crucially, at global batch scope, as I discussed &lt;a href="https://tobiasfalke.com/blog/moe-testbed-part2/"&gt;here&lt;/a&gt;.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;The main difference from Switch is using Sinkhorn instead of the balancing auxiliary loss, but as I show in &lt;a href="https://tobiasfalke.com/blog/moe-testbed-part2/"&gt;this post&lt;/a&gt;, that makes only a minor difference when controlling for scope. Clark et al. also test hash routing and RL-based routing, but those diverge more from typical settings of that era.&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;It used the auxiliary loss for balancing as Switch-Transformers did instead of Clark&amp;rsquo;s Sinkhorn. But, it also differed by using MoEs in every layer and adding router z-loss.&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;More precisely, each dense and MoE model is trained for the compute-optimal data volume given its active parameters, as defined by the scaling law. That is close to a Chinchilla-style constant tokens-per-parameter ratio against the effective size, but not equivalent.&amp;#160;&lt;a href="#fnref:5" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:6"&gt;
&lt;p&gt;Similar studies were done by &lt;a href="https://arxiv.org/abs/2402.07871" target="_blank" rel="noopener noreferrer"&gt;Krajewski et al. (2024)&lt;/a&gt; and &lt;a href="https://arxiv.org/abs/2501.12370" target="_blank" rel="noopener noreferrer"&gt;Abnar et al. (2025)&lt;/a&gt; but they did not release their raw data as Clark did nor can their fitted scaling functions be inverted to map from dense to MoEs as they are not well-conditioned for this use case, leading to vastly changing uplift factors with even tiny input changes.&amp;#160;&lt;a href="#fnref:6" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:7"&gt;
&lt;p&gt;With that filter, using a linear fit is reasonable, otherwise, a sigmoidal fit is typically used when trying to capture the full score range.&amp;#160;&lt;a href="#fnref:7" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Why I don't trust any single paper's claims</title><link>https://tobiasfalke.com/blog/single-paper-claims/</link><pubDate>Wed, 12 Aug 2026 00:00:00 +0000</pubDate><guid>https://tobiasfalke.com/blog/single-paper-claims/</guid><description>&lt;p&gt;This recent post on X reminded me of an article I always wanted to write about how to read and interpret published papers and their claims appropriately:&lt;/p&gt;
&lt;figure class="social-quote"&gt;
&lt;blockquote cite="https://x.com/kellerjordan0/status/2084721463089902074"&gt;PSA: Most biglab people now read almost zero papers and understand ICLR/ICML/NeurIPS to be mainly full
of overclaims &amp;amp; fraud. (but there are a few diamonds in the rough of course)&lt;/blockquote&gt;
&lt;figcaption&gt;
&lt;svg class="social-mark" viewBox="0 0 1200 1227" aria-hidden="true" focusable="false"&gt;&lt;path d="M714.163 519.284 1160.89 0h-105.86L667.137 450.887 357.328 0H0l468.492 681.821L0 1226.37h105.866l409.625-476.152 327.181 476.152H1200L714.137 519.284h.026ZM569.165 687.828l-47.468-67.894L144.011 79.694h162.604l304.797 435.991 47.468 67.894 396.2 566.721H892.476L569.165 687.854v-.026Z"/&gt;&lt;/svg&gt;
&lt;span&gt;Keller Jordan &lt;span class="social-handle"&gt;@kellerjordan0&lt;/span&gt;, 4 August 2026 &amp;middot; &lt;a href="https://x.com/kellerjordan0/status/2084721463089902074" rel="nofollow noopener"&gt;original post&lt;/a&gt;&lt;/span&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;While the fraud part probably (hopefully) applies to just a small minority of papers, the overclaiming issue is indeed a large problem. The topic often comes up when discussing papers with people newer to the field, in particular interns, so I always wanted to write down my thinking about this issue and how I approach it.&lt;/p&gt;
&lt;p&gt;The core problem is that a lot of papers published at ML conferences, at least in my field, express their findings in much more general terms than the actual experimental evidence warrants, making the naive reader, such as the inexperienced intern, who takes those claims literally, overestimate their importance and validity. I had cases where interns literally made statements like &amp;ldquo;why would anyone not use method X given that paper Y showed it is the best&amp;rdquo;. In this post, I&amp;rsquo;ll argue why it is almost never the case that a single paper showing that some X is superior to alternatives does so in a way that this question would be fully settled for the future.&lt;/p&gt;
&lt;p&gt;As a disclaimer, my experience is primarily from the LLM training literature. Other fields, even closely related topics within ML/AI, might not have this issue to the same degree, since it depends on the publishing/reviewing customs and the nature of the experiments.&lt;/p&gt;
&lt;h2 id="the-quantitative-gap"&gt;The quantitative gap&lt;/h2&gt;
&lt;p&gt;Let me start by illustrating the problem quantitatively. Over the last few years, I worked primarily on mixture of experts (MoE) architectures and training recipes. If you query arXiv for papers mentioning &amp;ldquo;mixture of experts&amp;rdquo; in the abstract, there are 2959 in the last three years, and 975 that have both &amp;ldquo;mixture of experts&amp;rdquo; and &amp;ldquo;routing&amp;rdquo; in the abstract (which makes it more likely they discuss new architectures and training recipes, as opposed to being just applications). All papers that propose something new, a slightly different architecture, new routing method, new auxiliary loss, etc., come with experiments that show their proposed method outperforms the established methods. If that evidence didn&amp;rsquo;t exist, the paper wouldn&amp;rsquo;t be published at all.&lt;/p&gt;
&lt;p&gt;And yet, while those proposed methods are presumably all beneficial, the changes that really get adopted in the field are orders of magnitude fewer. Comparing MoEs from three years ago, e.g. Mixtral, with the most recent ones, such as DeepSeek V4, Kimi K3 or GLM 5.3, the number of MoE-related differences is probably something like 10 or 20. Even if it is a bit more (certainly depends on what counts as a change), and even if the 1000 to 3000 papers above overestimate the number of proposed improvements (a few hundred might be more accurate), there is undeniably a large gap that remains. The vast majority of proposed innovations are simply forgotten.&lt;/p&gt;
&lt;h2 id="why-does-the-gap-exist"&gt;Why does the gap exist?&lt;/h2&gt;
&lt;p&gt;Because in practice, a lot of proposed innovations turn out to not actually make a difference, or at least not a positive one. So the interesting question is, why do reality and the paper disagree?&lt;/p&gt;
&lt;p&gt;There are several reasons I can think of:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Faked Experiments:&lt;/em&gt; Some papers might truly be fabricated, with experimental results being completely fake. I hope that is rare, but it probably does exist.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Buggy Experiments:&lt;/em&gt; Some papers show positive results that are caused by issues in the experimental setup, such as bugs in the code, data issues, etc. that benefit the proposed method in a way that it looks more promising than it would in a non-buggy setup. That makes the experimental result meaningless, as the experiment doesn&amp;rsquo;t measure what it is supposed to measure, and the result is similar to case 1, just not done intentionally and usually unknown to the authors until a future reproduction attempt reveals it. This might sound like a rare case, but everyone who has ever found a bug in their own experimental setup whose fix completely changed the results can tell you that this is quite common even when setting things up very carefully. Variations of this are cases that are not implementation mistakes, but flaws in the experimental design that bias the outcome without the authors noticing.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Undisclosed Limitations:&lt;/em&gt; In this case, the benefit of a method is real, but it comes at a cost that is not fully disclosed. Reviewers are good at spotting some of these and typically push back, for instance when a paper shows improved accuracy without accounting for the increased cost, so fair experimental setups are usually the case. Another more subtle version of this though is a careful selection of the experimental setup, in which alternative methods are compared fairly, but it is a setup that hides a problem that the method would have in other settings. In other words, it does not generalize beyond the settings that were tested in the paper, but the claims might be worded so broadly that the reader assumes it does.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Experimental Breadth:&lt;/em&gt; This last one is similar to 3, where the issue is also generalization, though not at the conceptual level &amp;ndash; where a method cannot be applied in another setting at all &amp;ndash; but at the empirical level, meaning one can use it, but it simply doesn&amp;rsquo;t work as well. I think this case is the most relevant one in practice. The main reason is that training LLMs is a very complex process, models can have different sizes, different architectures, different training hyperparameters, use different training data &amp;ndash; the list is very long &amp;ndash; and there are lots of interactions between all of them. An experiment that shows method A is better than B or C does so in the context of all these other factors set to some value, aka the experimental setup, and no paper manages to cover a wide variety of such settings since the space is simply too large to explore. That leaves many generalization questions open: You can&amp;rsquo;t say if A-better-than-B really generalizes to all possible settings or if there are interactions with other factors that change the picture.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ordered that way, the four categories form a spectrum of how far the claim is from the evidence behind it: The evidence is fake, it is wrong without the authors knowing, it is real but its price is not fully disclosed, or it is real and honestly reported but covers only a slice of the settings one might care about. The further down that list, the less anyone did anything wrong but the more common the case is.&lt;/p&gt;
&lt;p&gt;While the reasons above explain the limitations of the experimental evidence a paper has, the true issue is of course something else: How the paper communicates the results. A statement saying &amp;ldquo;A beats B in the case of model C across sizes D, E and F on data G and &amp;hellip;&amp;rdquo; would be honest but doesn&amp;rsquo;t read very well. The experiment section of a paper usually gives this honest statement because it specifies the full setting. But in the abstract, the introduction and the conclusions, the claims are often shortened, dropping the important qualifiers that make the non-careful reader expect more than the evidence really backs up. Clearly, these overclaiming habits are not just sloppy writing by the authors, but also incentivized by the existing norms and reviewing practices in the field, which demand bold claims to get papers accepted. But no matter what the exact causes are, what the careful reader needs to pay attention to doesn&amp;rsquo;t change.&lt;/p&gt;
&lt;h2 id="examples"&gt;Examples&lt;/h2&gt;
&lt;p&gt;I want to try illustrating the issue categories with a few examples, but that is trickier than it seems: Most of the gap between the number of published and actually adopted methods is just silently forgotten, no follow-up paper ever reports what the specific issue was. Maybe category 1, maybe 2, maybe 3, or maybe nothing at all and it just got overlooked. So naturally, the specific examples I will go over are in fact bad examples because they are the exception. I hope they are useful nonetheless to clarify my points.&lt;/p&gt;
&lt;p&gt;In my &lt;a href="https://tobiasfalke.com/blog/moe-intro-flops/"&gt;first post&lt;/a&gt;, I mentioned the scaling study of &lt;a href="https://arxiv.org/abs/2202.01169" target="_blank" rel="noopener noreferrer"&gt;Clark et al. (2022)&lt;/a&gt;, which was the first broad study that showed how the benefit of sparse MoE models over their dense counterparts scales with increasing sparsity. While it did show that very well and provided useful data points for everyone working on MoEs, the experimental setup had one subtle flaw that makes it an example of category 2: All models, no matter their size in either active or total parameters, were trained on the exact same token budget, rather than co-scaling the token budget with the model size as later scaling studies did. That introduced an artifact into the data suggesting that the MoE benefit diminishes with scale, which disappears when instead keeping the tokens-per-parameter constant.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;As an example of category 3, I want to discuss the &lt;a href="https://arxiv.org/abs/2501.13074" target="_blank" rel="noopener noreferrer"&gt;Autonomy of Experts&lt;/a&gt; paper from ICML 2025. It&amp;rsquo;s a nice idea to get rid of routers in MoEs by instead using the activation norms of experts themselves as the routing signal. Since one cannot compute those activations for all experts &amp;ndash; then we would lose the whole sparsity &amp;ndash; the authors take one weight of each expert, the gate projection of SwiGLU-style FFNs, replace that part with a low-rank factorization and compute only the down-projection step for all experts. That way, the part evaluated for all experts remains small and the remainder of the expert computation is still done only for the selected experts. The conceptual advantage is that with no router, just experts, there is only one thing to train and no risk of misalignment between router and experts. In the paper&amp;rsquo;s experiments, the model improves by one point across a variety of benchmarks.&lt;/p&gt;
&lt;p&gt;What one might miss at a first read is that the idea does not transfer from the paper&amp;rsquo;s 8 experts top-2 setting to more contemporary models with larger numbers of fine-grained experts. The factorization idea essentially replaces the $(d,E)$ router with a $(d,E,r)$ &amp;ldquo;router&amp;rdquo;, where $r$ is the low rank, and this is a dense part of the model since it is computed for every token. That factor $r$ growth in dense parameters implies that the sparse part of the model &amp;ndash; the actual experts &amp;ndash; needs to shrink to keep the overall active parameters constant, and that introduces a problem: Either $r$ is low, shifting few parameters from sparse to dense but creating a bottleneck due to the low rank, or it is increased, resolving the bottleneck but reducing the expert capacity. At 8 experts, top-2, 768 hidden dim, 3072 FFN dim (the paper&amp;rsquo;s setting), this effect is almost invisible. For a DeepSeek V3-style architecture with 256 experts, top-8, 7168 hidden dim, that&amp;rsquo;s not the case: A low rank dimension of 193, which is already fairly low for a model that size, would shift so many parameters to the dense region that in fact no parameters are left for the sparse experts at all.&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt; Only with ranks lower than 193 can the idea be applied at all, and it introduces bottlenecks that hurt the model quality badly. Because of that, it is a great example of the category of not even conceptually generalizing beyond the experimental setup of the paper.&lt;/p&gt;
&lt;p&gt;Category 4, which I claimed is the most frequent one, is about empirical generalization beyond the paper&amp;rsquo;s setting. As I argued, this happens typically because there are simply too many factors involved to account for all of them in ablations. One example is shared experts: &lt;a href="https://arxiv.org/pdf/2401.06066" target="_blank" rel="noopener noreferrer"&gt;DeepSeek-MoE&lt;/a&gt; introduced them in early 2024 and most MoEs adopted them since. The paper even has an ablation, showing that shared experts alone, independent of the also proposed fine-grained experts, improve their models. But one additional factor that is different from earlier work is the layer placement: While earlier work like &lt;a href="https://arxiv.org/abs/2006.16668" target="_blank" rel="noopener noreferrer"&gt;GShard&lt;/a&gt; and &lt;a href="https://arxiv.org/abs/2101.03961" target="_blank" rel="noopener noreferrer"&gt;Switch Transformer&lt;/a&gt; combined MoE layers with interleaved dense layers, DeepSeek-MoE used them in all layers. The usefulness of shared experts strongly depends on that context. This has been largely ignored even by subsequent work that adopted shared experts. I only know of &lt;a href="https://microsoft.ai/pdf/mai-thinking-1.pdf" target="_blank" rel="noopener noreferrer"&gt;MAI-Thinking-1&lt;/a&gt; explicitly calling this out more than two years later, reporting that they see no value of shared experts in interleaved architectures. Similarly, other factors of the MoE setup can influence experiments, for example, a routing scheme that looks promising under softmax routing activations might not work with sigmoid, or vice versa. And as I showed in the &lt;a href="https://tobiasfalke.com/blog/moe-testbed-part2/"&gt;previous post&lt;/a&gt;, scope is an important variable in token balancing that can change comparisons (assuming they are even done at the same scope in the first place).&lt;/p&gt;
&lt;h2 id="what-can-readers-do"&gt;What can readers do?&lt;/h2&gt;
&lt;p&gt;As a reader, this implies you should be skeptical of the claims a paper makes, especially in the abstract and introduction, and instead look at the exact experiments reported and make your own judgment on what conclusions the results support. That will catch some overclaiming, mainly of categories 2 and 3, but only those that a careful reviewer should already have caught (assuming the paper went through a reviewing process). Other issues, and in particular category 4, how far a proposed method generalizes empirically beyond the necessarily limited experiments of its paper, cannot be solved by careful reading.&lt;/p&gt;
&lt;p&gt;I see two main options to address that case:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Wait for adoption:&lt;/em&gt; Adoption by the field is the strongest signal that something is really useful across a variety of settings. That is also why I titled this whole post saying that a single paper is not enough. A method that only looks good because the paper overclaims will simply be ignored by subsequent work. A paper that is cited a lot seems to have more value. But more important than citations, which can mean many things, is whether a proposed technique gets adopted in later work. If a new architecture becomes the default choice in future work&amp;rsquo;s baselines or in released LLMs, then it must truly be good. But obviously, this solution has a price: The evidence is only clear with a long delay and only by the time everyone has already adopted it, so it does not work if you want to be an early adopter.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Try yourself:&lt;/em&gt; Test everything that looks promising on your own against your own baselines. That gives you a second set of experiments that complement the ones in the paper, and importantly, rather than answering the broad question of what all the settings are that the findings generalize to, it answers it for that one specific target setting you really care about: your own baseline. This is the relevant question in particular if your goal for following the literature is to train your own production LLMs for which you want to adopt potential improvements. And obviously, what it trades off compared to the first approach is time against costs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;The gap I started this post with does not mean that most of these papers are wrong. In most cases they are not: They report results that were really obtained in the setup they describe, and it is mostly the abstract and the introduction, not the experiment section, that make those results sound like general findings. That is also why I don&amp;rsquo;t think one should stop reading papers, as the tweet I started with suggests, but rather stop reading their claims as settled answers, and instead confirm them yourself or wait for the field as a whole to settle it.&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;a href="https://arxiv.org/abs/2402.07871" target="_blank" rel="noopener noreferrer"&gt;Krajewski et al. (2024)&lt;/a&gt; point this out. My own plot in the first post also demonstrates that even with Clark et al.&amp;rsquo;s data itself the diminishing returns disappear when selecting only the subset with constant tokens-per-parameter ratios.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;A normal MoE activates $N_{act}^{MoE} = d \cdot E + k \cdot 3 \cdot d \cdot d_{ffn}$ parameters per token. AoE changes that to $N_{act}^{AoE} = d \cdot E \cdot r + k \cdot (r \cdot d_{wide} + 2 \cdot d \cdot d_{wide})$, with $d_{wide}$ set to keep the total (but not active) parameters constant. If $d \cdot E \cdot r$ alone already matches $N_{act}^{MoE}$, no parameters are left for the actual experts. For DSV3, that happens at $r = (E + k \cdot 3 \cdot d_{ffn}) / E = 193$. Any feasible $r$ is hence significantly lower than $d_{ffn} = 2048$. For DSV4 Pro, it is 145 vs. 3072. And for the paper&amp;rsquo;s smaller top-2 model, it is 2305 compared to 3072.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>A Routing Testbed for MoEs, Part 2: Visualizing Balancing Methods</title><link>https://tobiasfalke.com/blog/moe-testbed-part2/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate><guid>https://tobiasfalke.com/blog/moe-testbed-part2/</guid><description>&lt;p&gt;In &lt;a href="https://tobiasfalke.com/blog/moe-testbed-part1/"&gt;Part 1&lt;/a&gt; I argued that two properties of the learned routing decide how much of an MoE&amp;rsquo;s total capacity is actually used. The load should be balanced across the experts, so that no expert stays undertrained and wastes the capacity it holds, and the experts should specialize, so that the additional parameters learn distinct things instead of duplicating each other. Load balance can be read off the routing statistics of any training run, while specialization cannot, which is what motivated our &lt;em&gt;&lt;a href="https://arxiv.org/abs/2604.07030" target="_blank" rel="noopener noreferrer"&gt;MoE Routing Testbed&lt;/a&gt;&lt;/em&gt;: A data mix of Wikipedia in eight languages with distinct scripts provides a strong prior for how tokens should be routed, a reference routing derived from that prior which we verified to be better than what our models learn on their own and the two metrics of expert utilization and routing purity that quantify the two goals separately.&lt;/p&gt;
&lt;p&gt;With that setup, the routing behavior of a training run becomes directly visible instead of having to be inferred from a validation loss. This second part of the post uses it on the mechanism that shapes routing most directly, namely the &lt;strong&gt;token balancing&lt;/strong&gt; that essentially every MoE training run applies in one form or another. We trained hundreds of configurations covering four balancing methods and the ways in which they can be applied. Via the expert utilization and routing purity metrics that our testbed can measure, the differences between these balancing approaches can be nicely visualized, as I show in this post.&lt;/p&gt;
&lt;h2 id="the-token-balancing-methods"&gt;The token balancing methods&lt;/h2&gt;
&lt;p&gt;We compared four approaches from the literature that have been used in MoE work over the past years:&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;load balancing loss (LBL)&lt;/strong&gt;, introduced with &lt;a href="https://arxiv.org/abs/2006.16668" target="_blank" rel="noopener noreferrer"&gt;GShard&lt;/a&gt; and popularized by the &lt;a href="https://arxiv.org/abs/2101.03961" target="_blank" rel="noopener noreferrer"&gt;Switch Transformer&lt;/a&gt;, is the oldest of them and still the most widely used one. For each MoE layer it computes two quantities per expert: The share $f_i$ of the token-expert assignments in the batch that went to expert $i$, and the average routing probability $P_i$ that the router assigned to expert $i$ over the same tokens. The auxiliary loss added to the language modeling loss is then $\alpha E \sum_{i=1}^{E} f_i P_i$. While $f$ is the distribution we want to be uniform, the surrogate $P$ is used additionally to make the loss differentiable, which is not the case for $f$ due to top-$k$ selection. $\alpha$ is a hyperparameter that weighs this auxiliary loss against the main LM loss.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Balanced assignment (BA)&lt;/strong&gt;, introduced with &lt;a href="https://arxiv.org/abs/2103.16716" target="_blank" rel="noopener noreferrer"&gt;BASE layers&lt;/a&gt;, decouples balancing from the router instead of penalizing it. Given the score $s_{ti}$ that the router assigns to each token $t$ in a batch for each expert $i$, it looks for the binary assignment that maximizes the total score of the selected token-expert pairs, subject to every token receiving $k$ experts and every expert receiving the same number of tokens. This is a linear assignment problem and can be solved with an auction algorithm. BASE layers itself assigns a single expert per token, the $k&amp;gt;1$ case used here is the straightforward generalization of that. Balance is perfect by construction rather than encouraged, and there is no strength left to tune, but as a consequence also no flexibility in that regard.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sinkhorn routing (SH)&lt;/strong&gt;, as used in the scaling study of &lt;a href="https://arxiv.org/abs/2202.01169" target="_blank" rel="noopener noreferrer"&gt;Clark et al. (2022)&lt;/a&gt;, keeps the same assignment view as BA but relaxes it. Rather than solving the assignment exactly, it adds an entropy term to the objective and the solution of that relaxed problem is found by the Sinkhorn algorithm. A handful of iterations are sufficient and they are cheap matrix operations, so the cost stays well below an exact solver, at the price of balance that is only approximate. Like BA, it acts on the routing itself rather than on the loss modifying the router.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;expert bias (EB)&lt;/strong&gt; method, introduced by &lt;a href="https://arxiv.org/abs/2408.15664" target="_blank" rel="noopener noreferrer"&gt;Wang et al. (2024)&lt;/a&gt; and popularized by &lt;a href="https://arxiv.org/abs/2412.19437" target="_blank" rel="noopener noreferrer"&gt;DeepSeek V3&lt;/a&gt;, often called auxiliary-loss-free balancing, takes a third route and manipulates the selection. Each expert gets a scalar bias $b_i$ that enters the top-$k$ selection only, so the selected experts are those with the highest $s_{ti} + b_i$, while the gating weights that scale their outputs are still computed from the unbiased $s_{ti}$. The bias hence steers which experts are chosen without distorting how their outputs are combined. After every step, the biases are updated by a fixed increment $\gamma$ based on the observed load, as $b_i \leftarrow b_i + \gamma \operatorname{sign}(\bar{c} - c_i)$, with $c_i$ the number of tokens expert $i$ received in that step and $\bar{c}$ the average across experts, so the bias decreases for experts above their share and increases for those below it. Balance is therefore approached over the course of many steps instead of being enforced within a single one, and the appeal of the method is that no additional gradient competes with the LM objective.&lt;/p&gt;
&lt;h2 id="three-dimensions-not-one"&gt;Three dimensions, not one&lt;/h2&gt;
&lt;p&gt;These four methods are usually compared as alternatives, i.e. the question is posed as which balancing method to use. But the method is only one part of the configuration. Applying it also requires deciding how hard the balance is enforced, and, before that, over which set of tokens it is applied. We therefore treat balancing as three separate dimensions: The &lt;strong&gt;method&lt;/strong&gt; (how balance is encouraged), the &lt;strong&gt;strength&lt;/strong&gt; (how hard it is enforced) and the &lt;strong&gt;scope&lt;/strong&gt; (over which tokens it is computed). Only LBL and EB come with a strength dial at all, and for EB it turns out to be a rather poor one.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; The scope, on the other hand, applies to all four methods equally, and it is the dimension that is almost never stated, since it follows from how the balancing statistics happen to be aggregated in a given implementation.&lt;/p&gt;
&lt;p&gt;Separating the three makes the comparison a lot more informative, because a difference attributed to a method may well come from the scope at which it was applied.&lt;/p&gt;
&lt;h2 id="the-role-of-scope"&gt;The role of scope&lt;/h2&gt;
&lt;p&gt;The effect of the scope is easiest to see in the extreme case of computing the balance over a single training sequence. Sequences are typically packed from a single data source, so such a sequence can be for instance entirely code, and a balancing mechanism applied at this scope pushes the router to spread code tokens uniformly over all experts. That is the opposite of what specialization requires, namely code tokens concentrating on the experts that handle code. At sequence scope, utilization and specialization are directly in conflict by construction.&lt;/p&gt;
&lt;p&gt;The other end of the spectrum, and arguably the ideal case, is a scope large enough to have a representative sample of the full training distribution. If the domains are represented at comparable rates, in the testbed exactly so, with eight domains at 1/8 each, then a router that sends each domain to its own group of experts is perfectly specialized and perfectly balanced at the same time. The conflict is hence not inherent to balancing, it is created by computing the balance over token sets that are too small and too homogeneous to reflect the training distribution and hence the distribution that experts should specialize over.&lt;/p&gt;
&lt;p&gt;What makes this practically relevant is where real training frameworks sit on that spectrum. As &lt;a href="https://arxiv.org/abs/2501.11873" target="_blank" rel="noopener noreferrer"&gt;Qiu et al. (2025)&lt;/a&gt; pointed out, most public MoE implementations compute the balancing statistics over the tokens that happen to be present on one device. In large-scale training with gradient accumulation or pipeline parallelism, such a per-device micro-batch often contains just one or two sequences, so that training frequently operates at the bad end of that spectrum without anyone having made that decision.&lt;/p&gt;
&lt;h2 id="experimental-setup"&gt;Experimental setup&lt;/h2&gt;
&lt;p&gt;The testbed lets us measure all of this cheaply. We swept the three dimensions systematically: Four methods (LBL, EB, SH, BA), five scopes (balancing over 1, 2, 8, 16 or all 64 sequences of the global batch, controlled via micro-batch size and cross-device aggregation) and for LBL and EB a range of strengths, resulting in 98 configurations in total. The model is a small single-layer MoE with 50M active parameters (270M total), 32 fine-grained experts under top-4 routing, trained for 20k steps (about 10.5B tokens) at a global batch size of 64 x 8192 tokens. No token dropping is applied in the default setup.&lt;/p&gt;
&lt;p&gt;Both our metrics, expert utilization and routing purity, are computed over the full global batch &amp;ndash; independent of the scope at which the balancing acts &amp;ndash; which is the detail I flagged in Part 1 and which matters here: The token load can be balanced over experts globally without being balanced locally, but not the other way round.&lt;/p&gt;
&lt;h2 id="result-1-scope-decides-the-trade-off"&gt;Result 1: Scope decides the trade-off&lt;/h2&gt;
&lt;p&gt;The following plot shows what I&amp;rsquo;ve been referring to as the visualization power of the routing testbed. When plotting the expert utilization vs. routing purity trade-offs for different configurations, we can clearly see the effect that scope has:&lt;/p&gt;
&lt;figure&gt;&lt;svg aria-label="Expert utilization versus routing purity for four balancing methods, with color encoding the balancing scope and shape encoding the method" class="moe-chart" viewBox="0 0 700 600" xmlns="http://www.w3.org/2000/svg" role="img"&gt;
&lt;style&gt;.moe-chart{font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}.moe-chart .grid{stroke:var(--border,#e5e7eb);stroke-width:1}.moe-chart .axis{stroke:var(--border,#e5e7eb);stroke-width:1.2}.moe-chart .tick{fill:var(--text-muted,#6b7280);font-size:13px}.moe-chart .atitle{fill:var(--text,#1a1a1a);font-size:14px}.moe-chart .series{fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .ref{fill:none;stroke:var(--text-light,#9ca3af);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .dot{fill:currentColor;stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .refdot{fill:var(--text-light,#9ca3af);stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .hit{fill:transparent;stroke:none;pointer-events:all;cursor:crosshair}.moe-chart .slabel{fill:currentColor;font-size:12.5px}.moe-chart .leader{stroke:currentColor;stroke-width:1;opacity:.55}.moe-chart .reflabel{fill:var(--text-muted,#6b7280);font-size:12.5px}.moe-chart .msq{fill:currentColor;stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .mtri{fill:currentColor;stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .mplus{fill:none;stroke:currentColor;stroke-width:2.4;stroke-linecap:round}.moe-chart .s1{color:#9ec1e8}.moe-chart .s2{color:#5f9bd9}.moe-chart .s8{color:#2c6fbb}.moe-chart .s16{color:#1d4880}.moe-chart .s64{color:#0f2c52}@media (prefers-color-scheme:dark){.moe-chart .s1{color:#cfe1f5}.moe-chart .s2{color:#93bce6}.moe-chart .s8{color:#5b93d0}.moe-chart .s16{color:#3d6fae}.moe-chart .s64{color:#2b5183}}&lt;/style&gt;
&lt;g&gt;
&lt;line class="grid" x1="64" y1="510.8" x2="676" y2="510.8"/&gt;
&lt;text class="tick" x="55" y="514.8" text-anchor="end"&gt;0.2&lt;/text&gt;
&lt;line class="grid" x1="64" y1="428.3" x2="676" y2="428.3"/&gt;
&lt;text class="tick" x="55" y="432.3" text-anchor="end"&gt;0.3&lt;/text&gt;
&lt;line class="grid" x1="64" y1="345.8" x2="676" y2="345.8"/&gt;
&lt;text class="tick" x="55" y="349.8" text-anchor="end"&gt;0.4&lt;/text&gt;
&lt;line class="grid" x1="64" y1="263.4" x2="676" y2="263.4"/&gt;
&lt;text class="tick" x="55" y="267.4" text-anchor="end"&gt;0.5&lt;/text&gt;
&lt;line class="grid" x1="64" y1="180.9" x2="676" y2="180.9"/&gt;
&lt;text class="tick" x="55" y="184.9" text-anchor="end"&gt;0.6&lt;/text&gt;
&lt;line class="grid" x1="64" y1="98.5" x2="676" y2="98.5"/&gt;
&lt;text class="tick" x="55" y="102.5" text-anchor="end"&gt;0.7&lt;/text&gt;
&lt;line class="grid" x1="64" y1="16.0" x2="676" y2="16.0"/&gt;
&lt;text class="tick" x="55" y="20.0" text-anchor="end"&gt;0.8&lt;/text&gt;
&lt;/g&gt;
&lt;line class="axis" x1="64" y1="552.0" x2="676" y2="552.0"/&gt;
&lt;line class="axis" x1="64" y1="16.0" x2="64" y2="552.0"/&gt;
&lt;line class="axis" x1="64.0" y1="552.0" x2="64.0" y2="556.0"/&gt;
&lt;text class="tick" x="64.0" y="570.0" text-anchor="middle"&gt;0.5&lt;/text&gt;
&lt;line class="axis" x1="181.7" y1="552.0" x2="181.7" y2="556.0"/&gt;
&lt;text class="tick" x="181.7" y="570.0" text-anchor="middle"&gt;0.6&lt;/text&gt;
&lt;line class="axis" x1="299.4" y1="552.0" x2="299.4" y2="556.0"/&gt;
&lt;text class="tick" x="299.4" y="570.0" text-anchor="middle"&gt;0.7&lt;/text&gt;
&lt;line class="axis" x1="417.1" y1="552.0" x2="417.1" y2="556.0"/&gt;
&lt;text class="tick" x="417.1" y="570.0" text-anchor="middle"&gt;0.8&lt;/text&gt;
&lt;line class="axis" x1="534.8" y1="552.0" x2="534.8" y2="556.0"/&gt;
&lt;text class="tick" x="534.8" y="570.0" text-anchor="middle"&gt;0.9&lt;/text&gt;
&lt;line class="axis" x1="652.5" y1="552.0" x2="652.5" y2="556.0"/&gt;
&lt;text class="tick" x="652.5" y="570.0" text-anchor="middle"&gt;1&lt;/text&gt;
&lt;text class="atitle" x="370.0" y="592" text-anchor="middle"&gt;Expert utilization&lt;/text&gt;
&lt;text class="atitle" x="16" y="284.0" text-anchor="middle" transform="rotate(-90 16 284.0)"&gt;Routing purity&lt;/text&gt;
&lt;g class="s1"&gt;
&lt;path class="series" d="M 557.7 496.8 L 562.7 496.4 L 565.4 494.7 L 564.1 491.3 L 558.3 484.6 L 546.7 473.7 L 512.5 440.2 L 436.3 406.9 L 359.5 332.5 L 278.8 255.5 L 229.5 205.4 L 187.6 159.7 L 246.7 138.2 L 244.5 111.7 L 210.2 96.9"/&gt;
&lt;circle class="dot" cx="557.7" cy="496.8" r="3"/&gt;
&lt;circle class="hit" cx="557.7" cy="496.8" r="6"&gt;&lt;title&gt;scope 1 · utilization 0.92 · purity 0.22 · loss 2.895&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="562.7" cy="496.4" r="3"/&gt;
&lt;circle class="hit" cx="562.7" cy="496.4" r="6"&gt;&lt;title&gt;scope 1 · utilization 0.92 · purity 0.22 · loss 2.889&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="565.4" cy="494.7" r="3"/&gt;
&lt;circle class="hit" cx="565.4" cy="494.7" r="6"&gt;&lt;title&gt;scope 1 · utilization 0.93 · purity 0.22 · loss 2.888&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="564.1" cy="491.3" r="3"/&gt;
&lt;circle class="hit" cx="564.1" cy="491.3" r="6"&gt;&lt;title&gt;scope 1 · utilization 0.92 · purity 0.22 · loss 2.886&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="558.3" cy="484.6" r="3"/&gt;
&lt;circle class="hit" cx="558.3" cy="484.6" r="6"&gt;&lt;title&gt;scope 1 · utilization 0.92 · purity 0.23 · loss 2.883&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="546.7" cy="473.7" r="3"/&gt;
&lt;circle class="hit" cx="546.7" cy="473.7" r="6"&gt;&lt;title&gt;scope 1 · utilization 0.91 · purity 0.24 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="512.5" cy="440.2" r="3"/&gt;
&lt;circle class="hit" cx="512.5" cy="440.2" r="6"&gt;&lt;title&gt;scope 1 · utilization 0.88 · purity 0.29 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="436.3" cy="406.9" r="3"/&gt;
&lt;circle class="hit" cx="436.3" cy="406.9" r="6"&gt;&lt;title&gt;scope 1 · utilization 0.82 · purity 0.33 · loss 2.879&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="359.5" cy="332.5" r="3"/&gt;
&lt;circle class="hit" cx="359.5" cy="332.5" r="6"&gt;&lt;title&gt;scope 1 · utilization 0.75 · purity 0.42 · loss 2.875&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="278.8" cy="255.5" r="3"/&gt;
&lt;circle class="hit" cx="278.8" cy="255.5" r="6"&gt;&lt;title&gt;scope 1 · utilization 0.68 · purity 0.51 · loss 2.879&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="229.5" cy="205.4" r="3"/&gt;
&lt;circle class="hit" cx="229.5" cy="205.4" r="6"&gt;&lt;title&gt;scope 1 · utilization 0.64 · purity 0.57 · loss 2.877&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="187.6" cy="159.7" r="3"/&gt;
&lt;circle class="hit" cx="187.6" cy="159.7" r="6"&gt;&lt;title&gt;scope 1 · utilization 0.60 · purity 0.63 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="246.7" cy="138.2" r="3"/&gt;
&lt;circle class="hit" cx="246.7" cy="138.2" r="6"&gt;&lt;title&gt;scope 1 · utilization 0.66 · purity 0.65 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="244.5" cy="111.7" r="3"/&gt;
&lt;circle class="hit" cx="244.5" cy="111.7" r="6"&gt;&lt;title&gt;scope 1 · utilization 0.65 · purity 0.68 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="210.2" cy="96.9" r="3"/&gt;
&lt;circle class="hit" cx="210.2" cy="96.9" r="6"&gt;&lt;title&gt;scope 1 · utilization 0.62 · purity 0.70 · loss 2.883&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="s2"&gt;
&lt;path class="series" d="M 556.7 500.4 L 570.1 493.7 L 563.1 477.2 L 553.2 451.4 L 547.2 426.4 L 552.0 395.4 L 533.8 360.0 L 464.6 330.8 L 396.4 292.7 L 314.2 234.1 L 238.5 177.1 L 175.2 129.5 L 235.4 111.2 L 145.1 82.8 L 154.4 66.4"/&gt;
&lt;circle class="dot" cx="556.7" cy="500.4" r="3"/&gt;
&lt;circle class="hit" cx="556.7" cy="500.4" r="6"&gt;&lt;title&gt;scope 2 · utilization 0.92 · purity 0.21 · loss 2.892&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="570.1" cy="493.7" r="3"/&gt;
&lt;circle class="hit" cx="570.1" cy="493.7" r="6"&gt;&lt;title&gt;scope 2 · utilization 0.93 · purity 0.22 · loss 2.888&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="563.1" cy="477.2" r="3"/&gt;
&lt;circle class="hit" cx="563.1" cy="477.2" r="6"&gt;&lt;title&gt;scope 2 · utilization 0.92 · purity 0.24 · loss 2.886&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="553.2" cy="451.4" r="3"/&gt;
&lt;circle class="hit" cx="553.2" cy="451.4" r="6"&gt;&lt;title&gt;scope 2 · utilization 0.92 · purity 0.27 · loss 2.883&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="547.2" cy="426.4" r="3"/&gt;
&lt;circle class="hit" cx="547.2" cy="426.4" r="6"&gt;&lt;title&gt;scope 2 · utilization 0.91 · purity 0.30 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="552.0" cy="395.4" r="3"/&gt;
&lt;circle class="hit" cx="552.0" cy="395.4" r="6"&gt;&lt;title&gt;scope 2 · utilization 0.91 · purity 0.34 · loss 2.879&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="533.8" cy="360.0" r="3"/&gt;
&lt;circle class="hit" cx="533.8" cy="360.0" r="6"&gt;&lt;title&gt;scope 2 · utilization 0.90 · purity 0.38 · loss 2.877&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="464.6" cy="330.8" r="3"/&gt;
&lt;circle class="hit" cx="464.6" cy="330.8" r="6"&gt;&lt;title&gt;scope 2 · utilization 0.84 · purity 0.42 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="396.4" cy="292.7" r="3"/&gt;
&lt;circle class="hit" cx="396.4" cy="292.7" r="6"&gt;&lt;title&gt;scope 2 · utilization 0.78 · purity 0.46 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="314.2" cy="234.1" r="3"/&gt;
&lt;circle class="hit" cx="314.2" cy="234.1" r="6"&gt;&lt;title&gt;scope 2 · utilization 0.71 · purity 0.54 · loss 2.878&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="238.5" cy="177.1" r="3"/&gt;
&lt;circle class="hit" cx="238.5" cy="177.1" r="6"&gt;&lt;title&gt;scope 2 · utilization 0.65 · purity 0.60 · loss 2.881&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="175.2" cy="129.5" r="3"/&gt;
&lt;circle class="hit" cx="175.2" cy="129.5" r="6"&gt;&lt;title&gt;scope 2 · utilization 0.59 · purity 0.66 · loss 2.888&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="235.4" cy="111.2" r="3"/&gt;
&lt;circle class="hit" cx="235.4" cy="111.2" r="6"&gt;&lt;title&gt;scope 2 · utilization 0.65 · purity 0.68 · loss 2.884&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="145.1" cy="82.8" r="3"/&gt;
&lt;circle class="hit" cx="145.1" cy="82.8" r="6"&gt;&lt;title&gt;scope 2 · utilization 0.57 · purity 0.72 · loss 2.890&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="154.4" cy="66.4" r="3"/&gt;
&lt;circle class="hit" cx="154.4" cy="66.4" r="6"&gt;&lt;title&gt;scope 2 · utilization 0.58 · purity 0.74 · loss 2.887&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="s8"&gt;
&lt;path class="series" d="M 551.8 329.4 L 542.3 273.3 L 548.1 245.7 L 542.3 213.5 L 541.5 205.0 L 534.5 158.3 L 506.5 136.0 L 483.8 149.8 L 414.8 127.7 L 317.4 139.9 L 232.1 128.1 L 253.0 114.0 L 276.1 110.3 L 283.8 102.4 L 176.6 86.5"/&gt;
&lt;circle class="dot" cx="551.8" cy="329.4" r="3"/&gt;
&lt;circle class="hit" cx="551.8" cy="329.4" r="6"&gt;&lt;title&gt;scope 8 · utilization 0.91 · purity 0.42 · loss 2.880&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="542.3" cy="273.3" r="3"/&gt;
&lt;circle class="hit" cx="542.3" cy="273.3" r="6"&gt;&lt;title&gt;scope 8 · utilization 0.91 · purity 0.49 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="548.1" cy="245.7" r="3"/&gt;
&lt;circle class="hit" cx="548.1" cy="245.7" r="6"&gt;&lt;title&gt;scope 8 · utilization 0.91 · purity 0.52 · loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="542.3" cy="213.5" r="3"/&gt;
&lt;circle class="hit" cx="542.3" cy="213.5" r="6"&gt;&lt;title&gt;scope 8 · utilization 0.91 · purity 0.56 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="541.5" cy="205.0" r="3"/&gt;
&lt;circle class="hit" cx="541.5" cy="205.0" r="6"&gt;&lt;title&gt;scope 8 · utilization 0.91 · purity 0.57 · loss 2.875&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="534.5" cy="158.3" r="3"/&gt;
&lt;circle class="hit" cx="534.5" cy="158.3" r="6"&gt;&lt;title&gt;scope 8 · utilization 0.90 · purity 0.63 · loss 2.876&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="506.5" cy="136.0" r="3"/&gt;
&lt;circle class="hit" cx="506.5" cy="136.0" r="6"&gt;&lt;title&gt;scope 8 · utilization 0.88 · purity 0.65 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="483.8" cy="149.8" r="3"/&gt;
&lt;circle class="hit" cx="483.8" cy="149.8" r="6"&gt;&lt;title&gt;scope 8 · utilization 0.86 · purity 0.64 · loss 2.875&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="414.8" cy="127.7" r="3"/&gt;
&lt;circle class="hit" cx="414.8" cy="127.7" r="6"&gt;&lt;title&gt;scope 8 · utilization 0.80 · purity 0.66 · loss 2.878&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="317.4" cy="139.9" r="3"/&gt;
&lt;circle class="hit" cx="317.4" cy="139.9" r="6"&gt;&lt;title&gt;scope 8 · utilization 0.72 · purity 0.65 · loss 2.879&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="232.1" cy="128.1" r="3"/&gt;
&lt;circle class="hit" cx="232.1" cy="128.1" r="6"&gt;&lt;title&gt;scope 8 · utilization 0.64 · purity 0.66 · loss 2.886&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="253.0" cy="114.0" r="3"/&gt;
&lt;circle class="hit" cx="253.0" cy="114.0" r="6"&gt;&lt;title&gt;scope 8 · utilization 0.66 · purity 0.68 · loss 2.881&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="276.1" cy="110.3" r="3"/&gt;
&lt;circle class="hit" cx="276.1" cy="110.3" r="6"&gt;&lt;title&gt;scope 8 · utilization 0.68 · purity 0.69 · loss 2.883&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="283.8" cy="102.4" r="3"/&gt;
&lt;circle class="hit" cx="283.8" cy="102.4" r="6"&gt;&lt;title&gt;scope 8 · utilization 0.69 · purity 0.70 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="176.6" cy="86.5" r="3"/&gt;
&lt;circle class="hit" cx="176.6" cy="86.5" r="6"&gt;&lt;title&gt;scope 8 · utilization 0.60 · purity 0.71 · loss 2.887&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="s16"&gt;
&lt;path class="series" d="M 571.3 297.9 L 557.2 258.0 L 557.1 235.3 L 550.3 219.7 L 545.7 180.0 L 541.7 157.3 L 519.1 170.2 L 487.2 163.3 L 449.2 162.7 L 365.1 151.2 L 240.3 127.7 L 220.4 117.3 L 197.7 98.5 L 199.2 81.3 L 206.9 72.5"/&gt;
&lt;circle class="dot" cx="571.3" cy="297.9" r="3"/&gt;
&lt;circle class="hit" cx="571.3" cy="297.9" r="6"&gt;&lt;title&gt;scope 16 · utilization 0.93 · purity 0.46 · loss 2.877&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="557.2" cy="258.0" r="3"/&gt;
&lt;circle class="hit" cx="557.2" cy="258.0" r="6"&gt;&lt;title&gt;scope 16 · utilization 0.92 · purity 0.51 · loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="557.1" cy="235.3" r="3"/&gt;
&lt;circle class="hit" cx="557.1" cy="235.3" r="6"&gt;&lt;title&gt;scope 16 · utilization 0.92 · purity 0.53 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="550.3" cy="219.7" r="3"/&gt;
&lt;circle class="hit" cx="550.3" cy="219.7" r="6"&gt;&lt;title&gt;scope 16 · utilization 0.91 · purity 0.55 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="545.7" cy="180.0" r="3"/&gt;
&lt;circle class="hit" cx="545.7" cy="180.0" r="6"&gt;&lt;title&gt;scope 16 · utilization 0.91 · purity 0.60 · loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="541.7" cy="157.3" r="3"/&gt;
&lt;circle class="hit" cx="541.7" cy="157.3" r="6"&gt;&lt;title&gt;scope 16 · utilization 0.91 · purity 0.63 · loss 2.872&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="519.1" cy="170.2" r="3"/&gt;
&lt;circle class="hit" cx="519.1" cy="170.2" r="6"&gt;&lt;title&gt;scope 16 · utilization 0.89 · purity 0.61 · loss 2.870&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="487.2" cy="163.3" r="3"/&gt;
&lt;circle class="hit" cx="487.2" cy="163.3" r="6"&gt;&lt;title&gt;scope 16 · utilization 0.86 · purity 0.62 · loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="449.2" cy="162.7" r="3"/&gt;
&lt;circle class="hit" cx="449.2" cy="162.7" r="6"&gt;&lt;title&gt;scope 16 · utilization 0.83 · purity 0.62 · loss 2.875&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="365.1" cy="151.2" r="3"/&gt;
&lt;circle class="hit" cx="365.1" cy="151.2" r="6"&gt;&lt;title&gt;scope 16 · utilization 0.76 · purity 0.64 · loss 2.880&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="240.3" cy="127.7" r="3"/&gt;
&lt;circle class="hit" cx="240.3" cy="127.7" r="6"&gt;&lt;title&gt;scope 16 · utilization 0.65 · purity 0.66 · loss 2.884&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="220.4" cy="117.3" r="3"/&gt;
&lt;circle class="hit" cx="220.4" cy="117.3" r="6"&gt;&lt;title&gt;scope 16 · utilization 0.63 · purity 0.68 · loss 2.886&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="197.7" cy="98.5" r="3"/&gt;
&lt;circle class="hit" cx="197.7" cy="98.5" r="6"&gt;&lt;title&gt;scope 16 · utilization 0.61 · purity 0.70 · loss 2.886&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="199.2" cy="81.3" r="3"/&gt;
&lt;circle class="hit" cx="199.2" cy="81.3" r="6"&gt;&lt;title&gt;scope 16 · utilization 0.61 · purity 0.72 · loss 2.884&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="206.9" cy="72.5" r="3"/&gt;
&lt;circle class="hit" cx="206.9" cy="72.5" r="6"&gt;&lt;title&gt;scope 16 · utilization 0.62 · purity 0.73 · loss 2.885&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="s1"&gt;
&lt;rect class="msq" x="648.9" y="495.8" width="7.2" height="7.2"/&gt;
&lt;circle class="hit" cx="652.5" cy="499.4" r="7"&gt;&lt;title&gt;BA · scope 1 · utilization 1.00 · purity 0.21 · loss 2.881&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="s2"&gt;
&lt;rect class="msq" x="648.9" y="404.2" width="7.2" height="7.2"/&gt;
&lt;circle class="hit" cx="652.5" cy="407.8" r="7"&gt;&lt;title&gt;BA · scope 2 · utilization 1.00 · purity 0.32 · loss 2.877&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="s8"&gt;
&lt;rect class="msq" x="648.9" y="124.5" width="7.2" height="7.2"/&gt;
&lt;circle class="hit" cx="652.5" cy="128.1" r="7"&gt;&lt;title&gt;BA · scope 8 · utilization 1.00 · purity 0.66 · loss 2.876&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="s16"&gt;
&lt;rect class="msq" x="648.9" y="122.7" width="7.2" height="7.2"/&gt;
&lt;circle class="hit" cx="652.5" cy="126.3" r="7"&gt;&lt;title&gt;BA · scope 16 · utilization 1.00 · purity 0.67 · loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="s1"&gt;
&lt;path class="mtri" d="M 538.3 476.2 L 542.5 483.7 L 534.1 483.7 Z"/&gt;
&lt;circle class="hit" cx="538.3" cy="480.8" r="7"&gt;&lt;title&gt;SH · scope 1 · utilization 0.90 · purity 0.24 · loss 2.879&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="s2"&gt;
&lt;path class="mtri" d="M 575.1 376.3 L 579.3 383.8 L 570.9 383.8 Z"/&gt;
&lt;circle class="hit" cx="575.1" cy="380.9" r="7"&gt;&lt;title&gt;SH · scope 2 · utilization 0.93 · purity 0.36 · loss 2.877&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="s8"&gt;
&lt;path class="mtri" d="M 567.5 117.4 L 571.7 124.9 L 563.3 124.9 Z"/&gt;
&lt;circle class="hit" cx="567.5" cy="122.0" r="7"&gt;&lt;title&gt;SH · scope 8 · utilization 0.93 · purity 0.67 · loss 2.876&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="s16"&gt;
&lt;path class="mtri" d="M 577.4 133.5 L 581.6 141.0 L 573.2 141.0 Z"/&gt;
&lt;circle class="hit" cx="577.4" cy="138.1" r="7"&gt;&lt;title&gt;SH · scope 16 · utilization 0.94 · purity 0.65 · loss 2.876&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="s64"&gt;
&lt;path class="mplus" d="M 535.9 216.0 H 544.7 M 540.3 211.6 V 220.4"/&gt;
&lt;circle class="hit" cx="540.3" cy="216.0" r="7"&gt;&lt;title&gt;EB · scope 64 · utilization 0.90 · purity 0.56 · loss 2.872&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;rect class="refdot" x="145.6" y="70.1" width="8" height="8" transform="rotate(45 149.6 74.1)"/&gt;
&lt;circle class="hit" cx="149.6" cy="74.1" r="8"&gt;&lt;title&gt;no balancing · utilization 0.57 · purity 0.73&lt;/title&gt;&lt;/circle&gt;
&lt;text class="reflabel" x="139.6" y="78.1" text-anchor="end"&gt;no balancing&lt;/text&gt;
&lt;defs&gt;&lt;marker id="toArrow" viewBox="0 0 8 8" refX="6.5" refY="4" markerWidth="6" markerHeight="6" orient="auto"&gt;&lt;path fill="var(--text-light,#9ca3af)" d="M0,0 L8,4 L0,8 Z"/&gt;&lt;/marker&gt;&lt;/defs&gt;
&lt;line class="leader" x1="370.0" y1="469.5" x2="264.1" y2="387.1" stroke="var(--text-light,#9ca3af)" marker-end="url(#toArrow)"/&gt;
&lt;text class="reflabel" x="381.8" y="481.9"&gt;weaker balancing&lt;/text&gt;
&lt;text class="reflabel" x="82" y="369.0"&gt;Balancing scope&lt;/text&gt;
&lt;g class="s1"&gt;
&lt;circle class="dot" cx="88.0" cy="381.0" r="4"/&gt;
&lt;text class="slabel" x="102" y="385.0"&gt;1 sequence&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s2"&gt;
&lt;circle class="dot" cx="88.0" cy="396.0" r="4"/&gt;
&lt;text class="slabel" x="102" y="400.0"&gt;2 sequences&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s8"&gt;
&lt;circle class="dot" cx="88.0" cy="411.0" r="4"/&gt;
&lt;text class="slabel" x="102" y="415.0"&gt;8 sequences&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s16"&gt;
&lt;circle class="dot" cx="88.0" cy="426.0" r="4"/&gt;
&lt;text class="slabel" x="102" y="430.0"&gt;16 sequences&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s64"&gt;
&lt;circle class="dot" cx="88.0" cy="441.0" r="4"/&gt;
&lt;text class="slabel" x="102" y="445.0"&gt;64 sequences (global)&lt;/text&gt;
&lt;/g&gt;
&lt;text class="reflabel" x="82" y="474.0"&gt;Method&lt;/text&gt;
&lt;g class="s8"&gt;
&lt;line class="series" x1="78" y1="486.0" x2="98" y2="486.0"/&gt;
&lt;circle class="dot" cx="88.0" cy="486.0" r="3"/&gt;
&lt;text class="slabel" x="102" y="490.0"&gt;LBL, strength swept&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s8"&gt;
&lt;rect class="msq" x="84.4" y="497.4" width="7.2" height="7.2"/&gt;
&lt;text class="slabel" x="102" y="505.0"&gt;BA&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s8"&gt;
&lt;path class="mtri" d="M 88.0 511.4 L 92.2 518.9 L 83.8 518.9 Z"/&gt;
&lt;text class="slabel" x="102" y="520.0"&gt;SH&lt;/text&gt;
&lt;/g&gt;
&lt;g class="s8"&gt;
&lt;path class="mplus" d="M 83.6 531.0 H 92.4 M 88.0 526.6 V 535.4"/&gt;
&lt;text class="slabel" x="102" y="535.0"&gt;EB&lt;/text&gt;
&lt;/g&gt;
&lt;/svg&gt;
&lt;figcaption&gt;Expert utilization vs. routing purity for the four LBL strength sweeps and the single-point results of BA, SH and EB. Color encodes the balancing scope, shape the method and the balancing strength is swept along each LBL line (strong balancing bottom right, weak top left). At a scope of one sequence, balancing trades utilization one for one against purity, while at larger scopes both become achievable at once. Without any balancing (gray diamond), specialization emerges on its own, at the cost of significant utilization.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;At a scope of just one sequence, the strength sweep is an almost straight line, from high utilization at low purity for the strongest weight down to low utilization at high purity for the weakest one. Every bit of balance is paid for with purity here, which is exactly the conceptual conflict described above and hence the intuitive result to expect. The run without any balancing, included as the gray diamond, confirms that specialization is what the router does on its own: It lands among the highest purity values of the whole sweep without any help, but its utilization is low. With growing scope, the lines bend towards the top-right corner. At a scope of 16 sequences, the strongest balancing already starts at higher purity and the best configurations reach around 0.9 utilization and 0.6 purity at the same time, resolving the conflict.&lt;/p&gt;
&lt;p&gt;The validation loss on the testbed mix follows that trade-off closely, with the lowest loss of every run in the plot coming from the large-scope LBL configurations, while the strongly balanced sequence-scope configurations produce the highest. Coloring the same landscape by that loss makes the correspondence easier to see:&lt;/p&gt;
&lt;figure&gt;&lt;svg aria-label="The same landscape colored by validation loss on the testbed mix" class="moe-chart" viewBox="0 0 700 600" xmlns="http://www.w3.org/2000/svg" role="img"&gt;
&lt;style&gt;.moe-chart{font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}.moe-chart .grid{stroke:var(--border,#e5e7eb);stroke-width:1}.moe-chart .axis{stroke:var(--border,#e5e7eb);stroke-width:1.2}.moe-chart .tick{fill:var(--text-muted,#6b7280);font-size:13px}.moe-chart .atitle{fill:var(--text,#1a1a1a);font-size:14px}.moe-chart .series{fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .ref{fill:none;stroke:var(--text-light,#9ca3af);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .dot{fill:currentColor;stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .refdot{fill:var(--text-light,#9ca3af);stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .hit{fill:transparent;stroke:none;pointer-events:all;cursor:crosshair}.moe-chart .slabel{fill:currentColor;font-size:12.5px}.moe-chart .leader{stroke:currentColor;stroke-width:1;opacity:.55}.moe-chart .reflabel{fill:var(--text-muted,#6b7280);font-size:12.5px}.moe-chart .ptitle{fill:var(--text,#1a1a1a);font-size:13.5px;text-anchor:middle}.moe-chart .lmark{fill:currentColor;stroke:var(--text-muted,#6b7280);stroke-width:0.9}.moe-chart .lplusbg{fill:none;stroke:var(--text-muted,#6b7280);stroke-width:4.6;stroke-linecap:round}.moe-chart .lplus{fill:none;stroke:currentColor;stroke-width:2.8;stroke-linecap:round}.moe-chart .cbtick{fill:var(--text-muted,#6b7280);font-size:11px}.moe-chart .bestring{fill:none;stroke:var(--text,#1a1a1a);stroke-width:1.4}.moe-chart .l0{color:#fbe0a0}.moe-chart .l1{color:#f0bd63}.moe-chart .l2{color:#dd9433}.moe-chart .l3{color:#ba6516}.moe-chart .l4{color:#8a400c}.moe-chart .l5{color:#5c2c05}@media (prefers-color-scheme:dark){.moe-chart .l0{color:#fff0bd}.moe-chart .l1{color:#ffd479}.moe-chart .l2{color:#f5a94a}.moe-chart .l3{color:#dd8130}.moe-chart .l4{color:#b85f22}.moe-chart .l5{color:#8f4417}}&lt;/style&gt;
&lt;line class="grid" x1="64.0" y1="510.8" x2="676.0" y2="510.8"/&gt;
&lt;text class="tick" x="55.0" y="514.8" text-anchor="end"&gt;0.2&lt;/text&gt;
&lt;line class="grid" x1="64.0" y1="428.3" x2="676.0" y2="428.3"/&gt;
&lt;text class="tick" x="55.0" y="432.3" text-anchor="end"&gt;0.3&lt;/text&gt;
&lt;line class="grid" x1="64.0" y1="345.8" x2="676.0" y2="345.8"/&gt;
&lt;text class="tick" x="55.0" y="349.8" text-anchor="end"&gt;0.4&lt;/text&gt;
&lt;line class="grid" x1="64.0" y1="263.4" x2="676.0" y2="263.4"/&gt;
&lt;text class="tick" x="55.0" y="267.4" text-anchor="end"&gt;0.5&lt;/text&gt;
&lt;line class="grid" x1="64.0" y1="180.9" x2="676.0" y2="180.9"/&gt;
&lt;text class="tick" x="55.0" y="184.9" text-anchor="end"&gt;0.6&lt;/text&gt;
&lt;line class="grid" x1="64.0" y1="98.5" x2="676.0" y2="98.5"/&gt;
&lt;text class="tick" x="55.0" y="102.5" text-anchor="end"&gt;0.7&lt;/text&gt;
&lt;line class="grid" x1="64.0" y1="16.0" x2="676.0" y2="16.0"/&gt;
&lt;text class="tick" x="55.0" y="20.0" text-anchor="end"&gt;0.8&lt;/text&gt;
&lt;line class="axis" x1="64.0" y1="552.0" x2="676.0" y2="552.0"/&gt;
&lt;line class="axis" x1="64.0" y1="16.0" x2="64.0" y2="552.0"/&gt;
&lt;line class="axis" x1="64.0" y1="552.0" x2="64.0" y2="556.0"/&gt;
&lt;text class="tick" x="64.0" y="570.0" text-anchor="middle"&gt;0.5&lt;/text&gt;
&lt;line class="axis" x1="181.7" y1="552.0" x2="181.7" y2="556.0"/&gt;
&lt;text class="tick" x="181.7" y="570.0" text-anchor="middle"&gt;0.6&lt;/text&gt;
&lt;line class="axis" x1="299.4" y1="552.0" x2="299.4" y2="556.0"/&gt;
&lt;text class="tick" x="299.4" y="570.0" text-anchor="middle"&gt;0.7&lt;/text&gt;
&lt;line class="axis" x1="417.1" y1="552.0" x2="417.1" y2="556.0"/&gt;
&lt;text class="tick" x="417.1" y="570.0" text-anchor="middle"&gt;0.8&lt;/text&gt;
&lt;line class="axis" x1="534.8" y1="552.0" x2="534.8" y2="556.0"/&gt;
&lt;text class="tick" x="534.8" y="570.0" text-anchor="middle"&gt;0.9&lt;/text&gt;
&lt;line class="axis" x1="652.5" y1="552.0" x2="652.5" y2="556.0"/&gt;
&lt;text class="tick" x="652.5" y="570.0" text-anchor="middle"&gt;1&lt;/text&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="557.7" cy="496.8" r="5.8"/&gt;
&lt;circle class="hit" cx="557.7" cy="496.8" r="7.8"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.22 · loss 2.895&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="562.7" cy="496.4" r="5.8"/&gt;
&lt;circle class="hit" cx="562.7" cy="496.4" r="7.8"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.22 · loss 2.889&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="565.4" cy="494.7" r="5.8"/&gt;
&lt;circle class="hit" cx="565.4" cy="494.7" r="7.8"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.93 · purity 0.22 · loss 2.888&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="564.1" cy="491.3" r="5.8"/&gt;
&lt;circle class="hit" cx="564.1" cy="491.3" r="7.8"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.22 · loss 2.886&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="558.3" cy="484.6" r="5.8"/&gt;
&lt;circle class="hit" cx="558.3" cy="484.6" r="7.8"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.23 · loss 2.883&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="546.7" cy="473.7" r="5.8"/&gt;
&lt;circle class="hit" cx="546.7" cy="473.7" r="7.8"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.91 · purity 0.24 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="512.5" cy="440.2" r="5.8"/&gt;
&lt;circle class="hit" cx="512.5" cy="440.2" r="7.8"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.88 · purity 0.29 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="436.3" cy="406.9" r="5.8"/&gt;
&lt;circle class="hit" cx="436.3" cy="406.9" r="7.8"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.82 · purity 0.33 · loss 2.879&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="359.5" cy="332.5" r="5.8"/&gt;
&lt;circle class="hit" cx="359.5" cy="332.5" r="7.8"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.75 · purity 0.42 · loss 2.875&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="278.8" cy="255.5" r="5.8"/&gt;
&lt;circle class="hit" cx="278.8" cy="255.5" r="7.8"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.68 · purity 0.51 · loss 2.879&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="229.5" cy="205.4" r="5.8"/&gt;
&lt;circle class="hit" cx="229.5" cy="205.4" r="7.8"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.64 · purity 0.57 · loss 2.877&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="187.6" cy="159.7" r="5.8"/&gt;
&lt;circle class="hit" cx="187.6" cy="159.7" r="7.8"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.60 · purity 0.63 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="246.7" cy="138.2" r="5.8"/&gt;
&lt;circle class="hit" cx="246.7" cy="138.2" r="7.8"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.66 · purity 0.65 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="244.5" cy="111.7" r="5.8"/&gt;
&lt;circle class="hit" cx="244.5" cy="111.7" r="7.8"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.65 · purity 0.68 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="210.2" cy="96.9" r="5.8"/&gt;
&lt;circle class="hit" cx="210.2" cy="96.9" r="7.8"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.62 · purity 0.70 · loss 2.883&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="556.7" cy="500.4" r="5.8"/&gt;
&lt;circle class="hit" cx="556.7" cy="500.4" r="7.8"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.92 · purity 0.21 · loss 2.892&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="570.1" cy="493.7" r="5.8"/&gt;
&lt;circle class="hit" cx="570.1" cy="493.7" r="7.8"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.93 · purity 0.22 · loss 2.888&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="563.1" cy="477.2" r="5.8"/&gt;
&lt;circle class="hit" cx="563.1" cy="477.2" r="7.8"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.92 · purity 0.24 · loss 2.886&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="553.2" cy="451.4" r="5.8"/&gt;
&lt;circle class="hit" cx="553.2" cy="451.4" r="7.8"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.92 · purity 0.27 · loss 2.883&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="547.2" cy="426.4" r="5.8"/&gt;
&lt;circle class="hit" cx="547.2" cy="426.4" r="7.8"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.91 · purity 0.30 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="552.0" cy="395.4" r="5.8"/&gt;
&lt;circle class="hit" cx="552.0" cy="395.4" r="7.8"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.91 · purity 0.34 · loss 2.879&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="533.8" cy="360.0" r="5.8"/&gt;
&lt;circle class="hit" cx="533.8" cy="360.0" r="7.8"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.90 · purity 0.38 · loss 2.877&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="464.6" cy="330.8" r="5.8"/&gt;
&lt;circle class="hit" cx="464.6" cy="330.8" r="7.8"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.84 · purity 0.42 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="396.4" cy="292.7" r="5.8"/&gt;
&lt;circle class="hit" cx="396.4" cy="292.7" r="7.8"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.78 · purity 0.46 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="314.2" cy="234.1" r="5.8"/&gt;
&lt;circle class="hit" cx="314.2" cy="234.1" r="7.8"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.71 · purity 0.54 · loss 2.878&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="238.5" cy="177.1" r="5.8"/&gt;
&lt;circle class="hit" cx="238.5" cy="177.1" r="7.8"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.65 · purity 0.60 · loss 2.881&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="175.2" cy="129.5" r="5.8"/&gt;
&lt;circle class="hit" cx="175.2" cy="129.5" r="7.8"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.59 · purity 0.66 · loss 2.888&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="235.4" cy="111.2" r="5.8"/&gt;
&lt;circle class="hit" cx="235.4" cy="111.2" r="7.8"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.65 · purity 0.68 · loss 2.884&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="145.1" cy="82.8" r="5.8"/&gt;
&lt;circle class="hit" cx="145.1" cy="82.8" r="7.8"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.57 · purity 0.72 · loss 2.890&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="154.4" cy="66.4" r="5.8"/&gt;
&lt;circle class="hit" cx="154.4" cy="66.4" r="7.8"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.58 · purity 0.74 · loss 2.887&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="551.8" cy="329.4" r="5.8"/&gt;
&lt;circle class="hit" cx="551.8" cy="329.4" r="7.8"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.42 · loss 2.880&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="542.3" cy="273.3" r="5.8"/&gt;
&lt;circle class="hit" cx="542.3" cy="273.3" r="7.8"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.49 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="548.1" cy="245.7" r="5.8"/&gt;
&lt;circle class="hit" cx="548.1" cy="245.7" r="7.8"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.52 · loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="542.3" cy="213.5" r="5.8"/&gt;
&lt;circle class="hit" cx="542.3" cy="213.5" r="7.8"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.56 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="541.5" cy="205.0" r="5.8"/&gt;
&lt;circle class="hit" cx="541.5" cy="205.0" r="7.8"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.57 · loss 2.875&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="534.5" cy="158.3" r="5.8"/&gt;
&lt;circle class="hit" cx="534.5" cy="158.3" r="7.8"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.90 · purity 0.63 · loss 2.876&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="506.5" cy="136.0" r="5.8"/&gt;
&lt;circle class="hit" cx="506.5" cy="136.0" r="7.8"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.88 · purity 0.65 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="483.8" cy="149.8" r="5.8"/&gt;
&lt;circle class="hit" cx="483.8" cy="149.8" r="7.8"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.86 · purity 0.64 · loss 2.875&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="414.8" cy="127.7" r="5.8"/&gt;
&lt;circle class="hit" cx="414.8" cy="127.7" r="7.8"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.80 · purity 0.66 · loss 2.878&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="317.4" cy="139.9" r="5.8"/&gt;
&lt;circle class="hit" cx="317.4" cy="139.9" r="7.8"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.72 · purity 0.65 · loss 2.879&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="232.1" cy="128.1" r="5.8"/&gt;
&lt;circle class="hit" cx="232.1" cy="128.1" r="7.8"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.64 · purity 0.66 · loss 2.886&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="253.0" cy="114.0" r="5.8"/&gt;
&lt;circle class="hit" cx="253.0" cy="114.0" r="7.8"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.66 · purity 0.68 · loss 2.881&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="276.1" cy="110.3" r="5.8"/&gt;
&lt;circle class="hit" cx="276.1" cy="110.3" r="7.8"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.68 · purity 0.69 · loss 2.883&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="283.8" cy="102.4" r="5.8"/&gt;
&lt;circle class="hit" cx="283.8" cy="102.4" r="7.8"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.69 · purity 0.70 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="176.6" cy="86.5" r="5.8"/&gt;
&lt;circle class="hit" cx="176.6" cy="86.5" r="7.8"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.60 · purity 0.71 · loss 2.887&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="571.3" cy="297.9" r="5.8"/&gt;
&lt;circle class="hit" cx="571.3" cy="297.9" r="7.8"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.93 · purity 0.46 · loss 2.877&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="557.2" cy="258.0" r="5.8"/&gt;
&lt;circle class="hit" cx="557.2" cy="258.0" r="7.8"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.92 · purity 0.51 · loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="557.1" cy="235.3" r="5.8"/&gt;
&lt;circle class="hit" cx="557.1" cy="235.3" r="7.8"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.92 · purity 0.53 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="550.3" cy="219.7" r="5.8"/&gt;
&lt;circle class="hit" cx="550.3" cy="219.7" r="7.8"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.91 · purity 0.55 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="545.7" cy="180.0" r="5.8"/&gt;
&lt;circle class="hit" cx="545.7" cy="180.0" r="7.8"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.91 · purity 0.60 · loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="541.7" cy="157.3" r="5.8"/&gt;
&lt;circle class="hit" cx="541.7" cy="157.3" r="7.8"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.91 · purity 0.63 · loss 2.872&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="519.1" cy="170.2" r="5.8"/&gt;
&lt;circle class="hit" cx="519.1" cy="170.2" r="7.8"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.89 · purity 0.61 · loss 2.870&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="487.2" cy="163.3" r="5.8"/&gt;
&lt;circle class="hit" cx="487.2" cy="163.3" r="7.8"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.86 · purity 0.62 · loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="449.2" cy="162.7" r="5.8"/&gt;
&lt;circle class="hit" cx="449.2" cy="162.7" r="7.8"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.83 · purity 0.62 · loss 2.875&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="365.1" cy="151.2" r="5.8"/&gt;
&lt;circle class="hit" cx="365.1" cy="151.2" r="7.8"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.76 · purity 0.64 · loss 2.880&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="240.3" cy="127.7" r="5.8"/&gt;
&lt;circle class="hit" cx="240.3" cy="127.7" r="7.8"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.65 · purity 0.66 · loss 2.884&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="220.4" cy="117.3" r="5.8"/&gt;
&lt;circle class="hit" cx="220.4" cy="117.3" r="7.8"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.63 · purity 0.68 · loss 2.886&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="197.7" cy="98.5" r="5.8"/&gt;
&lt;circle class="hit" cx="197.7" cy="98.5" r="7.8"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.61 · purity 0.70 · loss 2.886&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="199.2" cy="81.3" r="5.8"/&gt;
&lt;circle class="hit" cx="199.2" cy="81.3" r="7.8"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.61 · purity 0.72 · loss 2.884&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="206.9" cy="72.5" r="5.8"/&gt;
&lt;circle class="hit" cx="206.9" cy="72.5" r="7.8"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.62 · purity 0.73 · loss 2.885&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;path class="lplusbg" d="M 533.1 216.0 H 547.6 M 540.3 208.7 V 223.2"/&gt;&lt;path class="lplus" d="M 533.1 216.0 H 547.6 M 540.3 208.7 V 223.2"/&gt;
&lt;circle class="hit" cx="540.3" cy="216.0" r="7.8"&gt;&lt;title&gt;EB · scope 64 · utilization 0.90 · purity 0.56 · loss 2.872&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;path class="lmark" d="M 538.3 473.9 L 544.7 485.0 L 531.9 485.0 Z"/&gt;
&lt;circle class="hit" cx="538.3" cy="480.8" r="7.8"&gt;&lt;title&gt;SH · scope 1 · utilization 0.90 · purity 0.24 · loss 2.879&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;path class="lmark" d="M 575.1 373.9 L 581.5 385.1 L 568.8 385.1 Z"/&gt;
&lt;circle class="hit" cx="575.1" cy="380.9" r="7.8"&gt;&lt;title&gt;SH · scope 2 · utilization 0.93 · purity 0.36 · loss 2.877&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;path class="lmark" d="M 567.5 115.0 L 573.9 126.1 L 561.1 126.1 Z"/&gt;
&lt;circle class="hit" cx="567.5" cy="122.0" r="7.8"&gt;&lt;title&gt;SH · scope 8 · utilization 0.93 · purity 0.67 · loss 2.876&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;path class="lmark" d="M 577.4 131.2 L 583.8 142.3 L 571.0 142.3 Z"/&gt;
&lt;circle class="hit" cx="577.4" cy="138.1" r="7.8"&gt;&lt;title&gt;SH · scope 16 · utilization 0.94 · purity 0.65 · loss 2.876&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;rect class="lmark" x="647.4" y="494.3" width="10.2" height="10.2"/&gt;
&lt;circle class="hit" cx="652.5" cy="499.4" r="7.8"&gt;&lt;title&gt;BA · scope 1 · utilization 1.00 · purity 0.21 · loss 2.881&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;rect class="lmark" x="647.4" y="402.7" width="10.2" height="10.2"/&gt;
&lt;circle class="hit" cx="652.5" cy="407.8" r="7.8"&gt;&lt;title&gt;BA · scope 2 · utilization 1.00 · purity 0.32 · loss 2.877&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;rect class="lmark" x="647.4" y="123.1" width="10.2" height="10.2"/&gt;
&lt;circle class="hit" cx="652.5" cy="128.1" r="7.8"&gt;&lt;title&gt;BA · scope 8 · utilization 1.00 · purity 0.66 · loss 2.876&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;rect class="lmark" x="647.4" y="121.2" width="10.2" height="10.2"/&gt;
&lt;circle class="hit" cx="652.5" cy="126.3" r="7.8"&gt;&lt;title&gt;BA · scope 16 · utilization 1.00 · purity 0.67 · loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;&lt;rect x="78.0" y="518.0" width="25.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l1"&gt;&lt;rect x="103.0" y="518.0" width="25.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l2"&gt;&lt;rect x="128.0" y="518.0" width="25.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l3"&gt;&lt;rect x="153.0" y="518.0" width="25.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l4"&gt;&lt;rect x="178.0" y="518.0" width="25.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l5"&gt;&lt;rect x="203.0" y="518.0" width="25.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;text class="cbtick" x="78.0" y="543.0"&gt;2.870&lt;/text&gt;
&lt;text class="cbtick" x="153.0" y="543.0" text-anchor="middle"&gt;2.882&lt;/text&gt;
&lt;text class="cbtick" x="228.0" y="543.0" text-anchor="end"&gt;2.895&lt;/text&gt;
&lt;text class="cbtick" x="78.0" y="512.0"&gt;validation loss (lower is better)&lt;/text&gt;
&lt;text class="atitle" x="370.0" y="592" text-anchor="middle"&gt;Expert utilization&lt;/text&gt;
&lt;text class="atitle" x="16" y="284.0" text-anchor="middle" transform="rotate(-90 16 284.0)"&gt;Routing purity&lt;/text&gt;
&lt;/svg&gt;
&lt;figcaption&gt;The same runs and the same axes as above, colored by the validation loss on the testbed mix instead of by scope. The lowest losses sit in the upper right, where utilization and purity are high at the same time.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id="result-2-methods-are-equally-good"&gt;Result 2: Methods are equally good&lt;/h2&gt;
&lt;p&gt;In the two plots above, the alternative balancing methods were drawn as squares (BA), triangles (SH) and crosses (EB), which unlike LBL have no lines, because there is no strength to vary. BA, true to its auction formulation, pins utilization at exactly 1.0 in every configuration, so its four points sit on a vertical line at the right edge, ordered by scope. Sinkhorn behaves similarly at slightly lower utilization, and EB, applied at global scope as DeepSeek proposed it, reaches 0.90 utilization at 0.56 purity, the same neighborhood as LBL at its largest scopes. The differences between the methods are small compared to the effect of the scope and at a sufficiently large scope all four of them work well.&lt;/p&gt;
&lt;p&gt;That is worth emphasizing, given how much effort the field spent on the method question. EB was introduced with the claim of being superior to the auxiliary loss, and &lt;a href="https://arxiv.org/abs/2501.11873" target="_blank" rel="noopener noreferrer"&gt;Qiu et al. (2025)&lt;/a&gt; later showed that the two are on par once compared at the same scope, so the original comparison had confounded method with scope. Our experiments confirm this finding, but due to our testbed, we can do so by comprehensively searching the three-dimensional design space and accurately measuring and visualizing the effects, rather than just comparing the loss of two larger models. The same conclusion was recently also reported in Microsoft&amp;rsquo;s &lt;a href="https://microsoft.ai/pdf/mai-thinking-1.pdf" target="_blank" rel="noopener noreferrer"&gt;MAI-Thinking-1&lt;/a&gt;, which uses a global-batch balancing loss aggregated across data-parallel workers and micro-batches, and the report states that the aggregation strategy mattered much more than the type of loss according to their ablations, matching our observations here.&lt;/p&gt;
&lt;h2 id="result-3-the-role-of-token-dropping"&gt;Result 3: The role of token dropping&lt;/h2&gt;
&lt;p&gt;Many training setups cap the number of tokens an expert can process, i.e. they use a capacity factor and drop the tokens beyond it, trading model quality for predictable compute and communication. We repeated the grid search experiments under such caps, which inverts the picture:&lt;/p&gt;
&lt;figure&gt;&lt;svg aria-label="The landscape without token dropping and under a capacity factor of 1.0, colored by validation loss" class="moe-chart" viewBox="0 0 700 400" xmlns="http://www.w3.org/2000/svg" role="img"&gt;
&lt;style&gt;.moe-chart{font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}.moe-chart .grid{stroke:var(--border,#e5e7eb);stroke-width:1}.moe-chart .axis{stroke:var(--border,#e5e7eb);stroke-width:1.2}.moe-chart .tick{fill:var(--text-muted,#6b7280);font-size:13px}.moe-chart .atitle{fill:var(--text,#1a1a1a);font-size:14px}.moe-chart .series{fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .ref{fill:none;stroke:var(--text-light,#9ca3af);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .dot{fill:currentColor;stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .refdot{fill:var(--text-light,#9ca3af);stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .hit{fill:transparent;stroke:none;pointer-events:all;cursor:crosshair}.moe-chart .slabel{fill:currentColor;font-size:12.5px}.moe-chart .leader{stroke:currentColor;stroke-width:1;opacity:.55}.moe-chart .reflabel{fill:var(--text-muted,#6b7280);font-size:12.5px}.moe-chart .ptitle{fill:var(--text,#1a1a1a);font-size:13.5px;text-anchor:middle}.moe-chart .lmark{fill:currentColor;stroke:var(--text-muted,#6b7280);stroke-width:0.9}.moe-chart .lplusbg{fill:none;stroke:var(--text-muted,#6b7280);stroke-width:4.6;stroke-linecap:round}.moe-chart .lplus{fill:none;stroke:currentColor;stroke-width:2.8;stroke-linecap:round}.moe-chart .cbtick{fill:var(--text-muted,#6b7280);font-size:11px}.moe-chart .bestring{fill:none;stroke:var(--text,#1a1a1a);stroke-width:1.4}.moe-chart .l0{color:#fbe0a0}.moe-chart .l1{color:#f0bd63}.moe-chart .l2{color:#dd9433}.moe-chart .l3{color:#ba6516}.moe-chart .l4{color:#8a400c}.moe-chart .l5{color:#5c2c05}@media (prefers-color-scheme:dark){.moe-chart .l0{color:#fff0bd}.moe-chart .l1{color:#ffd479}.moe-chart .l2{color:#f5a94a}.moe-chart .l3{color:#dd8130}.moe-chart .l4{color:#b85f22}.moe-chart .l5{color:#8f4417}}&lt;/style&gt;
&lt;text class="ptitle" x="201.5" y="20.0"&gt;No dropping&lt;/text&gt;
&lt;line class="grid" x1="52.0" y1="343.3" x2="351.0" y2="343.3"/&gt;
&lt;text class="tick" x="43.0" y="347.3" text-anchor="end"&gt;0.2&lt;/text&gt;
&lt;line class="grid" x1="52.0" y1="290.0" x2="351.0" y2="290.0"/&gt;
&lt;text class="tick" x="43.0" y="294.0" text-anchor="end"&gt;0.3&lt;/text&gt;
&lt;line class="grid" x1="52.0" y1="236.7" x2="351.0" y2="236.7"/&gt;
&lt;text class="tick" x="43.0" y="240.7" text-anchor="end"&gt;0.4&lt;/text&gt;
&lt;line class="grid" x1="52.0" y1="183.3" x2="351.0" y2="183.3"/&gt;
&lt;text class="tick" x="43.0" y="187.3" text-anchor="end"&gt;0.5&lt;/text&gt;
&lt;line class="grid" x1="52.0" y1="130.0" x2="351.0" y2="130.0"/&gt;
&lt;text class="tick" x="43.0" y="134.0" text-anchor="end"&gt;0.6&lt;/text&gt;
&lt;line class="grid" x1="52.0" y1="76.7" x2="351.0" y2="76.7"/&gt;
&lt;text class="tick" x="43.0" y="80.7" text-anchor="end"&gt;0.7&lt;/text&gt;
&lt;line class="axis" x1="52.0" y1="354.0" x2="351.0" y2="354.0"/&gt;
&lt;line class="axis" x1="52.0" y1="34.0" x2="52.0" y2="354.0"/&gt;
&lt;line class="axis" x1="64.7" y1="354.0" x2="64.7" y2="358.0"/&gt;
&lt;text class="tick" x="64.7" y="372.0" text-anchor="middle"&gt;0.5&lt;/text&gt;
&lt;line class="axis" x1="128.3" y1="354.0" x2="128.3" y2="358.0"/&gt;
&lt;text class="tick" x="128.3" y="372.0" text-anchor="middle"&gt;0.6&lt;/text&gt;
&lt;line class="axis" x1="192.0" y1="354.0" x2="192.0" y2="358.0"/&gt;
&lt;text class="tick" x="192.0" y="372.0" text-anchor="middle"&gt;0.7&lt;/text&gt;
&lt;line class="axis" x1="255.6" y1="354.0" x2="255.6" y2="358.0"/&gt;
&lt;text class="tick" x="255.6" y="372.0" text-anchor="middle"&gt;0.8&lt;/text&gt;
&lt;line class="axis" x1="319.2" y1="354.0" x2="319.2" y2="358.0"/&gt;
&lt;text class="tick" x="319.2" y="372.0" text-anchor="middle"&gt;0.9&lt;/text&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="331.6" cy="334.3" r="4.2"/&gt;
&lt;circle class="hit" cx="331.6" cy="334.3" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.22 · loss 2.895&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="334.3" cy="334.1" r="4.2"/&gt;
&lt;circle class="hit" cx="334.3" cy="334.1" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.22 · loss 2.889&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="335.7" cy="332.9" r="4.2"/&gt;
&lt;circle class="hit" cx="335.7" cy="332.9" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.93 · purity 0.22 · loss 2.888&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="335.0" cy="330.7" r="4.2"/&gt;
&lt;circle class="hit" cx="335.0" cy="330.7" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.22 · loss 2.886&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="331.9" cy="326.4" r="4.2"/&gt;
&lt;circle class="hit" cx="331.9" cy="326.4" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.23 · loss 2.883&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="325.6" cy="319.4" r="4.2"/&gt;
&lt;circle class="hit" cx="325.6" cy="319.4" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.91 · purity 0.24 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="307.2" cy="297.7" r="4.2"/&gt;
&lt;circle class="hit" cx="307.2" cy="297.7" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.88 · purity 0.29 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="265.9" cy="276.1" r="4.2"/&gt;
&lt;circle class="hit" cx="265.9" cy="276.1" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.82 · purity 0.33 · loss 2.879&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="224.5" cy="228.0" r="4.2"/&gt;
&lt;circle class="hit" cx="224.5" cy="228.0" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.75 · purity 0.42 · loss 2.875&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="180.8" cy="178.2" r="4.2"/&gt;
&lt;circle class="hit" cx="180.8" cy="178.2" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.68 · purity 0.51 · loss 2.879&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="154.2" cy="145.8" r="4.2"/&gt;
&lt;circle class="hit" cx="154.2" cy="145.8" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.64 · purity 0.57 · loss 2.877&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="131.5" cy="116.3" r="4.2"/&gt;
&lt;circle class="hit" cx="131.5" cy="116.3" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.60 · purity 0.63 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="163.5" cy="102.4" r="4.2"/&gt;
&lt;circle class="hit" cx="163.5" cy="102.4" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.66 · purity 0.65 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="162.3" cy="85.3" r="4.2"/&gt;
&lt;circle class="hit" cx="162.3" cy="85.3" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.65 · purity 0.68 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="143.7" cy="75.7" r="4.2"/&gt;
&lt;circle class="hit" cx="143.7" cy="75.7" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.62 · purity 0.70 · loss 2.883&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="328.4" cy="226.0" r="4.2"/&gt;
&lt;circle class="hit" cx="328.4" cy="226.0" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.42 · loss 2.880&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="323.3" cy="189.7" r="4.2"/&gt;
&lt;circle class="hit" cx="323.3" cy="189.7" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.49 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="326.4" cy="171.9" r="4.2"/&gt;
&lt;circle class="hit" cx="326.4" cy="171.9" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.52 · loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="323.3" cy="151.1" r="4.2"/&gt;
&lt;circle class="hit" cx="323.3" cy="151.1" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.56 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="322.8" cy="145.6" r="4.2"/&gt;
&lt;circle class="hit" cx="322.8" cy="145.6" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.57 · loss 2.875&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="319.1" cy="115.4" r="4.2"/&gt;
&lt;circle class="hit" cx="319.1" cy="115.4" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.90 · purity 0.63 · loss 2.876&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="303.9" cy="100.9" r="4.2"/&gt;
&lt;circle class="hit" cx="303.9" cy="100.9" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.88 · purity 0.65 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="291.6" cy="109.9" r="4.2"/&gt;
&lt;circle class="hit" cx="291.6" cy="109.9" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.86 · purity 0.64 · loss 2.875&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="254.4" cy="95.5" r="4.2"/&gt;
&lt;circle class="hit" cx="254.4" cy="95.5" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.80 · purity 0.66 · loss 2.878&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="201.7" cy="103.5" r="4.2"/&gt;
&lt;circle class="hit" cx="201.7" cy="103.5" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.72 · purity 0.65 · loss 2.879&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="155.6" cy="95.9" r="4.2"/&gt;
&lt;circle class="hit" cx="155.6" cy="95.9" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.64 · purity 0.66 · loss 2.886&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="166.9" cy="86.7" r="4.2"/&gt;
&lt;circle class="hit" cx="166.9" cy="86.7" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.66 · purity 0.68 · loss 2.881&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="179.4" cy="84.3" r="4.2"/&gt;
&lt;circle class="hit" cx="179.4" cy="84.3" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.68 · purity 0.69 · loss 2.883&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="183.6" cy="79.2" r="4.2"/&gt;
&lt;circle class="hit" cx="183.6" cy="79.2" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.69 · purity 0.70 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="125.6" cy="68.9" r="4.2"/&gt;
&lt;circle class="hit" cx="125.6" cy="68.9" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.60 · purity 0.71 · loss 2.887&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="328.6" cy="188.1" r="4.2"/&gt;
&lt;circle class="hit" cx="328.6" cy="188.1" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.91 · purity 0.49 · loss 2.877&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="328.4" cy="164.1" r="4.2"/&gt;
&lt;circle class="hit" cx="328.4" cy="164.1" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.91 · purity 0.54 · loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="326.9" cy="142.8" r="4.2"/&gt;
&lt;circle class="hit" cx="326.9" cy="142.8" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.91 · purity 0.58 · loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="323.6" cy="133.0" r="4.2"/&gt;
&lt;circle class="hit" cx="323.6" cy="133.0" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.91 · purity 0.59 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="325.6" cy="133.1" r="4.2"/&gt;
&lt;circle class="hit" cx="325.6" cy="133.1" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.91 · purity 0.59 · loss 2.875&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="317.3" cy="107.2" r="4.2"/&gt;
&lt;circle class="hit" cx="317.3" cy="107.2" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.90 · purity 0.64 · loss 2.875&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="306.5" cy="99.1" r="4.2"/&gt;
&lt;circle class="hit" cx="306.5" cy="99.1" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.88 · purity 0.66 · loss 2.875&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="284.4" cy="105.5" r="4.2"/&gt;
&lt;circle class="hit" cx="284.4" cy="105.5" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.85 · purity 0.65 · loss 2.875&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="254.2" cy="90.3" r="4.2"/&gt;
&lt;circle class="hit" cx="254.2" cy="90.3" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.80 · purity 0.67 · loss 2.878&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="199.3" cy="101.8" r="4.2"/&gt;
&lt;circle class="hit" cx="199.3" cy="101.8" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.71 · purity 0.65 · loss 2.879&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="171.3" cy="100.9" r="4.2"/&gt;
&lt;circle class="hit" cx="171.3" cy="100.9" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.67 · purity 0.65 · loss 2.885&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="166.6" cy="86.4" r="4.2"/&gt;
&lt;circle class="hit" cx="166.6" cy="86.4" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.66 · purity 0.68 · loss 2.883&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="160.1" cy="81.4" r="4.2"/&gt;
&lt;circle class="hit" cx="160.1" cy="81.4" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.65 · purity 0.69 · loss 2.884&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="159.0" cy="76.8" r="4.2"/&gt;
&lt;circle class="hit" cx="159.0" cy="76.8" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.65 · purity 0.70 · loss 2.883&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="158.6" cy="76.3" r="4.2"/&gt;
&lt;circle class="hit" cx="158.6" cy="76.3" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.65 · purity 0.70 · loss 2.884&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;path class="lplusbg" d="M 316.9 152.7 H 327.4 M 322.2 147.4 V 157.9"/&gt;&lt;path class="lplus" d="M 316.9 152.7 H 327.4 M 322.2 147.4 V 157.9"/&gt;
&lt;circle class="hit" cx="322.2" cy="152.7" r="6.2"&gt;&lt;title&gt;EB · scope 64 · utilization 0.90 · purity 0.56 · loss 2.872&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;circle class="bestring" cx="322.2" cy="152.7" r="9"/&gt;
&lt;text class="reflabel" x="309.2" y="156.7" text-anchor="end"&gt;best loss: EB, scope 64&lt;/text&gt;
&lt;g class="l0"&gt;&lt;rect x="66.0" y="320.0" width="16.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l1"&gt;&lt;rect x="82.0" y="320.0" width="16.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l2"&gt;&lt;rect x="98.0" y="320.0" width="16.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l3"&gt;&lt;rect x="114.0" y="320.0" width="16.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l4"&gt;&lt;rect x="130.0" y="320.0" width="16.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l5"&gt;&lt;rect x="146.0" y="320.0" width="16.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;text class="cbtick" x="66.0" y="345.0"&gt;2.872&lt;/text&gt;
&lt;text class="cbtick" x="114.0" y="345.0" text-anchor="middle"&gt;2.897&lt;/text&gt;
&lt;text class="cbtick" x="162.0" y="345.0" text-anchor="end"&gt;2.922&lt;/text&gt;
&lt;text class="cbtick" x="66.0" y="314.0"&gt;validation loss (lower is better)&lt;/text&gt;
&lt;text class="ptitle" x="536.5" y="20.0"&gt;Tokens per expert capped at 1.0&lt;/text&gt;
&lt;line class="grid" x1="387.0" y1="343.3" x2="686.0" y2="343.3"/&gt;
&lt;line class="grid" x1="387.0" y1="290.0" x2="686.0" y2="290.0"/&gt;
&lt;line class="grid" x1="387.0" y1="236.7" x2="686.0" y2="236.7"/&gt;
&lt;line class="grid" x1="387.0" y1="183.3" x2="686.0" y2="183.3"/&gt;
&lt;line class="grid" x1="387.0" y1="130.0" x2="686.0" y2="130.0"/&gt;
&lt;line class="grid" x1="387.0" y1="76.7" x2="686.0" y2="76.7"/&gt;
&lt;line class="axis" x1="387.0" y1="354.0" x2="686.0" y2="354.0"/&gt;
&lt;line class="axis" x1="387.0" y1="34.0" x2="387.0" y2="354.0"/&gt;
&lt;line class="axis" x1="399.7" y1="354.0" x2="399.7" y2="358.0"/&gt;
&lt;text class="tick" x="399.7" y="372.0" text-anchor="middle"&gt;0.5&lt;/text&gt;
&lt;line class="axis" x1="463.3" y1="354.0" x2="463.3" y2="358.0"/&gt;
&lt;text class="tick" x="463.3" y="372.0" text-anchor="middle"&gt;0.6&lt;/text&gt;
&lt;line class="axis" x1="527.0" y1="354.0" x2="527.0" y2="358.0"/&gt;
&lt;text class="tick" x="527.0" y="372.0" text-anchor="middle"&gt;0.7&lt;/text&gt;
&lt;line class="axis" x1="590.6" y1="354.0" x2="590.6" y2="358.0"/&gt;
&lt;text class="tick" x="590.6" y="372.0" text-anchor="middle"&gt;0.8&lt;/text&gt;
&lt;line class="axis" x1="654.2" y1="354.0" x2="654.2" y2="358.0"/&gt;
&lt;text class="tick" x="654.2" y="372.0" text-anchor="middle"&gt;0.9&lt;/text&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="664.2" cy="333.7" r="4.2"/&gt;
&lt;circle class="hit" cx="664.2" cy="333.7" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.22 · loss 2.895&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="670.5" cy="334.2" r="4.2"/&gt;
&lt;circle class="hit" cx="670.5" cy="334.2" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.93 · purity 0.22 · loss 2.889&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="669.8" cy="333.7" r="4.2"/&gt;
&lt;circle class="hit" cx="669.8" cy="333.7" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.22 · loss 2.890&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="666.7" cy="332.0" r="4.2"/&gt;
&lt;circle class="hit" cx="666.7" cy="332.0" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.22 · loss 2.886&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="667.2" cy="329.6" r="4.2"/&gt;
&lt;circle class="hit" cx="667.2" cy="329.6" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.23 · loss 2.884&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="661.4" cy="327.1" r="4.2"/&gt;
&lt;circle class="hit" cx="661.4" cy="327.1" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.91 · purity 0.23 · loss 2.884&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="654.3" cy="321.4" r="4.2"/&gt;
&lt;circle class="hit" cx="654.3" cy="321.4" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.90 · purity 0.24 · loss 2.883&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="640.2" cy="313.8" r="4.2"/&gt;
&lt;circle class="hit" cx="640.2" cy="313.8" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.88 · purity 0.26 · loss 2.885&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="607.8" cy="298.6" r="4.2"/&gt;
&lt;circle class="hit" cx="607.8" cy="298.6" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.83 · purity 0.28 · loss 2.889&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="527.5" cy="275.9" r="4.2"/&gt;
&lt;circle class="hit" cx="527.5" cy="275.9" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.70 · purity 0.33 · loss 2.893&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="430.1" cy="233.1" r="4.2"/&gt;
&lt;circle class="hit" cx="430.1" cy="233.1" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.55 · purity 0.41 · loss 2.910&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="402.6" cy="211.4" r="4.2"/&gt;
&lt;circle class="hit" cx="402.6" cy="211.4" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.50 · purity 0.45 · loss 2.915&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="663.4" cy="294.1" r="4.2"/&gt;
&lt;circle class="hit" cx="663.4" cy="294.1" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.29 · loss 2.892&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="661.9" cy="269.6" r="4.2"/&gt;
&lt;circle class="hit" cx="661.9" cy="269.6" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.34 · loss 2.893&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="664.6" cy="240.2" r="4.2"/&gt;
&lt;circle class="hit" cx="664.6" cy="240.2" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.92 · purity 0.39 · loss 2.893&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="663.2" cy="234.7" r="4.2"/&gt;
&lt;circle class="hit" cx="663.2" cy="234.7" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.40 · loss 2.897&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="662.2" cy="220.4" r="4.2"/&gt;
&lt;circle class="hit" cx="662.2" cy="220.4" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.43 · loss 2.897&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="658.3" cy="205.9" r="4.2"/&gt;
&lt;circle class="hit" cx="658.3" cy="205.9" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.46 · loss 2.899&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="648.7" cy="209.0" r="4.2"/&gt;
&lt;circle class="hit" cx="648.7" cy="209.0" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.89 · purity 0.45 · loss 2.900&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="616.7" cy="204.9" r="4.2"/&gt;
&lt;circle class="hit" cx="616.7" cy="204.9" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.84 · purity 0.46 · loss 2.904&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="592.0" cy="218.2" r="4.2"/&gt;
&lt;circle class="hit" cx="592.0" cy="218.2" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.80 · purity 0.43 · loss 2.905&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="511.2" cy="230.2" r="4.2"/&gt;
&lt;circle class="hit" cx="511.2" cy="230.2" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.68 · purity 0.41 · loss 2.908&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="440.1" cy="212.3" r="4.2"/&gt;
&lt;circle class="hit" cx="440.1" cy="212.3" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.56 · purity 0.45 · loss 2.918&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="421.3" cy="197.8" r="4.2"/&gt;
&lt;circle class="hit" cx="421.3" cy="197.8" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.53 · purity 0.47 · loss 2.922&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="667.5" cy="239.2" r="4.2"/&gt;
&lt;circle class="hit" cx="667.5" cy="239.2" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.92 · purity 0.40 · loss 2.896&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="661.5" cy="218.6" r="4.2"/&gt;
&lt;circle class="hit" cx="661.5" cy="218.6" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.91 · purity 0.43 · loss 2.897&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="661.5" cy="222.3" r="4.2"/&gt;
&lt;circle class="hit" cx="661.5" cy="222.3" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.91 · purity 0.43 · loss 2.894&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="657.8" cy="219.4" r="4.2"/&gt;
&lt;circle class="hit" cx="657.8" cy="219.4" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.91 · purity 0.43 · loss 2.898&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="660.5" cy="205.3" r="4.2"/&gt;
&lt;circle class="hit" cx="660.5" cy="205.3" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.91 · purity 0.46 · loss 2.900&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="656.6" cy="197.4" r="4.2"/&gt;
&lt;circle class="hit" cx="656.6" cy="197.4" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.90 · purity 0.47 · loss 2.903&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="642.0" cy="206.3" r="4.2"/&gt;
&lt;circle class="hit" cx="642.0" cy="206.3" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.88 · purity 0.46 · loss 2.903&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="622.0" cy="203.0" r="4.2"/&gt;
&lt;circle class="hit" cx="622.0" cy="203.0" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.85 · purity 0.46 · loss 2.906&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="596.4" cy="223.7" r="4.2"/&gt;
&lt;circle class="hit" cx="596.4" cy="223.7" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.81 · purity 0.42 · loss 2.904&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="506.9" cy="231.5" r="4.2"/&gt;
&lt;circle class="hit" cx="506.9" cy="231.5" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.67 · purity 0.41 · loss 2.909&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="445.3" cy="214.4" r="4.2"/&gt;
&lt;circle class="hit" cx="445.3" cy="214.4" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.57 · purity 0.44 · loss 2.919&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="416.1" cy="198.2" r="4.2"/&gt;
&lt;circle class="hit" cx="416.1" cy="198.2" r="6.2"&gt;&lt;title&gt;LBL · scope 64 · utilization 0.53 · purity 0.47 · loss 2.921&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;path class="lplusbg" d="M 655.5 218.7 H 666.0 M 660.7 213.5 V 224.0"/&gt;&lt;path class="lplus" d="M 655.5 218.7 H 666.0 M 660.7 213.5 V 224.0"/&gt;
&lt;circle class="hit" cx="660.7" cy="218.7" r="6.2"&gt;&lt;title&gt;EB · scope 64 · utilization 0.91 · purity 0.43 · loss 2.898&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;circle class="bestring" cx="654.3" cy="321.4" r="9"/&gt;
&lt;text class="reflabel" x="641.3" y="325.4" text-anchor="end"&gt;best loss: LBL, scope 1&lt;/text&gt;
&lt;text class="atitle" x="350.0" y="392" text-anchor="middle"&gt;Expert utilization&lt;/text&gt;
&lt;text class="atitle" x="15" y="194.0" text-anchor="middle" transform="rotate(-90 15 194.0)"&gt;Routing purity&lt;/text&gt;
&lt;/svg&gt;
&lt;figcaption&gt;The landscape without dropping (left) and with a capacity factor 1.0 (right), for LBL at scopes of 1, 8 and 64 sequences plus EB, on a shared loss scale. Under the cap, the reachable purity falls from 0.71 to 0.47 and the best run becomes a strongly balanced sequence-scope configuration.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Two things change: The purity ceiling reduces substantially, so the specialized part of the landscape is no longer reachable at all. And the best run, ringed in both panels, moves from EB at global scope to LBL at a scope of one sequence, while the overall loss level rises. The reason is that the capacity constraint is enforced per device, so only strong local balancing avoids heavy dropping under it. Since the damage from the dropped tokens seems to outweigh what the specialization gains, the best strategy becomes to avoid dropping by strong local balancing. This is also in line with the experience at MAI, who observed that conclusions about balancing methodology can flip depending on the expert capacity and converged on a fully dropless implementation as in our baseline setting.&lt;/p&gt;
&lt;h2 id="result-4-validation-loss-hides-the-effects"&gt;Result 4: Validation loss hides the effects&lt;/h2&gt;
&lt;p&gt;One could ask whether the testbed is needed for any of this, or whether a plain validation loss would have shown the same. We checked that by training the same configurations on &lt;a href="https://arxiv.org/abs/2512.13961" target="_blank" rel="noopener noreferrer"&gt;Dolma3&lt;/a&gt;, the open training mix of the OLMo 3 models, and the following plot colors the trade-off landscape by the loss of both side by side:&lt;/p&gt;
&lt;figure&gt;&lt;svg aria-label="The same utilization versus routing purity landscape colored by validation loss on the testbed mix and on Dolma3" class="moe-chart" viewBox="0 0 700 400" xmlns="http://www.w3.org/2000/svg" role="img"&gt;
&lt;style&gt;.moe-chart{font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}.moe-chart .grid{stroke:var(--border,#e5e7eb);stroke-width:1}.moe-chart .axis{stroke:var(--border,#e5e7eb);stroke-width:1.2}.moe-chart .tick{fill:var(--text-muted,#6b7280);font-size:13px}.moe-chart .atitle{fill:var(--text,#1a1a1a);font-size:14px}.moe-chart .series{fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .ref{fill:none;stroke:var(--text-light,#9ca3af);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .dot{fill:currentColor;stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .refdot{fill:var(--text-light,#9ca3af);stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .hit{fill:transparent;stroke:none;pointer-events:all;cursor:crosshair}.moe-chart .slabel{fill:currentColor;font-size:12.5px}.moe-chart .leader{stroke:currentColor;stroke-width:1;opacity:.55}.moe-chart .reflabel{fill:var(--text-muted,#6b7280);font-size:12.5px}.moe-chart .ptitle{fill:var(--text,#1a1a1a);font-size:13.5px;text-anchor:middle}.moe-chart .lmark{fill:currentColor;stroke:var(--text-muted,#6b7280);stroke-width:0.9}.moe-chart .lplusbg{fill:none;stroke:var(--text-muted,#6b7280);stroke-width:4.6;stroke-linecap:round}.moe-chart .lplus{fill:none;stroke:currentColor;stroke-width:2.8;stroke-linecap:round}.moe-chart .cbtick{fill:var(--text-muted,#6b7280);font-size:11px}.moe-chart .bestring{fill:none;stroke:var(--text,#1a1a1a);stroke-width:1.4}.moe-chart .l0{color:#fbe0a0}.moe-chart .l1{color:#f0bd63}.moe-chart .l2{color:#dd9433}.moe-chart .l3{color:#ba6516}.moe-chart .l4{color:#8a400c}.moe-chart .l5{color:#5c2c05}@media (prefers-color-scheme:dark){.moe-chart .l0{color:#fff0bd}.moe-chart .l1{color:#ffd479}.moe-chart .l2{color:#f5a94a}.moe-chart .l3{color:#dd8130}.moe-chart .l4{color:#b85f22}.moe-chart .l5{color:#8f4417}}&lt;/style&gt;
&lt;text class="ptitle" x="201.5" y="20.0"&gt;Loss on the testbed mix&lt;/text&gt;
&lt;line class="grid" x1="52.0" y1="343.3" x2="351.0" y2="343.3"/&gt;
&lt;text class="tick" x="43.0" y="347.3" text-anchor="end"&gt;0.2&lt;/text&gt;
&lt;line class="grid" x1="52.0" y1="290.0" x2="351.0" y2="290.0"/&gt;
&lt;text class="tick" x="43.0" y="294.0" text-anchor="end"&gt;0.3&lt;/text&gt;
&lt;line class="grid" x1="52.0" y1="236.7" x2="351.0" y2="236.7"/&gt;
&lt;text class="tick" x="43.0" y="240.7" text-anchor="end"&gt;0.4&lt;/text&gt;
&lt;line class="grid" x1="52.0" y1="183.3" x2="351.0" y2="183.3"/&gt;
&lt;text class="tick" x="43.0" y="187.3" text-anchor="end"&gt;0.5&lt;/text&gt;
&lt;line class="grid" x1="52.0" y1="130.0" x2="351.0" y2="130.0"/&gt;
&lt;text class="tick" x="43.0" y="134.0" text-anchor="end"&gt;0.6&lt;/text&gt;
&lt;line class="grid" x1="52.0" y1="76.7" x2="351.0" y2="76.7"/&gt;
&lt;text class="tick" x="43.0" y="80.7" text-anchor="end"&gt;0.7&lt;/text&gt;
&lt;line class="axis" x1="52.0" y1="354.0" x2="351.0" y2="354.0"/&gt;
&lt;line class="axis" x1="52.0" y1="34.0" x2="52.0" y2="354.0"/&gt;
&lt;line class="axis" x1="83.8" y1="354.0" x2="83.8" y2="358.0"/&gt;
&lt;text class="tick" x="83.8" y="372.0" text-anchor="middle"&gt;0.6&lt;/text&gt;
&lt;line class="axis" x1="147.4" y1="354.0" x2="147.4" y2="358.0"/&gt;
&lt;text class="tick" x="147.4" y="372.0" text-anchor="middle"&gt;0.7&lt;/text&gt;
&lt;line class="axis" x1="211.0" y1="354.0" x2="211.0" y2="358.0"/&gt;
&lt;text class="tick" x="211.0" y="372.0" text-anchor="middle"&gt;0.8&lt;/text&gt;
&lt;line class="axis" x1="274.7" y1="354.0" x2="274.7" y2="358.0"/&gt;
&lt;text class="tick" x="274.7" y="372.0" text-anchor="middle"&gt;0.9&lt;/text&gt;
&lt;line class="axis" x1="338.3" y1="354.0" x2="338.3" y2="358.0"/&gt;
&lt;text class="tick" x="338.3" y="372.0" text-anchor="middle"&gt;1&lt;/text&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="287.1" cy="334.3" r="4.2"/&gt;
&lt;circle class="hit" cx="287.1" cy="334.3" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.22 · loss 2.895&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="289.7" cy="334.1" r="4.2"/&gt;
&lt;circle class="hit" cx="289.7" cy="334.1" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.22 · loss 2.889&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="291.2" cy="332.9" r="4.2"/&gt;
&lt;circle class="hit" cx="291.2" cy="332.9" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.93 · purity 0.22 · loss 2.888&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="290.5" cy="330.7" r="4.2"/&gt;
&lt;circle class="hit" cx="290.5" cy="330.7" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.22 · loss 2.886&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="287.4" cy="326.4" r="4.2"/&gt;
&lt;circle class="hit" cx="287.4" cy="326.4" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.23 · loss 2.883&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="281.1" cy="319.4" r="4.2"/&gt;
&lt;circle class="hit" cx="281.1" cy="319.4" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.91 · purity 0.24 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="262.6" cy="297.7" r="4.2"/&gt;
&lt;circle class="hit" cx="262.6" cy="297.7" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.88 · purity 0.29 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="221.4" cy="276.1" r="4.2"/&gt;
&lt;circle class="hit" cx="221.4" cy="276.1" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.82 · purity 0.33 · loss 2.879&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="179.9" cy="228.0" r="4.2"/&gt;
&lt;circle class="hit" cx="179.9" cy="228.0" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.75 · purity 0.42 · loss 2.875&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="136.3" cy="178.2" r="4.2"/&gt;
&lt;circle class="hit" cx="136.3" cy="178.2" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.68 · purity 0.51 · loss 2.879&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="109.6" cy="145.8" r="4.2"/&gt;
&lt;circle class="hit" cx="109.6" cy="145.8" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.64 · purity 0.57 · loss 2.877&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="87.0" cy="116.3" r="4.2"/&gt;
&lt;circle class="hit" cx="87.0" cy="116.3" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.60 · purity 0.63 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="118.9" cy="102.4" r="4.2"/&gt;
&lt;circle class="hit" cx="118.9" cy="102.4" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.66 · purity 0.65 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="117.8" cy="85.3" r="4.2"/&gt;
&lt;circle class="hit" cx="117.8" cy="85.3" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.65 · purity 0.68 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="99.2" cy="75.7" r="4.2"/&gt;
&lt;circle class="hit" cx="99.2" cy="75.7" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.62 · purity 0.70 · loss 2.883&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="286.5" cy="336.6" r="4.2"/&gt;
&lt;circle class="hit" cx="286.5" cy="336.6" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.92 · purity 0.21 · loss 2.892&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="293.7" cy="332.3" r="4.2"/&gt;
&lt;circle class="hit" cx="293.7" cy="332.3" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.93 · purity 0.22 · loss 2.888&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="290.0" cy="321.6" r="4.2"/&gt;
&lt;circle class="hit" cx="290.0" cy="321.6" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.92 · purity 0.24 · loss 2.886&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="284.6" cy="304.9" r="4.2"/&gt;
&lt;circle class="hit" cx="284.6" cy="304.9" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.92 · purity 0.27 · loss 2.883&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="281.4" cy="288.8" r="4.2"/&gt;
&lt;circle class="hit" cx="281.4" cy="288.8" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.91 · purity 0.30 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="283.9" cy="268.7" r="4.2"/&gt;
&lt;circle class="hit" cx="283.9" cy="268.7" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.91 · purity 0.34 · loss 2.879&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="274.2" cy="245.8" r="4.2"/&gt;
&lt;circle class="hit" cx="274.2" cy="245.8" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.90 · purity 0.38 · loss 2.877&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="236.7" cy="226.9" r="4.2"/&gt;
&lt;circle class="hit" cx="236.7" cy="226.9" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.84 · purity 0.42 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="199.8" cy="202.3" r="4.2"/&gt;
&lt;circle class="hit" cx="199.8" cy="202.3" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.78 · purity 0.46 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="155.4" cy="164.4" r="4.2"/&gt;
&lt;circle class="hit" cx="155.4" cy="164.4" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.71 · purity 0.54 · loss 2.878&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="114.5" cy="127.5" r="4.2"/&gt;
&lt;circle class="hit" cx="114.5" cy="127.5" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.65 · purity 0.60 · loss 2.881&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="80.3" cy="96.7" r="4.2"/&gt;
&lt;circle class="hit" cx="80.3" cy="96.7" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.59 · purity 0.66 · loss 2.888&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="112.8" cy="84.9" r="4.2"/&gt;
&lt;circle class="hit" cx="112.8" cy="84.9" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.65 · purity 0.68 · loss 2.884&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="64.0" cy="66.5" r="4.2"/&gt;
&lt;circle class="hit" cx="64.0" cy="66.5" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.57 · purity 0.72 · loss 2.890&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="69.0" cy="55.9" r="4.2"/&gt;
&lt;circle class="hit" cx="69.0" cy="55.9" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.58 · purity 0.74 · loss 2.887&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="283.9" cy="226.0" r="4.2"/&gt;
&lt;circle class="hit" cx="283.9" cy="226.0" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.42 · loss 2.880&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="278.7" cy="189.7" r="4.2"/&gt;
&lt;circle class="hit" cx="278.7" cy="189.7" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.49 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="281.8" cy="171.9" r="4.2"/&gt;
&lt;circle class="hit" cx="281.8" cy="171.9" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.52 · loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="278.7" cy="151.1" r="4.2"/&gt;
&lt;circle class="hit" cx="278.7" cy="151.1" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.56 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="278.3" cy="145.6" r="4.2"/&gt;
&lt;circle class="hit" cx="278.3" cy="145.6" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.57 · loss 2.875&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="274.5" cy="115.4" r="4.2"/&gt;
&lt;circle class="hit" cx="274.5" cy="115.4" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.90 · purity 0.63 · loss 2.876&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="259.4" cy="100.9" r="4.2"/&gt;
&lt;circle class="hit" cx="259.4" cy="100.9" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.88 · purity 0.65 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="247.1" cy="109.9" r="4.2"/&gt;
&lt;circle class="hit" cx="247.1" cy="109.9" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.86 · purity 0.64 · loss 2.875&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="209.8" cy="95.5" r="4.2"/&gt;
&lt;circle class="hit" cx="209.8" cy="95.5" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.80 · purity 0.66 · loss 2.878&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="157.2" cy="103.5" r="4.2"/&gt;
&lt;circle class="hit" cx="157.2" cy="103.5" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.72 · purity 0.65 · loss 2.879&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="111.0" cy="95.9" r="4.2"/&gt;
&lt;circle class="hit" cx="111.0" cy="95.9" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.64 · purity 0.66 · loss 2.886&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="122.4" cy="86.7" r="4.2"/&gt;
&lt;circle class="hit" cx="122.4" cy="86.7" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.66 · purity 0.68 · loss 2.881&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="134.8" cy="84.3" r="4.2"/&gt;
&lt;circle class="hit" cx="134.8" cy="84.3" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.68 · purity 0.69 · loss 2.883&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="139.0" cy="79.2" r="4.2"/&gt;
&lt;circle class="hit" cx="139.0" cy="79.2" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.69 · purity 0.70 · loss 2.882&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="81.1" cy="68.9" r="4.2"/&gt;
&lt;circle class="hit" cx="81.1" cy="68.9" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.60 · purity 0.71 · loss 2.887&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="294.4" cy="205.7" r="4.2"/&gt;
&lt;circle class="hit" cx="294.4" cy="205.7" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.93 · purity 0.46 · loss 2.877&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="286.8" cy="179.9" r="4.2"/&gt;
&lt;circle class="hit" cx="286.8" cy="179.9" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.92 · purity 0.51 · loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="286.7" cy="165.2" r="4.2"/&gt;
&lt;circle class="hit" cx="286.7" cy="165.2" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.92 · purity 0.53 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="283.1" cy="155.1" r="4.2"/&gt;
&lt;circle class="hit" cx="283.1" cy="155.1" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.91 · purity 0.55 · loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="280.6" cy="129.4" r="4.2"/&gt;
&lt;circle class="hit" cx="280.6" cy="129.4" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.91 · purity 0.60 · loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="278.4" cy="114.7" r="4.2"/&gt;
&lt;circle class="hit" cx="278.4" cy="114.7" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.91 · purity 0.63 · loss 2.872&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="266.2" cy="123.1" r="4.2"/&gt;
&lt;circle class="hit" cx="266.2" cy="123.1" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.89 · purity 0.61 · loss 2.870&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="249.0" cy="118.6" r="4.2"/&gt;
&lt;circle class="hit" cx="249.0" cy="118.6" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.86 · purity 0.62 · loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="228.4" cy="118.2" r="4.2"/&gt;
&lt;circle class="hit" cx="228.4" cy="118.2" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.83 · purity 0.62 · loss 2.875&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="182.9" cy="110.7" r="4.2"/&gt;
&lt;circle class="hit" cx="182.9" cy="110.7" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.76 · purity 0.64 · loss 2.880&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="115.5" cy="95.5" r="4.2"/&gt;
&lt;circle class="hit" cx="115.5" cy="95.5" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.65 · purity 0.66 · loss 2.884&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="104.7" cy="88.9" r="4.2"/&gt;
&lt;circle class="hit" cx="104.7" cy="88.9" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.63 · purity 0.68 · loss 2.886&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="92.5" cy="76.7" r="4.2"/&gt;
&lt;circle class="hit" cx="92.5" cy="76.7" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.61 · purity 0.70 · loss 2.886&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="93.3" cy="65.6" r="4.2"/&gt;
&lt;circle class="hit" cx="93.3" cy="65.6" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.61 · purity 0.72 · loss 2.884&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="97.4" cy="59.9" r="4.2"/&gt;
&lt;circle class="hit" cx="97.4" cy="59.9" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.62 · purity 0.73 · loss 2.885&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;path class="lplusbg" d="M 272.4 152.7 H 282.9 M 277.6 147.4 V 157.9"/&gt;&lt;path class="lplus" d="M 272.4 152.7 H 282.9 M 277.6 147.4 V 157.9"/&gt;
&lt;circle class="hit" cx="277.6" cy="152.7" r="6.2"&gt;&lt;title&gt;EB · scope 64 · utilization 0.90 · purity 0.56 · loss 2.872&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;path class="lmark" d="M 276.6 318.9 L 281.2 327.0 L 271.9 327.0 Z"/&gt;
&lt;circle class="hit" cx="276.6" cy="324.0" r="6.2"&gt;&lt;title&gt;SH · scope 1 · utilization 0.90 · purity 0.24 · loss 2.879&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;path class="lmark" d="M 296.5 254.3 L 301.1 262.4 L 291.9 262.4 Z"/&gt;
&lt;circle class="hit" cx="296.5" cy="259.3" r="6.2"&gt;&lt;title&gt;SH · scope 2 · utilization 0.93 · purity 0.36 · loss 2.877&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;path class="lmark" d="M 292.3 86.8 L 297.0 94.9 L 287.7 94.9 Z"/&gt;
&lt;circle class="hit" cx="292.3" cy="91.9" r="6.2"&gt;&lt;title&gt;SH · scope 8 · utilization 0.93 · purity 0.67 · loss 2.876&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;path class="lmark" d="M 297.7 97.3 L 302.3 105.3 L 293.1 105.3 Z"/&gt;
&lt;circle class="hit" cx="297.7" cy="102.3" r="6.2"&gt;&lt;title&gt;SH · scope 16 · utilization 0.94 · purity 0.65 · loss 2.876&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;rect class="lmark" x="334.6" y="332.3" width="7.4" height="7.4"/&gt;
&lt;circle class="hit" cx="338.3" cy="336.0" r="6.2"&gt;&lt;title&gt;BA · scope 1 · utilization 1.00 · purity 0.21 · loss 2.881&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;rect class="lmark" x="334.6" y="273.0" width="7.4" height="7.4"/&gt;
&lt;circle class="hit" cx="338.3" cy="276.7" r="6.2"&gt;&lt;title&gt;BA · scope 2 · utilization 1.00 · purity 0.32 · loss 2.877&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;rect class="lmark" x="334.6" y="92.2" width="7.4" height="7.4"/&gt;
&lt;circle class="hit" cx="338.3" cy="95.9" r="6.2"&gt;&lt;title&gt;BA · scope 8 · utilization 1.00 · purity 0.66 · loss 2.876&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;rect class="lmark" x="334.6" y="91.0" width="7.4" height="7.4"/&gt;
&lt;circle class="hit" cx="338.3" cy="94.6" r="6.2"&gt;&lt;title&gt;BA · scope 16 · utilization 1.00 · purity 0.67 · loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;&lt;rect x="66.0" y="320.0" width="16.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l1"&gt;&lt;rect x="82.0" y="320.0" width="16.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l2"&gt;&lt;rect x="98.0" y="320.0" width="16.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l3"&gt;&lt;rect x="114.0" y="320.0" width="16.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l4"&gt;&lt;rect x="130.0" y="320.0" width="16.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l5"&gt;&lt;rect x="146.0" y="320.0" width="16.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;text class="cbtick" x="66.0" y="345.0"&gt;2.870&lt;/text&gt;
&lt;text class="cbtick" x="114.0" y="345.0" text-anchor="middle"&gt;2.882&lt;/text&gt;
&lt;text class="cbtick" x="162.0" y="345.0" text-anchor="end"&gt;2.895&lt;/text&gt;
&lt;text class="cbtick" x="66.0" y="314.0"&gt;validation loss (lower is better)&lt;/text&gt;
&lt;text class="ptitle" x="536.5" y="20.0"&gt;Loss on Dolma3&lt;/text&gt;
&lt;line class="grid" x1="387.0" y1="343.3" x2="686.0" y2="343.3"/&gt;
&lt;line class="grid" x1="387.0" y1="290.0" x2="686.0" y2="290.0"/&gt;
&lt;line class="grid" x1="387.0" y1="236.7" x2="686.0" y2="236.7"/&gt;
&lt;line class="grid" x1="387.0" y1="183.3" x2="686.0" y2="183.3"/&gt;
&lt;line class="grid" x1="387.0" y1="130.0" x2="686.0" y2="130.0"/&gt;
&lt;line class="grid" x1="387.0" y1="76.7" x2="686.0" y2="76.7"/&gt;
&lt;line class="axis" x1="387.0" y1="354.0" x2="686.0" y2="354.0"/&gt;
&lt;line class="axis" x1="387.0" y1="34.0" x2="387.0" y2="354.0"/&gt;
&lt;line class="axis" x1="418.8" y1="354.0" x2="418.8" y2="358.0"/&gt;
&lt;text class="tick" x="418.8" y="372.0" text-anchor="middle"&gt;0.6&lt;/text&gt;
&lt;line class="axis" x1="482.4" y1="354.0" x2="482.4" y2="358.0"/&gt;
&lt;text class="tick" x="482.4" y="372.0" text-anchor="middle"&gt;0.7&lt;/text&gt;
&lt;line class="axis" x1="546.0" y1="354.0" x2="546.0" y2="358.0"/&gt;
&lt;text class="tick" x="546.0" y="372.0" text-anchor="middle"&gt;0.8&lt;/text&gt;
&lt;line class="axis" x1="609.7" y1="354.0" x2="609.7" y2="358.0"/&gt;
&lt;text class="tick" x="609.7" y="372.0" text-anchor="middle"&gt;0.9&lt;/text&gt;
&lt;line class="axis" x1="673.3" y1="354.0" x2="673.3" y2="358.0"/&gt;
&lt;text class="tick" x="673.3" y="372.0" text-anchor="middle"&gt;1&lt;/text&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="622.1" cy="334.3" r="4.2"/&gt;
&lt;circle class="hit" cx="622.1" cy="334.3" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.22 · loss 4.004&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="624.7" cy="334.1" r="4.2"/&gt;
&lt;circle class="hit" cx="624.7" cy="334.1" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.22 · loss 4.002&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="626.2" cy="332.9" r="4.2"/&gt;
&lt;circle class="hit" cx="626.2" cy="332.9" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.93 · purity 0.22 · loss 4.003&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="625.5" cy="330.7" r="4.2"/&gt;
&lt;circle class="hit" cx="625.5" cy="330.7" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.22 · loss 4.002&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="622.4" cy="326.4" r="4.2"/&gt;
&lt;circle class="hit" cx="622.4" cy="326.4" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.92 · purity 0.23 · loss 3.994&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="616.1" cy="319.4" r="4.2"/&gt;
&lt;circle class="hit" cx="616.1" cy="319.4" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.91 · purity 0.24 · loss 3.991&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="597.6" cy="297.7" r="4.2"/&gt;
&lt;circle class="hit" cx="597.6" cy="297.7" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.88 · purity 0.29 · loss 3.991&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="556.4" cy="276.1" r="4.2"/&gt;
&lt;circle class="hit" cx="556.4" cy="276.1" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.82 · purity 0.33 · loss 3.986&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="514.9" cy="228.0" r="4.2"/&gt;
&lt;circle class="hit" cx="514.9" cy="228.0" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.75 · purity 0.42 · loss 3.988&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="471.3" cy="178.2" r="4.2"/&gt;
&lt;circle class="hit" cx="471.3" cy="178.2" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.68 · purity 0.51 · loss 3.992&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="444.6" cy="145.8" r="4.2"/&gt;
&lt;circle class="hit" cx="444.6" cy="145.8" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.64 · purity 0.57 · loss 3.994&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="422.0" cy="116.3" r="4.2"/&gt;
&lt;circle class="hit" cx="422.0" cy="116.3" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.60 · purity 0.63 · loss 3.990&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="453.9" cy="102.4" r="4.2"/&gt;
&lt;circle class="hit" cx="453.9" cy="102.4" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.66 · purity 0.65 · loss 3.990&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="452.8" cy="85.3" r="4.2"/&gt;
&lt;circle class="hit" cx="452.8" cy="85.3" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.65 · purity 0.68 · loss 3.995&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="434.2" cy="75.7" r="4.2"/&gt;
&lt;circle class="hit" cx="434.2" cy="75.7" r="6.2"&gt;&lt;title&gt;LBL · scope 1 · utilization 0.62 · purity 0.70 · loss 3.983&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="621.5" cy="336.6" r="4.2"/&gt;
&lt;circle class="hit" cx="621.5" cy="336.6" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.92 · purity 0.21 · loss 4.001&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="628.7" cy="332.3" r="4.2"/&gt;
&lt;circle class="hit" cx="628.7" cy="332.3" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.93 · purity 0.22 · loss 4.003&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="625.0" cy="321.6" r="4.2"/&gt;
&lt;circle class="hit" cx="625.0" cy="321.6" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.92 · purity 0.24 · loss 4.003&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="619.6" cy="304.9" r="4.2"/&gt;
&lt;circle class="hit" cx="619.6" cy="304.9" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.92 · purity 0.27 · loss 3.996&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="616.4" cy="288.8" r="4.2"/&gt;
&lt;circle class="hit" cx="616.4" cy="288.8" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.91 · purity 0.30 · loss 4.005&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="618.9" cy="268.7" r="4.2"/&gt;
&lt;circle class="hit" cx="618.9" cy="268.7" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.91 · purity 0.34 · loss 3.995&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="609.2" cy="245.8" r="4.2"/&gt;
&lt;circle class="hit" cx="609.2" cy="245.8" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.90 · purity 0.38 · loss 3.992&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="571.7" cy="226.9" r="4.2"/&gt;
&lt;circle class="hit" cx="571.7" cy="226.9" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.84 · purity 0.42 · loss 3.996&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="534.8" cy="202.3" r="4.2"/&gt;
&lt;circle class="hit" cx="534.8" cy="202.3" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.78 · purity 0.46 · loss 3.991&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="490.4" cy="164.4" r="4.2"/&gt;
&lt;circle class="hit" cx="490.4" cy="164.4" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.71 · purity 0.54 · loss 3.999&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="449.5" cy="127.5" r="4.2"/&gt;
&lt;circle class="hit" cx="449.5" cy="127.5" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.65 · purity 0.60 · loss 3.992&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="415.3" cy="96.7" r="4.2"/&gt;
&lt;circle class="hit" cx="415.3" cy="96.7" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.59 · purity 0.66 · loss 4.005&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="447.8" cy="84.9" r="4.2"/&gt;
&lt;circle class="hit" cx="447.8" cy="84.9" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.65 · purity 0.68 · loss 4.003&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="399.0" cy="66.5" r="4.2"/&gt;
&lt;circle class="hit" cx="399.0" cy="66.5" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.57 · purity 0.72 · loss 4.003&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="404.0" cy="55.9" r="4.2"/&gt;
&lt;circle class="hit" cx="404.0" cy="55.9" r="6.2"&gt;&lt;title&gt;LBL · scope 2 · utilization 0.58 · purity 0.74 · loss 4.001&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="618.9" cy="226.0" r="4.2"/&gt;
&lt;circle class="hit" cx="618.9" cy="226.0" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.42 · loss 3.994&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="613.7" cy="189.7" r="4.2"/&gt;
&lt;circle class="hit" cx="613.7" cy="189.7" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.49 · loss 3.998&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="616.8" cy="171.9" r="4.2"/&gt;
&lt;circle class="hit" cx="616.8" cy="171.9" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.52 · loss 3.996&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="613.7" cy="151.1" r="4.2"/&gt;
&lt;circle class="hit" cx="613.7" cy="151.1" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.56 · loss 3.992&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="613.3" cy="145.6" r="4.2"/&gt;
&lt;circle class="hit" cx="613.3" cy="145.6" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.91 · purity 0.57 · loss 3.993&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="609.5" cy="115.4" r="4.2"/&gt;
&lt;circle class="hit" cx="609.5" cy="115.4" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.90 · purity 0.63 · loss 3.991&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="594.4" cy="100.9" r="4.2"/&gt;
&lt;circle class="hit" cx="594.4" cy="100.9" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.88 · purity 0.65 · loss 3.988&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="582.1" cy="109.9" r="4.2"/&gt;
&lt;circle class="hit" cx="582.1" cy="109.9" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.86 · purity 0.64 · loss 3.987&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="544.8" cy="95.5" r="4.2"/&gt;
&lt;circle class="hit" cx="544.8" cy="95.5" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.80 · purity 0.66 · loss 3.985&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="492.2" cy="103.5" r="4.2"/&gt;
&lt;circle class="hit" cx="492.2" cy="103.5" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.72 · purity 0.65 · loss 3.993&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="446.0" cy="95.9" r="4.2"/&gt;
&lt;circle class="hit" cx="446.0" cy="95.9" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.64 · purity 0.66 · loss 3.992&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="457.4" cy="86.7" r="4.2"/&gt;
&lt;circle class="hit" cx="457.4" cy="86.7" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.66 · purity 0.68 · loss 3.989&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="469.8" cy="84.3" r="4.2"/&gt;
&lt;circle class="hit" cx="469.8" cy="84.3" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.68 · purity 0.69 · loss 3.988&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="474.0" cy="79.2" r="4.2"/&gt;
&lt;circle class="hit" cx="474.0" cy="79.2" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.69 · purity 0.70 · loss 3.990&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;circle class="lmark" cx="416.1" cy="68.9" r="4.2"/&gt;
&lt;circle class="hit" cx="416.1" cy="68.9" r="6.2"&gt;&lt;title&gt;LBL · scope 8 · utilization 0.60 · purity 0.71 · loss 3.984&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="629.4" cy="205.7" r="4.2"/&gt;
&lt;circle class="hit" cx="629.4" cy="205.7" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.93 · purity 0.46 · loss 4.000&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l4"&gt;
&lt;circle class="lmark" cx="621.8" cy="179.9" r="4.2"/&gt;
&lt;circle class="hit" cx="621.8" cy="179.9" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.92 · purity 0.51 · loss 4.000&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="621.7" cy="165.2" r="4.2"/&gt;
&lt;circle class="hit" cx="621.7" cy="165.2" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.92 · purity 0.53 · loss 3.994&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="618.1" cy="155.1" r="4.2"/&gt;
&lt;circle class="hit" cx="618.1" cy="155.1" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.91 · purity 0.55 · loss 3.998&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="615.6" cy="129.4" r="4.2"/&gt;
&lt;circle class="hit" cx="615.6" cy="129.4" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.91 · purity 0.60 · loss 3.997&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="613.4" cy="114.7" r="4.2"/&gt;
&lt;circle class="hit" cx="613.4" cy="114.7" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.91 · purity 0.63 · loss 3.991&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="601.2" cy="123.1" r="4.2"/&gt;
&lt;circle class="hit" cx="601.2" cy="123.1" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.89 · purity 0.61 · loss 3.992&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="584.0" cy="118.6" r="4.2"/&gt;
&lt;circle class="hit" cx="584.0" cy="118.6" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.86 · purity 0.62 · loss 3.995&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;circle class="lmark" cx="563.4" cy="118.2" r="4.2"/&gt;
&lt;circle class="hit" cx="563.4" cy="118.2" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.83 · purity 0.62 · loss 3.993&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l3"&gt;
&lt;circle class="lmark" cx="517.9" cy="110.7" r="4.2"/&gt;
&lt;circle class="hit" cx="517.9" cy="110.7" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.76 · purity 0.64 · loss 3.996&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;circle class="lmark" cx="450.5" cy="95.5" r="4.2"/&gt;
&lt;circle class="hit" cx="450.5" cy="95.5" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.65 · purity 0.66 · loss 3.990&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="439.7" cy="88.9" r="4.2"/&gt;
&lt;circle class="hit" cx="439.7" cy="88.9" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.63 · purity 0.68 · loss 4.004&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="427.5" cy="76.7" r="4.2"/&gt;
&lt;circle class="hit" cx="427.5" cy="76.7" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.61 · purity 0.70 · loss 4.003&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="428.3" cy="65.6" r="4.2"/&gt;
&lt;circle class="hit" cx="428.3" cy="65.6" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.61 · purity 0.72 · loss 4.005&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l5"&gt;
&lt;circle class="lmark" cx="432.4" cy="59.9" r="4.2"/&gt;
&lt;circle class="hit" cx="432.4" cy="59.9" r="6.2"&gt;&lt;title&gt;LBL · scope 16 · utilization 0.62 · purity 0.73 · loss 4.007&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;path class="lplusbg" d="M 607.4 152.7 H 617.9 M 612.6 147.4 V 157.9"/&gt;&lt;path class="lplus" d="M 607.4 152.7 H 617.9 M 612.6 147.4 V 157.9"/&gt;
&lt;circle class="hit" cx="612.6" cy="152.7" r="6.2"&gt;&lt;title&gt;EB · scope 64 · utilization 0.90 · purity 0.56 · loss 3.993&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;path class="lmark" d="M 611.6 318.9 L 616.2 327.0 L 606.9 327.0 Z"/&gt;
&lt;circle class="hit" cx="611.6" cy="324.0" r="6.2"&gt;&lt;title&gt;SH · scope 1 · utilization 0.90 · purity 0.24 · loss 3.986&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;path class="lmark" d="M 631.5 254.3 L 636.1 262.4 L 626.9 262.4 Z"/&gt;
&lt;circle class="hit" cx="631.5" cy="259.3" r="6.2"&gt;&lt;title&gt;SH · scope 2 · utilization 0.93 · purity 0.36 · loss 3.991&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;path class="lmark" d="M 627.3 86.8 L 632.0 94.9 L 622.7 94.9 Z"/&gt;
&lt;circle class="hit" cx="627.3" cy="91.9" r="6.2"&gt;&lt;title&gt;SH · scope 8 · utilization 0.93 · purity 0.67 · loss 3.990&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;path class="lmark" d="M 632.7 97.3 L 637.3 105.3 L 628.1 105.3 Z"/&gt;
&lt;circle class="hit" cx="632.7" cy="102.3" r="6.2"&gt;&lt;title&gt;SH · scope 16 · utilization 0.94 · purity 0.65 · loss 3.990&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;rect class="lmark" x="669.6" y="332.3" width="7.4" height="7.4"/&gt;
&lt;circle class="hit" cx="673.3" cy="336.0" r="6.2"&gt;&lt;title&gt;BA · scope 1 · utilization 1.00 · purity 0.21 · loss 3.993&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l1"&gt;
&lt;rect class="lmark" x="669.6" y="273.0" width="7.4" height="7.4"/&gt;
&lt;circle class="hit" cx="673.3" cy="276.7" r="6.2"&gt;&lt;title&gt;BA · scope 2 · utilization 1.00 · purity 0.32 · loss 3.989&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l2"&gt;
&lt;rect class="lmark" x="669.6" y="92.2" width="7.4" height="7.4"/&gt;
&lt;circle class="hit" cx="673.3" cy="95.9" r="6.2"&gt;&lt;title&gt;BA · scope 8 · utilization 1.00 · purity 0.66 · loss 3.992&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;
&lt;rect class="lmark" x="669.6" y="91.0" width="7.4" height="7.4"/&gt;
&lt;circle class="hit" cx="673.3" cy="94.6" r="6.2"&gt;&lt;title&gt;BA · scope 16 · utilization 1.00 · purity 0.67 · loss 3.987&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="l0"&gt;&lt;rect x="401.0" y="320.0" width="16.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l1"&gt;&lt;rect x="417.0" y="320.0" width="16.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l2"&gt;&lt;rect x="433.0" y="320.0" width="16.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l3"&gt;&lt;rect x="449.0" y="320.0" width="16.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l4"&gt;&lt;rect x="465.0" y="320.0" width="16.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;g class="l5"&gt;&lt;rect x="481.0" y="320.0" width="16.5" height="12" fill="currentColor" stroke="var(--text-muted,#6b7280)" stroke-width="0.5"/&gt;&lt;/g&gt;
&lt;text class="cbtick" x="401.0" y="345.0"&gt;3.983&lt;/text&gt;
&lt;text class="cbtick" x="449.0" y="345.0" text-anchor="middle"&gt;3.995&lt;/text&gt;
&lt;text class="cbtick" x="497.0" y="345.0" text-anchor="end"&gt;4.007&lt;/text&gt;
&lt;text class="cbtick" x="401.0" y="314.0"&gt;validation loss (lower is better)&lt;/text&gt;
&lt;text class="atitle" x="350.0" y="392" text-anchor="middle"&gt;Expert utilization&lt;/text&gt;
&lt;text class="atitle" x="15" y="194.0" text-anchor="middle" transform="rotate(-90 15 194.0)"&gt;Routing purity&lt;/text&gt;
&lt;/svg&gt;
&lt;figcaption&gt;The same runs and the same axes as above, colored by validation loss. On the testbed mix (left) the loss lines up with the position in the landscape, with the well-utilized and well-specialized runs in the upper right achieving the lowest loss. On Dolma3 (right) the loss varies over a comparable range, but with only a faint correspondence to the position left. Each panel has its own loss scale.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The two panels hold the same runs at the same coordinates and differ only in which loss the color encodes. On the testbed mix, the color follows the position: The upper right of the landscape is where the low losses sit. On Dolma3, the same runs scatter their colors across the landscape with no usable ordering left, even though the spread of the losses is nearly the same. Measured across all 98 configurations as a rank correlation between the loss and how far up and to the right a run sits, the testbed reaches -0.80 and Dolma3 only -0.28. At 50M active parameters, a loss on a normal pretraining mix simply cannot distinguish routing configurations, and metrics that look at the routing itself are needed instead.&lt;/p&gt;
&lt;h2 id="what-about-expert-choice"&gt;What about expert choice?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Expert choice (EC)&lt;/strong&gt; routing (&lt;a href="https://arxiv.org/abs/2202.09368" target="_blank" rel="noopener noreferrer"&gt;Zhou et al., 2022&lt;/a&gt;) often comes up in discussions about token balancing and I want to say a few words on why we did not include it in the paper. EC inverts the assignment problem &amp;ndash; experts pick their top-$k$ tokens instead of tokens picking experts &amp;ndash; and thereby it achieves perfect balance by construction. The catch however is causality: Whether an expert picks a token depends on the other tokens in the batch, including future positions of the same sequence. For an autoregressive decoder this leaks future information during training, and when generating token by token, the assignment cannot be reproduced the way it was trained. Proposed fixes bolt on extra routers and training phases but have rarely been used by production MoE models.&lt;/p&gt;
&lt;p&gt;Beyond the causality issue, EC also has another flaw: The balance is not just guaranteed by construction, it is even impossible to remove, which can be problematic at inference time where the token distribution cannot be controlled. If the model has to process a batch of tokens coming purely from one domain, the EC assignment will force them over all experts nonetheless, no matter if they are specialized in that domain or not. LBL, BA, SH and EB do not face this problem because for each of them the balancing can simply be turned off at inference time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Expert threshold (ET)&lt;/strong&gt; routing (&lt;a href="https://arxiv.org/abs/2603.11535" target="_blank" rel="noopener noreferrer"&gt;Sun et al., 2026&lt;/a&gt;) is a recent attempt to repair the causality flaw of EC. Each expert maintains a threshold, tracked as an exponential moving average calibrated on the global token distribution, and a token is routed to an expert whenever its score clears that threshold, a decision that depends only on the token itself and hence restores causality. That does indeed solve the problem, but introduces new ones instead: Calibrating the threshold successfully can be challenging. The number of experts per token is no longer fixed and the dynamic allocation might be counterintuitive, as it is driven by the token&amp;rsquo;s routing score distribution over experts against per-expert (but cross token) thresholds. And the key quality of EC, balance by construction, is given up in this case.&lt;/p&gt;
&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;This concludes my walk through the &lt;em&gt;&lt;a href="https://arxiv.org/abs/2604.07030" target="_blank" rel="noopener noreferrer"&gt;MoE Routing Testbed&lt;/a&gt;&lt;/em&gt; paper. Its special data mix with clearly distinguishable domains enables directly measuring expert specialization. Using it, we can clearly measure and visualize how token balancing choices affect the trade-offs between expert specialization and expert utilization. Scope, as noticed by previous work, is the most important factor. Only if it is large enough can the two goals be achieved at the same time instead of conflicting. The balancing method itself, i.e. using a load balancing auxiliary loss or expert biases, plays only a minor role.&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;For EB, the bias update rate is not really a knob for balancing strength but for how fast the biases adapt and hence reach an equilibrium at all. We observe that empirically: within a certain range balancing works but the degree of balance stays constant, and outside that range EB stops balancing altogether.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>A Routing Testbed for MoEs, Part 1: Measuring Routing Effectiveness</title><link>https://tobiasfalke.com/blog/moe-testbed-part1/</link><pubDate>Sun, 05 Jul 2026 00:00:00 +0000</pubDate><guid>https://tobiasfalke.com/blog/moe-testbed-part1/</guid><description>&lt;p&gt;The &lt;a href="https://tobiasfalke.com/blog/moe-intro-flops/"&gt;first post&lt;/a&gt; of this series revisited the central promise of sparse MoE models: sparsity decouples model quality from cost and allows training high quality models for less compute. But one aspect that framing quietly assumes is that the total parameters are actually put to good use. In a recent paper that I co-authored with colleagues at Amazon, &lt;em&gt;&lt;a href="https://arxiv.org/abs/2604.07030" target="_blank" rel="noopener noreferrer"&gt;MoE Routing Testbed&lt;/a&gt;&lt;/em&gt;, we argue that whether an MoE can fully realize its potential depends heavily on two properties of the routing, &lt;em&gt;load balance&lt;/em&gt; and &lt;em&gt;expert specialization&lt;/em&gt;, and we propose a testbed to measure that. In this (two-part) post, I will walk you through that paper.&lt;/p&gt;
&lt;h2 id="balance-and-specialization-determine-the-sparsity-benefit"&gt;Balance and specialization determine the sparsity benefit&lt;/h2&gt;
&lt;p&gt;A sparse MoE with $A$ active parameters and $N$ total parameters comes with the promise of enabling better model quality than a dense model with $A$ parameters. In the worst case, which is the router collapsing to route every token to just a single expert (or fixed set of $k$ experts) each time, the quality in fact collapses to just that dense counterpart (or worse), making it the lower bound for the MoE quality, or at least a baseline it should certainly beat. A dense model with $N$ parameters is an upper reference, and presumably an ambitious one that the MoE will never reach given that it limits FLOPs per token to $A$. The interesting question of practical MoE training is where exactly between the dense quality of $A$ and $N$ the MoE will land.&lt;/p&gt;
&lt;p&gt;Our paper builds on the idea that there are two key properties of the learned routing that determine where on that model quality spectrum the MoE will land:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Load Balance:&lt;/strong&gt; The router should distribute tokens equally across the experts. This is the well-known thing about MoE training, usually discussed in the context of training stability (a collapsed router can throw off the whole training) or efficiency (the more balanced the load, the more efficient the EP setup). But beyond these, balance is also important for model quality more generally. An imbalanced load that over-utilizes some experts implies that other under-utilized experts receive fewer tokens, and hence less training data, leaving their parameters under-trained compared to the other experts. As a result, the full model capacity $N$ is not leveraged as much as in a perfectly balanced case.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Expert Specialization:&lt;/strong&gt; The router should route tokens in a way that allows experts to specialize. This is a somewhat overloaded term in the MoE literature, referring to different concepts and even more proposed metrics to capture them. For our purposes here, we define good specialization as avoiding duplication: The additional parameters a sparse model has are maximally useful if they are used to learn distinct things. That happens mostly automatically in a dense model, but in a sparse MoE it depends also on the router. Only if it learns to separate the input space in a meaningful way, each expert can learn a distinct slice of the overall problem, while a less optimal routing can lead to duplicated learning across the experts. Such duplication wastes model capacity and lowers the effective capacity $N$ to some $N&amp;rsquo;&amp;lt;N$, reducing as a result the quality benefit over $A$ that the sparsity brings.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first goal is what the well-known balancing techniques for MoE training address. The second is just as important, but much harder to even see clearly. And that difference in visibility is what motivated us to set up a special training setup for MoE models in which expert specialization can be directly quantified &amp;ndash; the MoE routing testbed.&lt;/p&gt;
&lt;h2 id="specialization-needs-a-reference"&gt;Specialization needs a reference&lt;/h2&gt;
&lt;p&gt;Specialization is a claim about what an expert has learned, but what we can observe easily is where the router sends tokens. The two are connected: if an expert receives tokens from all over the data distribution, it cannot specialize on any coherent subset; if it receives a coherent subset, it at least has the chance to. So routing behavior is the natural place to look for specialization and that&amp;rsquo;s also how most previous work approached it. The problem is that for real training data, we don&amp;rsquo;t know what coherent subsets exist at the token level, and therefore we cannot say whether any given routing pattern is good, bad or just different.&lt;/p&gt;
&lt;p&gt;The solution is to control the data. If the training mix is composed of clearly separated domains, we have a strong prior for what an ideal router &lt;em&gt;should&lt;/em&gt; do: send tokens from the same domain to the same group of experts, so that each group can specialize on its domain. That immediately allows us to measure specialization in a very intuitive way: Given the tokens that are being routed to an expert, we can simply calculate to what extent they come from a single domain &amp;ndash; the higher that fraction, the better specialized the expert is.&lt;/p&gt;
&lt;p&gt;The domains even provide a &lt;em&gt;reference routing&lt;/em&gt;, which is a routing that would route all tokens from each domain cleanly to a dedicated (set of) experts. For that reference to be meaningful, it should in fact be a good routing in the sense of leading to a very well-trained MoE on that training data: ideally known to be optimal, and failing that, at least demonstrably better than what routers learn on their own. How much of that certainty we can get depends entirely on the data, which made the data mix the central design decision of the testbed.&lt;/p&gt;
&lt;h2 id="designing-the-data-mix"&gt;Designing the data mix&lt;/h2&gt;
&lt;p&gt;We considered various options to build data mixes for this testbed that represent different trade-offs between two core goals: knowing what optimal routing looks like vs. being close to realistic LLM pretraining data. The following figure illustrates that:&lt;/p&gt;
&lt;figure&gt;&lt;svg aria-label="Data options for a routing testbed, ordered from synthetic to natural, with certainty about the optimal routing decreasing as realism increases" class="moe-chart moe-designspace" viewBox="0 0 700 240" xmlns="http://www.w3.org/2000/svg" role="img"&gt;
&lt;style&gt;.moe-chart{font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}.moe-chart .grid{stroke:var(--border,#e5e7eb);stroke-width:1}.moe-chart .axis{stroke:var(--border,#e5e7eb);stroke-width:1.2}.moe-chart .tick{fill:var(--text-muted,#6b7280);font-size:13px}.moe-chart .atitle{fill:var(--text,#1a1a1a);font-size:14px}.moe-chart .series{fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .dot{fill:currentColor;stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .hit{fill:transparent;stroke:none;pointer-events:all;cursor:crosshair}.moe-chart .slabel{fill:currentColor;font-size:12.5px}.moe-chart .reflabel{fill:var(--text-muted,#6b7280);font-size:12.5px}.moe-designspace .optname{fill:var(--text,#1a1a1a);font-size:13px;text-anchor:middle}.moe-designspace .optnote{fill:var(--text-muted,#6b7280);font-size:11px;text-anchor:middle}.moe-designspace .stem{stroke:var(--text-light,#9ca3af);stroke-width:1.2}.moe-designspace .optdot{fill:#94a3b8;stroke:var(--bg,#fff);stroke-width:1.2}.moe-designspace .tradeoff{stroke:var(--text-light,#9ca3af);stroke-width:1.3}.moe-designspace .tradelabel{fill:var(--text-muted,#6b7280);font-size:12.5px}.moe-designspace .chosen .optdot{fill:#2c6fbb}.moe-designspace .chosen .optname{fill:#2c6fbb}.moe-designspace .chosen .optnote{fill:#2c6fbb}.moe-designspace .chosen .stem{stroke:#2c6fbb}.moe-designspace .endlabel{fill:var(--text-muted,#6b7280);font-size:13px}@media (prefers-color-scheme:dark){.moe-designspace .optdot{fill:#64748b}.moe-designspace .chosen .optdot{fill:#5b93d0}.moe-designspace .chosen .optname{fill:#5b93d0}.moe-designspace .chosen .optnote{fill:#5b93d0}.moe-designspace .chosen .stem{stroke:#5b93d0}}&lt;/style&gt;
&lt;defs&gt;&lt;marker id="dsArrow" viewBox="0 0 8 8" refX="6.5" refY="4" markerWidth="6" markerHeight="6" orient="auto"&gt;&lt;path fill="var(--text-light,#9ca3af)" d="M0,0 L8,4 L0,8 Z"/&gt;&lt;/marker&gt;&lt;/defs&gt;
&lt;line class="axis" x1="24" y1="126.0" x2="676" y2="126.0"/&gt;
&lt;text class="endlabel" x="24" y="148.0"&gt;synthetic&lt;/text&gt;
&lt;text class="endlabel" x="676" y="114.0" text-anchor="end"&gt;natural&lt;/text&gt;
&lt;line class="tradeoff" x1="668" y1="30" x2="32" y2="30" marker-end="url(#dsArrow)"/&gt;
&lt;text class="tradelabel" x="350.0" y="22" text-anchor="middle"&gt;certainty about the optimal routing&lt;/text&gt;
&lt;line class="tradeoff" x1="32" y1="210" x2="668" y2="210" marker-end="url(#dsArrow)"/&gt;
&lt;text class="tradelabel" x="350.0" y="226" text-anchor="middle"&gt;closeness to the real use case&lt;/text&gt;
&lt;g&gt;
&lt;circle class="optdot" cx="89.2" cy="126.0" r="4.5"/&gt;
&lt;line class="stem" x1="89.2" y1="120.5" x2="89.2" y2="91.0"/&gt;
&lt;text class="optname" x="89.2" y="72.0"&gt;Mixture of&lt;/text&gt;
&lt;text class="optname" x="89.2" y="87.0"&gt;Gaussians&lt;/text&gt;
&lt;text class="optnote" x="89.2" y="102.0"&gt;optimal routing known&lt;/text&gt;
&lt;/g&gt;
&lt;g&gt;
&lt;circle class="optdot" cx="180.5" cy="126.0" r="4.5"/&gt;
&lt;line class="stem" x1="180.5" y1="131.5" x2="180.5" y2="145.0"/&gt;
&lt;text class="optname" x="180.5" y="156.0"&gt;Context-free&lt;/text&gt;
&lt;text class="optname" x="180.5" y="171.0"&gt;grammars&lt;/text&gt;
&lt;text class="optnote" x="180.5" y="186.0"&gt;separable, optimum unknown&lt;/text&gt;
&lt;/g&gt;
&lt;g&gt;
&lt;circle class="optdot" cx="297.8" cy="126.0" r="4.5"/&gt;
&lt;line class="stem" x1="297.8" y1="120.5" x2="297.8" y2="91.0"/&gt;
&lt;text class="optname" x="297.8" y="72.0"&gt;Classification&lt;/text&gt;
&lt;text class="optname" x="297.8" y="87.0"&gt;datasets&lt;/text&gt;
&lt;text class="optnote" x="297.8" y="102.0"&gt;too little data&lt;/text&gt;
&lt;/g&gt;
&lt;g class="chosen"&gt;
&lt;circle class="optdot" cx="415.2" cy="126.0" r="4.5"/&gt;
&lt;line class="stem" x1="415.2" y1="131.5" x2="415.2" y2="145.0"/&gt;
&lt;text class="optname" x="415.2" y="156.0"&gt;Wikipedia languages,&lt;/text&gt;
&lt;text class="optname" x="415.2" y="171.0"&gt;distinct scripts&lt;/text&gt;
&lt;text class="optnote" x="415.2" y="186.0"&gt;strong prior, natural text&lt;/text&gt;
&lt;/g&gt;
&lt;g&gt;
&lt;circle class="optdot" cx="513.0" cy="126.0" r="4.5"/&gt;
&lt;line class="stem" x1="513.0" y1="120.5" x2="513.0" y2="91.0"/&gt;
&lt;text class="optname" x="513.0" y="72.0"&gt;Text&lt;/text&gt;
&lt;text class="optname" x="513.0" y="87.0"&gt;domains&lt;/text&gt;
&lt;text class="optnote" x="513.0" y="102.0"&gt;weak prior per token&lt;/text&gt;
&lt;/g&gt;
&lt;g&gt;
&lt;circle class="optdot" cx="630.4" cy="126.0" r="4.5"/&gt;
&lt;line class="stem" x1="630.4" y1="131.5" x2="630.4" y2="145.0"/&gt;
&lt;text class="optname" x="630.4" y="156.0"&gt;Typical&lt;/text&gt;
&lt;text class="optname" x="630.4" y="171.0"&gt;LLM mix&lt;/text&gt;
&lt;text class="optnote" x="630.4" y="186.0"&gt;no reference&lt;/text&gt;
&lt;/g&gt;
&lt;/svg&gt;
&lt;figcaption&gt;The design space for the testbed data: the closer a data source is to the real LLM training data, the less certain we can be about what optimal routing looks like. Our testbed relies on Wikipedia in different languages, which is a balanced trade-off between the extremes of the spectrum.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Previous work such as &lt;a href="https://aclanthology.org/2023.emnlp-main.583/" target="_blank" rel="noopener noreferrer"&gt;Dikkala et al. (2023)&lt;/a&gt; sits at one end of the spectrum: With fully synthetic data sampled from mixtures of Gaussians, the optimal routing is known by construction and can be used to assess any learned routing. But this data is far from what MoEs work with in the real LLM pretraining case, namely natural language, and raises questions about whether findings from this setup transfer. Synthetic data such as sentences sampled from context-free grammars as used in the &lt;a href="https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5250639" target="_blank" rel="noopener noreferrer"&gt;Physics of Language Models&lt;/a&gt; line of work get closer to real language, but also lose the property of having a known optimal routing. Text classification datasets bring natural text whose labels give a routing prior, but they are orders of magnitude too small to train language models on.&lt;/p&gt;
&lt;p&gt;The other end of the spectrum is the actual target use case, a large and diverse pretraining mix as used to train general-purpose LLMs. That is the real data we care about, but we have no idea about the size, shape and number of slices of that data that different experts should specialize in to obtain the optimal language modeling performance. Taking distinct domains from such a corpus and mixing them in equal proportions introduces a stronger prior for how experts should specialize, but domains are a weak signal for the individual token: many tokens of a news article could equally appear in a novel.&lt;/p&gt;
&lt;p&gt;We landed on a data mix that we think offers the most interesting trade-off, given that you can&amp;rsquo;t have fully realistic data with a known optimal routing anyway: Wikipedia in eight languages with different scripts: German, Korean, Japanese, Chinese, Hebrew, Thai, Hindi and Arabic. Language is a domain boundary that survives down to the token level, and using distinct scripts sharpens it further, since tokens from different scripts mostly don&amp;rsquo;t even share surface forms. At the same time, every sequence is real human text. This provides strong token-level priors for how tokens should be routed, as I show with experiments later in this post. We believe this data option is also the most interesting addition to the existing literature: While Dikkala et al. occupy the left end of the spectrum, and various other papers sit on the right end by trying to measure specialization in the real setup (see 2.3 in the paper), we are, to my knowledge, the first to build a testbed from the middle of that spectrum.&lt;/p&gt;
&lt;p&gt;Two structural decisions complete the mix: Each domain gets exactly 1/8 of the mix, so that all domains are equally important and &amp;ndash; crucially &amp;ndash; a perfectly balanced expert load and a perfectly specialized routing are compatible with each other by construction. And the model is matched to the mix: we pair the 8-domain data with 32 experts under top-4 routing, so that the experts divide evenly into eight groups of four, one group per domain.&lt;/p&gt;
&lt;h2 id="not-every-token-has-a-domain"&gt;Not every token has a domain&lt;/h2&gt;
&lt;p&gt;The clean picture above has one flaw: not all tokens are domain-specific, even in this mix. Digits, punctuation, whitespace and many named entities appear across all eight languages. A reference that forces &lt;em&gt;every&lt;/em&gt; token into its sequence&amp;rsquo;s domain group has to make arbitrary calls for these generic tokens &amp;ndash; the digit &amp;ldquo;7&amp;rdquo; in a Thai article is not meaningfully Thai. Naively enforcing domain routing for all tokens builds that arbitrariness into the reference, and as we&amp;rsquo;ll see later, that measurably hurts.&lt;/p&gt;
&lt;p&gt;We therefore split tokens into a domain-specific set and a generic set. A small feed-forward classifier is trained to predict the domain from the token embedding, reaching 79% test accuracy&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; on that dataset, and its confidence serves as a proxy for domain-specificity: tokens it classifies correctly with high confidence are treated as domain-specific, the rest as generic. The reference routing then prescribes domain-aligned routing only for the domain-specific tokens and leaves the generic ones to be routed freely.&lt;/p&gt;
&lt;h2 id="measuring-against-the-reference"&gt;Measuring against the reference&lt;/h2&gt;
&lt;p&gt;With domains attached to tokens, two metrics fall out naturally that capture the two goals I introduced initially:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Routing purity&lt;/strong&gt; captures &lt;em&gt;expert specialization&lt;/em&gt;: for each expert, take the fraction of its received tokens that come from its most common domain, and average across experts: $\frac{1}{E} \sum_{i=1}^{E} \max_{d} \frac{f_{id}}{f_i}$ where $E$ is the number of experts, $f_i$ the share of all token-expert assignments that go to expert $i$ and $f_{id}$ the share that goes to expert $i$ &lt;em&gt;and&lt;/em&gt; comes from domain $d$. A purity of $1$ means every expert serves exactly one domain; with $D$ domains the lower end is $1/D$, which is where a routing that ignores domains entirely ends up. Note that purity does not check &lt;em&gt;which&lt;/em&gt; expert serves a domain &amp;ndash; tokens from the same domain should travel together, but which expert hosts them is irrelevant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Expert utilization&lt;/strong&gt; captures the &lt;em&gt;load balancing&lt;/em&gt; goal: it is maximal when all experts receive equal token counts and decreases as load concentrates: $\sum_{i=1}^{E} \min\left(f_i, \frac{1}{E}\right)$ reflecting that an over-used expert implies under-utilized ones elsewhere and hence reduces the effective total capacity of the model due to under-training some experts. Since top-$k$ routing sends every token to $k$ distinct experts, the worst case is a collapse onto a fixed set of $k$ experts, which puts the lower end at $k/E$.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Expert utilization can be computed simply from the routing statistics of how many tokens go to each expert. It is also independent of our testbed. Purity, on the other hand, looks at how the tokens are routed, i.e. which specific tokens go where, not just pure statistics, and for that it relies on our testbed setup and the domain-induced reference routing. We compute it only over the domain-specific tokens, ignoring the generic ones. Note that matching the model to the mix, i.e. $D = E/k$, givens both metrics the same range as their lower ends coincide at $1/D = k/E$ so the common range is $[1/D, 1]$. Both metrics are computed over the full global batch, which is an important detail I&amp;rsquo;ll discuss in Part 2 of the post.&lt;/p&gt;
&lt;h2 id="verifying-the-reference-routing"&gt;Verifying the reference routing&lt;/h2&gt;
&lt;p&gt;Having given up the certainty of the synthetic Gaussian world, we need to make the empirical case instead: a reference routing is only a meaningful comparison target if following it is actually better than anything the model learns on its own &amp;ndash; otherwise &amp;ldquo;closeness to the reference&amp;rdquo; measures closeness to a mediocre policy.&lt;/p&gt;
&lt;p&gt;We verify this empirically by training MoEs on the data mix while constraining the routing to follow the domain structure. Router logits are masked so that domain-specific tokens can only select experts from their domain&amp;rsquo;s assigned group, while generic tokens route freely. Sweeping the classifier-confidence threshold that splits the tokens into domain and generic moves the setup continuously from fully learned routing (no tokens constrained) to naive domain routing (all tokens constrained), changing the achieved validation loss:&lt;/p&gt;
&lt;figure&gt;&lt;svg aria-label="Validation loss as a function of the fraction of tokens constrained to domain-based routing" class="moe-chart" viewBox="0 0 700 320" xmlns="http://www.w3.org/2000/svg" role="img"&gt;
&lt;style&gt;.moe-chart{font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}.moe-chart .grid{stroke:var(--border,#e5e7eb);stroke-width:1}.moe-chart .axis{stroke:var(--border,#e5e7eb);stroke-width:1.2}.moe-chart .tick{fill:var(--text-muted,#6b7280);font-size:13px}.moe-chart .atitle{fill:var(--text,#1a1a1a);font-size:14px}.moe-chart .series{fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .dot{fill:currentColor;stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .hit{fill:transparent;stroke:none;pointer-events:all;cursor:crosshair}.moe-chart .slabel{fill:currentColor;font-size:12.5px}.moe-chart .reflabel{fill:var(--text-muted,#6b7280);font-size:12.5px}.moe-chart .refline{color:#2c6fbb}.moe-chart .learned-dot{fill:#94a3b8;opacity:.3}@media (prefers-color-scheme:dark){.moe-chart .refline{color:#5b93d0}.moe-chart .learned-dot{fill:#64748b}}&lt;/style&gt;
&lt;g&gt;
&lt;line class="grid" x1="64" y1="257.2" x2="676" y2="257.2"/&gt;
&lt;text class="tick" x="55" y="261.2" text-anchor="end"&gt;2.865&lt;/text&gt;
&lt;line class="grid" x1="64" y1="220.1" x2="676" y2="220.1"/&gt;
&lt;text class="tick" x="55" y="224.1" text-anchor="end"&gt;2.870&lt;/text&gt;
&lt;line class="grid" x1="64" y1="183.1" x2="676" y2="183.1"/&gt;
&lt;text class="tick" x="55" y="187.1" text-anchor="end"&gt;2.875&lt;/text&gt;
&lt;line class="grid" x1="64" y1="146.0" x2="676" y2="146.0"/&gt;
&lt;text class="tick" x="55" y="150.0" text-anchor="end"&gt;2.880&lt;/text&gt;
&lt;line class="grid" x1="64" y1="108.9" x2="676" y2="108.9"/&gt;
&lt;text class="tick" x="55" y="112.9" text-anchor="end"&gt;2.885&lt;/text&gt;
&lt;line class="grid" x1="64" y1="71.9" x2="676" y2="71.9"/&gt;
&lt;text class="tick" x="55" y="75.9" text-anchor="end"&gt;2.890&lt;/text&gt;
&lt;line class="grid" x1="64" y1="34.8" x2="676" y2="34.8"/&gt;
&lt;text class="tick" x="55" y="38.8" text-anchor="end"&gt;2.895&lt;/text&gt;
&lt;/g&gt;
&lt;line class="axis" x1="64" y1="272.0" x2="676" y2="272.0"/&gt;
&lt;line class="axis" x1="64" y1="20.0" x2="64" y2="272.0"/&gt;
&lt;line class="axis" x1="64.0" y1="272.0" x2="64.0" y2="276.0"/&gt;
&lt;text class="tick" x="64.0" y="290.0" text-anchor="middle"&gt;0&lt;/text&gt;
&lt;line class="axis" x1="217.0" y1="272.0" x2="217.0" y2="276.0"/&gt;
&lt;text class="tick" x="217.0" y="290.0" text-anchor="middle"&gt;0.25&lt;/text&gt;
&lt;line class="axis" x1="370.0" y1="272.0" x2="370.0" y2="276.0"/&gt;
&lt;text class="tick" x="370.0" y="290.0" text-anchor="middle"&gt;0.5&lt;/text&gt;
&lt;line class="axis" x1="523.0" y1="272.0" x2="523.0" y2="276.0"/&gt;
&lt;text class="tick" x="523.0" y="290.0" text-anchor="middle"&gt;0.75&lt;/text&gt;
&lt;line class="axis" x1="676.0" y1="272.0" x2="676.0" y2="276.0"/&gt;
&lt;text class="tick" x="676.0" y="290.0" text-anchor="middle"&gt;1&lt;/text&gt;
&lt;text class="atitle" x="370.0" y="312" text-anchor="middle"&gt;Fraction of tokens constrained to domain routing&lt;/text&gt;
&lt;text class="atitle" x="16" y="146.0" text-anchor="middle" transform="rotate(-90 16 146.0)"&gt;Validation loss&lt;/text&gt;
&lt;circle class="learned-dot" cx="370.0" cy="60.8" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="169.0" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="37.8" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="63.0" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="169.0" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="146.0" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="77.1" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="192.7" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="84.5" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="193.4" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="196.4" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="201.6" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="198.6" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="189.7" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="197.1" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="85.2" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="200.1" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="97.8" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="121.5" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="192.7" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="191.2" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="189.7" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="103.0" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="186.8" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="180.1" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="183.1" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="127.5" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="123.0" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="191.2" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="195.7" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="178.6" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="205.3" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="194.2" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="129.0" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="156.4" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="182.3" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="164.5" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="196.4" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="130.4" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="183.1" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="188.2" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="197.9" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="187.5" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="185.3" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="181.6" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="187.5" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="154.9" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="200.8" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="157.1" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="161.6" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="180.1" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="184.5" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="187.5" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="151.2" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="202.3" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="151.2" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="149.7" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="150.4" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="163.8" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="185.3" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="115.6" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="111.2" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="166.8" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="99.3" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="140.8" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="123.8" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="103.8" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="200.8" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="137.1" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="131.2" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="90.4" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="203.8" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="113.4" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="117.1" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="130.4" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="100.8" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="123.0" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="134.1" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="129.7" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="202.3" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="123.8" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="74.1" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="114.1" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="173.4" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="119.3" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="106.0" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="126.7" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="97.1" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="91.2" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="132.7" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="147.5" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="86.0" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="153.4" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="169.7" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="174.9" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="174.2" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="136.4" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="168.2" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="178.6" r="3"/&gt;
&lt;circle class="learned-dot" cx="370.0" cy="196.4" r="3"/&gt;
&lt;text class="reflabel" x="380.0" y="29.8"&gt;fully learned routing&lt;/text&gt;
&lt;g class="refline"&gt;
&lt;path class="series" d="M 64.0 198.6 L 260.1 200.8 L 330.8 212.7 L 370.0 220.9 L 431.2 218.6 L 492.4 186.8 L 553.6 193.4 L 614.8 120.1 L 676.0 120.8"/&gt;
&lt;circle class="dot" cx="64.0" cy="198.6" r="3"/&gt;
&lt;circle class="hit" cx="64.0" cy="198.6" r="7"&gt;&lt;title&gt;split ratio 0 · validation loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="260.1" cy="200.8" r="3"/&gt;
&lt;circle class="hit" cx="260.1" cy="200.8" r="7"&gt;&lt;title&gt;split ratio 0.3205 · validation loss 2.873&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="330.8" cy="212.7" r="3"/&gt;
&lt;circle class="hit" cx="330.8" cy="212.7" r="7"&gt;&lt;title&gt;split ratio 0.4359 · validation loss 2.871&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="370.0" cy="220.9" r="3"/&gt;
&lt;circle class="hit" cx="370.0" cy="220.9" r="7"&gt;&lt;title&gt;split ratio 0.5 · validation loss 2.870&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="431.2" cy="218.6" r="3"/&gt;
&lt;circle class="hit" cx="431.2" cy="218.6" r="7"&gt;&lt;title&gt;split ratio 0.6 · validation loss 2.870&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="492.4" cy="186.8" r="3"/&gt;
&lt;circle class="hit" cx="492.4" cy="186.8" r="7"&gt;&lt;title&gt;split ratio 0.7 · validation loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="553.6" cy="193.4" r="3"/&gt;
&lt;circle class="hit" cx="553.6" cy="193.4" r="7"&gt;&lt;title&gt;split ratio 0.8 · validation loss 2.874&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="614.8" cy="120.1" r="3"/&gt;
&lt;circle class="hit" cx="614.8" cy="120.1" r="7"&gt;&lt;title&gt;split ratio 0.9 · validation loss 2.884&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="676.0" cy="120.8" r="3"/&gt;
&lt;circle class="hit" cx="676.0" cy="120.8" r="7"&gt;&lt;title&gt;split ratio 1 · validation loss 2.883&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="refline"&gt;&lt;text class="slabel" x="382.0" y="242.9"&gt;reference routing at varying split&lt;/text&gt;&lt;/g&gt;
&lt;text class="reflabel" x="604.8" y="110.1" text-anchor="end"&gt;naive domain routing&lt;/text&gt;
&lt;/svg&gt;
&lt;figcaption&gt;Validation loss as a function of the fraction of tokens constrained to domain-based routing. Forcing all tokens into domain routing (ratio 1.0) is worse than learned routing on average; constraining roughly the most domain-specific half of tokens gives the lowest loss of all configurations, below every fully learned run (gray points).&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Naive domain routing &amp;ndash; forcing every token into its sequence&amp;rsquo;s domain group &amp;ndash; lands at the highest validation loss of the sweep, and higher than many fully learned routings, confirming that arbitrary domain assignments for generic tokens damage the model. Learned routing itself spans a wide range depending on the balancing configuration that Part 2 will discuss. The reference with a roughly 50:50 split, constraining the half of tokens the classifier is most confident about, reaches the lowest loss, below every fully learned configuration we trained. That makes it a useful reference and we can meaningfully measure routing purity against that target.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What&amp;rsquo;s next&lt;/h2&gt;
&lt;p&gt;We now have a routing testbed: a data mix with clearly defined domains, an empirically validated reference routing and two metrics &amp;ndash; routing purity and expert utilization &amp;ndash; that make the router&amp;rsquo;s two competing goals separately visible instead of collapsed into a single loss number. In Part 2, I show how that can clearly visualize the effects of various popular token balancing methods on learned routing and that scope is what matters most, much more than the actual balancing approach.&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Note that the fact that this classifier is not perfect is actually desirable: A classifier achieving 100% accuracy of mapping tokens to domains would not help us distinguishing domain-specific tokens from generic ones.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Mixture of Expert Models: Why FLOPs Don't Tell the Whole Story</title><link>https://tobiasfalke.com/blog/moe-intro-flops/</link><pubDate>Wed, 24 Jun 2026 00:00:00 +0000</pubDate><guid>https://tobiasfalke.com/blog/moe-intro-flops/</guid><description>&lt;p&gt;This post is the first in a (hopefully) longer series on LLM pretraining. I have spent the last three years on pretraining LLMs, and in particular, mixture of expert (MoE) models, closely watching the development of the field while experimenting with and training said models myself. While I can&amp;rsquo;t and won&amp;rsquo;t talk about the exact details of what I worked on at my employer (except for a few things that have been published), I will share some high-level observations, thoughts about the technology and learnings from the work, which still gives plenty of interesting topics to write about.&lt;/p&gt;
&lt;p&gt;Since my focus has been on MoEs for the majority of the time, I want to start the series revisiting the central promise of sparse models such as the commonly used Transformer-based MoEs: By activating just a subset of a model&amp;rsquo;s parameters for each token, model quality and compute &amp;ndash; the two key units whose relationship scaling laws describe &amp;ndash; become decoupled. The parameters of a model break down into total parameters and active parameters, the former reflecting the model&amp;rsquo;s total capacity available for learning and hence the quality it can achieve, while the latter indicates the compute it requires to train and inference the model, typically expressed in FLOPs. Or put simpler: You can get better models without paying for it. At least not the price known from dense models.&lt;/p&gt;
&lt;p&gt;That central promise is valid, but it comes with a few caveats that are discussed a lot less than the headline itself, namely memory and communication. The remainder of this post will focus on these two to paint the more honest picture of the MoE promise. As we&amp;rsquo;ll see, it requires a bit more effort to fully reap the benefits than just changing the architecture.&lt;/p&gt;
&lt;h2 id="quality"&gt;Quality&lt;/h2&gt;
&lt;p&gt;When I started working on LLM pretraining about three years ago, MoE architectures existed primarily in research papers, while the dominating open models &amp;ndash; Llama 1 and 2 were released at that time &amp;ndash; were exclusively dense. Only by the end of 2023, the first MoE models were publicly released, most notably &lt;a href="https://mistral.ai/news/mixtral-of-experts/" target="_blank" rel="noopener noreferrer"&gt;Mixtral&lt;/a&gt;, and soon after, &lt;a href="https://github.com/deepseek-ai/DeepSeek-MoE" target="_blank" rel="noopener noreferrer"&gt;DeepSeek-MoE&lt;/a&gt;. Today, sparse MoE architectures are the standard, used by open frontier models (e.g. DeepSeek, Qwen, GLM) as well as closed ones&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Qwen3.5 is a more recent example that nicely illustrates the impact sparsity has on model quality because it comes in both dense and sparse versions that were trained under comparable settings. As shown in the plot, there is a clear gap between dense and sparse MoE models at matched active parameters, which is the MoE promise I keep referring to:&lt;/p&gt;
&lt;figure&gt;&lt;svg aria-label="Quality versus sparsity for Qwen3.5 models" class="moe-chart" viewBox="0 0 700 300" xmlns="http://www.w3.org/2000/svg" role="img"&gt;
&lt;style&gt;.moe-chart{font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}.moe-chart .grid{stroke:var(--border,#e5e7eb);stroke-width:1}.moe-chart .axis{stroke:var(--border,#e5e7eb);stroke-width:1.2}.moe-chart .tick{fill:var(--text-muted,#6b7280);font-size:13px}.moe-chart .atitle{fill:var(--text,#1a1a1a);font-size:14px}.moe-chart .series{fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .ref{fill:none;stroke:var(--text-light,#9ca3af);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .dot{fill:currentColor;stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .refdot{fill:var(--text-light,#9ca3af);stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .hit{fill:transparent;stroke:none;pointer-events:all;cursor:crosshair}.moe-chart .slabel{fill:currentColor;font-size:12.5px}.moe-chart .leader{stroke:currentColor;stroke-width:1;opacity:.55}.moe-chart .reflabel{fill:var(--text-muted,#6b7280);font-size:12.5px}.moe-chart .plabel{font-size:12px}.moe-chart .moe{color:#2c6fbb}.moe-chart .plabel-moe{fill:currentColor}@media (prefers-color-scheme:dark){.moe-chart .moe{color:#5b93d0}}&lt;/style&gt;
&lt;g&gt;
&lt;line class="grid" x1="52.0" y1="237.0" x2="630.0" y2="237.0"/&gt;
&lt;text class="tick" x="43.0" y="241.0" text-anchor="end"&gt;60&lt;/text&gt;
&lt;line class="grid" x1="52.0" y1="187.0" x2="630.0" y2="187.0"/&gt;
&lt;text class="tick" x="43.0" y="191.0" text-anchor="end"&gt;65&lt;/text&gt;
&lt;line class="grid" x1="52.0" y1="137.0" x2="630.0" y2="137.0"/&gt;
&lt;text class="tick" x="43.0" y="141.0" text-anchor="end"&gt;70&lt;/text&gt;
&lt;line class="grid" x1="52.0" y1="87.0" x2="630.0" y2="87.0"/&gt;
&lt;text class="tick" x="43.0" y="91.0" text-anchor="end"&gt;75&lt;/text&gt;
&lt;line class="grid" x1="52.0" y1="37.0" x2="630.0" y2="37.0"/&gt;
&lt;text class="tick" x="43.0" y="41.0" text-anchor="end"&gt;80&lt;/text&gt;
&lt;/g&gt;
&lt;line class="axis" x1="52.0" y1="252.0" x2="630.0" y2="252.0"/&gt;
&lt;line class="axis" x1="52.0" y1="22.0" x2="52.0" y2="252.0"/&gt;
&lt;line class="axis" x1="115.7" y1="252.0" x2="115.7" y2="256.0"/&gt;
&lt;text class="tick" x="115.7" y="270.0" text-anchor="middle"&gt;3B&lt;/text&gt;
&lt;line class="axis" x1="224.3" y1="252.0" x2="224.3" y2="256.0"/&gt;
&lt;text class="tick" x="224.3" y="270.0" text-anchor="middle"&gt;5B&lt;/text&gt;
&lt;line class="axis" x1="371.8" y1="252.0" x2="371.8" y2="256.0"/&gt;
&lt;text class="tick" x="371.8" y="270.0" text-anchor="middle"&gt;10B&lt;/text&gt;
&lt;line class="axis" x1="519.3" y1="252.0" x2="519.3" y2="256.0"/&gt;
&lt;text class="tick" x="519.3" y="270.0" text-anchor="middle"&gt;20B&lt;/text&gt;
&lt;line class="axis" x1="605.5" y1="252.0" x2="605.5" y2="256.0"/&gt;
&lt;text class="tick" x="605.5" y="270.0" text-anchor="middle"&gt;30B&lt;/text&gt;
&lt;text class="atitle" x="341.0" y="292.0" text-anchor="middle"&gt;Active parameters&lt;/text&gt;
&lt;text class="atitle" x="15" y="137.0" text-anchor="middle" transform="rotate(-90 15 137.0)"&gt;Average benchmark score&lt;/text&gt;
&lt;g&gt;
&lt;path class="ref" d="M 176.9 197.5 L 349.4 145.8 L 583.1 86.6"/&gt;
&lt;circle class="refdot" cx="176.9" cy="197.5" r="3"/&gt;
&lt;circle class="hit" cx="176.9" cy="197.5" r="7"&gt;&lt;title&gt;dense 4B · average benchmark score 63.95&lt;/title&gt;&lt;/circle&gt;
&lt;text class="reflabel plabel" x="176.9" y="215.5" text-anchor="middle"&gt;4B&lt;/text&gt;
&lt;circle class="refdot" cx="349.4" cy="145.8" r="3"/&gt;
&lt;circle class="hit" cx="349.4" cy="145.8" r="7"&gt;&lt;title&gt;dense 9B · average benchmark score 69.12&lt;/title&gt;&lt;/circle&gt;
&lt;text class="reflabel plabel" x="349.4" y="163.8" text-anchor="middle"&gt;9B&lt;/text&gt;
&lt;circle class="refdot" cx="583.1" cy="86.6" r="3"/&gt;
&lt;circle class="hit" cx="583.1" cy="86.6" r="7"&gt;&lt;title&gt;dense 27B · average benchmark score 75.04&lt;/title&gt;&lt;/circle&gt;
&lt;text class="reflabel plabel" x="583.1" y="104.6" text-anchor="middle"&gt;27B&lt;/text&gt;
&lt;text class="reflabel" x="591.1" y="90.6"&gt;dense&lt;/text&gt;
&lt;/g&gt;
&lt;g class="moe"&gt;
&lt;path class="series" d="M 115.7 110.0 L 371.8 86.3 L 484.7 54.7"/&gt;
&lt;circle class="dot" cx="115.7" cy="110.0" r="3"/&gt;
&lt;circle class="hit" cx="115.7" cy="110.0" r="7"&gt;&lt;title&gt;35B-A3B · 3B active · average benchmark score 72.7&lt;/title&gt;&lt;/circle&gt;
&lt;text class="plabel-moe plabel" x="115.7" y="101.0" text-anchor="middle"&gt;35B-A3B&lt;/text&gt;
&lt;circle class="dot" cx="371.8" cy="86.3" r="3"/&gt;
&lt;circle class="hit" cx="371.8" cy="86.3" r="7"&gt;&lt;title&gt;122B-A10B · 10B active · average benchmark score 75.07&lt;/title&gt;&lt;/circle&gt;
&lt;text class="plabel-moe plabel" x="371.8" y="77.3" text-anchor="middle"&gt;122B-A10B&lt;/text&gt;
&lt;circle class="dot" cx="484.7" cy="54.7" r="3"/&gt;
&lt;circle class="hit" cx="484.7" cy="54.7" r="7"&gt;&lt;title&gt;397B-A17B · 17B active · average benchmark score 78.23&lt;/title&gt;&lt;/circle&gt;
&lt;text class="plabel-moe plabel" x="484.7" y="45.7" text-anchor="middle"&gt;397B-A17B&lt;/text&gt;
&lt;/g&gt;
&lt;/svg&gt;
&lt;figcaption&gt;Model quality of dense vs. sparse Qwen3.5 models at matched active parameters. Quality is measured here as the average across the 24 benchmarks reported for all 6 models. Scores taken from the respective model cards.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;A more controlled version of this comparison was first done by the scaling study of &lt;a href="https://arxiv.org/abs/2202.01169" target="_blank" rel="noopener noreferrer"&gt;Clark et al. (2022)&lt;/a&gt;, which trained dense models as well as sparse counterparts of increasing sparsity. As you can see in the following plot of their data, the MoE promise is not just a constant benefit, but of course increases with the degree of sparsity. The more experts they add to a dense model, the more quality improves (or here, validation loss decreases).&lt;/p&gt;
&lt;figure&gt;&lt;svg aria-label="Quality versus sparsity at fixed active parameters" class="moe-chart" viewBox="0 0 700 350" xmlns="http://www.w3.org/2000/svg" role="img"&gt;
&lt;style&gt;.moe-chart{font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}.moe-chart .grid{stroke:var(--border,#e5e7eb);stroke-width:1}.moe-chart .axis{stroke:var(--border,#e5e7eb);stroke-width:1.2}.moe-chart .tick{fill:var(--text-muted,#6b7280);font-size:13px}.moe-chart .atitle{fill:var(--text,#1a1a1a);font-size:14px}.moe-chart .series{fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .ref{fill:none;stroke:var(--text-light,#9ca3af);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .dot{fill:currentColor;stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .refdot{fill:var(--text-light,#9ca3af);stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .hit{fill:transparent;stroke:none;pointer-events:all;cursor:crosshair}.moe-chart .slabel{fill:currentColor;font-size:12.5px}.moe-chart .leader{stroke:currentColor;stroke-width:1;opacity:.55}.moe-chart .reflabel{fill:var(--text-muted,#6b7280);font-size:12.5px}.moe-chart .plabel{font-size:12px}.moe-chart .c2{color:#9ec1e8}.moe-chart .c4{color:#7fb0e2}.moe-chart .c8{color:#5f9bd9}.moe-chart .c16{color:#4385cc}.moe-chart .c32{color:#2c6fbb}.moe-chart .c64{color:#245a9e}.moe-chart .c128{color:#1d4880}.moe-chart .c512{color:#153862}@media (prefers-color-scheme:dark){.moe-chart .c2{color:#cfe1f5}.moe-chart .c4{color:#b3d0ef}.moe-chart .c8{color:#93bce6}.moe-chart .c16{color:#74a8db}.moe-chart .c32{color:#5b93d0}.moe-chart .c64{color:#4a80c0}.moe-chart .c128{color:#3d6fae}.moe-chart .c512{color:#33619c}}&lt;/style&gt;
&lt;g&gt;
&lt;line class="grid" x1="58.0" y1="292.1" x2="622.0" y2="292.1"/&gt;
&lt;text class="tick" x="49.0" y="296.1" text-anchor="end"&gt;2&lt;/text&gt;
&lt;line class="grid" x1="58.0" y1="259.1" x2="622.0" y2="259.1"/&gt;
&lt;text class="tick" x="49.0" y="263.1" text-anchor="end"&gt;2.2&lt;/text&gt;
&lt;line class="grid" x1="58.0" y1="226.0" x2="622.0" y2="226.0"/&gt;
&lt;text class="tick" x="49.0" y="230.0" text-anchor="end"&gt;2.4&lt;/text&gt;
&lt;line class="grid" x1="58.0" y1="193.0" x2="622.0" y2="193.0"/&gt;
&lt;text class="tick" x="49.0" y="197.0" text-anchor="end"&gt;2.6&lt;/text&gt;
&lt;line class="grid" x1="58.0" y1="160.0" x2="622.0" y2="160.0"/&gt;
&lt;text class="tick" x="49.0" y="164.0" text-anchor="end"&gt;2.8&lt;/text&gt;
&lt;line class="grid" x1="58.0" y1="127.0" x2="622.0" y2="127.0"/&gt;
&lt;text class="tick" x="49.0" y="131.0" text-anchor="end"&gt;3&lt;/text&gt;
&lt;line class="grid" x1="58.0" y1="94.0" x2="622.0" y2="94.0"/&gt;
&lt;text class="tick" x="49.0" y="98.0" text-anchor="end"&gt;3.2&lt;/text&gt;
&lt;line class="grid" x1="58.0" y1="60.9" x2="622.0" y2="60.9"/&gt;
&lt;text class="tick" x="49.0" y="64.9" text-anchor="end"&gt;3.4&lt;/text&gt;
&lt;line class="grid" x1="58.0" y1="27.9" x2="622.0" y2="27.9"/&gt;
&lt;text class="tick" x="49.0" y="31.9" text-anchor="end"&gt;3.6&lt;/text&gt;
&lt;/g&gt;
&lt;line class="axis" x1="58.0" y1="302.0" x2="622.0" y2="302.0"/&gt;
&lt;line class="axis" x1="58.0" y1="18.0" x2="58.0" y2="302.0"/&gt;
&lt;line class="axis" x1="78.9" y1="302.0" x2="78.9" y2="306.0"/&gt;
&lt;text class="tick" x="78.9" y="320.0" text-anchor="middle"&gt;16M&lt;/text&gt;
&lt;line class="axis" x1="163.2" y1="302.0" x2="163.2" y2="306.0"/&gt;
&lt;text class="tick" x="163.2" y="320.0" text-anchor="middle"&gt;27M&lt;/text&gt;
&lt;line class="axis" x1="288.3" y1="302.0" x2="288.3" y2="306.0"/&gt;
&lt;text class="tick" x="288.3" y="320.0" text-anchor="middle"&gt;57M&lt;/text&gt;
&lt;line class="axis" x1="428.7" y1="302.0" x2="428.7" y2="306.0"/&gt;
&lt;text class="tick" x="428.7" y="320.0" text-anchor="middle"&gt;132M&lt;/text&gt;
&lt;line class="axis" x1="601.1" y1="302.0" x2="601.1" y2="306.0"/&gt;
&lt;text class="tick" x="601.1" y="320.0" text-anchor="middle"&gt;368M&lt;/text&gt;
&lt;text class="atitle" x="340.0" y="342.0" text-anchor="middle"&gt;Active parameters&lt;/text&gt;
&lt;text class="atitle" x="16" y="160.0" text-anchor="middle" transform="rotate(-90 16 160.0)"&gt;Validation loss&lt;/text&gt;
&lt;g&gt;
&lt;path class="ref" d="M 78.9 38.5 L 163.2 78.7 L 288.3 124.5 L 428.7 166.7 L 601.1 215.6"/&gt;
&lt;circle class="refdot" cx="78.9" cy="38.5" r="3"/&gt;
&lt;circle class="hit" cx="78.9" cy="38.5" r="6"&gt;&lt;title&gt;dense · 16M active params · loss 3.536&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="refdot" cx="163.2" cy="78.7" r="3"/&gt;
&lt;circle class="hit" cx="163.2" cy="78.7" r="6"&gt;&lt;title&gt;dense · 27M active params · loss 3.292&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="refdot" cx="288.3" cy="124.5" r="3"/&gt;
&lt;circle class="hit" cx="288.3" cy="124.5" r="6"&gt;&lt;title&gt;dense · 57M active params · loss 3.015&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="refdot" cx="428.7" cy="166.7" r="3"/&gt;
&lt;circle class="hit" cx="428.7" cy="166.7" r="6"&gt;&lt;title&gt;dense · 132M active params · loss 2.759&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="refdot" cx="601.1" cy="215.6" r="3"/&gt;
&lt;circle class="hit" cx="601.1" cy="215.6" r="6"&gt;&lt;title&gt;dense · 368M active params · loss 2.463&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="c2"&gt;
&lt;path class="series" d="M 78.9 45.0 L 163.2 84.8 L 288.3 130.2 L 428.7 172.4 L 601.1 220.1"/&gt;
&lt;circle class="dot" cx="78.9" cy="45.0" r="3"/&gt;
&lt;circle class="hit" cx="78.9" cy="45.0" r="6"&gt;&lt;title&gt;2 experts · 16M active params · loss 3.497&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="163.2" cy="84.8" r="3"/&gt;
&lt;circle class="hit" cx="163.2" cy="84.8" r="6"&gt;&lt;title&gt;2 experts · 27M active params · loss 3.256&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="288.3" cy="130.2" r="3"/&gt;
&lt;circle class="hit" cx="288.3" cy="130.2" r="6"&gt;&lt;title&gt;2 experts · 57M active params · loss 2.980&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="428.7" cy="172.4" r="3"/&gt;
&lt;circle class="hit" cx="428.7" cy="172.4" r="6"&gt;&lt;title&gt;2 experts · 132M active params · loss 2.725&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="601.1" cy="220.1" r="3"/&gt;
&lt;circle class="hit" cx="601.1" cy="220.1" r="6"&gt;&lt;title&gt;2 experts · 368M active params · loss 2.436&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="c4"&gt;
&lt;path class="series" d="M 78.9 56.1 L 163.2 92.8 L 288.3 138.7 L 428.7 179.9 L 601.1 227.9"/&gt;
&lt;circle class="dot" cx="78.9" cy="56.1" r="3"/&gt;
&lt;circle class="hit" cx="78.9" cy="56.1" r="6"&gt;&lt;title&gt;4 experts · 16M active params · loss 3.429&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="163.2" cy="92.8" r="3"/&gt;
&lt;circle class="hit" cx="163.2" cy="92.8" r="6"&gt;&lt;title&gt;4 experts · 27M active params · loss 3.207&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="288.3" cy="138.7" r="3"/&gt;
&lt;circle class="hit" cx="288.3" cy="138.7" r="6"&gt;&lt;title&gt;4 experts · 57M active params · loss 2.929&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="428.7" cy="179.9" r="3"/&gt;
&lt;circle class="hit" cx="428.7" cy="179.9" r="6"&gt;&lt;title&gt;4 experts · 132M active params · loss 2.679&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="601.1" cy="227.9" r="3"/&gt;
&lt;circle class="hit" cx="601.1" cy="227.9" r="6"&gt;&lt;title&gt;4 experts · 368M active params · loss 2.389&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="c8"&gt;
&lt;path class="series" d="M 78.9 64.7 L 163.2 102.9 L 288.3 147.4 L 428.7 188.3 L 601.1 235.9"/&gt;
&lt;circle class="dot" cx="78.9" cy="64.7" r="3"/&gt;
&lt;circle class="hit" cx="78.9" cy="64.7" r="6"&gt;&lt;title&gt;8 experts · 16M active params · loss 3.377&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="163.2" cy="102.9" r="3"/&gt;
&lt;circle class="hit" cx="163.2" cy="102.9" r="6"&gt;&lt;title&gt;8 experts · 27M active params · loss 3.146&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="288.3" cy="147.4" r="3"/&gt;
&lt;circle class="hit" cx="288.3" cy="147.4" r="6"&gt;&lt;title&gt;8 experts · 57M active params · loss 2.876&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="428.7" cy="188.3" r="3"/&gt;
&lt;circle class="hit" cx="428.7" cy="188.3" r="6"&gt;&lt;title&gt;8 experts · 132M active params · loss 2.628&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="601.1" cy="235.9" r="3"/&gt;
&lt;circle class="hit" cx="601.1" cy="235.9" r="6"&gt;&lt;title&gt;8 experts · 368M active params · loss 2.341&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="c16"&gt;
&lt;path class="series" d="M 78.9 74.7 L 163.2 112.5 L 288.3 156.2 L 428.7 197.0 L 601.1 243.6"/&gt;
&lt;circle class="dot" cx="78.9" cy="74.7" r="3"/&gt;
&lt;circle class="hit" cx="78.9" cy="74.7" r="6"&gt;&lt;title&gt;16 experts · 16M active params · loss 3.317&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="163.2" cy="112.5" r="3"/&gt;
&lt;circle class="hit" cx="163.2" cy="112.5" r="6"&gt;&lt;title&gt;16 experts · 27M active params · loss 3.087&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="288.3" cy="156.2" r="3"/&gt;
&lt;circle class="hit" cx="288.3" cy="156.2" r="6"&gt;&lt;title&gt;16 experts · 57M active params · loss 2.823&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="428.7" cy="197.0" r="3"/&gt;
&lt;circle class="hit" cx="428.7" cy="197.0" r="6"&gt;&lt;title&gt;16 experts · 132M active params · loss 2.576&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="601.1" cy="243.6" r="3"/&gt;
&lt;circle class="hit" cx="601.1" cy="243.6" r="6"&gt;&lt;title&gt;16 experts · 368M active params · loss 2.294&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="c32"&gt;
&lt;path class="series" d="M 78.9 84.7 L 163.2 121.7 L 288.3 165.3 L 428.7 203.6 L 601.1 250.8"/&gt;
&lt;circle class="dot" cx="78.9" cy="84.7" r="3"/&gt;
&lt;circle class="hit" cx="78.9" cy="84.7" r="6"&gt;&lt;title&gt;32 experts · 16M active params · loss 3.256&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="163.2" cy="121.7" r="3"/&gt;
&lt;circle class="hit" cx="163.2" cy="121.7" r="6"&gt;&lt;title&gt;32 experts · 27M active params · loss 3.032&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="288.3" cy="165.3" r="3"/&gt;
&lt;circle class="hit" cx="288.3" cy="165.3" r="6"&gt;&lt;title&gt;32 experts · 57M active params · loss 2.768&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="428.7" cy="203.6" r="3"/&gt;
&lt;circle class="hit" cx="428.7" cy="203.6" r="6"&gt;&lt;title&gt;32 experts · 132M active params · loss 2.536&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="601.1" cy="250.8" r="3"/&gt;
&lt;circle class="hit" cx="601.1" cy="250.8" r="6"&gt;&lt;title&gt;32 experts · 368M active params · loss 2.250&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="c64"&gt;
&lt;path class="series" d="M 78.9 92.3 L 163.2 130.4 L 288.3 172.4 L 428.7 210.4 L 601.1 257.3"/&gt;
&lt;circle class="dot" cx="78.9" cy="92.3" r="3"/&gt;
&lt;circle class="hit" cx="78.9" cy="92.3" r="6"&gt;&lt;title&gt;64 experts · 16M active params · loss 3.210&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="163.2" cy="130.4" r="3"/&gt;
&lt;circle class="hit" cx="163.2" cy="130.4" r="6"&gt;&lt;title&gt;64 experts · 27M active params · loss 2.979&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="288.3" cy="172.4" r="3"/&gt;
&lt;circle class="hit" cx="288.3" cy="172.4" r="6"&gt;&lt;title&gt;64 experts · 57M active params · loss 2.725&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="428.7" cy="210.4" r="3"/&gt;
&lt;circle class="hit" cx="428.7" cy="210.4" r="6"&gt;&lt;title&gt;64 experts · 132M active params · loss 2.495&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="601.1" cy="257.3" r="3"/&gt;
&lt;circle class="hit" cx="601.1" cy="257.3" r="6"&gt;&lt;title&gt;64 experts · 368M active params · loss 2.211&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="c128"&gt;
&lt;path class="series" d="M 78.9 99.9 L 163.2 137.5 L 288.3 178.8 L 428.7 216.1 L 601.1 262.4"/&gt;
&lt;circle class="dot" cx="78.9" cy="99.9" r="3"/&gt;
&lt;circle class="hit" cx="78.9" cy="99.9" r="6"&gt;&lt;title&gt;128 experts · 16M active params · loss 3.164&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="163.2" cy="137.5" r="3"/&gt;
&lt;circle class="hit" cx="163.2" cy="137.5" r="6"&gt;&lt;title&gt;128 experts · 27M active params · loss 2.936&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="288.3" cy="178.8" r="3"/&gt;
&lt;circle class="hit" cx="288.3" cy="178.8" r="6"&gt;&lt;title&gt;128 experts · 57M active params · loss 2.686&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="428.7" cy="216.1" r="3"/&gt;
&lt;circle class="hit" cx="428.7" cy="216.1" r="6"&gt;&lt;title&gt;128 experts · 132M active params · loss 2.460&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="601.1" cy="262.4" r="3"/&gt;
&lt;circle class="hit" cx="601.1" cy="262.4" r="6"&gt;&lt;title&gt;128 experts · 368M active params · loss 2.180&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;g class="c512"&gt;
&lt;path class="series" d="M 78.9 108.0 L 163.2 145.8 L 288.3 186.8 L 428.7 222.9 L 601.1 269.8"/&gt;
&lt;circle class="dot" cx="78.9" cy="108.0" r="3"/&gt;
&lt;circle class="hit" cx="78.9" cy="108.0" r="6"&gt;&lt;title&gt;512 experts · 16M active params · loss 3.115&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="163.2" cy="145.8" r="3"/&gt;
&lt;circle class="hit" cx="163.2" cy="145.8" r="6"&gt;&lt;title&gt;512 experts · 27M active params · loss 2.886&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="288.3" cy="186.8" r="3"/&gt;
&lt;circle class="hit" cx="288.3" cy="186.8" r="6"&gt;&lt;title&gt;512 experts · 57M active params · loss 2.638&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="428.7" cy="222.9" r="3"/&gt;
&lt;circle class="hit" cx="428.7" cy="222.9" r="6"&gt;&lt;title&gt;512 experts · 132M active params · loss 2.419&lt;/title&gt;&lt;/circle&gt;
&lt;circle class="dot" cx="601.1" cy="269.8" r="3"/&gt;
&lt;circle class="hit" cx="601.1" cy="269.8" r="6"&gt;&lt;title&gt;512 experts · 368M active params · loss 2.135&lt;/title&gt;&lt;/circle&gt;
&lt;/g&gt;
&lt;text class="reflabel" x="630.0" y="219.6"&gt;dense&lt;/text&gt;
&lt;g class="c2"&gt;
&lt;polyline class="leader" fill="none" points="624.0,220.1 628.0,230.1 630.0,230.1"/&gt;
&lt;/g&gt;
&lt;g class="c2"&gt;&lt;text class="slabel" x="630.0" y="234.1"&gt;1/2&lt;/text&gt;&lt;/g&gt;
&lt;g class="c8"&gt;
&lt;polyline class="leader" fill="none" points="624.0,235.9 628.0,244.6 630.0,244.6"/&gt;
&lt;/g&gt;
&lt;g class="c8"&gt;&lt;text class="slabel" x="630.0" y="248.6"&gt;1/8&lt;/text&gt;&lt;/g&gt;
&lt;g class="c32"&gt;
&lt;polyline class="leader" fill="none" points="624.0,250.8 628.0,259.1 630.0,259.1"/&gt;
&lt;/g&gt;
&lt;g class="c32"&gt;&lt;text class="slabel" x="630.0" y="263.1"&gt;1/32&lt;/text&gt;&lt;/g&gt;
&lt;g class="c512"&gt;
&lt;polyline class="leader" fill="none" points="624.0,269.8 628.0,273.6 630.0,273.6"/&gt;
&lt;/g&gt;
&lt;g class="c512"&gt;&lt;text class="slabel" x="630.0" y="277.6"&gt;1/512&lt;/text&gt;&lt;/g&gt;
&lt;/svg&gt;
&lt;figcaption&gt;Model quality measured as validation loss at different levels of sparsity (top-1 out of N experts) at different active parameters. Based on data from &lt;a href="https://arxiv.org/abs/2202.01169" target="_blank" rel="noopener noreferrer"&gt;Clark et al. (2022)&lt;/a&gt; (S-BASE routing, top-1, every 2nd layer).&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Similar findings have been confirmed by later scaling studies, such as &lt;a href="https://arxiv.org/abs/2402.07871" target="_blank" rel="noopener noreferrer"&gt;Krajewski et al. (2024)&lt;/a&gt; and &lt;a href="https://arxiv.org/abs/2501.12370" target="_blank" rel="noopener noreferrer"&gt;Abnar et al. (2025)&lt;/a&gt;, and the quality effect is uncontested.&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt; But, at what cost does it come? Looking at just FLOPs, it seems to be free, since FLOPs are a function of only the active parameters and thus would predict the same cost for dense and sparse models at matched active parameters. And that&amp;rsquo;s exactly where the story isn&amp;rsquo;t fully complete.&lt;/p&gt;
&lt;h2 id="memory"&gt;Memory&lt;/h2&gt;
&lt;p&gt;The first issue with sparse MoEs is that the additional experts, even if inactive and therefore not contributing to compute, still need to be present in memory. The selection of experts, and their separation into active and inactive, is done per token by the learned router, and that selection can of course differ across the tokens in a batch. So while per token the compute is limited to the number of selected experts, across a larger pool of tokens all experts get eventually used. Compute is a function of active parameters, but the memory for storing the weights is still a function of the total model size.&lt;/p&gt;
&lt;p&gt;There is an elegant solution to the memory problem and it has been around almost as long as MoEs themselves: Expert Parallelism (EP).&lt;/p&gt;
&lt;figure&gt;&lt;svg aria-label="Expert parallelism layered over data parallelism, with dispatch and combine all-to-all" class="moe-chart moe-diagram" viewBox="0 0 700 246" xmlns="http://www.w3.org/2000/svg" role="img"&gt;
&lt;style&gt;.moe-chart{font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}.moe-chart .grid{stroke:var(--border,#e5e7eb);stroke-width:1}.moe-chart .axis{stroke:var(--border,#e5e7eb);stroke-width:1.2}.moe-chart .tick{fill:var(--text-muted,#6b7280);font-size:13px}.moe-chart .atitle{fill:var(--text,#1a1a1a);font-size:14px}.moe-chart .series{fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .ref{fill:none;stroke:var(--text-light,#9ca3af);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.moe-chart .dot{fill:currentColor;stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .refdot{fill:var(--text-light,#9ca3af);stroke:var(--bg,#fff);stroke-width:1.1}.moe-chart .hit{fill:transparent;stroke:none;pointer-events:all;cursor:crosshair}.moe-chart .slabel{fill:currentColor;font-size:12.5px}.moe-chart .leader{stroke:currentColor;stroke-width:1;opacity:.55}.moe-chart .reflabel{fill:var(--text-muted,#6b7280);font-size:12.5px}.moe-chart .plabel{font-size:12px}.moe-diagram .ptitle{fill:var(--text,#1a1a1a);font-size:13px;text-anchor:middle}.moe-diagram .device{fill:none;stroke:var(--text-light,#9ca3af);stroke-width:1.4}.moe-diagram .devlabel{fill:var(--text-muted,#6b7280);font-size:10px;text-anchor:middle}.moe-diagram .wblock{stroke:var(--bg,#fff);stroke-width:1.2}.moe-diagram .router{stroke:var(--bg,#fff);stroke-width:1.2;fill:#94a3b8}.moe-diagram .blabel{fill:#fff;font-size:11px;text-anchor:middle}.moe-diagram .rlabel{fill:#fff;font-size:8px;text-anchor:middle}.moe-diagram .tok{stroke:var(--bg,#fff);stroke-width:1}.moe-diagram .flow{fill:none;stroke:var(--text-light,#9ca3af);stroke-width:1.3}.moe-diagram .a2alabel{fill:var(--text-muted,#6b7280);font-size:10px;text-anchor:middle}.moe-diagram .ea{fill:#2c6fbb}.moe-diagram .eb{fill:#c67c0a}.moe-diagram .ffn{fill:#94a3b8}.moe-diagram .arrowA{fill:none;stroke:#2c6fbb;stroke-width:1.8}.moe-diagram .arrowB{fill:none;stroke:#c67c0a;stroke-width:1.8}.moe-diagram .mA{fill:#2c6fbb}.moe-diagram .mB{fill:#c67c0a}.moe-diagram .mG{fill:var(--text-light,#9ca3af)}@media (prefers-color-scheme:dark){.moe-diagram .ea{fill:#5b93d0}.moe-diagram .eb{fill:#e2a53f}.moe-diagram .ffn,.moe-diagram .router{fill:#64748b}.moe-diagram .arrowA{stroke:#5b93d0}.moe-diagram .arrowB{stroke:#e2a53f}.moe-diagram .mA{fill:#5b93d0}.moe-diagram .mB{fill:#e2a53f}}&lt;/style&gt;
&lt;defs&gt;&lt;marker id="ahA" viewBox="0 0 8 8" refX="6.5" refY="4" markerWidth="6" markerHeight="6" orient="auto"&gt;&lt;path class="mA" d="M0,0 L8,4 L0,8 Z"/&gt;&lt;/marker&gt;&lt;marker id="ahB" viewBox="0 0 8 8" refX="6.5" refY="4" markerWidth="6" markerHeight="6" orient="auto"&gt;&lt;path class="mB" d="M0,0 L8,4 L0,8 Z"/&gt;&lt;/marker&gt;&lt;marker id="ahG" viewBox="0 0 8 8" refX="6.5" refY="4" markerWidth="6" markerHeight="6" orient="auto"&gt;&lt;path class="mG" d="M0,0 L8,4 L0,8 Z"/&gt;&lt;/marker&gt;&lt;/defs&gt;
&lt;text class="ptitle" x="114.7" y="18"&gt;Dense&lt;/text&gt;
&lt;text class="devlabel" x="60.3" y="36.0"&gt;GPU 0&lt;/text&gt;
&lt;rect class="device" x="12.0" y="42.0" width="96.7" height="198.0" rx="8"/&gt;
&lt;rect class="tok ffn" x="34.3" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="48.3" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="62.3" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="76.3" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="wblock ffn" x="43.3" y="101.0" width="34" height="24" rx="3"/&gt;
&lt;text class="blabel" x="60.3" y="117.0"&gt;FFN&lt;/text&gt;
&lt;rect class="tok ffn" x="34.3" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="48.3" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="62.3" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="76.3" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;text class="devlabel" x="169.0" y="36.0"&gt;GPU 1&lt;/text&gt;
&lt;rect class="device" x="120.7" y="42.0" width="96.7" height="198.0" rx="8"/&gt;
&lt;rect class="tok ffn" x="143.0" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="157.0" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="171.0" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="185.0" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="wblock ffn" x="152.0" y="101.0" width="34" height="24" rx="3"/&gt;
&lt;text class="blabel" x="169.0" y="117.0"&gt;FFN&lt;/text&gt;
&lt;rect class="tok ffn" x="143.0" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="157.0" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="171.0" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="185.0" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;line class="flow" x1="60.3" y1="220.0" x2="60.3" y2="126.0" marker-end="url(#ahG)"/&gt;
&lt;line class="flow" x1="60.3" y1="101.0" x2="60.3" y2="63.0" marker-end="url(#ahG)"/&gt;
&lt;line class="flow" x1="169.0" y1="220.0" x2="169.0" y2="126.0" marker-end="url(#ahG)"/&gt;
&lt;line class="flow" x1="169.0" y1="101.0" x2="169.0" y2="63.0" marker-end="url(#ahG)"/&gt;
&lt;text class="ptitle" x="350.0" y="18"&gt;MoE, naive&lt;/text&gt;
&lt;text class="devlabel" x="295.7" y="36.0"&gt;GPU 0&lt;/text&gt;
&lt;rect class="device" x="247.3" y="42.0" width="96.7" height="198.0" rx="8"/&gt;
&lt;rect class="tok ffn" x="269.7" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="283.7" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="297.7" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="311.7" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="router" x="279.7" y="190.5" width="32" height="13" rx="2.5"/&gt;
&lt;text class="rlabel" x="295.7" y="200.0"&gt;Router&lt;/text&gt;
&lt;rect class="tok ea" x="269.7" y="164.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok eb" x="283.7" y="164.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok eb" x="297.7" y="164.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ea" x="311.7" y="164.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="wblock ea" x="254.7" y="101.0" width="34" height="24" rx="3"/&gt;
&lt;text class="blabel" x="271.7" y="117.0"&gt;A&lt;/text&gt;
&lt;rect class="wblock eb" x="302.7" y="101.0" width="34" height="24" rx="3"/&gt;
&lt;text class="blabel" x="319.7" y="117.0"&gt;B&lt;/text&gt;
&lt;rect class="tok ffn" x="269.7" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="283.7" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="297.7" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="311.7" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;text class="devlabel" x="404.3" y="36.0"&gt;GPU 1&lt;/text&gt;
&lt;rect class="device" x="356.0" y="42.0" width="96.7" height="198.0" rx="8"/&gt;
&lt;rect class="tok ffn" x="378.3" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="392.3" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="406.3" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="420.3" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="router" x="388.3" y="190.5" width="32" height="13" rx="2.5"/&gt;
&lt;text class="rlabel" x="404.3" y="200.0"&gt;Router&lt;/text&gt;
&lt;rect class="tok eb" x="378.3" y="164.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ea" x="392.3" y="164.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ea" x="406.3" y="164.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok eb" x="420.3" y="164.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="wblock ea" x="363.3" y="101.0" width="34" height="24" rx="3"/&gt;
&lt;text class="blabel" x="380.3" y="117.0"&gt;A&lt;/text&gt;
&lt;rect class="wblock eb" x="411.3" y="101.0" width="34" height="24" rx="3"/&gt;
&lt;text class="blabel" x="428.3" y="117.0"&gt;B&lt;/text&gt;
&lt;rect class="tok ffn" x="378.3" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="392.3" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="406.3" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="420.3" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;line class="flow" x1="295.7" y1="220.0" x2="295.7" y2="204.5" marker-end="url(#ahG)"/&gt;
&lt;line class="flow" x1="295.7" y1="190.5" x2="295.7" y2="175.0" marker-end="url(#ahG)"/&gt;
&lt;line class="arrowA" x1="295.7" y1="164.0" x2="271.7" y2="126.0" marker-end="url(#ahA)"/&gt;
&lt;line class="arrowB" x1="295.7" y1="164.0" x2="319.7" y2="126.0" marker-end="url(#ahB)"/&gt;
&lt;line class="flow" x1="271.7" y1="101.0" x2="295.7" y2="63.0" marker-end="url(#ahG)"/&gt;
&lt;line class="flow" x1="319.7" y1="101.0" x2="295.7" y2="63.0" marker-end="url(#ahG)"/&gt;
&lt;line class="flow" x1="404.3" y1="220.0" x2="404.3" y2="204.5" marker-end="url(#ahG)"/&gt;
&lt;line class="flow" x1="404.3" y1="190.5" x2="404.3" y2="175.0" marker-end="url(#ahG)"/&gt;
&lt;line class="arrowA" x1="404.3" y1="164.0" x2="380.3" y2="126.0" marker-end="url(#ahA)"/&gt;
&lt;line class="arrowB" x1="404.3" y1="164.0" x2="428.3" y2="126.0" marker-end="url(#ahB)"/&gt;
&lt;line class="flow" x1="380.3" y1="101.0" x2="404.3" y2="63.0" marker-end="url(#ahG)"/&gt;
&lt;line class="flow" x1="428.3" y1="101.0" x2="404.3" y2="63.0" marker-end="url(#ahG)"/&gt;
&lt;text class="ptitle" x="585.3" y="18"&gt;MoE, expert-parallel&lt;/text&gt;
&lt;text class="devlabel" x="531.0" y="36.0"&gt;GPU 0&lt;/text&gt;
&lt;rect class="device" x="482.7" y="42.0" width="96.7" height="198.0" rx="8"/&gt;
&lt;rect class="tok ffn" x="505.0" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="519.0" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="533.0" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="547.0" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="router" x="515.0" y="190.5" width="32" height="13" rx="2.5"/&gt;
&lt;text class="rlabel" x="531.0" y="200.0"&gt;Router&lt;/text&gt;
&lt;rect class="tok ea" x="505.0" y="164.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok eb" x="519.0" y="164.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok eb" x="533.0" y="164.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ea" x="547.0" y="164.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ea" x="505.0" y="136.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ea" x="519.0" y="136.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ea" x="533.0" y="136.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ea" x="547.0" y="136.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ea" x="505.0" y="80.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ea" x="519.0" y="80.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ea" x="533.0" y="80.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ea" x="547.0" y="80.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="wblock ea" x="514.0" y="101.0" width="34" height="24" rx="3"/&gt;
&lt;text class="blabel" x="531.0" y="117.0"&gt;A&lt;/text&gt;
&lt;rect class="tok ffn" x="505.0" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="519.0" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="533.0" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="547.0" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;text class="devlabel" x="639.7" y="36.0"&gt;GPU 1&lt;/text&gt;
&lt;rect class="device" x="591.3" y="42.0" width="96.7" height="198.0" rx="8"/&gt;
&lt;rect class="tok ffn" x="613.7" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="627.7" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="641.7" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="655.7" y="220.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="router" x="623.7" y="190.5" width="32" height="13" rx="2.5"/&gt;
&lt;text class="rlabel" x="639.7" y="200.0"&gt;Router&lt;/text&gt;
&lt;rect class="tok eb" x="613.7" y="164.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ea" x="627.7" y="164.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ea" x="641.7" y="164.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok eb" x="655.7" y="164.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok eb" x="613.7" y="136.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok eb" x="627.7" y="136.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok eb" x="641.7" y="136.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok eb" x="655.7" y="136.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok eb" x="613.7" y="80.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok eb" x="627.7" y="80.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok eb" x="641.7" y="80.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok eb" x="655.7" y="80.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="wblock eb" x="622.7" y="101.0" width="34" height="24" rx="3"/&gt;
&lt;text class="blabel" x="639.7" y="117.0"&gt;B&lt;/text&gt;
&lt;rect class="tok ffn" x="613.7" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="627.7" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="641.7" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;rect class="tok ffn" x="655.7" y="52.0" width="10" height="10" rx="2"/&gt;
&lt;line class="flow" x1="531.0" y1="220.0" x2="531.0" y2="204.5" marker-end="url(#ahG)"/&gt;
&lt;line class="flow" x1="531.0" y1="190.5" x2="531.0" y2="175.0" marker-end="url(#ahG)"/&gt;
&lt;line class="flow" x1="639.7" y1="220.0" x2="639.7" y2="204.5" marker-end="url(#ahG)"/&gt;
&lt;line class="flow" x1="639.7" y1="190.5" x2="639.7" y2="175.0" marker-end="url(#ahG)"/&gt;
&lt;line class="arrowB" x1="568.2" y1="164.0" x2="602.5" y2="146.0" marker-end="url(#ahB)"/&gt;
&lt;line class="arrowA" x1="602.5" y1="164.0" x2="568.2" y2="146.0" marker-end="url(#ahA)"/&gt;
&lt;line class="arrowA" x1="531.0" y1="136.0" x2="531.0" y2="126.0" marker-end="url(#ahA)"/&gt;
&lt;line class="arrowA" x1="531.0" y1="101.0" x2="531.0" y2="91.0" marker-end="url(#ahA)"/&gt;
&lt;line class="arrowB" x1="639.7" y1="136.0" x2="639.7" y2="126.0" marker-end="url(#ahB)"/&gt;
&lt;line class="arrowB" x1="639.7" y1="101.0" x2="639.7" y2="91.0" marker-end="url(#ahB)"/&gt;
&lt;line class="arrowA" x1="568.2" y1="80.0" x2="602.5" y2="62.0" marker-end="url(#ahA)"/&gt;
&lt;line class="arrowB" x1="602.5" y1="80.0" x2="568.2" y2="62.0" marker-end="url(#ahB)"/&gt;
&lt;text class="a2alabel" x="585.3" y="116.0"&gt;all-to-all&lt;/text&gt;
&lt;/svg&gt;
&lt;figcaption&gt;Expert parallelism (right) brings the memory footprint from the naive solution (middle) back to dense parity (left) but at the cost of introducing two new all-to-all collectives (during forward as well as backward passes).&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;As depicted in the figure above, the idea of EP is best explained by comparing to a dense model and the naive MoE setup that incurs the high memory cost we just discussed. While the dense setup, when combined with data parallelism, holds exactly the same copy of the model on each device, the same approach applied to MoEs results in the FFN memory footprint growing E-fold with E experts. In addition, each expert is heavily underutilized since just a subset of the local batch will be routed to it.&lt;/p&gt;
&lt;p&gt;EP, as shown in the right-most column, fixes the memory issue by distributing the experts across devices, as the name already suggests. In the extreme case of having an expert parallel degree as high as the number of experts, the memory footprint reduces to the dense case and we get the sparsity benefit for free. Well, still not completely yet, because we have solved the memory issue, but there is now communication needed to send the tokens to the device where their assigned expert is located, and similarly send the expert outputs back to the original device, via all-to-all collectives.&lt;/p&gt;
&lt;p&gt;Before we turn to communication, I want to point out how elegantly EP interacts with DP: Under a perfectly balanced load, i.e. when each expert is assigned the same number of tokens in a batch, the all-to-all communication becomes a token exchange, with each device sending as many tokens out as it receives and keeping the same-sized local batch before and after. This is only possible because EP does not act in a new orthogonal parallelization dimension but operates inside the existing data parallelism, which provides the tokens that can be exchanged with each other. And as a result, it also solves the underutilization problem: Each expert can now process a full-sized batch similar to the FFN in the dense model. This also demonstrates why token balancing is such a crucial topic in MoE training, which we&amp;rsquo;ll discuss in a dedicated upcoming post.&lt;/p&gt;
&lt;h2 id="communication"&gt;Communication&lt;/h2&gt;
&lt;p&gt;EP solves memory but adds communication, which creates a new problem: It now takes longer to run a pass through the model. And compared to other types of parallelism, like the gradient synchronization necessary in data parallel training, this communication even lies on the critical path of every forward and backward pass, meaning it can&amp;rsquo;t be as easily overlapped with computation. Nonetheless, overlapping compute and communication is the solution, it just takes more effort to achieve that in MoEs.&lt;/p&gt;
&lt;p&gt;DeepSeek&amp;rsquo;s &lt;a href="https://arxiv.org/abs/2412.19437v2" target="_blank" rel="noopener noreferrer"&gt;DualPipe&lt;/a&gt; or Megatron&amp;rsquo;s &lt;a href="https://developer.nvidia.cn/blog/1f1b-moe-a2a-computing-overlap/" target="_blank" rel="noopener noreferrer"&gt;interleaved 1F1B with A2A overlap&lt;/a&gt; are pipelining approaches that achieve significant overlap, but doing so requires very careful scheduling of micro batches across pipeline stages, decoupling forward and backward computations (and even finer-grained subsets of the backward) or overlapping subsets of experts. Even with that, what can be hidden depends on the time communication and computation portions of the model take, which depend on the exact architecture (defining the matmul sizes as well as the communication payloads) and the hardware (determining the compute and networking capabilities). Beyond the plain MoE setup, specific architectural variations like using a shared expert, or more drastically, a fully parallel transformer architecture (as in &lt;a href="https://arxiv.org/abs/2204.02311" target="_blank" rel="noopener noreferrer"&gt;PaLM&lt;/a&gt;), can provide additional opportunity for overlap, but changes like the parallel layers come with consequences also for model quality. On the architecture side, fine-grained experts are another important factor, since besides their positive impact on model quality, they also remove the need for tensor parallelism for experts, which would complicate successfully overlapping the all-to-all even more. But more importantly, even for the conceptually best overlapping strategy, whether it delivers in practice further depends on very careful implementation: carefully managing CUDA streams, allocating sufficient SMs to compute and communication kernels, avoiding stragglers, etc. And finally, the hardware. While it determines the timing of communication and compute blocks and hence the potential for overlapping, it shapes the model in even more ways. Most importantly for MoEs, communication bandwidth changes dramatically when going from intra-node communication (via NVLink) to inter-node (via InfiniBand), on an H100 the bandwidth difference is about 18x. Overlapping the all-to-all with compute is a completely different challenge if that communication is across nodes or stays within one. And at what number of devices that boundary sits depends again on the hardware being used (e.g. a GB200 NVL72 rack has 72 GPUs in NVLink instead of just 8).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://arxiv.org/abs/2412.19437v2" target="_blank" rel="noopener noreferrer"&gt;DeepSeek V3&lt;/a&gt; was an excellent example to demonstrate what it takes to handle all these challenges: careful pipelining with DualPipe, custom communication kernels with DeepEP, limited inter-node communication via node-limited routing, fine-grained experts to avoid tensor parallelism, to name just a few ingredients. Compared to using EP to reduce the memory bottleneck, hiding the communication requires a lot more effort and tricks, especially at the implementation level, and it relies on a careful co-design of model architecture, implementation and hardware. Only with that, the matched compute compared to a dense model also translates to matched latency and training cost.&lt;/p&gt;
&lt;p&gt;That being said, fully hiding all communication and reaching cost parity with dense models is not strictly necessary to make MoEs attractive. As discussed before, the appeal of sparse models is that they bring a sizable improvement in model quality, and depending on the size of that, even with some amount of communication overhead, and hence higher training cost than the dense counterpart, the sparse model can still offer a better cost/quality trade-off.&lt;/p&gt;
&lt;h2 id="inference"&gt;Inference&lt;/h2&gt;
&lt;p&gt;So far, the discussion assumed training when talking about memory, communication, latency and cost. But the same challenges also exist at inference time, and in fact, they become even more challenging. I don&amp;rsquo;t want to go deep into inference here, but I&amp;rsquo;d like to highlight two important differences that inference adds.&lt;/p&gt;
&lt;p&gt;First, batching. We saw above that EP interacts nicely with DP and thereby hides the memory cost associated with the additional total parameters a sparse model brings. But that assumes large batches of tokens are processed. During inference, they don&amp;rsquo;t come naturally, but need to be constructed on the fly by combining independent incoming requests. This is typically already done in modern inference solutions to amortize the cost of reading model weights from HBM during decoding, but MoEs add another reason why inference should be run with batches as large as possible: distributing experts over devices fits them in the available memory, and distributing tokens across the same dimension keeps all those devices busy.&lt;/p&gt;
&lt;p&gt;Second, the data distribution is no longer under control. As I briefly hinted at above, an important factor for the efficiency of EP is that the token load across the experts is even. During training, this is achieved by actively encouraging the router to assign tokens in a balanced fashion. But crucially, that balance is defined with respect to the training distribution, a diverse mix of data across all domains a model should learn. At inference time, we don&amp;rsquo;t control the data distribution, it is simply the sum of the incoming requests. If they happen to concentrate on a certain domain at some point in time, the expert usage of the resulting batch is necessarily skewed, even if the model was nicely balanced during training. The resulting all-to-all communication and expert matmuls mirror that imbalance and stragglers increase latency. For that reason, various MoE-specific inference solutions have been proposed that depart from the regular expert placement used in training and instead dynamically deploy experts redundantly or not at all based on demand.&lt;/p&gt;
&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;The adoption of sparse MoE architectures has been one of the key ingredients for scaling LLMs over the past years to the capabilities they have today. Better quality at same FLOPs was the, somewhat simplified, promise they brought to the table. As we saw in this post, the reality is a little more complex, memory and communication need to be handled, and implementation is where that promise becomes reality or not. A good illustration of that is how much space the DeepSeek V3 tech report spends describing model architecture vs. system implementation. Despite those hurdles, sparsity has now fully conquered the landscape of LLMs and dense models have become rare, especially at the frontier.&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Officially only &lt;a href="https://blog.google/innovation-and-ai/products/google-gemini-next-generation-model-february-2024/#gemini-15" target="_blank" rel="noopener noreferrer"&gt;Gemini&lt;/a&gt; was confirmed to be an MoE, GPT-4 was rumored to be one, Claude remains unknown, but in 2026 the probability is very high that all closed frontier models are sparse.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;One claim of Clark et al. (2022), namely that the sparsity benefit diminishes with scale, has been refuted by later work and found to be an artifact of their study using a fixed amount of tokens to train all models. My plot above accounts for that and uses their intermediate data points instead of final ones to keep a constant token-per-parameter ratio. Only then, the curves remain parallel.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item></channel></rss>