跳到主要内容

预训练详解

问题

LLM 的预训练过程是怎样的?训练数据从哪来?如何进行大规模分布式训练?

答案

预训练是 LLM 获取通用语言能力的基础阶段——用海量文本训练模型预测下一个 Token。本文涵盖数据、目标、分布式训练三大核心。

一、预训练目标

Next Token Prediction(CLM)

Decoder-only 模型的标准目标——自回归语言建模

L=1Tt=1TlogPθ(xtx1,,xt1)\mathcal{L} = -\frac{1}{T}\sum_{t=1}^{T}\log P_\theta(x_t | x_1, \ldots, x_{t-1})

给定前文,预测下一个 Token 的概率。

为什么"预测下一个词"如此强大?

要正确预测下一个词,模型需要理解:语法、语义、事实知识、逻辑推理、甚至常识。这个看似简单的目标隐含了对语言和世界的全面理解——"压缩即智能"。

二、训练数据

数据来源

数据源说明量级
Common Crawl互联网抓取PB 级
Wikipedia百科全书~20B Token
BooksBookCorpus 等~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 时降低学习率重跑

五、训练成本

模型参数训练 TokenGPU 数估算成本
LLaMA 2-70B70B2T2048 A100~$2M
GPT-4(传闻)~1.8T~13T~25000 A100~$100M
LLaMA 3-405B405B15T16384 H100~$30M+

常见面试问题

Q1: LLM 预训练的核心目标是什么?

答案Next Token Prediction(下一个 Token 预测)——给定前文 x1,...,xt1x_1, ..., x_{t-1},最大化 P(xt)P(x_t) 的对数似然。这个简单目标让模型学会了语言的全部:语法、语义、事实知识、推理能力。预训练后的模型是 Base Model,还需要 SFT 和 RLHF 才能成为好用的对话模型。

Q2: 数据质量为什么比数据量更重要?

答案

  1. 低质量数据(HTML 噪声、重复内容)浪费训练算力
  2. 有害数据(仇恨、色情)会被模型记忆
  3. 重复数据导致过拟合——研究表明数据去重可以大幅降低 Loss
  4. 数学/代码等高质量数据的占比直接影响推理能力
  5. Phi 系列证明了"小模型 + 高质量数据"可以超越"大模型 + 低质量数据"

Q3: FSDP 和 DDP 的区别是什么?

答案

  • DDP:每个 GPU 持有完整的模型副本,只在梯度上做 AllReduce。显存占用 = 模型 + 梯度 + 优化器状态
  • FSDP(ZeRO-3):将模型参数、梯度、优化器状态都分片到多 GPU,每个 GPU 只持有 1/N。需要时通过通信 AllGather。显存占用降低到 1/N,但通信量更大

Q4: 如何处理训练中的 Loss Spike?

答案

  1. 检测:实时监控 Loss 和梯度 norm
  2. 诊断:检查数据是否异常(坏 batch)、梯度是否爆炸
  3. 处理:回退到最近 checkpoint,跳过问题数据批次,可能降低学习率
  4. 预防:梯度裁剪、BF16、Warmup、数据质量控制

相关链接