预训练:数据、稳定性与评估
前面 01–13 讲的是怎么把训练摊到多张卡上(并行、通信、显存)。这一篇收预训练里剩下的那一半 —— 喂什么数据、怎么让一次跑几周的训练不出事、跑完怎么知道好不好。
缩放法则(模型多大、数据多少)在 06-缩放法则,这里只引用结论;混合精度、梯度累积、激活重计算、FlashAttention 的机制在 10-混合精度与显存优化 与 08-FlashAttention。
数据:四道工序
来源与规模
| 数据源 | 典型规模 | 质量 | 提供什么能力 |
|---|---|---|---|
| Common Crawl | 数百 TB 原始 HTML | 低(垃圾 + 近重复占大头) | 覆盖面最广的通用语言 |
| 维基百科 | ~20 GB | 高 | 结构化事实知识,多语言 |
| 书籍(Books3 / PG-19) | ~100 GB | 高 | 长文本连贯性与叙事推理 |
| 学术论文(arXiv / S2ORC) | ~100 GB | 高 | 数学与科学 |
| 代码(GitHub / The Stack) | ~500 GB | 中 | 结构化推理 |
| 论坛问答(Reddit / StackExchange) | 数百 GB | 中 | 对话与问答模式 |
| 新闻 | ~100 GB | 中 | 时事知识与书面语风格 |
代码数据的边际价值被反复观察到:在训练集里加入代码,模型在非代码任务上的推理表现也会提升。这也是 Code Llama、DeepSeek-Coder 这类模型公开训练配方后,通用模型普遍提高代码比例的原因。
配比:一个可查的例子
LLaMA 1 的 1.4T token 配方(英文为主):
| 来源 | 占比 |
|---|---|
| Common Crawl | 67.0% |
| C4 | 15.0% |
| GitHub | 4.5% |
| Wikipedia | 4.5% |
| Books | 4.5% |
| arXiv | 2.5% |
| StackExchange | 2.0% |
这个表里最反直觉的一行是 GitHub 与 Wikipedia 同为 4.5% —— 一个代码库和一个百科全书的 token 量级被摆在同等位置。剩下的中文/多语言倾斜靠配方调整:Qwen 大幅提高中文网页与书籍比例,DeepSeek 提高中文与数学/代码比例。
多样性比单一来源的规模更值钱。 从 Common Crawl 增量 1T token 的收益,往往不如新增 100B token 的高质量书籍或代码 —— 因为 Common Crawl 内部的信息重复度极高。
清洗:五步流水线
| 步骤 | 做什么 | 关键参数 / 工具 |
|---|---|---|
| 语言识别 | 过滤非目标语言 | fastText 分类器 |
| 去重 | 精确去重(文档哈希)+ 模糊去重 | MinHash + LSH |
| 质量过滤 | 启发式规则 + 分类器打分 | 长度、特殊字符比例、黑名单;fastText 二分类 |
| 隐私过滤 | 去 PII(邮箱、电话、证件号) | 正则 + 命名实体识别 |
| 安全过滤 | 去仇恨 / 暴力 / 色情 | 分类器 + 关键词表 |
去重是收益最高的一步。 Common Crawl 中近重复内容占比可达 30–50% —— 不算这个数,模型会在同一段文本上反复训练,等价于给这部分数据加权。GPT-3 那篇里的「WebText-like 过滤」就是用高质量语料作正例训一个 fastText 分类器,给全量网页打分。
从原始网页到可训练的分片:
Common Crawl(数百 TB 原始 HTML)
│
① 语言识别 ──── fastText 分类器,滤掉非目标语言
│
② 去重 ──────── 精确(文档哈希)+ 模糊(MinHash + LSH)
│ ▲ 收益最高的一步:近重复内容占比可达 30–50%
│
③ 质量过滤 ──── 启发式规则(长度 / 特殊字符比例 / 黑名单)+ 分类器打分
│
④ 隐私过滤 ──── 去 PII(邮箱 / 电话 / 证件号):正则 + 命名实体识别
│
⑤ 安全过滤 ──── 去仇恨 / 暴力 / 色情:分类器 + 关键词表
│
Tokenization ──▶ 预分片,供训练直接读取基准污染:最容易被忽视的一项
如果训练语料里混进了 MMLU、GSM8K 的测试集题目与答案,模型的分数反映的是记忆而非能力。LLaMA 那篇专门做了去污染(decontamination):检测训练数据中与测试集高度相似的文本并移除。
污染不总是显式的字符串匹配
题目被改写、翻译、或作为「解题过程」的一部分出现在论坛帖里,都能把答案带进去。去污染要按 n-gram 重叠比例做模糊匹配,不能只查原题字符串。 这也是「同一个模型在不同评测上分数差异很大」的常见来源之一。
多 Epoch:与「每个 token 只训一次」相反的经验
「数据只能过一遍,重复会导致过拟合」这条传统规则在大模型上被推翻了。LLaMA-65B 在 1.4T token 总量上训练,部分数据实际重复使用了 2–4 次,性能仍在提升。
前提是数据质量足够高。 在高质量子集上过 2–4 遍,好于在低质量数据上过 1 遍。这对算力受限的团队是实际的出路。
优化器与学习率
AdamW
几乎所有 LLM 预训练都用 AdamW —— 相对 Adam 的改动是把权重衰减从梯度里拆出来,直接作用在参数上(Loshchilov & Hutter, ICLR 2019)。
两个动量
源材料的一处参数口径
来源写
为什么优化器状态是显存大头
| 项 | 精度 | 显存 |
|---|---|---|
| 模型参数 | BF16 | |
| FP32 主权重 | FP32 | |
| 梯度 | BF16 | |
| Adam | FP32 | |
| 合计 |
推导见 05-优化器与显存开销。这
学习率调度:Warmup + 余弦
| 阶段 | 范围 | 作用 |
|---|---|---|
| 线性预热 | 前 1000–2000 步,从 0 升到峰值 | 避免初参随机时大学习率把模型推飞 |
| 余弦衰减 | 峰值降到最小(常为峰值的 1/10) | 后期小步长收敛 |
峰值学习率随规模下降:7B 约
Loss Spike:长训练的必然事件
跑几周的预训练,loss 突然飙升甚至变 NaN 是必然遇到的,不是异常。三个常见诱因与对策:
| 诱因 | 机制 | 对策 |
|---|---|---|
| 数值溢出 | FP16 下梯度超出表示范围 → inf/NaN | 换 BF16(8 位指数,动态范围与 FP32 同级)或动态 loss scaling |
| 数据异常 | 某个 batch 含极端样本,梯度范数尖峰 | 清洗阶段剔除;运行时按 grad norm 阈值跳过 |
| 学习率过大 | 预热结束后峰值过高 | 降峰值;延长 warmup |
标准处置是「回滚 + 跳过」:从最近的正常 checkpoint 恢复,跳过导致 spike 的那个数据 batch,继续训练。LLaMA 那篇里遇到少量 spike 就是这么处理的 —— 而不是降低学习率重跑。
BF16 免掉的是溢出,不是尖峰
BF16 的动态范围消除了「梯度变 inf」这一路,但梯度范数本身仍会突然放大几个数量级,参数被推离正常区域后 loss 照样炸。所以梯度裁剪(clip_grad_norm,LLaMA 用 1.0)与 checkpoint 回滚能力,跟精度选择是两件独立的保障。
长训练里 loss 尖峰是必然事件,标准处置是「回滚 + 跳过」:
loss
│ ╱╲ ← 尖峰(可能直接 NaN)
│ ╱ ╲
│ ╱╲ ╱ ╲
│ ╱╲ ╱ ╲ ╱ ╲
│ ╱╲ ╱ ╲ ╱ ╲╱ ╲
│ ╱ V V ╲
└───┴─────┴─────┴─────┬───────▶ 步数
▲ ▲
│ └─ 从最近的正常 checkpoint 恢复,跳过导致尖峰的
│ 那个 batch,继续训练
└─ checkpoint(每几百至几千步存一个)
三种诱因与对策:
· 数值溢出(FP16 下梯度超范围)→ 换 BF16 或动态 loss scaling
· 数据异常(某个 batch 含极端样本)→ 清洗剔除;运行时按 grad norm 阈值跳过
· 学习率过大(预热后峰值过高)→ 降峰值、延长 warmup
⇒ BF16 免掉的是「溢出」,不是「尖峰」:梯度范数本身仍会突然放大几个数量级,
所以 clip_grad_norm 与 checkpoint 回滚能力是两件独立的保障批量大小
LLM 预训练的 batch 以百万 token 计。LLaMA-65B 用 4M token/batch —— 按 2048 的序列长度算,约 2000 条序列。
三个理由:
- GPU 利用率 —— 大 batch 才能把矩阵乘的规模撑到算力饱和
- 梯度质量 —— batch 越大,梯度是对真实梯度的越精确估计,更新方向更稳
- 通信摊销 —— 数据并行的 AllReduce 每步开销基本固定,token 数摊薄了它(03-集合通信与 NCCL)
代价是泛化性:超过临界批量后继续增大 batch,收敛所需步数不再下降,效果变差。常规做法是 batch 翻倍时学习率同步放大(平方根或线性缩放规则),并对超大 batch 加 warmup 步数。
评估
三层指标
| 层 | 指标 | 说明 |
|---|---|---|
| 训练过程 | 交叉熵损失 | 直接反映拟合程度;缩放法则研究的正是这条曲线 |
| 泛化 | 验证集困惑度 | 交叉熵的指数形式,「平均困惑程度」 |
| 下游能力 | 基准测试 | 见下表 |
| 基准 | 考什么 | 形式 |
|---|---|---|
| MMLU | 57 个学科的知识 | 多选 |
| HellaSwag | 常识推理 | 选最合理续写 |
| ARC | 科学推理 | 多选 |
| GSM8K | 小学数学应用题 | 开放生成 |
| HumanEval | 代码生成 | Python 函数补全 |
| TruthfulQA | 事实性 | 判断题 |
| WinoGrande | 指代消解 | 选择 |
困惑度只在 tokenizer 相同时可比
PPL 是「每 token 交叉熵的指数」,而「token」的切分方式由 tokenizer 决定(05-文本分词与子词算法:BPE、WordPiece 与 Unigram)。词表更大的 tokenizer 每 token 承载更多字符,PPL 天然更低 —— 跨模型比 PPL 会得出错误结论。要比就得换算成 bits-per-byte。
基准分数还要看污染
上一节的去污染做到什么程度,直接决定这张表可信不可信。两个实用校验:训练数据里搜测试集的原题片段;看分数曲线的形状 —— 真实能力提升通常是平滑的,污染带来的提升往往在某几个基准上突然跳高。
一次完整预训练的资源账
以 LLaMA-70B 级别为例:
| 项 | 量 |
|---|---|
| GPU | 2048 × A100 80GB(约 256 台 8 卡机) |
| 训练数据 | ~2T token(约 8 TB 原始文本) |
| 训练时间 | ~21 天 |
| 总计算量 | ~ |
| 电力 | ~1 GWh |
| 成本 | ~$200–500 万(按云 GPU 价格) |
这组数字可以自洽验算。 训练算力的经验公式是
与表里的总计算量一致。反过来也能验算时间和成本:2048 张 A100 的 BF16 峰值约
21 天意味着实际 MFU 要接近 60% —— 大集群上这是相当高的水平,也是「预训练是工程极致」这句话的具体含义(13-3D 并行与混合并行策略)。
训练框架生态
| 框架 | 出身 | 核心能力 |
|---|---|---|
| Megatron-LM | NVIDIA | 张量并行 + 流水线并行(TP/PP 参考实现) |
| DeepSpeed | Microsoft | ZeRO 系列 + PP + 混合精度 |
| FSDP | Meta / PyTorch | ZeRO-3 的 PyTorch 原生实现 |
| Megatron-DeepSpeed | 社区 | Megatron 的 TP + DeepSpeed 的 ZeRO |
| Colossal-AI | HPC-AI Tech | 多维并行 + 自动并行策略搜索 |
选型对应的机制都在本目录前面几篇:TP/SP 见 08-张量并行与序列并行,PP 见 09-流水线并行,ZeRO 见 07-ZeRO 显存优化系列。
流程全景
数据准备:爬取 → 清洗 → 去重 → 质量过滤 → 安全过滤 → Tokenization → 预分片
↓
模型初始化:参数随机初始化(标准差与层数相关)
↓
分布式训练:3D 并行 + 混合精度 + FlashAttention + 梯度累积
↓
监控与恢复:loss 曲线 / 定期 checkpoint(每几百至几千步)/ spike 回滚
↓
评估:验证集 PPL + 基准测试
↓
产出:Base Model(会续写,但不听指令)→ 交给下一环对齐Base Model 与 Chat Model 的差距是下一环的事:Base Model 看到「请解释什么是量子计算」可能续写出更多问题,因为「问题后面跟着更多问题」在语料里同样是常见模式。把它变成助手需要 SFT 与偏好优化,见 15-对齐训练:SFT、RLHF 与 DPO。
相关
- 02-分布式训练总论与显存账本 —— 显存账本与并行的总入口
- 05-优化器与显存开销 —— Adam 状态
的完整推导 - 07-ZeRO 显存优化系列 —— 为什么要优先切优化器状态
- 10-混合精度与显存优化 —— BF16/FP16、梯度累积、激活重计算
- 13-3D 并行与混合并行策略 —— 大集群的实际并行编排
- 15-对齐训练:SFT、RLHF 与 DPO —— 预训练产出的 Base Model 往哪走
- 06-缩放法则 —— 模型规模与数据量的理论指导
- 01-语言模型演进:N-gram 到 RNN —— next token prediction 这条目标的来路
参考
- https://arxiv.org/abs/2001.08361
- https://arxiv.org/abs/2203.15556
- https://arxiv.org/abs/2302.13971
- https://arxiv.org/abs/2005.14165
- https://arxiv.org/abs/1711.05101
- https://arxiv.org/abs/2306.01116
- ting.is-a.dev. LLM 原理 专栏第 03 篇.
缩放法则、分布式并行、混合精度、FlashAttention 四部分与本库既有笔记重叠,本文不重复展开,只保留数据、稳定性、评估、资源账本四块;来源的
YJ