第五章 预训练:从 GPT 到 Llama¶
导读¶
预训练(Pretraining)是 LLM 成本最高、最关键的阶段。本章解释:模型在预训练时到底在做什么、数据流水线如何搭建、Scaling Laws 怎么指导决策、现代预训练 recipe 的关键演进。
5.1 预训练任务:Next-Token Prediction¶
预训练任务极其简单——预测下一个 token:
# 训练样本:(x_1, ..., x_L) -> 预测 x_2, ..., x_{L+1}
logits = model(input_ids[:, :-1]) # [B, L-1, V]
target = input_ids[:, 1:] # 错位一位
loss = cross_entropy(logits.view(-1, V), target.reshape(-1))
这个看似简单的任务之所以能产生"通用智能",是因为:
- 任务足够通用:所有文本都可用作训练数据,无需标注;
- 任务足够难:要预测下一 token,模型必须学语法、知识、推理、风格;
- 数据规模无上限:互联网提供 TB 级语料;
- Scaling 友好:越大越准,没有饱和迹象。
5.2 数据流水线¶
数据是预训练的第一性原理。Llama-3 用了 15T tokens,DeepSeek-V3 用了 14.8T tokens。数据流水线大致四步:
1. 数据采集¶
| 来源 | 用途 | 备注 |
|---|---|---|
| Common Crawl | 网页主体 | 占比最大,质量参差 |
| GitHub | 代码 | 推理能力、结构化输出 |
| ArXiv / PubMed | 学术 | 数学、推理 |
| Wikipedia / Books | 高质量知识 | 占比小但价值高 |
| 数学题集(OpenMath、SigmaMath) | 数学能力 | 关键 |
| 多语言语料 | 多语言能力 | 占比 5-10% |
2. 数据清洗¶
- 去重:MinHash / SimHash,去除重复网页(CC 重复率 30-50%);
- 语言识别:fastText / cld3,过滤非目标语言;
- 质量评分:用一个轻量 LM 给文本打 perplexity,过高/过低都剔除;
- 安全 / PII 过滤:去电话、邮箱、身份证号;
- 低质剔除:占位文本、广告、SEO 垃圾。
清洗后通常保留 10-30%,即 100T 原始 → 15T 高质。
3. 配比与采样¶
不同来源对模型能力影响巨大:
| 配比 | 影响 |
|---|---|
| 代码 15% | 显著提升推理 / 结构化输出能力 |
| 数学 5-8% | 数学能力主要来源 |
| 学术 10% | 长文本推理 |
| 多语言 5-10% | 多语言能力 |
Phi 系列(Microsoft)的实验显示:用教材级数据(小而精)训 1.4B 模型,性能可逼近 7B 通用模型——证明**数据质量 > 数据量**。
4. 打包与训练¶
- 序列打包:把多文档拼到 max_len,避免 padding 浪费;
- document mask:在 attention 中加 mask 隔离不同文档(避免 A 文档"看见" B 文档);
- 动态 batch:WSD 或 cosine 学习率衰减;
- 数据课程(curriculum):先训通用,后增加高质量数据比例。
5.3 Scaling Laws¶
Kaplan 2020(OpenAI)首次系统化提出:Loss 与算力、参数、数据呈幂律关系:
Hoffmann 2022(Chinchilla,DeepMind)修正:compute-optimal 边界上,数据应约为参数的 20 倍:
| 模型参数 | Chinchilla 最优 tokens |
|---|---|
| 1B | 20B |
| 7B | 140B |
| 70B | 1.4T |
实际情况:Llama-3 70B 训了 ~15T tokens(10 倍 Chinchilla),仍继续降 loss——说明**过训练(over-training)**对小模型仍然有效,模型质量不饱和。
5.4 训练超参 recipe¶
| 项 | 7B 典型 | 70B 典型 |
|---|---|---|
| 优化器 | AdamW | AdamW |
| lr | 3e-4 | 2e-4 |
| warmup | 2000 steps | 2000 steps |
| schedule | cosine | WSD |
| batch | 4M tokens | 8-16M tokens |
| seq_len | 4096 → 8192 | 8192 |
| weight_decay | 0.1 | 0.1 |
| β1, β2 | 0.9, 0.95 | 0.9, 0.95 |
| grad_clip | 1.0 | 1.0 |
| 精度 | bf16 | bf16 |
3D 并行(第 10 章详述):
- 7B:DP=8 通常够;
- 70B:DP × TP × PP(如 64 × 8 × 1);
- 405B:DP × TP × PP(如 256 × 8 × 8)。
5.5 训练监控¶
预训练一次几十万 step,必须实时监控:
- loss curve:应平滑下降;突然飙升 = 数据问题或数值不稳定;
- grad_norm:稳定在 0.1-10;>100 = 爆炸;
- tokens/s:集群吞吐量,与理论峰值对比找瓶颈;
- MFU(Model FLOPs Utilization):实际算力 / 峰值算力,40-55% 算优秀;
- loss spike:偶发,要能定位(数据 / 优化器 / 数值精度)。
5.6 Checkpoint 管理¶
预训练动辄上千 GPU·天,必须支持:
- 周期性 checkpoint:每 1-2 小时存一次;
- 分布式存储:checkpoint 大(70B fp32 = 280GB),需高吞吐存储;
- 断点续训:故障率不可忽略,必须能从最近 ckpt 恢复;
- 版本管理:每个 ckpt 评测、记录超参,便于回滚。
5.7 训练成本¶
| 模型 | 算力 | H100·天(粗估) |
|---|---|---|
| 1.4B (Phi-2) | ~1e21 FLOPs | ~250 |
| 7B (Llama-2) | ~1.5e22 | ~3000 |
| 70B (Llama-3) | ~6e23 | ~120000 |
| 405B (Llama-3) | ~1.6e25 | ~3.2M |
按 H100 $3/小时 计:70B 约 $9M,405B 约 $230M——这就是为什么只有少数公司能预训练前沿模型。
5.8 现代预训练的演进¶
| 演进 | 之前 | 现代 |
|---|---|---|
| 数据 | 自然分布 | 课程式 + 高质合成 |
| 架构 | MHA + LN | GQA + RMSNorm + SwiGLU |
| 长度 | 2K | 8K-128K(RoPE 外推) |
| Tokenizer | BPE 32K | BBPE 128K+ |
| 优化 | Adam | AdamW + WSD + 长训 |
| 稀疏 | 无 | MoE(Mixtral/DeepSeek) |
MoE 路线:DeepSeek-V3 用 256 个 expert、激活 8 个,总参数 671B 但激活仅 37B——用相对小的算力达到 dense 大模型质量。
5.9 微调 vs 继续预训练 vs 从零训¶
| 选项 | 数据 | 算力 | 何时用 |
|---|---|---|---|
| 从零预训练 | 10T+ tokens | 巨大 | 只有前沿 lab |
| 继续预训练(CPT) | 100B+ tokens | 中等 | 领域适配(医疗/法律) |
| SFT | 10K-1M 样本 | 极小 | 通用对齐(第 6 章) |
| LoRA / QLoRA | 1K-100K 样本 | 几乎零 | 业务定制 |
90% 工程师场景应选 SFT 或 LoRA,不要从零训或继续预训练——投入产出比差。
工程实战要点¶
- 数据 > 算力 > 模型:在数据上花的功夫回报最高;
- 过训练仍有效:7B 训 5T 比 70B 训 1T 在同等算力下可能更强;
- MoE 是性价比路线:但工程复杂度大幅上升;
- 监控 loss spike:偶发不可怕,可怕的是定位不了;
- checkpoint 是命根:分布式存储 + 定期校验;
- 从零预训练只在前沿 lab:工程师业务场景应该走 SFT / RAG 路线。
小结¶
- 预训练任务 = next-token prediction,简单但通用;
- 数据流水线:采集 → 清洗(去重/质量)→ 配比 → 打包训练;
- Chinchilla 定律:D ≈ 20 × N;现代过训练仍有效;
- 现代 recipe:AdamW + cosine/WSD + bf16 + 3D 并行;
- 训练成本:7B ~\(1M、70B ~\)10M、405B ~$200M;
- MoE 是性价比路线,但工程复杂度上升;
- 工程师场景应走 SFT/RAG 路线,不要从零训。
练习题¶
- 解释为什么"预测下一个 token"如此简单的任务能产生通用能力。
- Chinchilla 定律建议 70B 模型训多少 tokens?Llama-3 实际训了多少?
- 数据清洗的 4 个关键步骤是什么?分别解决什么问题?
- 估算训练 7B 模型 + 1T tokens 需要多少 H100·天。
- 解释 MoE 的"总参数大但激活参数小"特点。
- Phi-2 实验说明了什么关于数据 vs 规模的结论?
- 为什么"过训练"在 Llama-3 后变得流行?
- 工程师做业务定制应该选 CPT、SFT、LoRA 还是预训练?为什么?