Ch 13 · 32T Tokens
第三部分 · 预训练 · 13

32T Tokens — 预训练的活水

数据策展不是"清洗 + 拼接"那么简单:长文档优先怎么改了 packing 的概率分布、采样级 mask 怎么把 cross-sample 的隐性噪声切干净、4K→16K→64K→1M 的阶梯调度怎么和 sparse attention 切换时机配合,以及为什么 V4 在 mid-training 才注入 agentic 数据而不是从头混。

名词速通 · 一分钟看懂"32T Tokens"

32T Tokens = V4-Flash 32 万亿 / V4-Pro 33 万亿训练 token,长文档优先 + 采样级 mask + 阶梯式扩长上下文 + mid-training 注入 agentic 数据

一句话:把"先用 4K 短样本喂 dense 主干、再扩到 1M 让 sparse attention 接管"做成一条阶梯,每段长度都对应不同的数据混合 + 不同的 attention 模式。 数据本身不是简单"加更多 web",而是用模板过滤压模型崩塌、扩多语言长尾、把 agentic 任务延到 mid-training 单独注入。

32T Tokens(与 V3 的 14.8T 比)
训练 token 总量 ~翻倍。但 token 本身越来越贵:清洗后高质量 web 增长慢,必须靠"长尾语言扩容 + 长文档加权 + 合成 / 翻译 token"补缺口。token 总量比 V3 大,但每 token 信息密度更高,这是 Ch15 Base 跳分的根本来源。
FIM(Fill-In-the-Middle,OpenAI 2022)
训练时把一段文本切成 prefix / middle / suffix,重排成 <PRE> prefix <SUF> suffix <MID> middle 让模型预测 middle。让模型能"双向"看上下文 —— 代码补全、cloze 类任务依赖此。V4 沿用 V3 的 FIM 比例(约 10%)。
Packing(样本拼接)
训练时把多个短样本拼到同一个 sequence 长度(如 4K)填满 batch,避免 padding 浪费。问题:默认 attention 让样本 A 的 token 能看到样本 B 的 token,引入 cross-sample 关联噪声。这就是接下来 sample-level mask 要解决的事。
Sample-level Attention Masking(采样级注意力屏蔽)
V4 与 V3 的关键差异:packed sequence 内部,每个样本只能看自己内部的 token,跨样本一律 mask 掉。等价于"打包但语义独立"。在长文档加权的前提下尤其重要 —— 单个文档可能占满整个 4K,跨样本污染会让长上下文学习被短样本主导。
Model Collapse(模型崩塌,Shumailov 2024)
训练数据混入大量 LLM 生成的模板化文本(SEO、AI 写作、代码片段重复)后,模型分布逐渐塌陷到狭窄模式,多样性 ↓,幻觉 ↑。V4 的对策:用专门的模板检测器过滤批量自动生成内容,模板化模式被压低到 ~3% 以下。
Long-Document Priority(长文档优先)
显著加权学术论文、技术报告、长文献、长代码库。动机:(1) FACTS / Simple-QA 等知识类 benchmark 的 token-efficiency 高度依赖长上下文样本;(2) sparse attention 必须在长样本上才能学到"哪部分该跳过、哪部分该精读"的 selection 模式;(3) 长样本含丰富跨段引用,对 mHC 这种深度堆叠模型的层间依赖训练更有效。
Mid-Training(中段训练)
Pre-train 末段、SFT 之前的一个新阶段:在已经基本收敛的 Base 上注入特定能力数据(V4 注入 agentic 工具调用 + code agent 轨迹)。比 SFT 多得多 token、比 pre-train 更结构化。这是 V4 报告新引入的概念,把"工具能力"从 SFT 提到 pre-train 末端,让 OPD 蒸馏起步就有 agent 知识。
序列长度阶梯:4K → 16K → 64K → 1M
训练分四段,每段序列长度不同:4K 阶段(占 token 约 60%)走 dense attention 学语言基础;16K + 64K(约 35%)逐步切到 SWA + CSA/HCA 混合,让 sparse 模式 warmup;1M(约 5%)让 long-context 模式精修。这条阶梯的存在是因为 sparse attention 在短序列下无优势,只有长序列才能体现压缩+稀疏的价值
Tokenizer(沿用 V3 + 几个特殊 token)
词表 128K 不变(V3 的 BBPE 训练版本)。新增几个 agentic 控制 token:<|tool_call|><|tool_result|> 等。不重训 tokenizer 是为了让 V3 的 KV cache、prompt cache 直接复用,向后兼容。
一句话定位:32T 不是"喂更多数据"那么简单,而是数据策展 + 数据顺序 + attention mask 三件事一起改。读完这章你应该能解释为什么 sample-level mask 在长文档加权后变成了必需,而不是 V3 的可选项。

