chapter 07 / llm-pretraining · 预计学习时间 150-180 分钟
形式上,预训练简单到令人失望——第 2 章的 softmax 交叉熵,类别是约 10 万个 token,对语料里每个位置最大化下一个 token 的对数概率:
$$L = -\frac{1}{T}\sum_{t=1}^{T} \log P_\theta\big(x_t \mid x_{<t}\big)$$深意在「什么样的文本会出现在语料里」。预测「巴黎是法国的____」需要事实;预测「因此 x = ____」需要做完前面的代数;预测侦探小说最后一页「凶手是____」需要消化全书线索。下一词预测是一个任务的超集:损失压得足够低,语法、事实、推理被一并逼出来——不是模型「想」学它们,而是不学就压不下去。
模型不读字符,读 token。BPE(字节对编码)的算法朴素得像作业题:从 256 个字节开始,反复找语料中最高频的相邻 pair 合并成新 token,直到词表达到目标大小(GPT-4 约 10 万):
语料: "low lower lowest" 词表从字节开始
第1轮: 最高频 pair = (l,o) → 合并 "lo" 词表 +1
第2轮: 最高频 pair = (lo,w) → 合并 "low" 词表 +1
第3轮: (low,e) → "lowe" …… 直到 |V| = 目标
词表大小是三方权衡:大词表 → 序列短(省 $O(n^2)$ 注意力)但嵌入矩阵大、稀有 token 训练不足;小词表反之。LLM 的很多「智障时刻」其实是 tokenizer 背锅:数不对 "strawberry" 里有几个 r(它看到的是 [st][raw][berry] 三个原子,不是 10 个字母)、算术不稳定("1234" 可能切成 [12][34],对位加法无从谈起)、中文每字 1-2 token 而英文每词 ~1.3 token(同样上下文窗口装的中文信息更少、API 计费更贵)。Karpathy 的暴论值得记住:「LLM 的每一个怪癖,追根溯源一半在 tokenizer。」
2020 年 Kaplan 等人发现:损失对参数量 $N$、数据量 $D$、算力 $C$ 都呈幂律,跨七个数量级成立:
$$L(N) \propto N^{-0.076}, \qquad L(D) \propto D^{-0.095}, \qquad C \approx 6ND$$($C \approx 6ND$ 的由来:前向每参数每 token 约 2 FLOPs(一乘一加),反向约 2 倍前向,合计 6。)Kaplan 的结论「优先放大 N」导致了 GPT-3 时代的「大模型、少数据」(175B 只喂 300B token)。2022 年 Chinchilla 修正了实验方法(每个算力点重新调学习率调度),结论翻转:给定算力下,N 和 D 应同比放大,最优配比约 $D^* \approx 20N$。70B 参数 × 1.4T token 的 Chinchilla 全面击败 4 倍大的 Gopher——半个领域的训练计划当场作废。
必做实验:① 依次点五个预设,看 D/N 判定从「欠训练」(GPT-3,1.7:1)走到「推理最优」(LLaMA-3,1875:1)的历史轨迹;② 把 N 拉到 1T、D 设为 20N——看看 Chinchilla 最优地训一个万亿参数模型要多少张 H100 跑多少年,理解为什么万亿级模型几乎都是 MoE;③ 固定算力心算验证:N 翻倍、D 减半,C 不变——但 loss 不同,这正是 scaling law 要回答的问题。
滑块均为对数刻度 · MFU 按 40% 计(实际大集群 35-45%)· MoE 模型按激活参数算 C
以 FineWeb(Hugging Face 公开复现的预训练数据管线,附录信息源有报告链接)为模板,从 Common Crawl 的 ~百 PB 原始网页到 15T 干净 token,每一步都是数量级的删减:
关键纪律:基本只训 ~1 个 epoch(数据足够多时重复见同一数据收益骤减且加剧记忆)。对照第 1 章经典 ML 动辄几百 epoch——LLM 的过拟合主战场不在 epoch 数,在数据重复和污染。高质量数据耗尽(「data wall」)是 2025-2026 的真问题,应对路线:合成数据(强模型生成+过滤)、多模态数据、以及第 8 章的 RL(用算力换数据效率)。
70B 参数 × (权重 2 字节 + 梯度 2 + Adam 两个矩 8) ≈ 840GB——单卡 80GB 装不下零头。四把刀,按「切什么」区分:
| 策略 | 切什么 | 代价 |
|---|---|---|
| 数据并行 DP | 切 batch,每卡完整模型副本 | 每步 all-reduce 梯度;显存不省 |
| ZeRO / FSDP | 把优化器状态/梯度/权重分片到各卡,用时临时聚合 | 通信换显存,DP 的显存解药 |
| 张量并行 TP | 切单个矩阵乘(按行/列),几卡合算一层 | 每层两次 all-reduce,需 NVLink 级带宽,一般不出节点 |
| 流水线并行 PP | 按层切段,不同卡管不同层 | 流水线「气泡」(首尾空转),用 micro-batch 填 |
万卡训练是 3D 并行:节点内 TP(吃 NVLink 带宽)× 节点间 PP × 整体 DP/ZeRO。再加两件标配:混合精度(bf16 算、fp32 累积——bf16 指数位与 fp32 相同,不易溢出,已基本淘汰 fp16+loss scaling)和梯度检查点(不存中间激活,反向时重算——拿 1/3 的额外计算换一半以上的激活显存,几乎所有大模型训练默认开)。
MoE(混合专家)把每层 FFN 复制成 $E$ 份「专家」,由路由器为每个 token 挑 top-$k$(如 8 选 1-2)个激活。效果:参数量 ×E,每 token 计算量几乎不变。DeepSeek-V3:总参数 671B,每 token 只激活 37B——用 37B 的算力买 671B 的知识容量。但天下没有免费午餐,权衡要细算:
| Dense | MoE | |
|---|---|---|
| 推理计算 | 全参数参与 | 只激活 top-k 专家,FLOPs 低 |
| 显存 | = 参数量 | 全部专家都要载入显存(路由是逐 token 的,没法预测下个 token 用谁)——计算省了,内存没省 |
| 训练工程 | 成熟、简单 | 难度高一档:负载均衡辅助 loss(防专家垮塌——少数专家垄断流量)、专家并行的 all-to-all 通信、容量因子调优 |
| 微调 | 开箱即用 | 路由在小数据下易失衡,框架支持参差 |
第 6 章埋的雷:注意力对序列长度是 $O(n^2)$——128K 上下文时,注意力矩阵本身就是天文数字。一条活跃的研究线试图把它压到 $O(n)$:线性注意力 / 状态空间模型(Mamba、RWKV、DeltaNet 系),思想可粗暴概括为「把 KV 历史压缩进一个固定大小的循环状态」——某种意义上是带着 Transformer 的训练并行性回到 RNN(第 5 章的幽灵)。纯线性模型的检索能力(「大海捞针」)仍逊于全注意力,所以 2025-2026 的主流妥协是混合架构:大部分层用线性注意力,每隔几层插一层全注意力兜底(Qwen3.5、MiniMax 等均属此类)。
一份典型 LLM 预训练配置,每一项你都在前面章节推导过:
optimizer: AdamW(β₁=0.9, β₂=0.95, weight_decay=0.1) # 第3章;β₂ 调低应对梯度噪声
lr: warmup 2000 步 → 余弦衰减到峰值的 10% # 第1章 SGD 噪声地板的解药
grad_clip: 1.0 # 第5章梯度裁剪
precision: bf16(fp32 master weights) # 本章 §6
batch: ~4M token/步(数百万级) # 第1章 mini-batch 的极端形态
收尾视频:Karpathy 的 3.5 小时通览把本章(预训练)和下一章(后训练)串成完整图景,看完它你对「ChatGPT 是怎么炼成的」将有工程级的理解: