387 lines
14 KiB
Markdown
387 lines
14 KiB
Markdown
# 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 实际输出
|
||
什么,却不适合回答“换一批文本,这个现象还在不在”。
|
||
|
||
本轮把问题改成:
|
||
|
||
1. 固定四种可公开重建的文本域;
|
||
2. 每域固定 32 条,共 128 条 prompt;
|
||
3. 对官方 DeepSeek-V2-Lite 的 embedding 与 layer 0–6 做连续 BF16 forward;
|
||
4. 在 layer 1–6 捕获每个有效 token 的真实 top-6 routed-expert ID;
|
||
5. 先聚合到 prompt,再以 prompt 为单位做 2,000 次分层 bootstrap;
|
||
6. 同时报告点估计、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](https://huggingface.co/datasets/Salesforce/wikitext/tree/b08601e04326c79dfdd32d625aee71d232d685c3/wikitext-2-raw-v1) | `text` | revision `b08601e…685c3`; parquet `204929b7…11c4c` |
|
||
| 中文新闻 | [CLUE TNEWS](https://github.com/CLUEbenchmark/CLUE/tree/9e61ddd3659ddb57ed82b4d0ba0a8613dfb55a2e) | `sentence` | repo `9e61ddd…55a2e`; archive `77c476e7…33462`; test `74f19932…a0ca8` |
|
||
| Python 代码 | [OpenAI HumanEval](https://github.com/openai/human-eval/tree/6d43fb980f9fee3c892a914eda09951f772ad10d) | `prompt` | revision `6d43fb9…ad10d`; gzip `b796127e…979ef` |
|
||
| 小学数学 | [OpenAI GSM8K](https://github.com/openai/grade-school-math/tree/3101c7d5072418e28b9008a6636bde82a006892c) | `question` | revision `3101c7d…6892c`; test JSONL `3730d312…d14` |
|
||
|
||
边界:
|
||
|
||
- HumanEval 的 `canonical_solution`、`test` 没有进入模型,也没有执行代码;
|
||
- GSM8K 的 `answer` 没有进入模型;
|
||
- TNEWS 的标签和关键词没有进入模型;
|
||
- WikiText 只取 raw validation 的正文候选,不连接其他 split;
|
||
- 这四个来源被当作“探针语料”,不是任务正确率评测。
|
||
|
||
### 2.2 确定性选样
|
||
|
||
固定 salt:
|
||
|
||
```text
|
||
llm-atlas-deepseek-routing-v1
|
||
```
|
||
|
||
每域候选按下式升序排列,再取前 32 条:
|
||
|
||
```text
|
||
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 官方工件
|
||
|
||
```text
|
||
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 的输出,但统计时只切:
|
||
|
||
```text
|
||
topk_ids[sample, :valid_length, :]
|
||
```
|
||
|
||
所以每条 prompt 的 route 总数必须严格等于:
|
||
|
||
```text
|
||
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 分层进行,固定:
|
||
|
||
```text
|
||
replicates = 2000
|
||
seed = 20260729
|
||
interval = percentile [2.5%, 97.5%]
|
||
```
|
||
|
||
它回答的是:
|
||
|
||
> 如果仍从这个固定探针来源与选样合同附近换一批 prompt,统计量会怎样波动?
|
||
|
||
它不回答:
|
||
|
||
> 真实训练分布或线上流量的总体参数是什么?
|
||
|
||
## 5. 两种聚合口径
|
||
|
||
### 5.1 Token weighted
|
||
|
||
先汇总一个 domain 内所有 prompt 的 route counts,再归一:
|
||
|
||
```text
|
||
p_e = Σ_i count(i,e) / Σ_i Σ_e count(i,e)
|
||
```
|
||
|
||
长 prompt 贡献更多,适合回答“本批实际 token 流向哪里”。
|
||
|
||
### 5.2 Prompt balanced
|
||
|
||
先把每条 prompt 的 64 维分布归一,再让 32 条 prompt 等权:
|
||
|
||
```text
|
||
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
|
||
|
||
```text
|
||
CV = population_std(p) / mean(p)
|
||
```
|
||
|
||
越大表示 share 越分散。它不是训练损失,也不直接等于“不均衡惩罚”。
|
||
|
||
### Gini
|
||
|
||
64 个 share 的 Gini coefficient。0 表示完全均匀;越大表示质量集中到更少 expert。
|
||
|
||
### Effective experts
|
||
|
||
```text
|
||
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`:
|
||
|
||
```text
|
||
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 中文新闻:
|
||
|
||
```text
|
||
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 数学:
|
||
|
||
```text
|
||
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 数学:
|
||
|
||
```text
|
||
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:
|
||
|
||
```text
|
||
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 运行入口
|
||
|
||
```bash
|
||
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. 下一步
|
||
|
||
1. 在受支持的 SM90 / SM100 环境执行 FlashMLA 优化 kernel,而不只运行算法参考路径;
|
||
2. 扩展到完整 layer 0–26,需要下载并校验其余 checkpoint shards;
|
||
3. 加入长度匹配与 tokenizer-fragmentation 对照,拆开 domain 和长度因素;
|
||
4. 预注册更少的主要比较,或使用 permutation / null bootstrap 与多重比较校正;
|
||
5. 研究 shared expert 与 routed expert 的激活规模,而不只看 routed IDs;
|
||
6. 若讨论性能,另建生成质量与吞吐合同,不与本路由描述实验混在一起。
|