1. 为什么 V3 的数据策略需要重做

V3 时代的数据 pipeline 已经很成熟:14.8T tokens、CommonCrawl + GitHub + 学术 + 中文 + 多语言混合,含 FIM、tokenizer 128K BBPE。V4 要把百万 token 上下文做成默认,原 pipeline 有三个不再适配的地方:

  • 样本平均长度太短:V3 的样本平均 ~600 token,packing 后短样本占主导。CSA / HCA 的"跨段选择"在 600 token 内体现不出价值,sparse attention 学不到正确的 selection 模式;
  • 模板化数据混入:V3 训练完成后(2024 末),互联网上 LLM 生成内容比例已超 20%,再用同样的过滤器会把模板化模式带进 V4 → model collapse 风险;
  • Cross-sample 噪声放大:长文档加权后,单样本可能占满 4K 整个 packing,少量短样本被 attention 覆盖到的概率反升,noise 反而比 V3 严重。
数值演练 · 长文档加权后 packing 的样本数变化 假设 4K packing window:
  • V3 风格(短样本主导):平均样本长度 600 token → 每 4K window 装 ~6.7 个样本。Cross-sample attention 涉及的 token pair 数 $\binom{6.7}{2} \approx 22$,每对约 600×600=36 万 token-pair。
  • V4 长文档加权:平均长度涨到 ~2000 token → 每 4K window 装 ~2 个样本。但 cross-sample token pair 数 $\binom{2}{2} = 1$,每对 2000×2000=400 万 token-pair
单样本对污染量 36→400 万,噪声密度 ×11×。V3 的 packing-only 策略下噪声是均匀低水位的;V4 长文档加权后变成"少而极致"的污染源 —— 必须 sample-level mask 切断。

2. Sample-level Attention Masking

做法很简单:在 packed sequence 上额外维护一个 sample id 数组,attention mask 在因果 mask 之上再叠一层"$i$ 与 $j$ 同样本才可见"。

$$ M_{ij} \;=\; \begin{cases} 0 & \text{if } j \le i \;\;\land\;\; \mathrm{sid}(i) = \mathrm{sid}(j) \\ -\infty & \text{otherwise} \end{cases} $$
📖 公式白话翻译

这条 mask 翻成大白话就是在标准因果 mask 上多加一条"同源"过滤

  1. $j \le i$:标准因果约束 —— 当前 token 只能看历史 token,不能偷看未来;
  2. $\mathrm{sid}(i) = \mathrm{sid}(j)$:新增的同源约束 —— 即便 $j$ 在 $i$ 前面、且都在同一 packed window 里,只要它们属于不同样本就 mask 掉
  3. $M_{ij} = -\infty$:把不可见位置的 attention logit 拍到负无穷,softmax 后权重为 0。

这条改动对 V3 是"可选项"(短样本时跨样本噪声小),对 V4 长文档加权后是必须。直觉:你不会让一个学术论文的 token 偷看到隔壁拼贴在同一 window 里的论坛帖子,否则模型会学到伪相关性 —— 比如"标题党后面跟方程"这种 packing 制造的虚假分布。

Demo · Packing 内部的 attention mask(拖动样本数 / 切换 sample-level)
交互
attention mask(行 = query,列 = key;绿色 = 可见,灰色 = 屏蔽) 同源 + 因果 = 可见 cross-sample 噪声(V3 看见、V4 屏蔽) 未来或屏蔽 总 token = 64 · 样本数 = 4 · cross-sample 对数 = 0 / 0 右侧统计:被切掉的 cross-sample / 因果三角总数。

读图法:方块 = (query, key) 对。绿格是同样本且 $j \le i$ 的合法 attention;黄格是 V3 默认看见、但 V4 sample-level mask 切断的 cross-sample 因果对;灰格是因果 mask 切掉的未来。
把样本数从 1 拉到 8 你会看到黄色块迅速增多(块状对角阵)。点切换按钮看 V4 把所有黄格变灰 —— 每个样本各自一块独立三角,互不可见
读出"cross-sample 对数 / 因果三角总数"的比例就是 V3 多看到的污染信号比例 —— 4 个样本均匀打包时约 25%。

3. 4K → 16K → 64K → 1M 序列长度阶梯

训练序列长度不是从头到尾固定的。V4 走四段阶梯,每段对应不同 attention 模式:

