预训练详解
问题
LLM 的预训练过程是怎样的?训练数据从哪来?如何进行大规模分布式训练?
答案
预训练是 LLM 获取通用语言能力的基础阶段——用海量文本训练模型预测下一个 Token。本文涵盖数据、目标、分布式训练三大核心。
一、预训练目标
Next Token Prediction(CLM)
Decoder-only 模型的标准目标——自回归语言建模:
给定前文,预测下一个 Token 的概率。
为什么"预测下一个词"如此强大?
要正确预测下一个词,模型需要理解:语法、语义、事实知识、逻辑推理、甚至常识。这个看似简单的目标隐含了对语言和世界的全面理解——"压缩即智能"。
二、训练数据
数据来源
| 数据源 | 说明 | 量级 |
|---|---|---|
| Common Crawl | 互联网抓取 | PB 级 |
| Wikipedia | 百科全书 | ~20B Token |
| Books | BookCorpus 等 | ~100B Token |
| 代码 | GitHub、StackOverflow | ~500B Token |
| 学术论文 | arXiv、S2ORC | ~50B Token |
| 对话数据 | Reddit、论坛 | ~100B Token |
数据处理流水线
数据质量 > 数据数量
| 项目 | 做法 |
|---|---|
| 质量过滤 | 用小模型判断文本质量得分(perplexity 过滤) |
| 去重 | MinHash 做模糊去重、精确 n-gram 去重 |
| 数据配比 | 代码、数学数据占比越高,推理能力越强 |
| 数据退火 | 训练后期增加高质量数据的比例 |
| 合成数据 | 用已有模型生成训练数据(如数学推理链) |
三、分布式训练
训练一个 70B 参数模型需要数千 GPU 协作。核心并行策略:
1. 数据并行(Data Parallelism, DP)
每个 GPU 持有完整模型,处理不同数据,梯度同步后更新。
- DDP:每个 GPU 存完整模型 → 显存不够
- FSDP / ZeRO:将模型参数、梯度、优化器状态切片分布到多 GPU
2. 张量并行(Tensor Parallelism, TP)
将单个矩阵运算切分到多个 GPU:
例如 FFN 的 W_up (4096 × 11008)
GPU 0 持有 W_up[:, :5504]
GPU 1 持有 W_up[:, 5504:]
各自计算后拼接
TP 要求 GPU 间高带宽通信(通常用 NVLink 在同一节点内)。
3. 流水线并行(Pipeline Parallelism, PP)
将不同层放在不同 GPU 上:
GPU 0: 层 1-20
GPU 1: 层 21-40
GPU 2: 层 41-60
GPU 3: 层 61-80
通过 micro-batch 减少 GPU 空闲(气泡)。
4. 序列并行(Sequence Parallelism, SP)
将长序列切分到多 GPU,用 Ring Attention 通信。
混合并行
实际训练通常组合使用:
| 层级 | 并行方式 | 范围 |
|---|---|---|
| 单节点内 GPU | 张量并行(TP=8) | NVLink 高带宽 |
| 跨节点 | 流水线并行(PP) | InfiniBand |
| 全局 | 数据并行(FSDP) | 所有 GPU |
四、训练稳定性
大模型训练极易出现 Loss Spike(损失突然飙升)和发散。关键技巧:
| 技巧 | 作用 |
|---|---|
| BF16 训练 | 范围大,减少溢出 |
| Warmup | 前 1-5% 步线性升温,避免一开始步子迈太大 |
| 梯度裁剪 | max_norm=1.0,防止梯度爆炸 |
| AdamW 优化器 | 解耦 Weight Decay,稳定训练 |
| Checkpoint | 定期保存,Loss Spike 时可回退 |
| 学习率回退 | Loss Spike 时降低学习率重跑 |
五、训练成本
| 模型 | 参数 | 训练 Token | GPU 数 | 估算成本 |
|---|---|---|---|---|
| LLaMA 2-70B | 70B | 2T | 2048 A100 | ~$2M |
| GPT-4(传闻) | ~1.8T | ~13T | ~25000 A100 | ~$100M |
| LLaMA 3-405B | 405B | 15T | 16384 H100 | ~$30M+ |
常见面试问题
Q1: LLM 预训练的核心目标是什么?
答案: Next Token Prediction(下一个 Token 预测)——给定前文 ,最大化 的对数似然。这个简单目标让模型学会了语言的全部:语法、语义、事实知识、推理能力。预训练后的模型是 Base Model,还需要 SFT 和 RLHF 才能成为好用的对话模型。
Q2: 数据质量为什么比数据量更重要?
答案:
- 低质量数据(HTML 噪声、重复内容)浪费训练算力
- 有害数据(仇恨、色情)会被模型记忆
- 重复数据导致过拟合——研究表明数据去重可以大幅降低 Loss
- 数学/代码等高质量数据的占比直接影响推理能力
- Phi 系列证明了"小模型 + 高质量数据"可以超越"大模型 + 低质量数据"
Q3: FSDP 和 DDP 的区别是什么?
答案:
- DDP:每个 GPU 持有完整的模型副本,只在梯度上做 AllReduce。显存占用 = 模型 + 梯度 + 优化器状态
- FSDP(ZeRO-3):将模型参数、梯度、优化器状态都分片到多 GPU,每个 GPU 只持有 1/N。需要时通过通信 AllGather。显存占用降低到 1/N,但通信量更大
Q4: 如何处理训练中的 Loss Spike?
答案:
- 检测:实时监控 Loss 和梯度 norm
- 诊断:检查数据是否异常(坏 batch)、梯度是否爆炸
- 处理:回退到最近 checkpoint,跳过问题数据批次,可能降低学习率
- 预防:梯度裁剪、BF16、Warmup、数据质量控制