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

32T Tokens — 预训练的活水

V4 如何扩展网页、多语言、数学、代码与长文档语料,为什么在 mid-training 加入 agentic data,sample-level attention mask 与 V3 有何不同,以及训练长度如何从 4K 逐步扩展到 1M。

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

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

一句话:把"先用 4K 短样本喂 dense 主干、再扩到 1M 让 sparse attention 接管"做成一条阶梯,每段长度都对应不同的数据混合 + 不同的 attention 模式。 数据构造包括过滤批量自动生成和模板化网页内容、扩大多语言语料、强调长文档,并在 mid-training 加入 agentic data。

32T Tokens(与 V3 的 14.8T 比)
Flash 使用 32T tokens,Pro 使用 33T tokens,明显高于 V3 的 14.8T。报告说明数据扩展包括更严格的网页过滤、更大的多语言语料、数学与代码数据,以及长文档优先;没有披露合成或翻译 token 的占比,也不能仅凭 benchmark 提升证明“每 token 信息密度更高”。
FIM(Fill-In-the-Middle,OpenAI 2022)
训练时把文本重排为 prefix / suffix / middle,让模型预测中间内容。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)
V4 对网页数据增加过滤规则,以移除批量自动生成和模板化内容,降低模型坍塌风险。报告没有说明所用检测器,也没有给出“压到 3% 以下”的比例。
Long-Document Priority(长文档优先)
报告特别强调科学论文、技术报告等具有独特学术价值的长文档。它没有把这一选择与 FACTS、Simple-QA、Indexer 学习或 mHC 层间依赖逐项建立因果关系。
Mid-Training(中段训练)
报告称在 mid-training 阶段加入 agentic data,以增强编码能力;没有进一步披露数据是否由工具调用或 code-agent trajectories 构成,也没有给出该阶段的 token 数。
序列长度阶梯:4K → 16K → 64K → 1M
训练长度依次扩展为 4K → 16K → 64K → 1M。Flash 前 1T tokens 使用 dense attention,并在 64K 阶段先 warm up Lightning Indexer、再启用 sparse attention;Pro 的 dense 阶段更长。报告没有给出各长度阶段占总 token 的百分比。
Tokenizer(沿用 V3 + 几个特殊 token)
V4 基于 V3 tokenizer 增加少量用于 context construction 的特殊 token,词表仍为 128K。报告没有将它们列为 <|tool_call|><|tool_result|>,也没有声称这样可以直接复用 V3 的 KV cache。
一句话定位:V4 的预训练变化不只在 token 总量,还包括数据策展、数据顺序和 sample-level attention mask。报告明确采用样本级 mask 隔离打包序列中的不同样本,但没有把它与长文档加权建立单一因果关系。

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

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

  • 长上下文训练需要长样本:报告强调长文档策展,但没有披露 V3 样本平均约 600 token 的数字。
  • 模板化数据混入:网页中的批量自动生成与模板化内容会提高 model-collapse 风险,因此 V4 增加了相应过滤策略;报告没有估计其在互联网中的占比。
  • 样本边界:把不同来源文档打包进同一训练序列可减少截断,但若只使用普通 causal mask,后面的样本可以看到前面样本。V4 因而改用 sample-level attention mask;报告没有量化此前的噪声比例。
示意 · 为什么 packing 需要样本级 mask 假设一个训练序列依次装入文档 A 与文档 B:
  • 只有 causal mask:B 中的 token 可以看到 A,因为 A 位于序列中更早的位置;
  • 叠加 sample-level mask:B 只能看到 B 内更早的 token,A 与 B 在语义上彼此隔离。
报告没有披露平均样本长度或 cross-sample pair 比例,因此不再用 600 / 2000 token 等假设值代替实测。

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。

报告明确指出 V4 与 V3 的差异是采用 sample-level attention masking,但没有说明 V3 中该策略只是“可选项”,也没有给出跨样本污染的定量分析。直观上,这一 mask 让为了提高利用率而打包到同一序列的不同样本保持语义隔离。

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 把所有黄格变灰 —— 每个样本各自一块独立三角,互不可见
右侧比例只是当前等长分块示意中被 sample-level mask 额外屏蔽的 pair 占比,不能等同于 V3 的训练“污染比例”或模型质量损失。

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

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

序列长度token 占比主要 attention 模式主要任务
① 起始4K未披露denseFlash 的 dense warmup 从这里开始
② 扩长16K未披露dense继续扩展上下文
③ 引入稀疏64K未披露Indexer warmup → sparse两阶段启用 sparse attention
④ 长上下文1M未披露sparse百万 token 训练
📖 为什么不是从头跑 1M

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

  1. 计算与缓存:dense attention 的 score 数量随序列长度二次增长,1M 上下文代价很高;报告没有给出“单层 60MB / 全模型 3.6GB”的统一缓存数字。
  2. 稀疏 selection 需要 warmup:V4 先训练 dense 模型,再短暂 warm up Lightning Indexer,随后进行 sparse attention 训练。报告没有说未 warmup 一定发散,也没有给出前 60% token 的比例。
  3. 长样本稀缺:可用的 1M 长样本(书籍、超长仓库)token 数远少于短样本。把它放最后一段精修是 token 效率最优。

长序列训练会结合 Ch11 的 contextual parallelism。报告说明了 two-stage CP 如何处理压缩边界,但没有披露 4K/16K/64K/1M 分别对应的 CP 并行度。

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

V4 报告说明数学与编程语料仍是预训练核心,并在 mid-training 阶段加入 agentic data 以增强编码能力。它没有详细披露 V3 的混合方式,也没有列出 agentic data 的具体组成。

为什么延后注入
  1. 论文事实:agentic data 在 mid-training 阶段加入,用于进一步增强 coding capabilities。
  2. 合理解释:在主干能力形成后再加入结构化 agentic 数据,可能有利于控制数据配比和能力注入;这是本文解读,不是报告给出的因果实验。
  3. 报告没有披露这一阶段的 learning rate、token 数、工具 schema 或对 OPD 的消融影响。

因此,这一节只保留报告明确披露的训练位置与目标,不再推测其它公司的内部流程或宣称“首次”。

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 若采用常见的粗略估算 $\text{training FLOPs}\approx6N_{\text{active}}D$,并暂时忽略 attention、路由和稀疏 kernel 的差异:
  • 每 token 训练计算约 $6 \cdot 49\text{B} = 2.94 \times 10^{11}$ FLOPs;
  • 33T tokens × $2.94 \times 10^{11}$ ≈ $9.7 \times 10^{24}$ FLOPs
  • 报告没有披露训练所用 GPU 数、MFU、总 H100-hours 或训练天数,因此不对 wall-time 作反推。
这是按激活参数套用 dense-model 经验式的数量级估算,不是报告给出的训练 FLOPs,也不足以推出实际训练时长。

6. 一句话总结

Flash 与 Pro 分别训练 32T 和 33T tokens。数据侧扩大并清理网页、多语言、数学、代码与长文档语料,并在 mid-training 加入 agentic data;训练侧采用 sample-level attention mask,将序列长度从 4K 逐步扩展到 16K、64K 和 1M,并分阶段引入 sparse attention。