14 KiB
DeepSeek-V2-Lite 多域路由语料审计
状态:第三轮真实权重执行 / 固定公开语料 / prompt-level bootstrap
捕获时间:2026-07-29T07:45:00+00:00
证据身份:X(本机真实执行)+ O(官方工件)+ S(统计摘要)
输出:src/data/deepseek-v2-lite-routing-corpus.json与独立重跑src/data/deepseek-v2-lite-routing-corpus-repro.json
1. 这轮到底补了什么
上一轮 v2_lite_trace.py 的任务是做“显微镜”:4 条手写 prompt、90 个有效
token,逐 token 保存 top-6 expert ID 与 gate weight。它适合解释 router 实际输出
什么,却不适合回答“换一批文本,这个现象还在不在”。
本轮把问题改成:
- 固定四种可公开重建的文本域;
- 每域固定 32 条,共 128 条 prompt;
- 对官方 DeepSeek-V2-Lite 的 embedding 与 layer 0–6 做连续 BF16 forward;
- 在 layer 1–6 捕获每个有效 token 的真实 top-6 routed-expert ID;
- 先聚合到 prompt,再以 prompt 为单位做 2,000 次分层 bootstrap;
- 同时报告点估计、95% 区间、两种聚合口径和明确停止线。
正式运行包含:
| 数量 | 值 |
|---|---|
| prompt | 128 |
| 有效 token | 8,460 |
| 每个 MoE 层的 routed-expert 选择 | 50,760 |
| 实测 MoE 层 | 6 |
| routed-expert 选择总数 | 304,560 |
| routed experts / layer | 64 |
| active routed experts / token | 6 |
| bootstrap replicates | 2,000 |
这里的 304,560 是 8,460 tokens × top-6 × 6 MoE layers,不是模型参数量、
训练 token 数或线上请求量。
2. 语料合同
2.1 四个公开来源
| 域 | 公开来源 | 只使用的字段 | 固定 revision / 文件 SHA-256 |
|---|---|---|---|
| 英文百科 | Salesforce WikiText-2 raw validation | text |
revision b08601e…685c3; parquet 204929b7…11c4c |
| 中文新闻 | CLUE TNEWS | sentence |
repo 9e61ddd…55a2e; archive 77c476e7…33462; test 74f19932…a0ca8 |
| Python 代码 | OpenAI HumanEval | prompt |
revision 6d43fb9…ad10d; gzip b796127e…979ef |
| 小学数学 | OpenAI GSM8K | question |
revision 3101c7d…6892c; test JSONL 3730d312…d14 |
边界:
- HumanEval 的
canonical_solution、test没有进入模型,也没有执行代码; - GSM8K 的
answer没有进入模型; - TNEWS 的标签和关键词没有进入模型;
- WikiText 只取 raw validation 的正文候选,不连接其他 split;
- 这四个来源被当作“探针语料”,不是任务正确率评测。
2.2 确定性选样
固定 salt:
llm-atlas-deepseek-routing-v1
每域候选按下式升序排列,再取前 32 条:
SHA256(salt | domain | source_id), then source_id
这比 random.sample 多保留了两层可复现性:
- 不依赖 Python / NumPy 随机实现;
- 每条输出都保留 source ID、selection rank、原文 SHA-256、字符数与 token 数, 可以从固定源文件重新定位。
文本使用官方 DeepSeek-V2-Lite tokenizer,加入 special tokens,从右侧截到 96 tokens。最低长度过滤为:
| 域 | 最低 token | 文本过滤后的候选 | 长度合格 | 选中 | 选中 token |
|---|---|---|---|---|---|
| 英文百科 | 24 | 1,841 | 1,655 | 32 | 2,882 |
| 中文新闻 | 8 | 10,000 | 9,415 | 32 | 573 |
| Python 代码 | 24 | 164 | 164 | 32 | 2,983 |
| 小学数学 | 16 | 1,319 | 1,319 | 32 | 2,022 |
英文与代码经常触到 96-token 截止线;中文新闻标题明显更短。因此后续不能只给 一份“把所有 token 倒进桶里”的汇总。
3. 模型与执行边界
3.1 官方工件
deepseek-ai/DeepSeek-V2-Lite
revision 604d5664dddd88a0433dbae533b7fe9472482de0
关键 SHA-256:
| 工件 | SHA-256 |
|---|---|
config.json |
f346286b0f1c8b044252fd54cb4fa78b9fab6472a6e8bebb9edfe03d414ea03d |
modeling_deepseek.py |
7d8e5221095286eea991137760893fd7ba52727c0b4ebf48ec09e8bc56b45b9c |
tokenizer.json |
41f3bf64213da8c012d8bd0871a58a1fdf70463e8f08f110ddbb1082f529f669 |
| checkpoint index | d2cdb2f325f6682cf3ad1ad2526a9f979d857390b579380c0331d975136e0acf |
| shard 1 | 0d7e9f39bde40111a4c0f390b87497dce4565cf578d916395e6b2c7851f1e8da |
第一分片完整包含 embedding 与 decoder layer 0–6;layer 7 跨分片,因此继续遵守 原有停止线。Layer 0 是 dense FFN,layer 1–6 是本次统计的六个 MoE 层。
3.2 批处理不会把 padding 算进统计
128 条样本按 token 数、domain、source ID 稳定排序,batch size 为 16。每个 batch 右侧 padding,并使用官方 eager attention 与 causal/padding mask。
gate hook 会看到 padded positions 的输出,但统计时只切:
topk_ids[sample, :valid_length, :]
所以每条 prompt 的 route 总数必须严格等于:
valid_tokens × 6
六层均通过这个不变量检查;每层都是 50,760 routes。
3.3 未执行的对象
- 未下载或执行 layer 7–26;
- 未做完整模型生成;
- 未测回答正确率;
- 未测训练期间 router load;
- 未测线上 serving 流量;
- 未执行 FlashMLA 优化 kernel;
- 未给 expert ID 赋语义名称。
4. 为什么 bootstrap 的单位必须是 prompt
一个 prompt 中相邻 token:
- 共享主题、语言与格式;
- 共享相同前缀 hidden state;
- 在 causal attention 下相互依赖;
- 不是独立同分布样本。
如果把 8,460 个 token 当成 8,460 个独立样本,区间会虚假变窄。这里先为每个 prompt 保存 64 维 route-count vector,再在每个 domain 的 32 条 prompt 内有放回 抽取 32 条。四个 domain 分层进行,固定:
replicates = 2000
seed = 20260729
interval = percentile [2.5%, 97.5%]
它回答的是:
如果仍从这个固定探针来源与选样合同附近换一批 prompt,统计量会怎样波动?
它不回答:
真实训练分布或线上流量的总体参数是什么?
5. 两种聚合口径
5.1 Token weighted
先汇总一个 domain 内所有 prompt 的 route counts,再归一:
p_e = Σ_i count(i,e) / Σ_i Σ_e count(i,e)
长 prompt 贡献更多,适合回答“本批实际 token 流向哪里”。
5.2 Prompt balanced
先把每条 prompt 的 64 维分布归一,再让 32 条 prompt 等权:
p_e = mean_i [count(i,e) / Σ_e count(i,e)]
适合跨格式比较,因为一条短新闻标题与一条被截到 96 token 的代码 prompt 各有一票。 网站默认展示这一口径,并允许切换。
在本次四域内部,CV 的两种口径最大绝对差为 0.027(Layer 1 数学)。这说明主要 层级图景不是某一条特别长 prompt 单独制造的;但两套数字仍完整保留,不能据此假设 未来语料也不敏感。
6. 指标是什么
对当前层、当前 domain 的 64 维 expert share p:
CV
CV = population_std(p) / mean(p)
越大表示 share 越分散。它不是训练损失,也不直接等于“不均衡惩罚”。
Gini
64 个 share 的 Gini coefficient。0 表示完全均匀;越大表示质量集中到更少 expert。
Effective experts
H(p) = -Σ p_e log p_e
effective = exp(H)
完全均匀时为 64;越小表示“按熵折算”的有效 expert 数越少。
Top-expert share
64 个 share 的最大值。完全均匀基线为 1/64 = 1.5625%。
Jensen–Shannon divergence
同层两个 domain 分布 P,Q:
M = (P + Q) / 2
JSD(P,Q) = 1/2 KL(P||M) + 1/2 KL(Q||M)
使用自然对数,范围 [0, ln(2)]。0 表示两条 64 维分布完全相同。
7. 主要结果
以下均为 prompt-balanced 点估计;括号内是 effective experts。网站可切换到 token-weighted 并查看完整 95% 区间。
| layer | 英文百科 CV(effective) | 中文新闻 CV(effective) | 代码 CV(effective) | 数学 CV(effective) |
|---|---|---|---|---|
| 1 | 0.439(59.0) | 0.754(53.3) | 0.566(55.4) | 0.613(56.3) |
| 2 | 0.363(60.2) | 0.460(58.4) | 0.400(59.1) | 0.403(59.0) |
| 3 | 0.398(59.2) | 0.469(57.9) | 0.440(57.9) | 0.525(57.0) |
| 4 | 0.424(58.6) | 0.910(47.2) | 0.610(54.0) | 0.527(56.0) |
| 5 | 0.418(58.5) | 0.551(55.0) | 0.524(56.0) | 0.848(49.7) |
| 6 | 0.496(56.7) | 0.594(53.1) | 0.556(54.7) | 0.770(50.7) |
7.1 Layer 2 在四域都相对平
Layer 2 的 prompt-balanced CV 为 0.363–0.460,effective experts 为 58.4–60.2,是六个被测 MoE 层中四域共同最平的一段。
“相对平”只指这 64 维 route-count distribution;不等于 expert 权重相同、计算量 完全相同或训练全局均衡。
7.2 Layer 4 的中文新闻更集中
Layer 4 中文新闻:
CV = 0.910, 95% CI [0.857, 0.993]
effective experts = 47.2, 95% CI [44.4, 48.5]
top share = E29 9.06%, 95% CI [8.41%, 9.78%]
同层英文百科 CV 为 0.424、代码为 0.610、数学为 0.527。正确表述是:
在这 32 条 TNEWS 句子、这个 tokenizer、这个 layer 的固定探针中,route counts 比另外三域更集中。
错误表述是:
E29 是“中文专家”。
7.3 Layer 5/6 的数学更集中
Layer 5 数学:
CV = 0.848, 95% CI [0.794, 0.911]
effective experts = 49.7, 95% CI [48.1, 50.7]
top share = E14 8.04%, 95% CI [7.38%, 8.64%]
Layer 6 数学:
CV = 0.770, 95% CI [0.728, 0.826]
effective experts = 50.7, 95% CI [49.3, 51.5]
top share = E28 7.54%, 95% CI [6.79%, 8.26%]
E14 与 E28 位于不同层,是不同参数;不能连成一个跨层“数学专家轨迹”。
7.4 同层域间 JSD
每层最大的 prompt-balanced pair:
| layer | 最大 pair | JSD point | 95% bootstrap interval |
|---|---|---|---|
| 1 | 中文新闻 ↔ 代码 | 0.0587 | [0.0549, 0.0703] |
| 2 | 中文新闻 ↔ 代码 | 0.0345 | [0.0306, 0.0466] |
| 3 | 中文新闻 ↔ 代码 | 0.0569 | [0.0519, 0.0713] |
| 4 | 中文新闻 ↔ 代码 | 0.1502 | [0.1376, 0.1715] |
| 5 | 中文新闻 ↔ 数学 | 0.1113 | [0.0990, 0.1368] |
| 6 | 中文新闻 ↔ 代码 | 0.1161 | [0.1054, 0.1351] |
Layer 4 的中文新闻↔代码是本探针最大的同层距离,但仍只有理论上界
ln(2)≈0.693 的约 21.7%。
必须特别注意:普通 percentile bootstrap 是围绕经验分布重采样,不是“两个总体完全 相同”的 null bootstrap。区间不含 0 不能被偷换成经过校正的显著性检验。
8. 可复现性
正式运行和独立重跑的完整 JSON:
4678a1d15395de93ffba757598cc3642bf35e9e07f71d82ddd87c27fc38a09e4
两个文件 byte-for-byte identical。确定性范围包括:
- 128 条选样身份、token 数与原文 SHA-256;
- 六层、每条 prompt 的 64 维 integer route counts;
- 两种聚合口径;
- 2,000 次 bootstrap 导出的所有 metric / expert-share / JSD 区间;
- 模型、语料、环境与统计合同。
没有记录 wall-clock timing,因此复跑一致性没有把 GPU warm-up、频率或系统噪声混进 证据闸门。
8.1 运行入口
PYTHONPATH=/path/to/transformers-4.41.2-deps \
python -B experiments/deepseek/v2_lite_routing_corpus.py \
--artifact-dir /path/to/deepseek-v2-lite \
--human-eval /path/to/HumanEval.jsonl.gz \
--gsm8k /path/to/gsm8k/test.jsonl \
--tnews /path/to/tnews/test.json \
--tnews-archive /path/to/tnews_public.zip \
--wikitext /path/to/wikitext-validation.parquet \
--output src/data/deepseek-v2-lite-routing-corpus.json \
--per-domain 32 \
--max-tokens 96 \
--batch-size 16 \
--bootstrap 2000 \
--seed 20260729 \
--captured-at 2026-07-29T07:45:00+00:00
官方 2024 remote code 在本机 Transformers 5.5 上会因已移除的
is_torch_fx_available 失败;与前两轮相同,本实验使用隔离的 Transformers 4.41.2
依赖,并把官方模型代码作为只读本地 package 导入,不给源码打补丁。
9. 仍然不能说什么
本实验没有授权以下结论:
- “DeepSeek 训练时专家全局负载就是这样”;
- “线上中文请求一定路由到 E29”;
- “E48 是代码专家、E14 是数学专家”;
- “某个 domain 的任务性能更好”;
- “router 的分布差异来自语义,而不是长度、tokenization、格式或共享前缀”;
- “六个早期 MoE 层代表完整 27 层”;
- “bootstrap CI 已经完成假设检验或多重比较控制”。
更稳妥的结论只有:
在固定、可重建的 128 条公开 prompt 上,DeepSeek-V2-Lite 的六个早期 MoE 层 确实呈现可测量的层间与域间 route-count 差异;prompt-level bootstrap 让我们能同时 看见差异和换 prompt 时的波动,但不能把参数索引直接解释成语义角色。
10. 下一步
- 在受支持的 SM90 / SM100 环境执行 FlashMLA 优化 kernel,而不只运行算法参考路径;
- 扩展到完整 layer 0–26,需要下载并校验其余 checkpoint shards;
- 加入长度匹配与 tokenizer-fragmentation 对照,拆开 domain 和长度因素;
- 预注册更少的主要比较,或使用 permutation / null bootstrap 与多重比较校正;
- 研究 shared expert 与 routed expert 的激活规模,而不只看 routed IDs;
- 若讨论性能,另建生成质量与吞吐合同,不与本路由描述实验混在一起。