序列长度token 占比主要 attention 模式主要任务
① 基础4K~60%dense(warmup)语言基础 / 短样本知识
② 扩长 116K~20%SWA + CSA 切入稀疏 selection 学习
③ 扩长 264K~15%SWA + CSA + HCA 全开跨段引用 / 长依赖
④ 长精修1M~5%full sparse百万 token 训练
📖 为什么不是从头跑 1M

有三个根本原因让"一开始就 1M"不可行:

  1. 显存账:1M token 单层 KV ~60MB,全模型 ~3.6GB/请求。带 dense attention 时 attention score 矩阵 1M×1M = $10^{12}$ 项,显存 + 计算都爆。必须先在 4K 学到一个能切 sparse 的初值。
  2. 稀疏 selection 需要先验:CSA 的 Lightning Indexer 要学"哪部分该精读"。模型未收敛时indexer 选的是噪声,sparse 训练发散。所以前 60% token 走 dense 让模型先学到基本语义。
  3. 长样本稀缺:可用的 1M 长样本(书籍、超长仓库)token 数远少于短样本。把它放最后一段精修是 token 效率最优。

这条阶梯在工程层与 Ch11 的 two-stage CP 完美对接:① 阶段 CP 不需要(4K 单卡能装),② 阶段开始 CP=2,③ CP=4,④ CP=8 ~ 16。序列长度调度同时是并行度调度

4. Mid-Training:把 agentic 数据延后注入

V3 把代码、数学、工具调用数据从 pre-train 头到尾混在一起。V4 改为:pre-train 末端用一段独立 mid-training 阶段集中注入 agentic 数据(工具调用轨迹、code agent 多步推理、long-horizon 任务)。

为什么延后注入
  1. 结构化数据干扰早期学习:agentic 轨迹含大量结构化 token(<|tool_call|> JSON 等),早期混入会让模型把 token 分布学偏,普通文本生成质量下降;
  2. 需要稳定的语言基础:工具调用本质是"语言 → 结构 → 语言"的转换,模型必须先有扎实语言能力才能学好这层映射;
  3. Mid-training 可以大胆调高 lr:相比 SFT 的少量数据 + 低 lr,mid-training 用 pre-train 量级的 lr + 大量 token,让 agentic 能力真正进权重而不是"表层 SFT";
  4. 给 OPD 一个高起点:Ch18 的 reverse-KL 蒸馏期望学生模型已经能调用工具,否则 specialist teacher 蒸不下来。

这是 V4 报告新加的训练阶段,对标 Anthropic / OpenAI 内部已经在做的"capability training",但 DeepSeek 第一次把它形式化写进开源报告。

5. V4-Flash / V4-Pro 关键超参对比

V4-Flash (284B / 13B 激活)V4-Pro (1.6T / 49B 激活)
Transformer 层数 $L$4361
hidden size $d$40967168
CSA 压缩率 $m$ / top-k4 / 5124 / 1024
HCA 压缩率 $m'$128128
核心 head 数 / dim $c$64 / 512128 / 512
SWA window $n_{\text{win}}$128128
routed experts (激活 $K$)256 (6)384 (6)
MoE 中间维 $d_{\text{ff}}$20483072
mHC 扩展因子 $n_{\text{hc}}$44
Sinkhorn 步数2020
训练 token32T33T
峰值 LR$2.7 \times 10^{-4}$$2.0 \times 10^{-4}$
序列长度调度4K → 16K → 64K → 1M4K → 16K → 64K → 1M
数值演练 · 训练总 FLOPs V4-Pro:每 token 激活参数 49B,按"前向 6 ND,反向 12 ND"经验估:
  • 每 token forward+backward ≈ $6 \cdot 49\text{B} = 2.94 \times 10^{11}$ FLOPs;
  • 33T tokens × $2.94 \times 10^{11}$ ≈ $9.7 \times 10^{24}$ FLOPs
  • 按 H100 BF16 989 TFLOPs/s 与实际 MFU ~35% 算,等价 $\approx 880{,}000$ H100-小时,即 10K 卡集群跑 ~3.7 天净计算
实际带通信开销 + spike 重算 + multi-stage 切换,wall-time 约 60–80 天。这就是为什么 Ch11 的训练框架优化能省下来的每 1% 都极贵。

6. 一句话总结

把整章压成一句话

32T token 不是"加更多数据"那么简单,而是 长文档加权 + 采样级 mask + 阶梯式扩长 + mid-training 注入 四件事联动 —— 它们共同把 V3 的"短样本稳态"改造成 V4 的"长上下文默认"。Sample-level mask 是这套改造里最朴素也最关键的一步:它让 packing 这种工程必需不再污染长文档的语义。