Skip to content

预训练:数据、稳定性与评估 ​

标签
AI/infra/预训练
AI/infra/训练工程
字数
3736 字
阅读时间
15 分钟

前面 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 Crawl67.0%
C415.0%
GitHub4.5%
Wikipedia4.5%
Books4.5%
arXiv2.5%
StackExchange2.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)。

mt=β1mt−1+(1−β1)gtvt=β2vt−1+(1−β2)gt2θt+1=θt−η⋅m^tv^t+ϵ−λθt

两个动量 m^、v^ 各占 4 字节/参数(FP32)。

源材料的一处参数口径

来源写 ϵ=10−8、β2=0.95。10−8 是 Adam 的默认值,而 LLaMA 系列实际用 ϵ=10−5(更早的 GPT-3 用 10−8)。这个大模型上差三个数量级的 ϵ 有实际影响:ϵ 越小学到的更新越贴近 v^ 的归一化结果,过大则会把小梯度抹平。两套值都在用,这里并记。

为什么优化器状态是显存大头 ​

16N 的完整账本(N = 参数量)里,Adam 状态占 8N,是参数本身(BF16)的 4 倍:

项精度显存
模型参数BF162N
FP32 主权重FP324N
梯度BF162N
Adam m + vFP328N
合计16N

推导见 05-优化器与显存开销。这 8N 的存在,解释了 ZeRO 系列为什么优先切优化器状态(07-ZeRO 显存优化系列)。

学习率调度:Warmup + 余弦 ​

ηt=ηmin+12(ηmax−ηmin)(1+cos⁡t−TwT−Twπ)
阶段范围作用
线性预热前 1000–2000 步,从 0 升到峰值避免初参随机时大学习率把模型推飞
余弦衰减峰值降到最小(常为峰值的 1/10)后期小步长收敛

峰值学习率随规模下降:7B 约 3×10−4,65B 约 1.5×10−4。这个量级比 SFT(约 2×10−5)高一个数量级 —— 预训练要从随机初始化学到东西,微调只是调整输出行为(15-对齐训练:SFT、RLHF 与 DPO)。

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 条序列。

三个理由:

  1. GPU 利用率 —— 大 batch 才能把矩阵乘的规模撑到算力饱和
  2. 梯度质量 —— batch 越大,梯度是对真实梯度的越精确估计,更新方向更稳
  3. 通信摊销 —— 数据并行的 AllReduce 每步开销基本固定,token 数摊薄了它(03-集合通信与 NCCL)

代价是泛化性:超过临界批量后继续增大 batch,收敛所需步数不再下降,效果变差。常规做法是 batch 翻倍时学习率同步放大(平方根或线性缩放规则),并对超大 batch 加 warmup 步数。

评估 ​

三层指标 ​

层指标说明
训练过程交叉熵损失直接反映拟合程度;缩放法则研究的正是这条曲线
泛化验证集困惑度 PPL=eL交叉熵的指数形式,「平均困惑程度」
下游能力基准测试见下表
基准考什么形式
MMLU57 个学科的知识多选
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 级别为例:

项量
GPU2048 × A100 80GB(约 256 台 8 卡机)
训练数据~2T token(约 8 TB 原始文本)
训练时间~21 天
总计算量~1.0×1024 FLOPs
电力~1 GWh
成本~$200–500 万(按云 GPU 价格)

这组数字可以自洽验算。 训练算力的经验公式是 C≈6ND(N = 参数量,D = 训练 token 数):

6×70×109×2×1012=8.4×1023≈1×1024 FLOPs

与表里的总计算量一致。反过来也能验算时间和成本:2048 张 A100 的 BF16 峰值约 3.1×1017 FLOP/s,按 40% 实际利用率(MFU)算约 1.3×1017,则

8.4×10231.3×1017≈6.5×106 s≈75 天

21 天意味着实际 MFU 要接近 60% —— 大集群上这是相当高的水平,也是「预训练是工程极致」这句话的具体含义(13-3D 并行与混合并行策略)。

训练框架生态 ​

框架出身核心能力
Megatron-LMNVIDIA张量并行 + 流水线并行(TP/PP 参考实现)
DeepSpeedMicrosoftZeRO 系列 + PP + 混合精度
FSDPMeta / PyTorchZeRO-3 的 PyTorch 原生实现
Megatron-DeepSpeed社区Megatron 的 TP + DeepSpeed 的 ZeRO
Colossal-AIHPC-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。

相关 ​

参考 ​

缩放法则、分布式并行、混合精度、FlashAttention 四部分与本库既有笔记重叠,本文不重复展开,只保留数据、稳定性、评估、资源账本四块;来源的 ϵ=10−8 与 LLaMA 实际用的 10−5 并记在正文

贡献者 ​

文件历史 ​