diff --git a/PROGRESS.md b/PROGRESS.md
index e26d7ed..0b57a96 100644
--- a/PROGRESS.md
+++ b/PROGRESS.md
@@ -6,11 +6,12 @@
| 工作流 | 状态 | 完成度 | 下一检查点 |
|---|---:|---:|---|
-| 研究框架与规范 | 进行中 | 72% | 给 125 篇索引补充逐篇精读层级 |
+| 研究框架与规范 | 进行中 | 76% | 给 130 篇索引补充逐篇精读层级 |
| 网站设计系统 | 进行中 | 89% | 打印样式与更多通用可视化组件 |
| Kimi K3 深读 | 进行中 | 55% | 扩写 scaling / infra 逐图笔记 |
| Transformer 基础 | 进行中 | 52% | 矩阵形状动画与手算练习 |
| DeepSeek 专题 | 进行中 | 61% | GRPO 完整公式与训练轨迹推导 |
+| 稀疏计算与 MoE | 完成首版 | 74% | 真实负载 traces 与专家特化案例 |
| 长上下文专题 | 完成首版 | 72% | 真实模型配置、内核细节与失败案例 |
| 引用与事实检查 | 进行中 | 54% | 自动化外链复查与来源等级扩展 |
| 开源仓库 | 已完成首版 | 100% | 持续提交研究与网站迭代 |
@@ -25,21 +26,24 @@
- [x] 提炼参考网站的编辑设计语言。
- [x] 确认 `git.k1412.top` 为 Gitea/Forgejo 兼容服务且本机 HTTPS 凭据可用于既有仓库。
- [x] 使用 Grok CLI 检索并形成约 95 篇一手论文的补充路线,主代理已回查关键来源。
-- [x] 完成首批 125 篇关键论文索引,覆盖 12 个专题与 Kimi/DeepSeek 聚光主线。
+- [x] 完成首批 130 篇关键论文索引,覆盖 12 个专题与 Kimi/DeepSeek 聚光主线。
- [x] 完成可检索、可按专题筛选的论文库页面。
-- [x] 完成 K3、Transformer 基础、DeepSeek 谱系与长上下文四篇首版长文。
-- [x] 完成 K3 三轴架构、Self-Attention 实验、DeepSeek 谱系与长上下文成本实验室四张原创交互图。
+- [x] 完成 K3、Transformer 基础、DeepSeek 谱系、长上下文与 MoE 五篇首版长文。
+- [x] 完成 K3 三轴架构、Self-Attention 实验、DeepSeek 谱系、长上下文成本与 MoE 路由实验室五张原创交互图。
- [x] 完成长上下文首版:五张成本账、26 篇一手论文、10+ 机制图与 8 策略交互实验室。
- [x] 核验 FlashAttention、DeepSeek-V2/V3.2/V4、Kimi Linear/K3 等六份论文原文,并建立长上下文研究账本。
-- [x] Astro 类型检查、生产构建、8 个内部路由和桌面/移动端视觉检查通过。
+- [x] 核验 Switch、ST-MoE、DeepSeekMoE、Loss-Free、V3、LatentMoE 与 K3 原文,并建立 MoE 研究账本。
+- [x] 完成 MoE 首版:六张账、19 篇一手论文、完整 DeepSeek/K3 主线与路由—容量—通信实验室。
+- [x] Astro 类型检查、生产构建、9 个内部路由和桌面/移动端视觉检查通过。
- [x] 创建 `wuyang/llm-atlas` 公开仓库,匿名 API 确认 `private: false`。
-- [x] 本地生产镜像通过健康检查与全部 8 个页面路由烟雾测试。
+- [x] 本地生产镜像通过健康检查与全部 9 个页面路由烟雾测试。
- [x] 通过 Unraid Compose Manager、Nginx Proxy Manager 与 HTTPS 发布首版。
## 正在进行
-- [ ] MoE 路由模拟器与通信成本账本。
+- [ ] 推理模型与测试时扩展:CoT、verifier、GRPO、R1、Kimi k1.5 与 K3 MOPD。
- [ ] 长上下文专题的真实模型配置对比、内核细节与失败案例二轮深化。
+- [ ] MoE 专题的真实集群 traces、专家特化案例与二轮外部证据。
## 研究账本
@@ -49,11 +53,13 @@
| 2026-07-28 | K3 作为“汇流点”,不是课程起点 | 初学者可以先学基础,高阶读者可以从 K3 反向跳转 |
| 2026-07-28 | 优先重绘论文图并标明“简化/改绘” | 图可缩放、可交互,也减少脱离上下文复制论文图片 |
| 2026-07-28 | Grok 只用于线索扩展与交叉检查 | 正文事实必须回到论文、官方仓库或正式文档 |
-| 2026-07-28 | 首批论文库收录 125 篇,按问题与专题多标签组织 | 论文库承担发现入口,专题正文承担深度精读与机制复核 |
+| 2026-07-28 | 首批论文库收录 130 篇,按问题与专题多标签组织 | 论文库承担发现入口,专题正文承担深度精读与机制复核 |
| 2026-07-28 | 源码公开到 `git.k1412.top/wuyang/llm-atlas` | 路线、进度、研究方法和内容变更均可追踪 |
| 2026-07-28 | 站点使用不可变镜像与 Compose Manager 部署 | 每次发布保留明确版本、健康检查和回滚点 |
| 2026-07-28 | 长上下文按计算、缓存、位置、状态容量、系统五张账单组织 | 避免把 FlashAttention、位置外推和“记住更久”混成同一个问题 |
| 2026-07-28 | 交互缓存数字统一标记为教学估算 | 展示增长规律,不冒充任一模型的真实线上显存基准 |
+| 2026-07-28 | MoE 按六张账组织,路由算法与集群执行分开核算 | 避免用“稀疏所以便宜”跳过容量、负载、通信与权重读取 |
+| 2026-07-28 | “aux-loss-free”保留论文真实边界 | 区分 selection bias、mixture weight、z-loss 与 V3 的极小 sequence-wise loss |
## 未决问题
diff --git a/README.md b/README.md
index 89ab38f..a011fa1 100644
--- a/README.md
+++ b/README.md
@@ -17,8 +17,8 @@
- 持续进度:[PROGRESS.md](./PROGRESS.md)
- 证据与写作规范:[research/METHODOLOGY.md](./research/METHODOLOGY.md)
-首个里程碑包含 16 专题学习地图、125 篇关键论文索引、Kimi K3 完整导读、
-Transformer 基础、DeepSeek 技术谱系、长上下文与高效注意力深度专题,以及四张原创交互可视化。
+当前里程碑包含 16 专题学习地图、130 篇关键论文索引、Kimi K3 完整导读、
+Transformer 基础、DeepSeek 技术谱系、长上下文与 MoE 深度专题,以及五张原创交互可视化。
其余专题按进度账本持续扩建。
## 本地开发
diff --git a/ROADMAP.md b/ROADMAP.md
index 6d88eea..61070fc 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -45,6 +45,9 @@ GPT 系列 → Kaplan scaling laws → Chinchilla compute-optimal → 数据质
Conditional Computation → Sparsely-Gated MoE → GShard/Switch → DeepSeekMoE → LatentMoE → K3 Stable LatentMoE。重点解释路由、专家特化、负载均衡与通信。
+首版已发布:以“容量、激活计算、路由、负载、通信、稳定性”六张账串起 1991–2026 的 19 篇一手论文,
+包含 DeepSeekMoE / Loss-Free / LatentMoE / K3 重点推导,以及 8 种架构、4 类平衡策略的交互实验室。
+
### 07. 长上下文与高效注意力
稀疏注意力、线性注意力、FlashAttention、MQA/GQA、MLA、状态空间模型、Delta Rule、Kimi Linear/KDA、混合注意力与 1M 上下文。
diff --git a/package.json b/package.json
index 767c119..0e70d59 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,9 @@
"dev": "astro dev --host 0.0.0.0",
"build": "astro build",
"preview": "astro preview --host 0.0.0.0",
- "check": "astro check"
+ "check": "astro check",
+ "check:site": "node scripts/check-site.mjs",
+ "check:moe-browser": "node scripts/check-moe-browser.mjs"
},
"dependencies": {
"@astrojs/sitemap": "3.7.3",
diff --git a/research/MOE_RESEARCH.md b/research/MOE_RESEARCH.md
new file mode 100644
index 0000000..2a0e5e4
--- /dev/null
+++ b/research/MOE_RESEARCH.md
@@ -0,0 +1,159 @@
+# 稀疏计算与 MoE 研究账本
+
+最后核验:2026-07-28
+
+## 教学主线
+
+MoE 不能只写成“更多参数、较少计算”。本专题固定拆成六张账单:
+
+1. **容量**:模型一共存了多少参数。
+2. **激活计算**:每个 Token 实际经过多少专家参数。
+3. **路由**:谁决定 Token 去哪里,选择是 top-1、top-2 还是 top-k。
+4. **负载**:专家收到的 Token 是否均匀,溢出时是否丢 Token。
+5. **通信**:专家分散在不同设备后,dispatch / combine 两次 All-to-All 搬多少数据。
+6. **稳定性**:硬路由、router logits、极稀疏潜空间链怎样影响训练。
+
+核心因果链:
+
+> 稠密 FFN 把容量与每 Token 算力绑死
+> → 软门控专家学会分工,但所有专家仍可能参与
+> → 稀疏 top-k 让条件计算进入大规模模型
+> → Transformer MoE 把 FFN 专家分到设备上
+> → 容量、掉 Token、负载和 All-to-All 成为新瓶颈
+> → DeepSeek 细分专家、隔离共享知识,并限制跨设备路由
+> → 无辅助损失 bias 把均衡移出主梯度
+> → LatentMoE 压缩路由载荷与专家宽度
+> → K3 在 896 选 16 的极稀疏区间进一步解决激活爆炸、bias 更新和执行不均。
+
+## 本地一手材料
+
+PDF 与文本只作本地研究缓存,受 `.gitignore` 排除;公开仓库仅提交本账本和 canonical URL。
+
+| ID | 来源 | 本地页数 | 本轮用途 |
+|---|---|---:|---|
+| `1701.06538` | Sparsely-Gated MoE | 19 | Noisy Top-k 与现代稀疏门控起点 |
+| `2006.16668` | GShard | 35 | Transformer MoE、自动切分与 Top-2 |
+| `2101.03961` | Switch Transformers | 40 | Top-1、capacity factor、drop 与 EP |
+| `2202.08906` | ST-MoE | 38 | router z-loss、稳定性与迁移 |
+| `2202.09368` | Expert Choice | 14 | 专家选 Token 的负载均衡分支 |
+| `2401.04088` | Mixtral of Experts | 13 | 社区可运行的 8 选 2 MoE |
+| `2401.06066` | DeepSeekMoE | 33 | 细粒度专家与共享专家 |
+| `2408.15664` | Auxiliary-Loss-Free Balancing | 14 | expert bias 与干扰梯度 |
+| `2412.19437` | DeepSeek-V3 | 53 | 256 选 8、node limit、系统协同 |
+| `2601.18089` | LatentMoE | 18 | 潜空间专家、带宽与通信 |
+| `2607.24653` | Kimi K3 | 47 | Stable LatentMoE、QB 与 MoonEP |
+
+补充复用:
+
+- DeepSeek-V2 `2405.04434`:本地缓存位于 `research/sources/long-context/`。
+- Kimi K3 原报告:`research/sources/kimi-k3/k3_tech_report.*`。
+
+## 已核验的关键结论
+
+### Switch:capacity factor 不是模型容量
+
+Switch 的专家容量定义为:
+
+```text
+expert capacity = tokens per batch / number of experts × capacity factor
+```
+
+- 它是每个专家这一批最多能处理多少 Token,不是专家参数量。
+- 大于 1 的 capacity factor 提供负载缓冲。
+- 专家溢出时,Switch 跳过专家计算并让表示沿残差路径进入下一层。
+- capacity factor 增大也会增加 padding、计算、激活内存和通信。
+- 论文报告在其主要实验中 dropped tokens 通常低于 1%,不可外推为所有 MoE。
+
+### ST-MoE:稳定不等于均衡
+
+- Load-balancing loss 管“专家是否被均匀使用”。
+- Router z-loss 管“进入 router softmax 的 logits 是否过大”。
+- ST-MoE 的公式惩罚每个 Token router log-partition 的平方。
+- 论文的稳定性研究使用训练 CF=1.25、评估 CF=2.0,并令 z-loss 系数 `0.001`。
+- 因而 z-loss 不能被写成另一种负载均衡损失。
+
+### DeepSeekMoE:同计算预算下切得更细
+
+- 传统配置有 `N` 个专家、激活 `K` 个。
+- DeepSeekMoE 把每个 FFN 专家沿中间维切成 `m` 个更小专家,总数成为 `mN`,激活数成为 `mK`,保持总专家参数与激活计算近似不变。
+- 论文示例:`N=16, K=2` 只有 `C(16,2)=120` 种组合;切成 `64` 个小专家并激活 `8` 个后,组合数为 `C(64,8)=4,426,165,368`。
+- Shared expert isolation 让共享专家始终执行,承载共性变换;路由专家更专注于差异知识。
+- 2B 验证模型为 1 个共享专家 + 63 个路由专家,其中每 Token 激活 1+7。
+- 禁用共享专家并多激活一个路由专家时,论文的 Pile loss 从 1.808 上升到 2.414;这是该实验设置下的证据,不是通用常数。
+
+### Loss-Free / V3:selection 与 mixture weight 分开
+
+- 原始 affinity score 为 `s`,expert bias 为 `b`。
+- `s+b` 只用于决定 top-k;最终混合专家输出的权重仍来自原始 `s`。
+- 因此 bias 调整 dispatch,不向语言建模参数引入 auxiliary-loss 的干扰梯度。
+- 原方法按上一步负载以固定步长更新 bias;步长过小反应慢、过大会振荡。
+- DeepSeek-V3:671B 总参数、37B 激活;每个 MoE 层 1 shared + 256 routed,激活 8 routed;每 Token 最多发往 4 个节点。
+- V3 主要使用 auxiliary-loss-free 策略,但仍保留系数极小的 sequence-wise balance loss 防止单序列极端失衡。正文必须保留这个边界,不能简写为“完全没有任何辅助损失”。
+- V3 报告称训练和推理都不 drop Token;这是其负载均衡与部署策略下的模型报告事实。
+
+### LatentMoE:省下的是路由宽度与专家权重流量
+
+- 标准 MoE 以模型宽度 `d` dispatch Token,并让 routed expert 在 `d` 宽度上计算。
+- LatentMoE 先下投影到 `ℓ response.json());
+const page = pages.find((entry) => entry.type === "page");
+if (!page) throw new Error(`CDP ${cdpPort} 没有可用页面`);
+
+const socket = new WebSocket(page.webSocketDebuggerUrl);
+await new Promise((resolve, reject) => {
+ socket.addEventListener("open", resolve, { once: true });
+ socket.addEventListener("error", reject, { once: true });
+});
+
+let nextId = 0;
+const pending = new Map();
+const exceptions = [];
+socket.addEventListener("message", (event) => {
+ const message = JSON.parse(event.data);
+ if (message.id && pending.has(message.id)) {
+ const { resolve, reject } = pending.get(message.id);
+ pending.delete(message.id);
+ if (message.error) reject(new Error(message.error.message));
+ else resolve(message.result);
+ }
+ if (message.method === "Runtime.exceptionThrown") {
+ exceptions.push(message.params.exceptionDetails.text);
+ }
+});
+
+const command = (method, params = {}) => new Promise((resolve, reject) => {
+ const id = ++nextId;
+ pending.set(id, { resolve, reject });
+ socket.send(JSON.stringify({ id, method, params }));
+});
+const pause = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
+const evaluate = async (expression) => {
+ const result = await command("Runtime.evaluate", {
+ expression,
+ returnByValue: true,
+ awaitPromise: true,
+ });
+ if (result.exceptionDetails) throw new Error(result.exceptionDetails.text);
+ return result.result.value;
+};
+const navigate = async (path) => {
+ await command("Page.navigate", { url: `${baseUrl}${path}` });
+ for (let attempt = 0; attempt < 30; attempt += 1) {
+ await pause(100);
+ if (await evaluate("document.readyState === 'complete'")) return;
+ }
+ throw new Error(`${path} 加载超时`);
+};
+const screenshot = async (path) => {
+ const result = await command("Page.captureScreenshot", { format: "png", captureBeyondViewport: false });
+ writeFileSync(path, Buffer.from(result.data, "base64"));
+};
+
+await command("Page.enable");
+await command("Runtime.enable");
+await command("Emulation.setDeviceMetricsOverride", {
+ width: 1440,
+ height: 1100,
+ deviceScaleFactor: 1,
+ mobile: false,
+});
+await navigate("/moe/");
+
+const k3 = await evaluate(`(() => {
+ const root = document.querySelector("[data-moe-lab]");
+ const started = performance.now();
+ root.querySelector('[data-preset-button="k3"]').click();
+ const duration = performance.now() - started;
+ const skew = root.querySelector("[data-skew]");
+ const capacity = root.querySelector("[data-capacity]");
+ skew.value = "100";
+ capacity.value = "0.75";
+ skew.dispatchEvent(new Event("input", { bubbles: true }));
+ capacity.dispatchEvent(new Event("input", { bubbles: true }));
+ root.querySelector('[data-balance="none"]').click();
+ const none = {
+ ratio: root.querySelector("[data-load-ratio]").textContent,
+ overflow: root.querySelector("[data-drop-rate]").textContent,
+ };
+ root.querySelector('[data-balance="quantile"]').click();
+ return {
+ duration: Number(duration.toFixed(2)),
+ title: root.querySelector("[data-route-title]").textContent,
+ fraction: root.querySelector("[data-active-fraction]").textContent,
+ communication: root.querySelector("[data-comm-value]").textContent,
+ communicationNote: root.querySelector("[data-comm-note]").textContent,
+ combination: root.querySelector("[data-combination-value]").textContent,
+ none,
+ quantile: {
+ ratio: root.querySelector("[data-load-ratio]").textContent,
+ overflow: root.querySelector("[data-drop-rate]").textContent,
+ },
+ metrics: root.querySelectorAll(".metric-grid > article").length,
+ };
+})()`);
+
+const latent = await evaluate(`(() => {
+ const root = document.querySelector("[data-moe-lab]");
+ const started = performance.now();
+ root.querySelector('[data-preset-button="latent"]').click();
+ return {
+ duration: Number((performance.now() - started).toFixed(2)),
+ fraction: root.querySelector("[data-active-fraction]").textContent,
+ communication: root.querySelector("[data-comm-value]").textContent,
+ note: root.querySelector("[data-comm-note]").textContent,
+ };
+})()`);
+
+const layout = await evaluate(`(() => {
+ const header = document.querySelector(".site-header");
+ const nav = document.querySelector(".top-nav");
+ const meta = document.querySelector(".header-meta");
+ return {
+ documentOverflow: document.documentElement.scrollWidth - document.documentElement.clientWidth,
+ navGap: Number((meta.getBoundingClientRect().left - nav.getBoundingClientRect().right).toFixed(1)),
+ articleSections: document.querySelectorAll(".article-section").length,
+ };
+})()`);
+
+await evaluate(`(() => {
+ document.documentElement.style.scrollBehavior = "auto";
+ document.querySelector("[data-moe-lab]").scrollIntoView({ block: "start", behavior: "instant" });
+ return { scrollY, top: document.querySelector("[data-moe-lab]").getBoundingClientRect().top };
+})()`);
+await pause(200);
+await screenshot("/tmp/llm-atlas-moe-lab-desktop.png");
+
+await command("Emulation.setDeviceMetricsOverride", {
+ width: 390,
+ height: 844,
+ deviceScaleFactor: 1,
+ mobile: true,
+});
+await navigate("/moe/");
+const mobile = await evaluate(`({
+ documentOverflow: document.documentElement.scrollWidth - document.documentElement.clientWidth,
+ menuVisible: getComputedStyle(document.querySelector("#menu-toggle")).display !== "none",
+ title: document.querySelector("h1").innerText,
+})`);
+await screenshot("/tmp/llm-atlas-moe-mobile.png");
+
+await command("Emulation.setDeviceMetricsOverride", {
+ width: 1440,
+ height: 1100,
+ deviceScaleFactor: 1,
+ mobile: false,
+});
+await navigate("/");
+const home = await evaluate(`({
+ documentOverflow: document.documentElement.scrollWidth - document.documentElement.clientWidth,
+ releaseCards: document.querySelectorAll(".release-card").length,
+ navLinks: document.querySelectorAll(".top-nav a").length,
+})`);
+await screenshot("/tmp/llm-atlas-home-desktop.png");
+await evaluate(`(() => {
+ document.documentElement.style.scrollBehavior = "auto";
+ document.querySelector("#new-chapters").scrollIntoView({ block: "start", behavior: "instant" });
+})()`);
+await pause(100);
+await screenshot("/tmp/llm-atlas-home-releases.png");
+
+const report = { k3, latent, layout, mobile, home, exceptions };
+console.log(JSON.stringify(report, null, 2));
+
+const failures = [];
+if (!k3.title.includes("896 选 16")) failures.push("K3 预设未生效");
+if (k3.metrics !== 6) failures.push(`指标卡数量异常:${k3.metrics}`);
+if (!k3.communicationNote.includes("2× latent")) failures.push("K3 latent 通信说明缺失");
+if (!latent.note.includes("4× latent")) failures.push("LatentMoE 4× 通信说明缺失");
+if (layout.documentOverflow > 0 || mobile.documentOverflow > 0 || home.documentOverflow > 0) {
+ failures.push("页面存在横向溢出");
+}
+if (layout.navGap < 0) failures.push(`桌面导航碰撞:${layout.navGap}px`);
+if (!mobile.menuVisible) failures.push("移动端菜单按钮未显示");
+if (home.releaseCards !== 2) failures.push(`首页新章卡数量异常:${home.releaseCards}`);
+if (exceptions.length) failures.push(`浏览器脚本异常:${exceptions.join("; ")}`);
+
+socket.close();
+if (failures.length) {
+ failures.forEach((failure) => console.error(`- ${failure}`));
+ process.exit(1);
+}
diff --git a/scripts/check-site.mjs b/scripts/check-site.mjs
new file mode 100644
index 0000000..ec766e8
--- /dev/null
+++ b/scripts/check-site.mjs
@@ -0,0 +1,67 @@
+import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
+import { extname, join, normalize } from "node:path";
+
+const root = new URL("../dist/", import.meta.url);
+const rootPath = root.pathname;
+
+function walk(directory) {
+ return readdirSync(directory).flatMap((name) => {
+ const path = join(directory, name);
+ return statSync(path).isDirectory() ? walk(path) : [path];
+ });
+}
+
+function routeFile(pathname) {
+ const clean = decodeURIComponent(pathname).replace(/^\/+/, "");
+ if (!clean) return join(rootPath, "index.html");
+ const local = normalize(join(rootPath, clean));
+ if (!local.startsWith(normalize(rootPath))) return null;
+ if (extname(local)) return local;
+ return join(local, "index.html");
+}
+
+if (!existsSync(rootPath)) {
+ console.error("dist/ 不存在;请先运行 npm run build。");
+ process.exit(1);
+}
+
+const htmlFiles = walk(rootPath).filter((file) => file.endsWith(".html"));
+const anchors = new Map();
+for (const file of htmlFiles) {
+ const html = readFileSync(file, "utf8");
+ anchors.set(file, new Set([...html.matchAll(/\sid=["']([^"']+)["']/g)].map((match) => match[1])));
+}
+
+let references = 0;
+let anchorReferences = 0;
+const failures = [];
+
+for (const source of htmlFiles) {
+ const html = readFileSync(source, "utf8");
+ const hrefs = [...html.matchAll(/\shref=["']([^"']+)["']/g)].map((match) => match[1]);
+ for (const href of hrefs) {
+ if (!href.startsWith("/") || href.startsWith("//")) continue;
+ references += 1;
+ const url = new URL(href, "https://llm-atlas.local");
+ const target = routeFile(url.pathname);
+ if (!target || !existsSync(target)) {
+ failures.push(`${source.replace(rootPath, "/")} → ${href}(目标不存在)`);
+ continue;
+ }
+ if (url.hash) {
+ anchorReferences += 1;
+ const id = decodeURIComponent(url.hash.slice(1));
+ if (!anchors.get(target)?.has(id)) {
+ failures.push(`${source.replace(rootPath, "/")} → ${href}(锚点不存在)`);
+ }
+ }
+ }
+}
+
+console.log(
+ `${htmlFiles.length} 个页面,${references} 个站内引用,${anchorReferences} 个跨页锚点,${failures.length} 个失败。`,
+);
+if (failures.length) {
+ failures.forEach((failure) => console.error(`- ${failure}`));
+ process.exit(1);
+}
diff --git a/src/components/MoERoutingLab.astro b/src/components/MoERoutingLab.astro
new file mode 100644
index 0000000..dcdfe2d
--- /dev/null
+++ b/src/components/MoERoutingLab.astro
@@ -0,0 +1,1298 @@
+---
+const presets = [
+ {
+ id: "dense",
+ label: "Dense FFN",
+ kicker: "1 条固定路径",
+ experts: 1,
+ active: 1,
+ shared: 0,
+ devices: 1,
+ deviceLimit: 1,
+ latentRatio: 1,
+ capacity: 1,
+ balance: "none",
+ summary: "每个 Token 都经过同一套 FFN 参数。容量、每 Token 算力与权重读取被绑在一起。",
+ solves: "执行简单、无路由",
+ leaves: "扩容量就同步扩计算",
+ },
+ {
+ id: "switch",
+ label: "Switch",
+ kicker: "128 选 1",
+ experts: 128,
+ active: 1,
+ shared: 0,
+ devices: 8,
+ deviceLimit: 8,
+ latentRatio: 1,
+ capacity: 1.25,
+ balance: "aux",
+ summary: "每个 Token 只去得分最高的一个专家,用最小 top-k 降低专家计算和通信。",
+ solves: "把容量与激活计算解耦",
+ leaves: "容量溢出与辅助损失",
+ },
+ {
+ id: "gshard",
+ label: "GShard",
+ kicker: "16 选 2",
+ experts: 16,
+ active: 2,
+ shared: 0,
+ devices: 8,
+ deviceLimit: 8,
+ latentRatio: 1,
+ capacity: 2,
+ balance: "aux",
+ summary: "Top-2 为每个 Token 组合两个专家,把 Transformer MoE 扩到数千设备。",
+ solves: "更强专家组合",
+ leaves: "两路计算与 All-to-All",
+ },
+ {
+ id: "mixtral",
+ label: "Mixtral",
+ kicker: "8 选 2",
+ experts: 8,
+ active: 2,
+ shared: 0,
+ devices: 8,
+ deviceLimit: 8,
+ latentRatio: 1,
+ capacity: 1.25,
+ balance: "aux",
+ summary: "少量大专家、每层 top-2;结构直观,成为开放生态理解和部署 MoE 的常用入口。",
+ solves: "开放可用性",
+ leaves: "粗专家可能学习重复知识",
+ },
+ {
+ id: "deepseek",
+ label: "DeepSeekMoE",
+ kicker: "1 shared + 63 选 7",
+ experts: 63,
+ active: 7,
+ shared: 1,
+ devices: 8,
+ deviceLimit: 8,
+ latentRatio: 1,
+ capacity: 1.25,
+ balance: "aux",
+ summary: "把专家切细并同时激活更多小专家;共享专家固定处理共性变换。",
+ solves: "专业化与知识冗余",
+ leaves: "细粒度提高通信扇出",
+ },
+ {
+ id: "v3",
+ label: "DeepSeek-V3",
+ kicker: "1 shared + 256 选 8",
+ experts: 256,
+ active: 8,
+ shared: 1,
+ devices: 8,
+ deviceLimit: 4,
+ latentRatio: 1,
+ capacity: 1,
+ balance: "lossfree",
+ summary: "Expert bias 只调 top-k 选择;node-limited routing 把每个 Token 限在最多四个节点。",
+ solves: "干扰梯度与跨节点扇出",
+ leaves: "固定步长 bias 会慢或振荡",
+ },
+ {
+ id: "latent",
+ label: "LatentMoE",
+ kicker: "512 选 24 · 4× latent",
+ experts: 512,
+ active: 24,
+ shared: 2,
+ devices: 8,
+ deviceLimit: 8,
+ latentRatio: 4,
+ capacity: 1.1,
+ balance: "lossfree",
+ summary: "先把 Token 从模型宽度投到 1/4 latent 宽度,再 dispatch 和执行 routed experts。",
+ solves: "权重带宽与通信载荷",
+ leaves: "投影开销与潜空间信息损失",
+ },
+ {
+ id: "k3",
+ label: "K3 Stable",
+ kicker: "2 shared + 896 选 16",
+ experts: 896,
+ active: 16,
+ shared: 2,
+ devices: 8,
+ deviceLimit: 8,
+ latentRatio: 2,
+ capacity: 1,
+ balance: "quantile",
+ summary: "半宽 latent routed path、两条全宽共享路径,并用 Quantile Balancing 面向极稀疏专家池。",
+ solves: "3T 级极稀疏与稳定均衡",
+ leaves: "需要 MoonEP 与专用内核协同",
+ },
+];
+
+const tokens = Array.from({ length: 12 }, (_, index) => index);
+const expertBins = Array.from({ length: 12 }, (_, index) => index);
+const routeLines = Array.from({ length: 36 }, (_, index) => ({
+ token: Math.floor(index / 3),
+ branch: index % 3,
+}));
+const loadBins = Array.from({ length: 32 }, (_, index) => index);
+const deviceCells = Array.from({ length: 64 }, (_, index) => ({
+ from: Math.floor(index / 8),
+ to: index % 8,
+}));
+---
+
+
+
+
+
INTERACTIVE / MOE ROUTING LAB
+
参数没有消失:只是每个 Token 选择不同路径
+
+
+ 预设使用论文结构,负载与路由是确定性教学模拟。先切模型,再故意增加偏斜,观察“模型更稀疏”为何会把压力转移到均衡和通信。
+
+
+
+
+ {presets.map((preset) => (
+
+ ))}
+
+
+
+
+
+ 01 / TOKEN → EXPERT
+ SWITCH · 128 选 1
+
+
+
+
+
+ TOKENS
+ {tokens.map((token) => t{token + 1})}
+
+
+ EXPERT GROUPS
+ {expertBins.map((bin) => (
+
+ E{bin + 1}
+
+ 0
+
+ ))}
+
+
+
+
+ 被专家处理
+ 超过 capacity
+ 共享专家另行固定执行
+
+
+
+
+ {presets.map((preset) => (
+
+ {preset.kicker}
+ {preset.label}
+ {preset.summary}
+
+ - 主要解决
- {preset.solves}
+ - 仍然留下
- {preset.leaves}
+
+
+ ))}
+
+
FIXED DENSE PATH
+
0 shared experts
+
Switch 没有固定共享专家;每个 Token 只走一个 routed expert。
+
+
+
+
+
+
+
02 / STRESS THE ROUTER
+
把路由推向过热,再换一种均衡方法
+
+ 模拟 512 个 Token。偏斜越高,越多 Token 争抢热门专家;capacity factor 越大,缓冲越多,但 padding、显存和通信预算也越大。
+
+
+
+
+
+
+
+
BALANCE MODE
+
+
+
+
+
+
+
+
+
+
+
+
+ ROUTED SPARSITY
+ 1 / 128 · 0.78%
+ 不含 attention 与其他稠密路径
+
+
+ MAX / MEAN LOAD
+ —
+ 1.00× 才是完全均匀
+
+
+ OVERFLOW ROUTES
+ —
+ 每专家容量 5 个 Token
+
+
+ DISPATCH + COMBINE
+ 14.0 MiB
+ 7168 维 BF16 教学载荷
+
+
+ DEVICE FANOUT
+ —
+ 每 Token 平均触达设备数
+
+
+ COMBINATION SPACE
+ 10²·¹
+ C(N,k) 上限,不代表已学会的技能数
+
+
+
+
+
+
+ 03 / LOAD HISTOGRAM
+ 32 个专家分组 · 红线是 capacity
+
+
+
CAP
+ {loadBins.map((bin) => (
+
{String(bin + 1).padStart(2, "0")}
+ ))}
+
+
+
+
+
+ 04 / ALL-TO-ALL
+ 8 个 EP ranks
+
+
+ {deviceCells.map(({ from, to }) => (
+
+ ))}
+
+
+ 源设备 →
+ 颜色越深,dispatch 的 Token 路由越多
+
+
+
+
+
+
01ROUTERouter 为 Token 与专家打分,选 top-k。
+
→
+
02DISPATCH把 Token 搬到专家所在设备;第一次 All-to-All。
+
→
+
03EXPERT每个专家只处理收到的小批 Token。
+
→
+
04COMBINE结果搬回原设备,加权合并;第二次通信。
+
+
+
+
TEACHING SIMULATION, NOT A BENCHMARK
+
+ Aux、Loss-Free 与 QB 在这里用确定性近似展示负载方向,不复现论文训练过程;通信值只计算 512 个 Token 的 BF16
+ dispatch/combine payload,不含协议、对齐、共享专家、梯度、索引与 kernel 开销。K3 还依赖 MoonEP 的冗余专家规划。
+
+
+
+
+
+
+
diff --git a/src/components/SiteFooter.astro b/src/components/SiteFooter.astro
index 62b7b12..92c2ccc 100644
--- a/src/components/SiteFooter.astro
+++ b/src/components/SiteFooter.astro
@@ -5,6 +5,7 @@
+ 进入 MoE 专题:比较粗专家、细粒度专家与共享专家 →
@@ -212,6 +213,10 @@ const toc = [
根据近期负载上调冷门专家、下调热门专家;bias 只影响路由选择,不直接进入最终门控权重,
从而把“系统要均衡”和“模型要准确”更松地解耦。
+
+ 专题版推导会进一步区分 z-loss、辅助平衡损失、Loss-Free expert bias
+ 与 K3 Quantile Balancing;“aux-loss-free”并不等于系统里不存在任何平衡约束。
+
FP8 训练真正难在哪
diff --git a/src/pages/index.astro b/src/pages/index.astro
index 0cb66ae..af20342 100644
--- a/src/pages/index.astro
+++ b/src/pages/index.astro
@@ -7,6 +7,7 @@ import { chapters, statusLabel } from "@/data/chapters";
const routes: Record = {
roadmap: "/roadmap/",
foundations: "/foundations/",
+ moe: "/moe/",
"long-context": "/long-context/",
};
@@ -75,6 +76,7 @@ const paths = [
选择学习路径 ↓
直接解剖 K3
DeepSeek 专题
+ MoE 专题
长上下文专题
@@ -85,7 +87,7 @@ const paths = [
16核心专题
151K3 报告来源
-
125关键论文索引
+
130关键论文索引
47pK3 技术报告
@@ -97,23 +99,41 @@ const paths = [
-
-
-
-
NEW / CHAPTER 07 LONG CONTEXT
-
一百万 Token,不是一扇更大的窗
-
- 新专题把长上下文拆成计算、缓存、位置、状态容量与系统五张账单,
- 沿 26 篇一手论文走完 FlashAttention、MLA、Delta Rule、KDA、Kimi K3 与 DeepSeek-V4。
-
-
-
- - LINEAGE
- 2019 → 2026
- VISUALS10+ 机制图
- LAB8 种策略 · 4 档长度
-
- 进入专题 →
-
+
@@ -323,12 +343,20 @@ const paths = [
padding-bottom: 0;
}
+ .release-grid {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 22px;
+ }
+
.release-card {
position: relative;
display: grid;
- grid-template-columns: minmax(0, 1.45fr) minmax(280px, 0.65fr);
- gap: clamp(34px, 6vw, 90px);
- padding: clamp(28px, 4vw, 58px);
+ grid-template-rows: 1fr auto;
+ gap: 28px;
+ min-height: 560px;
+ padding: clamp(28px, 3.6vw, 50px);
+ padding-bottom: clamp(74px, 7vw, 92px);
border: 1px solid var(--line-strong);
color: inherit;
text-decoration: none;
@@ -346,8 +374,8 @@ const paths = [
.release-card h2 {
max-width: 760px;
margin: 20px 0 18px;
- font-size: clamp(2rem, 4vw, 4.2rem);
- line-height: 1.03;
+ font-size: clamp(2rem, 3.2vw, 3.5rem);
+ line-height: 1.05;
}
.release-card p:not(.eyebrow) {
@@ -358,7 +386,7 @@ const paths = [
}
.release-card dl {
- margin: 0 0 28px;
+ margin: 0;
border-top: 1px solid var(--line);
}
@@ -391,8 +419,12 @@ const paths = [
}
@media (max-width: 760px) {
- .release-card {
+ .release-grid {
grid-template-columns: 1fr;
+ }
+
+ .release-card {
+ min-height: 0;
padding-bottom: 76px;
}
diff --git a/src/pages/k3/index.astro b/src/pages/k3/index.astro
index 56b923a..4d6d2ec 100644
--- a/src/pages/k3/index.astro
+++ b/src/pages/k3/index.astro
@@ -286,6 +286,7 @@ const toc = [
这条技术线与 DeepSeekMoE 紧密相连:shared experts 保存公共知识,细粒度 routed experts 促进专业化。
K3 再借 LatentMoE 让“选 16 个专家”的通信和权重读取可承受,并为极端稀疏补上稳定性机制。
+ 进入 MoE 专题:逐步推导 LatentMoE 与 Quantile Balancing →
diff --git a/src/pages/moe/index.astro b/src/pages/moe/index.astro
new file mode 100644
index 0000000..6727cb1
--- /dev/null
+++ b/src/pages/moe/index.astro
@@ -0,0 +1,1680 @@
+---
+import BaseLayout from "@/layouts/BaseLayout.astro";
+import MoERoutingLab from "@/components/MoERoutingLab.astro";
+
+const toc = [
+ ["00", "map", "先拆成六张账单"],
+ ["01", "dense", "容量与算力怎样解绑"],
+ ["02", "history", "从软专家到稀疏门控"],
+ ["03", "pipeline", "一次 MoE 前向发生什么"],
+ ["04", "capacity", "容量、掉 Token 与稳定"],
+ ["05", "branches", "路由的几条分支"],
+ ["06", "deepseek", "DeepSeekMoE:切细与共享"],
+ ["07", "balance", "V2/V3:通信与无辅损"],
+ ["08", "latent", "LatentMoE:进入潜空间"],
+ ["09", "k3", "K3 Stable LatentMoE"],
+ ["10", "lab", "交互路由实验室"],
+ ["11", "systems", "MoonEP 与执行系统"],
+ ["12", "evaluation", "怎样判断专家真专"],
+ ["↳", "papers", "关键论文阅读链"],
+];
+
+const waves = [
+ {
+ year: "1991–94",
+ title: "让局部专家分工",
+ papers: "Adaptive MoE · Hierarchical MoE",
+ move: "门控网络学习输入空间划分,多个专家竞争解释样本。",
+ wall: "规模小、软混合,尚未解决大网络的每样本计算。",
+ },
+ {
+ year: "2017",
+ title: "只激活 top-k",
+ papers: "Sparsely-Gated MoE",
+ move: "Noisy Top-k 把巨大专家池变成条件计算,容量第一次可远快于激活算力增长。",
+ wall: "路由塌缩、专家不均和分布式执行变成新问题。",
+ },
+ {
+ year: "2020–22",
+ title: "进入 Transformer 与集群",
+ papers: "GShard · Switch · GLaM · ST-MoE",
+ move: "FFN 专家、自动切分、top-1/2、capacity 与专家并行形成现代栈。",
+ wall: "Token drop、All-to-All、训练稳定和迁移质量互相牵制。",
+ },
+ {
+ year: "2021–24",
+ title: "重写谁选谁",
+ papers: "BASE · Expert Choice · Soft MoE · MoD",
+ move: "均衡分配、专家选 Token、连续 slots 与按深度跳层探索不同条件计算。",
+ wall: "因果语言模型、解码、静态形状与主流内核限制部分路线。",
+ },
+ {
+ year: "2024–26",
+ title: "算法与系统共同设计",
+ papers: "DeepSeekMoE · Loss-Free · LatentMoE · K3",
+ move: "切细专家、共享共性、限域路由、潜空间载荷、分位数均衡与冗余专家规划汇流。",
+ wall: "理论 FLOPs 已不是唯一尺度,权重带宽、网络、稳定和服务部署同样决定成本。",
+ },
+];
+
+const paperChain = [
+ ["1991", "Adaptive Mixtures of Local Experts", "https://doi.org/10.1162/neco.1991.3.1.79", "门控与局部专家分工的概念起点。"],
+ ["1994", "Hierarchical Mixtures of Experts and the EM Algorithm", "https://www.cs.toronto.edu/~hinton/absps/hme.pdf", "树状门控与 EM 训练。"],
+ ["2017", "Sparsely-Gated Mixture-of-Experts", "https://arxiv.org/abs/1701.06538", "Noisy Top-k、负载目标与现代条件计算。"],
+ ["2020", "GShard", "https://arxiv.org/abs/2006.16668", "Top-2 Transformer MoE、自动切分和大规模翻译。"],
+ ["2021", "Switch Transformers", "https://arxiv.org/abs/2101.03961", "Top-1、capacity factor、token drop 与专家并行。"],
+ ["2021", "BASE Layers", "https://arxiv.org/abs/2103.16716", "把路由视作均衡分配问题。"],
+ ["2021", "GLaM", "https://arxiv.org/abs/2112.06905", "1.2T 语言模型中的 top-2 MoE。"],
+ ["2022", "ST-MoE", "https://arxiv.org/abs/2202.08906", "Router z-loss、稳定性、capacity 与迁移。"],
+ ["2022", "Expert Choice Routing", "https://arxiv.org/abs/2202.09368", "专家选择固定容量 Token。"],
+ ["2022", "MegaBlocks", "https://arxiv.org/abs/2211.15841", "以 block-sparse GPU kernels 避免因负载不均而丢 Token。"],
+ ["2023", "Soft MoE", "https://arxiv.org/abs/2308.00951", "用连续 dispatch/combine slots 替代硬 top-k。"],
+ ["2024", "Mixtral of Experts", "https://arxiv.org/abs/2401.04088", "开放生态中的每层 8 选 2。"],
+ ["2024", "DeepSeekMoE", "https://arxiv.org/abs/2401.06066", "细粒度专家分割与共享专家隔离。"],
+ ["2024", "Mixture-of-Depths", "https://arxiv.org/abs/2404.02258", "把条件计算从宽度扩到深度。"],
+ ["2024", "DeepSeek-V2", "https://arxiv.org/abs/2405.04434", "Device-limited routing 与规模化 DeepSeekMoE。"],
+ ["2024", "Auxiliary-Loss-Free Load Balancing", "https://arxiv.org/abs/2408.15664", "Selection bias 与 mixture weight 解耦。"],
+ ["2024", "DeepSeek-V3", "https://arxiv.org/abs/2412.19437", "256 选 8、node limit、no-drop 与 DualPipe。"],
+ ["2026", "LatentMoE", "https://arxiv.org/abs/2601.18089", "在潜空间 dispatch 和执行专家,优化 accuracy per cost。"],
+ ["2026", "Kimi K3", "https://arxiv.org/abs/2607.24653", "Stable LatentMoE、Quantile Balancing 与 MoonEP。"],
+];
+---
+
+
+
+
+
+
ARCHITECTURE / 06 MIXTURE OF EXPERTS
+
2.8T 参数,
不等于每个 Token 跑 2.8T
+
+ MoE 的核心不是“凭空省掉参数”,而是让不同 Token 只激活不同的专家子集。
+ 它把容量与计算解绑,也把代价转移到路由、负载、显存带宽与跨设备 All‑to‑All。
+
+
+
+ - LEDGERS
- 6 张独立账单
+ - CORE PAPERS
- 19 篇一手来源
+ - LINEAGE
- 1991 → 2026
+ - LAB
- 8 架构 · 4 均衡模式
+ - ENDPOINT
- DeepSeek ↔ Kimi K3
+
+
+
+
+
+
+
+
+
+ 00 SIX LEDGERS
+ “更大但更便宜”只有拆成六笔账才成立
+
+ 稠密模型里,增加 FFN 宽度会同时增加参数、每 Token FLOPs 和权重读取。
+ MoE 用条件路由拆开三者,却不是免费午餐:模型越稀疏,越需要为不均匀的动态执行付账。
+
+
+
+
+ L1 / CAPACITY总参数模型存了多少权重?
+ 决定知识容量、存储、加载和分片压力;不会因为某个 Token 没激活它就消失。
+
+
+ L2 / COMPUTE激活参数这次前向用了多少?
+ Top-k 只执行少数 routed experts,但 attention、共享专家和投影仍是稠密路径。
+
+
+ L3 / ROUTING专家选择谁去哪里?
+ Router 的 score、top-k、共享路径和限域约束共同决定每个 Token 的计算图。
+
+
+ L4 / LOAD容量与均衡会不会有人排爆?
+ 热门专家过载会让设备等待、形状波动,早期实现还会直接跳过溢出的专家计算。
+
+
+ L5 / NETWORKDispatch / CombineToken 搬多远?
+ 专家分布到不同设备后,前后两次 All-to-All 可能把理论省下的计算时间吃回去。
+
+
+ L6 / STABILITY硬切换与数值训练会不会崩?
+ Router logits、辅助损失、潜空间连续矩阵乘与极端稀疏都可能制造独立故障。
+
+
+
+
+
图书馆比喻:书库很大,不代表每位读者搬走全部书
+
+ 稠密 FFN 像每个问题都由同一支超大团队完整处理;MoE 像先由调度台判断领域,再叫少数专家组接单。
+ 团队名册可以很大,但每单只付少数人的计算工资。新的麻烦是:热门专家会排队,不同楼层之间要搬材料,
+ 调度台也可能永远只叫同一批人。
+
+
+
+
+
+ 01 CAPACITY ≠ ACTIVE COMPUTE
+ 先看懂稠密 FFN,才知道 MoE 替换了什么
+
+ Decoder-only Transformer 的每层通常有 attention 和 FFN。Attention 在 Token 之间混合信息;
+ FFN 则对每个位置独立做通道变换。模型的大部分参数往往在 FFN 中,因此现代 MoE 通常不替换整个 Transformer,
+ 而是把若干层的一个 FFN 换成许多份专家 FFN。
+
+
+
+
+
DENSE FFN
+
t₁t₂t₃t₄
+
同一组巨大权重
+
{Array.from({ length: 36 }, () => )}
+
每个 Token 读取、计算同一套 FFN。
+
+
+
SPARSE MOE
+
t₁t₂t₃t₄
+
Router → 少数专家
+
+ {Array.from({ length: 12 }, (_, index) => E{index + 1})}
+
+
专家都存着,但每个 Token 只读取 top-k。
+
+
+
+
+
+ 三个经常被混用的数字
+
+
TOTAL PARAMS2.8TK3 存储的全部模型权重口径。
+
ACTIVATED PARAMS104.2BK3 报告的每 Token 激活参数口径;包含的不只 16 个 routed experts。
+
ROUTED EXPERT RATIO16 / 896只有 1.79%,但不能直接拿它乘 2.8T 推导 activated params。
+
+
+
为什么 2.8T × 16/896 不是 104B 的算法
+
+ 总参数里还包含 attention、embedding、latent 上下投影、两个 full-width shared experts 等稠密或固定路径;
+ routed experts 的参数形状也与这些模块不同。跨模型比较时必须沿用报告给出的 active parameter 口径。
+
+
+
+
+
+ 02 FIVE WAVES
+ MoE 的历史,是每解决一笔算力账就暴露一笔系统账
+
+ 1991 年的 Adaptive Mixtures of Local Experts
+ 已经有专家和 gate,但今天 LLM 里的 MoE 还需要稀疏 top-k、静态 batch 形状、设备切分和高性能通信。
+ 因此“概念发明”和“可扩展 Transformer MoE”之间隔了二十多年。
+
+
+ {waves.map((wave, index) => (
+
+ {String(index + 1).padStart(2, "0")}
+
+
+
{wave.title}
+
{wave.papers}
+
{wave.move}
+
留下的墙:{wave.wall}
+
+
+ ))}
+
+
+ 2017 的关键改变:从“加权所有专家”到“只执行 top-k”
+
+ Sparsely-Gated MoE 用 Noisy Top-k Gating
+ 在巨大专家池中只保留少数非零 gate。稀疏执行让参数容量增长快于计算增长,同时用噪声与负载目标鼓励探索。
+ 这篇论文把条件计算从一个好想法推进成现代大模型可继承的模块,但也正式引入路由塌缩:如果 gate 总偏爱少数专家,
+ 其他专家得不到训练,热门设备又成为整步瓶颈。
+
+
+
+
+ 03 ONE FORWARD PASS
+ 一次 MoE 前向不是一个算子,而是一条物流链
+
+ 在单卡伪代码里,MoE 看起来只是 top-k 加几次矩阵乘。进入 Expert Parallelism 后,
+ 专家被分散到不同 GPU;Token 起初在数据所属设备上,必须先按路由重排,再把结果运回原位置。
+
+
+
+
+ 01 / SCORERouter
+
+ 为每个 Token 计算专家 affinity。
+
+
→
+
+ 02 / SELECTTop-k
+ E₂E₇E₉
+ 只保留少数专家;共享专家可绕过 router 固定执行。
+
+
→
+
+ 03 / DISPATCHAll-to-All
+
+ Token 搬到专家所在设备并按 expert 分组。
+
+
→
+
+ 04 / EXPERTGrouped GEMM
+
+ 不同专家处理长度不同的小批 Token。
+
+
→
+
+ 05 / COMBINEReturn + Weight
+ Σ
+ 第二次通信,恢复原 Token 顺序并按 gate 合并。
+
+
+
+
+
理论专家 FLOPs≈ T · k · expert_sizek 小时远低于执行全部 N 个专家。
+
专家权重读取取决于 batch / expert小 batch 下每专家 Token 少,常被 HBM 带宽限制。
+
通信载荷≈ 2 · T · k · routed_width两次通信;协议、对齐和梯度会继续加成本。
+
+
+
+
+ 04 CAPACITY · DROP · STABILITY
+ Router 选得很聪明,也可能让硬件跑得很笨
+
+ 早期 TPU/SPMD 实现要求专家 batch 形状在编译时确定。假设一批有 T 个 Token、N 个专家、每 Token 激活 k 个专家,
+ 理想平均负载约为 Tk/N。Capacity factor(CF)给这个平均数加缓冲:
+
+
+ expert capacity ≈ ⌈CF × T × k / N⌉
+ Switch 原式是 top-1 的 T/N × CF;这里写成常用 top-k 教学推广。具体实现的 group 与取整口径不同。
+
+
+
+
+
HAND CALCULATION
+
512 Token · 16 专家 · top-2
+
平均每专家 512×2/16 = 64 条 route。
+
+ - CF = 1.00
- 每专家容量 64
+ - CF = 1.25
- 每专家容量 80
+ - CF = 2.00
- 每专家容量 128
+
+
+
+
E₁热门 · overflow
+
E₂轻微溢出
+
E₃空槽浪费
+
E₄接近闲置
+
+
+
+
+ Switch 对溢出 Token 跳过专家计算,让表示沿残差进入下一层;论文主要实验报告 dropped tokens 通常低于 1%,
+ 但这不是 MoE 的自然定律。把 CF 拉高可减少 overflow,却线性增加 padding、激活内存、einsum 和 All-to-All 成本。
+ ST-MoE 进一步表明最优 CF 依赖硬件:它的 32B 模型从 1.25 拉到 2.0,step time 增加 14%,质量增益却较小。
+
+
+ 三个不同问题,不能都叫“负载均衡”
+
+
+ A / AUX BALANCE谁被用了多少
+ 用额外 loss 让实际路由比例与平均 gate 概率都接近均匀;过强会把干扰梯度加进主训练。
+
+
+ B / ROUTER Z-LOSSlogits 会不会爆大
+ ST-MoE 惩罚 router log-partition 的平方,减少指数函数前的大数与舍入风险;它不直接分配容量。
+
+
+ C / SYSTEM BALANCE每张卡何时完成
+ 即使专家平均负载相等,专家到 rank 的映射、组内长尾和通信路径仍可能让设备 makespan 不同。
+
+
+
+
+
+ 05 ROUTING BRANCHES
+ Top-k 不是唯一答案,但因果 LM 与硬件会筛掉很多漂亮方案
+
+
+ BASE / 2021把路由做成均衡分配
+ 直接求 Token–expert 的 balanced assignment,减少靠辅助损失慢慢“劝”均衡。
+ 代价:分配求解与主流在线 top-k 栈不同。
+
+
+ EXPERT CHOICE / 2022反过来让专家选 Token
+ 每个专家拿固定 bucket,专家侧天然满载;不同 Token 可被 0、1 或多个专家处理。
+ 因果风险:同一 chunk 的未来 Token 可影响前面 Token 是否被专家选中。
+
+
+ SOFT MOE / 2023不用硬 top-k
+ 先把 Token 连续混成固定 slots,让专家处理 slots,再连续 combine 回 Token。
+ 代价:信息路径和传统稀疏 EP 不同,硬专业化直觉也改变。
+
+
+ MIXTURE OF DEPTHS / 2024条件计算不只在宽度
+ 固定每层可处理的 Token 容量,让重要 Token 进块、不重要 Token 跳过。
+ 它改变“走多深”,可与专家宽度 MoE 组合,但调度更复杂。
+
+
+
+
Expert Choice 为什么对自回归语言模型尤其敏感
+
+ 如果专家在一个包含多个时间位置的 bucket 中挑最高分 Token,后面的 Token 会改变前面 Token 是否入选,
+ 等于通过路由图泄露未来信息。Loss-Free 论文因此强调:训练因果 LM 时,均衡算法本身也必须遵守因果约束。
+
+
+
+
+
+ 06 DEEPSEEK SPOTLIGHT · SPECIALIZATION
+ DeepSeekMoE 的关键不是“专家多”,而是同预算下切得更细
+
+ DeepSeekMoE 把传统粗专家的失败描述成两类:一个专家接收过多类型知识,形成
+ knowledge hybridity;不同专家都要重复学习常识,形成
+ knowledge redundancy。它用 fine-grained expert segmentation 与 shared expert isolation
+ 分别回应这两个问题。
+
+
+
+
+
CONVENTIONAL
+
16 个粗专家 · 选 2
+
+ {Array.from({ length: 16 }, (_, index) => E{index + 1})}
+
+
C(16,2) = 120
+
每个专家很宽,单个专家更容易混入多种知识。
+
+
保持总专家参数与激活计算
+
+
FINE-GRAINED
+
64 个小专家 · 选 8
+
+ {Array.from({ length: 64 }, (_, index) => )}
+
+
C(64,8) = 4,426,165,368
+
组合更灵活;组合数只是表达空间上限,不是已学会技能数。
+
+
+
+ Shared expert isolation:先把共性工作拿出来
+
+
+
ALWAYS ON共享专家
+
所有 Token 都经过,集中承载基础与共性变换。
+
+
+
TOP-K路由专家池
+
{Array.from({ length: 15 }, (_, index) => )}
+
减少重复负担,更专注差异知识。
+
+
+
+ 2B 实验中,DeepSeekMoE 使用 1 个共享专家和 63 个 routed experts,每 Token 激活 1+7。
+ 在保持计算相近时,禁用 shared expert 并多开一个 routed expert,Pile loss 从 1.808 升到 2.414。
+ 这个实验支持共享路径确实学到难以被临时路由替代的共性知识;它不是所有规模上的固定幅度。
+
+
+
+
+ 07 DEEPSEEK V2 → V3
+ 专家切细以后,DeepSeek 必须接着解决自己制造的通信扇出
+
+
+ Device-limited routing
+ 先挑少数目标设备,再在这些设备上的专家中完成 top-k,限制每 Token 的通信目的地。
+ 同时保留 expert/device/communication 多类 auxiliary balance objectives。
+
+
→
+
+ Node-limited routing
+ 每 Token 最多发到 4 个节点;每层 1 shared + 256 routed,激活 8 routed。
+ 把通信限制提升到 NVLink 节点域,并用 DualPipe 重叠计算和 All-to-All。
+
+
→
+
+ Auxiliary-loss-free bias
+ 用历史负载调 expert bias,让过热专家更难入选、冷门专家更容易入选。
+ 报告称训练/推理 no token-dropping,但服务还使用冗余专家与周期性重排。
+
+
+
+ 最关键的解耦:选谁,与选中后占多大权重
+
+
+
SELECTION LANE
+
sᵢ + bᵢ → Top-k
+
Bias 只影响调度。过载专家下一步 bias 下降,欠载专家上升。
+
+
≠
+
+
MIXTURE LANE
+
pᵢ ∝ sᵢ
+
被选专家的实际输出权重仍来自原始 affinity,不把 bias 混进专家贡献。
+
+
+
+
+ 传统 auxiliary loss 把“请均匀”写进训练目标,系数太小压不住塌缩,太大又和语言建模梯度争方向。
+ Loss-Free Balancing 用非梯度 bias 更新 dispatch,论文在最高 3B、200B Token 的实验中取得更低 perplexity 与更好负载。
+ DeepSeek-V3 将其扩到 671B-A37B,并在 14.8T Token 训练中使用。
+
+
+
“Auxiliary-loss-free”不是“V3 完全没有任何 balance loss”
+
+ V3 的主均衡来自 batch-wise expert bias,但报告还保留系数 0.0001 的 sequence-wise auxiliary loss,
+ 只用于防止单条序列内部出现极端失衡。严谨表述应是:去掉主要的 expert-level auxiliary balancing 梯度,
+ 不是删除所有与平衡有关的正则项。
+
+
+
+
+
+ 08 LATENT MOE
+ 当 FLOPs 已经稀疏,下一堵墙是权重带宽和 Token 载荷宽度
+
+ 标准 routed expert 接收完整模型宽度 d。小 batch 时,每个专家只得到少量 Token,GPU 花更多时间从 HBM
+ 读取不同专家权重;大吞吐 Expert Parallel 时,All-to-All 又要搬运 k 份 d 维 Token。
+ LatentMoE 因此不先减少 k,而是减少 routed width。
+
+
+
+
+
STANDARD MOE
+
x ∈ RᵈDISPATCH dExperts in dCOMBINE dy ∈ Rᵈ
+
每条路由搬完整模型宽度;专家权重也以 d 为输入/输出宽度。
+
+
+
LATENT MOE
+
x ∈ RᵈW↓ : d → ℓRoute + Experts in ℓW↑ : ℓ → dy ∈ Rᵈ
+
共享专家仍可走全宽;routed path 的通信与权重流量约按 d/ℓ 压缩。
+
+
+
+
+
+ ℓ-MoEeff把节省换成效率
+ 压缩 d→ℓ,并按 α=d/ℓ 增加总专家 N;top-k 不变,主要降低 active params / cost。
+
+
+ ℓ-MoEacc把节省换成更多组合
+ 同时把 N 和 k 放大 α 倍,让通信和带宽近似不增,却提升专家组合与非线性预算。
+
+
+
+ 论文在 16B/2B active 与 95B/8B active 模型上探索,主要后续实验使用 α=4;
+ ℓ-MoEacc 在其 95B 对比中以相近 total/active 参数提高多个任务准确率。
+ 论文的万亿参数 Kimi-K2 serving 图来自高保真模拟器与 effective-parameter construction,
+ 因而本课程把它标成 projected result,不写成真实线上基准。
+
+
+
+
+ 09 KIMI K3 · STABLE LATENTMOE
+ “Stable”不是修饰词:它对应极端稀疏下三种具体修复
+
+ K3 把模型宽度 7168 投到 3584 维 latent routed path,用 896 个 routed experts 取 16 个,
+ 另有 2 个全宽 shared experts。更大的专家池与更高 k 扩张专业化空间,却把原 LatentMoE
+ 推进了一个新故障区间。
+
+
+
+
TOTAL / ACTIVE2.78T / 104.2B
+
ROUTED EXPERTS896 → 16
+
SHARED EXPERTS2 · always on
+
MODEL → LATENT7168 → 3584
+
EXPERT HIDDEN3072
+
ROUTED SPARSITY56×
+
+
+
+
+ FIX 01 / SCALENormalized LatentMoE
+ 多个 routed experts 聚合后的 latent u 尺度会随 gate 与专家变化;K3 在 W↑ 前加入 RMSNorm,再与共享路径相加。
+
+
+ FIX 02 / ACTIVATIONSiTU-GLU
+ W↓、多分支 gated expert、W↑ 形成近四连矩阵乘;有界 tanh soft-cap 控制 SwiGLU 两个乘法分支的极值。
+ 报告配置 β₁=4、β₂=25,标量输出上界为 100。
+
+
+ FIX 03 / BALANCEQuantile Balancing
+ 固定步长 bias 在近 10³ 专家下会面临“反应慢 vs 振荡”;QB 直接从 score margin 的目标 quantile 算下一步 bias。
+
+
+
+ Quantile Balancing:从“每次推一点”变成“直接找负载阈值”
+
+
01Top-(k+1)前 k 个是真路由,第 k+1 个给出每个 Token 的入选 cutoff αᵢ。
+
→
+
02Margin对专家 j 计算所有 Token 的 raw score sᵢⱼ 减 cutoff αᵢ。
+
→
+
03Quantile目标负载 q=mk/n,对 margin 取 1-k/n 分位数得到下一步 bias。
+
→
+
04Next stepBias 下一批才生效;推理时冻结,遵守 causal LM 约束。
+
+
+
+ 全局 batch 有数百万 margin,无法把它们全收集到一处精确排序。K3 用每专家直方图统计,
+ 通过一次 all-reduce 合并 bin counts,再从累计直方图读 quantile。这里体现了很典型的算法—系统协同:
+ 数学目标是分位数,工程实现则把全局排序改写成固定大小的可加统计。
+
+
+
+
+ 10 INTERACTIVE LAB
+ 亲手制造路由塌缩,再看每种方法到底改了哪张账
+
+ 先从 Switch 开始,把路由偏斜拉高、capacity factor 降到 0.75;再依次切换 Aux proxy、Loss-Free 和 QB proxy。
+ 最后比较 DeepSeek-V3 的 node limit、LatentMoE 的 4× payload 压缩与 K3 的 896 选 16。
+
+
+
+
+
+ 11 MOONEP · EXECUTION
+ Router 均匀,不代表每张 GPU 同时下班
+
+ Quantile Balancing 主要在专家选择层面逼近目标负载;真正训练 3T 模型时,还要把专家映射到 EP ranks,
+ 安排 redundant experts、通信 buffer、Grouped GEMM 与 shared expert stream。K3 的 MoonEP
+ 用在线冗余专家规划把“平均均衡”推进到“每个 rank 完全等量执行”。
+
+
+
+
+
CONVENTIONAL EP
+
R1等待
+
R2空闲
+
R3等待
+
R4空闲
+
+
在线规划
冗余专家
+
+
MOONEP
+
R1S×K
+
R2S×K
+
R3S×K
+
R4S×K
+
+
+
+
+
BOUNDED REDUNDANCY至多 E/R 槽
报告证明每 rank 预留这个上界即可保证存在可行平衡计划。
+
ZERO COPY直接写入 expert-grouped buffer
Planning kernel 预先给出目的地,fused permute/unpermute 减少中间 copy。
+
STATIC SHAPES每 rank 固定 S×K
消除每层读取动态 shape 的 host sync,也压低内存碎片。
+
OVERLAPShared / routed 分流
共享专家独立 stream;dispatch/combine 与其他计算阶段重叠。
+
+
+
+
+ 12 EVIDENCE
+ 怎样判断专家真的“专”,而不只是路由图看起来热闹
+
+
L1训练与验证 loss
在相同 total params、active params、FLOPs 与训练 Token 下比较,避免“更多计算”冒充架构收益。
+
L2负载指标
同时看全局、batch、sequence、rank 与 per-expert makespan;一个平均数会隐藏长尾。
+
L3干预专家
禁用高分专家、共享专家或改变激活 k,看 loss 退化是否说明专家不可替代。
+
L4领域路由
比较代码、数学、自然语言等域的 load pattern,但不要把相关性直接命名成可解释技能。
+
L5系统测量
端到端 tokens/s、p50/p99、HBM traffic、All-to-All、空槽、掉 Token 与容错必须同看。
+
L6部署口径
Prefill 与 decode 的 expert batch 不同;训练均衡方案不保证小 batch 在线服务同样均衡。
+
+
+
+
+
PAPER FACT
+
K3 报告公开 2.78T/104.2B、896→16、2 shared、QB 数学式和 MoonEP 设计。
+
+
+
REASONABLE INFERENCE
+
更大组合空间提供更细专业化机会,但 C(N,k) 不是能力数量,也不保证自动形成可解释专家。
+
+
+
STILL UNKNOWN
+
完整训练数据、线上请求分布、真实专家语义、长期失效模式与第三方 3T 复现仍不公开。
+
+
+
+
+
+ ↳ PRIMARY-SOURCE READING ORDER
+ 按问题读 19 篇论文,而不是按模型名背配置
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/progress/index.astro b/src/pages/progress/index.astro
index 50fc259..9c8d0dd 100644
--- a/src/pages/progress/index.astro
+++ b/src/pages/progress/index.astro
@@ -7,11 +7,12 @@ const published = chapters.filter((chapter) => chapter.status === "published").l
const researching = chapters.filter((chapter) => ["researching", "drafting"].includes(chapter.status)).length;
const workstreams = [
- { label: "研究框架与规范", value: 72, next: "给 125 篇索引补充逐篇精读层级" },
+ { label: "研究框架与规范", value: 76, next: "给 130 篇索引补充逐篇精读层级" },
{ label: "网站设计系统", value: 89, next: "打印样式与更多通用可视化组件" },
{ label: "Kimi K3 深读", value: 55, next: "扩写 scaling / infra 逐图笔记" },
{ label: "Transformer 基础", value: 52, next: "加入矩阵形状动画与手算练习" },
{ label: "DeepSeek 专题", value: 61, next: "GRPO 完整公式与训练轨迹推导" },
+ { label: "稀疏计算与 MoE", value: 74, next: "补充真实集群 traces 与专家特化案例" },
{ label: "长上下文专题", value: 72, next: "加入更多论文逐图笔记与真实模型配置对比" },
{ label: "引用与事实检查", value: 54, next: "自动化外链复查与来源等级扩展" },
{ label: "开源与部署", value: 100, next: "每轮保留不可变镜像、提交与回滚点" },
@@ -37,7 +38,7 @@ const workstreams = [
OVERALL专题平均 {average}%
READABLE{published} 个首版可读专题
ACTIVE{researching} 个研究/写作中
- UPDATED2026-07-28 22:47 CST
+ UPDATED2026-07-28 23:24 CST
MODE持续迭代,不锁死版本
@@ -47,7 +48,7 @@ const workstreams = [
01 WORKSTREAMS
-
八条工作流同时推进,但不混淆“有页面”和“已核验”
+
九条工作流同时推进,但不混淆“有页面”和“已核验”
内容首版优先打通全局脉络;随后每轮迭代选择一个专题推进到论文/工程层,并做独立事实复核。
@@ -84,10 +85,11 @@ const workstreams = [
✓K3 报告已结构化拆解
47 页报告目录、151 条参考来源和架构/后训练/系统主线已经提取。
✓16 专题知识图
从语言模型基础到评测安全,包含先修依赖和三条贯穿案例。
✓编辑式网站系统
响应式导航、章节模板、侧栏、进度、论文链和证据提示组件。
- ✓四张原创交互图
K3 三轴架构、Self-Attention Query、DeepSeek 谱系与长上下文成本实验室。
- ✓四篇首版长文
K3 完整导读、Transformer 基础、DeepSeek 论文谱系与长上下文专题。
+ ✓五张原创交互图
K3 三轴架构、Self-Attention Query、DeepSeek 谱系、长上下文成本与 MoE 路由实验室。
+ ✓五篇首版长文
K3 导读、Transformer 基础、DeepSeek 谱系、长上下文与 MoE 专题。
✓长上下文深度专题
五张成本账、26 篇一手论文、10+ 机制图与 8 策略交互实验室。
- ✓125 篇关键论文索引
覆盖 12 个专题,支持全文搜索、标签筛选与 Kimi/DeepSeek 聚光主线。
+ ✓MoE 深度专题
六张账、19 篇一手论文、DeepSeek/K3 主线与路由—容量—通信交互实验室。
+ ✓130 篇关键论文索引
覆盖 12 个专题,支持全文搜索、标签筛选与 Kimi/DeepSeek 聚光主线。
✓公开仓库与自托管发布
源码公开到 git.k1412.top,网站由不可变镜像、Compose Manager 与 HTTPS 交付。
@@ -102,9 +104,9 @@ const workstreams = [
优先级专题本轮交付完成闸门
-
P0稀疏计算与 MoESwitch → DeepSeekMoE → LatentMoE → Stable LatentMoE
路由模拟器 + 通信账本
+
P0推理模型与测试时扩展CoT → verifier → GRPO → R1 → k1.5 → K3 MOPD
奖励/预算交互图
P1长上下文二轮深化真实模型配置 → 内核细节 → 长上下文评测与失败案例
配置比较器 + 逐图论文笔记
-
P1推理模型与测试时扩展CoT → verifier → GRPO → R1 → k1.5 → K3 MOPD
奖励/预算交互图
+
P1MoE 二轮深化真实负载 traces → 专家特化可解释性 → 共享专家语义
案例库 + 集群证据
P1大规模训练系统ZeRO/Megatron → Expert/Context Parallel → DualPipe/MoonEP
显存与通信计算器
P2原生多模态ViT/CLIP → connector VLM → Kimi-VL/MoonViT-V2
视觉 Token 流程图