Skip to content
Gains Summary
Main Navigation 首页 / Home
C++ 编程 / C++ Programming
系统与高性能 / Systems & Performance
Web 开发 / Web Development
人工智能 / Artificial Intelligence
工业软件 / Industrial Software
其他内容 / Other Topics
C++ 编程 / C++系统与性能 / SystemsWeb 开发 / Web人工智能 / AI工业软件 / Industrial

外观

Sidebar Navigation

← 人工智能 / Artificial Intelligence

大语言模型 / Large Language Models

1. LLM 前置知识学习路线 / A Prerequisite Learning Path for Large Language Models

2. 神经网络基础 - 从零理解 AI 的"计算单元" / Neural Network Fundamentals from Artificial Neurons

3. Token 与上下文窗口 - LLM 的计费与记忆单位 / Tokens and Context Windows as the Units of LLM Cost and Memory

4. 解码策略 - 控制 LLM 输出的艺术 / Decoding Strategies for Controlling LLM Output

5. 消息角色 - 构建 Agent 对话的基础 / Message Roles as the Foundation of Agent Conversations

6. 流式输出 - 实时交互的体验优化 / Streaming Output for Responsive Interaction

7. Prompt 工程基础 - 与 LLM 高效对话的技巧 / Prompt Engineering Fundamentals for Effective LLM Interaction

8. LLM 进化史 - 从词向量到 Transformer / The Evolution of LLMs from Word Embeddings to Transformers

9. Transformer 手动计算:从 Attention 到 Encoder-Decoder 完整数据流

10. Transformer 核心原理 - 现代 LLM 的基石 / Transformer Fundamentals Behind Modern LLMs

11. Decoder-Only LLM 深度解析:为什么扔掉 Encoder,以及 KV Cache 如何工作

12. 训练 vs 推理:同一个 Transformer,两条完全不同的执行路径

13. Transformer 训练阶段计算详解 - 手算每一行矩阵 / Transformer Training Computation Matrix by Matrix

14. Transformer 推理阶段详解 — 模型如何"思考"并生成回答 / Transformer Inference and Autoregressive Generation

15. 训练基础扫盲 - 理解 Fine-tune 在做什么 / A Training Primer for Understanding Fine-Tuning

16. LLM 预训练全景:数据管道、Scaling Laws 与训练稳定性

17. 训练基础设施 - 从单卡到千卡集群 / Training Infrastructure from One GPU to Thousand-GPU Clusters

18. Post-Training Pipeline - 从 Base Model 到可用助手 / The Post-Training Pipeline from Base Model to Assistant

19. SFT 深度解析:从 Base Model 到指令跟随——后训练第一步 / SFT Deep Dive: Teaching Base Models to Follow Instructions

20. RLHF 深度解析:从 Reward Model 到 PPO 的完整对齐流程

21. DPO 与对齐方法:从 RLHF 复杂度到直接偏好优化

22. 研究视角:DL/RL 理论到 LLM 训练的完整映射

本页目录

LLM 预训练全景:数据管道、Scaling Laws 与训练稳定性 ​

📅 创建时间:2026-07-29 🏷️ 标签:#PreTraining #ScalingLaws #DataPipeline #TrainingStability #MixedPrecision #Checkpoint 📚 前置知识:[[11-training-primer]](知道训练循环的四步曲)[[08-transformer-by-hand]](知道 Transformer 前向传播怎么算)


📋 本章目标 ​

  • 理解预训练在整个 LLM 生命周期中的位置——它是工厂,不是装修
  • 掌握训练数据的完整 Pipeline:从原始网页到可以喂给模型的 token 序列
  • 理解 Scaling Laws 的核心结论:多大的模型配多少数据才划算
  • 能够手算一个给定参数量的模型的 Chinchilla 最优数据量和训练 FLOPs
  • 理解为什么大模型训练容易崩:Loss Spike、混合精度、学习率预热
  • 理解 Checkpoint 机制和训练恢复流程
  • 建立预训练成本的直观认知:从 GPT-3 的 $4.6M 到 GPT-4 的 $100M+
  • 看完这篇,你能理解为什么全球只有少数几家公司能从零训练大模型

第0部分:Pre-Training 在整个 LLM 生命周期中的位置 ​

0.1 两阶段范式 ​

现代 LLM 的创建分为两个大阶段:

┌─────────────────────────────────────────────────────────────┐
│            LLM 完整生命周期——两阶段范式                       │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌──────────────┐    ┌──────────────┐    ┌──────────────┐  │
│  │  数据收集     │───→│  数据清洗     │───→│ Tokenization │  │
│  │  (Raw Data)  │    │  (Clean Data) │    │  (Token IDs) │  │
│  └──────────────┘    └──────────────┘    └──────┬───────┘  │
│                                                  │          │
│  ╔══════════════════════════════════════════════╪══════╗   │
│  ║          阶段一:Pre-Training(工厂)         │      ║   │
│  ║                                              ↓      ║   │
│  ║  ┌─────────────────────────────────────────────┐   ║   │
│  ║  │          Pre-Training(预训练)              │   ║   │
│  ║  │  • 目标:学习语言的统计规律                   │   ║   │
│  ║  │  • 任务:Next Token Prediction               │   ║   │
│  ║  │  • 数据:数万亿 token 的原始文本              │   ║   │
│  ║  │  • 时长:数周到数月                           │   ║   │
│  ║  │  • 成本:数百万到数亿美元                     │   ║   │
│  ║  └────────────────────┬────────────────────────┘   ║   │
│  ║                       │                            ║   │
│  ║                       ↓                            ║   │
│  ║               ┌──────────────┐                     ║   │
│  ║               │  Base Model  │  ← 预训练的产物     ║   │
│  ║               │ (原始能力)    │    还没法直接对话   ║   │
│  ║               └──────┬───────┘                     ║   │
│  ╚══════════════════════╪═════════════════════════════╝   │
│                          │                                  │
│  ╔══════════════════════╪═════════════════════════════╗   │
│  ║    阶段二:Post-Training(装修)                   ║   │
│  ║                      ↓                            ║   │
│  ║  ┌─────────────────────────────────────────────┐   ║   │
│  ║  │  SFT(监督微调)→  Reward Modeling           │   ║   │
│  ║  │       →  RLHF/DPO(人类偏好对齐)            │   ║   │
│  ║  └────────────────────┬────────────────────────┘   ║   │
│  ║                       │                            ║   │
│  ║                       ↓                            ║   │
│  ║               ┌──────────────┐                     ║   │
│  ║               │  Chat Model  │  ← 可以对话了       ║   │
│  ║               │ (对齐后)      │                     ║   │
│  ║               └──────────────┘                     ║   │
│  ╚═════════════════════════════════════════════════════╝   │
│                                                             │
│  关键认知:                                                  │
│  • Base Model 不是 Chat Model——它只会续写,不会对话          │
│  • Pre-Training 决定了模型的能力上限                         │
│  • Post-Training 只是把能力"激发"出来,不能创造新能力         │
│  • 一个差的 Base Model,无论怎么对齐都没用                    │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

0.2 Base Model vs Chat Model——一个直观的例子 ​

假如你给 Base Model(GPT-3 预训练后、没做任何对齐)输入:

问:什么是光合作用?
答:
1
2

Base Model 可能会续写:

问:什么是光合作用?
答:这是一个常见的生物学问题。光合作用是指植物利用光能...
问:什么是呼吸作用?
答:呼吸作用是细胞...
1
2
3
4

它不会停!因为它在训练时学的就是"不停续写"。它不知道"答完问题就该停"——这是 Post-Training 教给它的。

Pre-Training 教模型"语言",Post-Training 教模型"对话"。


第1部分:训练数据——模型"吃"什么 ​

1.1 数据来源全景 ​

┌─────────────────────────────────────────────────────────────┐
│              预训练数据的主要来源                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  数据源              │ 规模估计        │ 质量  │ 用途       │
│  ───────────────────┼────────────────┼───────┼──────────  │
│  Common Crawl        │ 数 PB / 万亿词  │ 低-中 │ 广泛知识   │
│  Wikipedia           │ ~6M 英文文章   │ 高    │ 事实知识   │
│  Books (Books3等)    │ ~200K 本书     │ 高    │ 长文本理解 │
│  Code (The Stack)    │ ~6TB 代码      │ 中-高 │ 推理/代码  │
│  Academic Papers     │ 数百万篇       │ 高    │ 科学知识   │
│  Reddit / 社交媒体   │ 数十亿条       │ 低-中 │ 对话风格   │
│  GitHub Issues/PRs   │ 数百万条       │ 中    │ 技术讨论   │
│  ArXiv / PubMed      │ 数百万篇       │ 很高  │ 学术推理   │
│  News Articles       │ 数千万篇       │ 高    │ 事实/时效  │
│                                                             │
│  核心原则:多样性 > 单一来源的绝对质量                         │
│  → 模型需要见识足够多的写作风格、领域和格式                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

1.2 数据 Pipeline——从原始网页到训练样本 ​

这是预训练中最容易被低估的部分。处理数 TB 的原始网页数据,需要一整套工业级 Pipeline:

┌─────────────────────────────────────────────────────────────┐
│            数据 Pipeline:从 URL 到 Token 序列                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  阶段1:数据收集                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ Crawl 数百亿网页 → 提取正文(去除 HTML/CSS/JS)      │   │
│  │ → 语言检测(只保留目标语言的文本)                   │   │
│  │ → 输出:海量原始文本 (~数十TB)                       │   │
│  └─────────────────────────────────────────────────────┘   │
│                            ↓                                │
│  阶段2:去重(Deduplication)                                │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ • 文档级去重:MinHash / SimHash → 相似文档去重      │   │
│  │ • 段落级去重:删除重复出现的模板文字(如网站页脚)   │   │
│  │ • 精确去重:相同 URL / 相同 hash 直接删除           │   │
│  │                                                     │   │
│  │ 重要发现:Common Crawl 中有 ~50% 的重复内容!        │   │
│  │ 不去重 = 浪费 50% 的计算资源 + 过拟合风险            │   │
│  └─────────────────────────────────────────────────────┘   │
│                            ↓                                │
│  阶段3:过滤(Filtering)                                    │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ • 长度过滤:删除 < 100 字符或 > 100K 字符的文档     │   │
│  │ • 困惑度过滤:用一个小模型打分,删除低质量文本       │   │
│  │ • 启发式规则:删除含大量特殊字符/乱码/非自然语言     │   │
│  │ • 毒性/色情/暴力过滤:用分类器筛除有害内容           │   │
│  │ • 个人信息过滤:删除邮箱、电话、身份证号等 PII       │   │
│  └─────────────────────────────────────────────────────┘   │
│                            ↓                                │
│  阶段4:质量评分(Quality Scoring)                          │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ • 用分类器(如 fastText / KenLM 模型)打分          │   │
│  │ • 评估维度:语法正确性、信息密度、格式规范性         │   │
│  │ • 只保留高分文档(如 > 0.5 分)                      │   │
│  └─────────────────────────────────────────────────────┘   │
│                            ↓                                │
│  阶段5:数据配比(Data Mix)                                 │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 不是所有数据等量使用。需要按比例混合:               │   │
│  │                                                     │   │
│  │  典型配比(LLaMA 风格):                            │   │
│  │  • Common Crawl 过滤后:67%                          │   │
│  │  • 书籍:5%                                          │   │
│  │  • Wikipedia:4.5%                                   │   │
│  │  • GitHub/Code:15%                                  │   │
│  │  • 学术论文:2.5%                                    │   │
│  │  • Reddit/对话:5%                                   │   │
│  │                                                     │   │
│  │  不同配比 → 不同能力侧重                             │   │
│  │  代码多 → 推理能力强                                 │   │
│  │  书籍多 → 长文本理解强                                │   │
│  │  对话多 → 口语化能力好                                │   │
│  └─────────────────────────────────────────────────────┘   │
│                            ↓                                │
│  阶段6:Tokenization → 最终训练数据                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

1.3 数据配比为什么重要——几个经典案例 ​

┌─────────────────────────────────────────────────────────────┐
│            不同模型的数据配比策略及效果                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  The Pile (EleutherAI, 2020):                               │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 22 个精选数据集,学术导向                             │   │
│  │ 包括 PubMed, ArXiv, GitHub, StackExchange, Books3   │   │
│  │                                                     │   │
│  │ 贡献:证明"精选混合"远优于"随机大量"                  │   │
│  │ → GPT-Neo/GPT-J 的基础训练数据                        │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  LLaMA (Meta, 2023):                                        │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 只使用公开可用数据,不用用户数据                       │   │
│  │ 强调代码数据(15%)→ 推理能力显著提升                 │   │
│  │ 发现:即使训练 token 数远超 Chinchilla optimal,      │   │
│  │       小模型(7B/13B)仍然在持续提升                   │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  DeepSeek (2024-2025):                                      │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 极大比例的高质量数学/代码数据                          │   │
│  │ 中文数据占比高(相比 LLaMA 几乎无中文)               │   │
│  │ → DeepSeek 的数学能力和代码能力位居开源模型前列       │   │
│  │                                                     │   │
│  │ 核心洞察:数学+代码数据 = 推理能力                    │   │
│  │ 纯文本讨论再多的推理,不如让模型在代码中实践逻辑      │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  关键教训:                                                  │
│  • 数据配比是"食谱",不同"食谱"产出的模型能力不同            │
│  • 代码数据是"秘密武器"——它教会模型逻辑和分步推理           │
│  • 数据配比是高度保密的商业机密                              │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

1.4 需要多少数据?——从 Chinchilla 到 Llama 3 ​

┌─────────────────────────────────────────────────────────────┐
│          训练数据量:理论最优 vs 工业实践                      │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Chinchilla 最优 (DeepMind, 2022):                          │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 公式:D_optimal ≈ 20 × N                             │   │
│  │ 其中 D = 训练 token 数,N = 模型参数数               │   │
│  │                                                     │   │
│  │ • 1B 参数  → 200亿 tokens                            │   │
│  │ • 7B 参数  → 1400亿 tokens                           │   │
│  │ • 70B 参数 → 1.4万亿 tokens                          │   │
│  │ • 175B 参数→ 3.5万亿 tokens                          │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  工业实践(远超 Chinchilla):                                │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 模型          │ 参数量  │ 训练Tokens │ 倍数(C-opt)  │   │
│  │ ─────────────┼─────────┼───────────┼────────────── │   │
│  │ GPT-3        │ 175B    │ 300B      │ 0.09× (严重不足)│  │
│  │ Chinchilla   │ 70B     │ 1.4T      │ 1.0× (恰好)  │   │
│  │ LLaMA-1-7B   │ 7B      │ 1.0T      │ 7.1×         │   │
│  │ LLaMA-2-70B  │ 70B     │ 2.0T      │ 1.4×         │   │
│  │ Llama 3-8B   │ 8B      │ 15T       │ 93.8× !     │   │
│  │ Llama 3-70B  │ 70B     │ 15T       │ 10.7×        │   │
│  │ DeepSeek-V3  │ 671B MoE│ 14.8T     │ ~37× (按激活)│   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  为什么远超 Chinchilla?                                     │
│  • Chinchilla 是在固定计算预算下的最优解                     │
│  • 但如果你有更多算力,继续喂更多数据,模型还会变好           │
│  • Llama 3 证明:即使到了 15T tokens,8B 模型仍没饱和        │
│  • 小模型 + 海量数据 >> 大模型 + 少量数据(同计算预算下)     │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

1.5 数据质量 vs 数据数量——永恒的 tradeoff ​

┌─────────────────────────────────────────────────────────────┐
│              数据质量 vs 数量的权衡                           │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  问题:                                                     │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 你有 100 万 GPU-小时的计算预算。                      │   │
│  │ 方案 A:用 100B 高质量 token(如精选书籍+论文)      │   │
│  │ 方案 B:用 1T 中等质量 token(如过滤后的网页)       │   │
│  │                                                     │   │
│  │ 选哪个?                                             │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  研究发现:                                                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ • 在计算预算受限时:质量 > 数量                      │   │
│  │   LLaMA 只用了 1T tokens 但精选数据,效果碾压        │   │
│  │   那些用了更多数据但质量较差的模型                    │   │
│  │                                                     │   │
│  │ • 当数据量极大时:多样性 > 纯度                      │   │
│  │   过度过滤会导致模型没见过"脏数据",推理时遇到        │   │
│  │   打字错误或非正式表达时表现差                        │   │
│  │                                                     │   │
│  │ • 中等质量数据的重复:有害                            │   │
│  │   同一数据重复训练超过 4-5 个 epoch → 过拟合         │   │
│  │                                                     │   │
│  │ • 高质量数据的重复:没那么有害,但收益递减            │   │
│  │                                                     │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  实践建议(综合各团队的共识):                               │
│  1. 先用质量过滤(去掉垃圾)                                │
│  2. 再保证多样性(不要只留"教科书式"的文本)                │
│  3. 每个数据源最多重复 4 个 epoch                           │
│  4. 如果预算允许,加更多高质量数据,而不是重复旧数据         │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

第2部分:Scaling Laws——更大的模型需要多少数据和算力 ​

2.1 什么是 Scaling Laws ​

Scaling Laws 回答一个核心问题:给定计算预算,我应该把资源分配给更大的模型还是更多的数据?

┌─────────────────────────────────────────────────────────────┐
│              Scaling Laws 的核心问题                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  你有 B 美元的计算预算。                                     │
│                                                             │
│  选项 A:建一个大模型,用少量数据训练                         │
│    → GPT-3 风格:175B 参数,只训练 300B tokens               │
│                                                             │
│  选项 B:建一个小模型,用海量数据训练                         │
│    → Llama 3 风格:8B 参数,训练 15T tokens                  │
│                                                             │
│  选项 C:建一个中等模型,用中等数据训练                       │
│    → Chinchilla 风格:70B 参数,训练 1.4T tokens             │
│                                                             │
│  哪一个最终模型效果最好?                                                     │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

2.2 Kaplan et al. (OpenAI, 2020)——第一个 Scaling Law ​

┌─────────────────────────────────────────────────────────────┐
│        Kaplan  Scaling Law(OpenAI, 2020)                   │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  核心结论:当计算预算增加时,应该把大部分资源分给模型大小     │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 给定计算预算 C:                                      │   │
│  │ • N (模型参数) ∝ C^0.73                              │   │
│  │ • D (数据量)   ∝ C^0.27                              │   │
│  │                                                     │   │
│  │ 翻译:计算预算增加 10 倍 → 模型变大 5.3 倍,数据只多 1.9 倍│   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  这就是为什么 GPT-3 这么大(175B)但只训练了 300B tokens:  │
│  → OpenAI 当时相信"模型大比分重要"                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

2.3 Chinchilla (DeepMind, 2022)——推翻 Kaplan ​

┌─────────────────────────────────────────────────────────────┐
│          Chinchilla Scaling Law(DeepMind, 2022)            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  DeepMind 训练了 400+ 个不同大小的模型(70M 到 16B),       │
│  系统性地研究了模型大小和数据量的最优配比。                   │
│                                                             │
│  核心发现:Kaplan 错了。模型大小和数据量应该等比例增长。      │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 给定计算预算 C:                                      │   │
│  │ • N (模型参数) ∝ C^0.50                              │   │
│  │ • D (数据量)   ∝ C^0.50                              │   │
│  │                                                     │   │
│  │ 翻译:计算预算增加 10 倍 → 模型和数据各涨 3.16 倍     │   │
│  │                                                     │   │
│  │ Chinchilla 最优公式:D ≈ 20 × N                      │   │
│  │ 一个 70B 的模型,应该用 1.4T tokens 训练              │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  实验验证:                                                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ DeepMind 训练了 Chinchilla(70B 参数,1.4T tokens)  │   │
│  │ 对比 Gopher(280B 参数,300B tokens)                 │   │
│  │                                                     │   │
│  │ 结果:Chinchilla 在所有 benchmark 上都碾压 Gopher!  │   │
│  │ • Chinchilla: 70B 参数                               │   │
│  │ • Gopher:     280B 参数                              │   │
│  │                                                     │   │
│  │ 训练成本相近,但小 4 倍的 Chinchilla 赢了。           │   │
│  │ → 因为数据给够了!                                   │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  重要纠正:                                                  │
│  GPT-3 只有 300B tokens 训练 175B 参数                       │
│  → D/N = 300B/175B = 1.7(远低于 Chinchilla 的 20)         │
│  → GPT-3 严重"欠训练"(undertrained)                       │
│  → 如果重新分配计算预算,一个更小的模型+更多数据效果更好     │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

2.4 用 Chinchilla 公式做具体计算 ​

┌─────────────────────────────────────────────────────────────┐
│           手算 Chinchilla 最优值——你需要多大数据?            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Chinchilla 核心公式:D_optimal ≈ 20 × N                     │
│                                                             │
│  你的模型参数量 N          →  最优训练 Token 数 D            │
│  ─────────────────────────────────────────────              │
│  100M (0.1B)               →  2B tokens                      │
│  1B                        →  20B tokens                     │
│  7B  (LLaMA-7B)            →  140B tokens                    │
│  13B (LLaMA-13B)           →  260B tokens                    │
│  34B (Code Llama 34B)      →  680B tokens                    │
│  70B (LLaMA-2-70B)         →  1.4T tokens                    │
│  175B (GPT-3)              →  3.5T tokens                    │
│  405B (Llama 3.1 405B)     →  8.1T tokens                    │
│  671B (DeepSeek-V3, MoE)   →  按 37B 激活: 740B tokens       │
│                                                             │
│  注意:这只是"最优"的理论值。                              │
│  实际中很多模型远超这个数,效果继续变好。                     │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

2.5 FLOPs 估算——训练需要多少计算量 ​

Transformer 训练的 FLOPs 可以用一个简洁的公式近似:

┌─────────────────────────────────────────────────────────────┐
│            训练 FLOPs 估算公式                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  FLOPs_total ≈ 6 × N × D                                    │
│                                                             │
│  其中:                                                      │
│    N = 模型参数数量                                          │
│    D = 训练 token 数量                                       │
│    6 = 每个参数每个 token 的 FLOPs(前向2 + 反向4)          │
│                                                             │
│  推导简述(Transformer 一次前向传播):                       │
│  • 每个 token 每个参数:~2 FLOPs(一次乘一次加)             │
│  • 反向传播:~4 FLOPs(约为前向的 2 倍)                     │
│  • 总:~6 FLOPs/token/param                                  │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

具体计算示例——GPT-3:

GPT-3: N = 175B, D = 300B tokens

FLOPs = 6 × 175 × 10^9 × 300 × 10^9
      = 6 × 175 × 300 × 10^18
      = 315,000 × 10^18
      = 3.15 × 10^23 FLOPs

换算:
  3.15 × 10^23 FLOPs ÷ 10,000 张 V100
  V100 FP16: ~125 TFLOPS = 1.25 × 10^14 FLOPs/s (理论)
  实际利用率 ~50%: ~6.25 × 10^13 FLOPs/s

  总时间 = 3.15 × 10^23 ÷ (10,000 × 6.25 × 10^13)
         = 3.15 × 10^23 ÷ 6.25 × 10^17
         ≈ 5.04 × 10^5 秒
         ≈ 140 小时
         ≈ 5.8 天(假设 100% 利用率、无故障)

  实际需要约 14.8 天(利用率更低、有故障恢复)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

具体计算示例——Chinchilla 最优的 70B 模型:

Chinchilla optimal 70B: N = 70B, D = 1.4T

FLOPs = 6 × 70 × 10^9 × 1.4 × 10^12
      = 6 × 98 × 10^21
      = 5.88 × 10^23 FLOPs

对比 GPT-3: 3.15 × 10^23 FLOPs
Chinchilla 70B 的训练 FLOPs 几乎是 GPT-3 的 2 倍!

→ Chinchilla 虽小但训练更贵(因为数据多得多)
→ 但最终效果好得多
1
2
3
4
5
6
7
8
9
10
11

具体计算示例——Llama 3-70B(远超 Chinchilla):

Llama 3-70B: N = 70B, D = 15T

FLOPs = 6 × 70 × 10^9 × 15 × 10^12
      = 6 × 1050 × 10^21
      = 6.3 × 10^24 FLOPs

这是 Chinchilla 最优 70B 的 ~10.7 倍 FLOPs!
→ 远超 Chinchilla 的"最优",但效果显著更好
→ "Chinchilla 最优"只是计算预算固定时的最优,预算可以更多
1
2
3
4
5
6
7
8
9

2.6 Beyond Chinchilla——新共识 ​

┌─────────────────────────────────────────────────────────────┐
│            超越 Chinchilla:工业界的新共识                    │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Chinchilla 结论(2022):D ≈ 20 × N 是最优的               │
│                                                             │
│  2024-2025 实践:D ≈ 100× 甚至 1000× N 仍然有效             │
│                                                             │
│  为什么?                                                    │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 1. Chinchilla 在固定计算预算下优化                    │   │
│  │    现实是:大公司不在乎"最优"——它们要"最好"          │   │
│  │                                                     │   │
│  │ 2. 更多数据总是有帮助的(收益递减,但还没到零)       │   │
│  │    Llama 3-8B 训练到 15T tokens,loss 还在下降       │   │
│  │                                                     │   │
│  │ 3. 小模型+海量数据有工程优势                          │   │
│  │    • 推理更快、更便宜                                 │   │
│  │    • 部署成本低                                       │   │
│  │    • 用户愿意等更久的训练,但不愿等更久的推理          │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  新共识:                                                    │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ • "Chinchilla optimal" → "只要数据够多就继续训"     │   │
│  │ • D >> 20 × N 不再被认为是"浪费"                     │   │
│  │ • 数据质量 >> 数据数量(但数量仍然重要)              │   │
│  │ • 最终瓶颈可能是"能找到多少高质量数据",而不是算力   │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

第3部分:训练稳定性——为什么大模型训练容易崩 ​

3.1 Loss Spike——训练时的"心脏病发作" ​

┌─────────────────────────────────────────────────────────────┐
│              Loss Spike:大模型训练的噩梦                     │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  训练 Loss 曲线(正常):                                    │
│                                                             │
│  Loss                                                       │
│    │                                                        │
│  8 ┤╲                                                        │
│    │ ╲                                                       │
│  6 ┤  ╲______                                                │
│    │         ╲___                                             │
│  4 ┤             ╲___                                        │
│    │                  ╲___                                    │
│  2 ┤                       ╲___                               │
│    │                            ╲___                          │
│    └──────────────────────────────────→ Steps                │
│                                                             │
│  训练 Loss 曲线(出现 Loss Spike):                         │
│                                                             │
│  Loss                                                       │
│    │                        ↑ spike!                        │
│  8 ┤╲                       │                               │
│    │ ╲                      │                               │
│  6 ┤  ╲______               │                               │
│    │         ╲___           │                                │
│  4 ┤             ╲___  ╱────╯                                │
│    │                  ╲╱╲    ╲___                             │
│  2 ┤                   ╲________╲___                        │
│    │                                                         │
│    └──────────────────────────────────→ Steps               │
│                                                             │
│  一旦出现大 Spike,Loss 可能:                                │
│  • 跳到 NaN → 训练崩溃,彻底失败                              │
│  • 跳高后回落 → 但模型质量永久受损                            │
│  • 跳高后回落但不恢复 → Loss 停滞在较高水平                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

3.2 Loss Spike 的常见原因 ​

┌─────────────────────────────────────────────────────────────┐
│           Loss Spike 五大常见原因及对策                       │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  原因1:坏数据批次(Bad Data Batch)                         │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 某一批训练数据极其异常:                               │   │
│  │ • 全是特殊字符或乱码                                  │   │
│  │ • 全是重复 token(如 2048 个 "the")                  │   │
│  │ • 语言突然切换(英文中混入一整段二进制)              │   │
│  │                                                     │   │
│  │ 对策:数据质量过滤在前(见第1部分),但总有漏网之鱼   │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  原因2:梯度爆炸(Gradient Explosion)                       │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 某些参数梯度过大,一次更新把权重推到极端值             │   │
│  │ → 后续前向传播产生巨大激活值                          │   │
│  │ → Loss 暴增                                           │   │
│  │                                                     │   │
│  │ 对策:Gradient Clipping(梯度裁剪)                   │   │
│  │ 把梯度的 L2 范数限制在一个阈值内(如 1.0)            │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  原因3:混合精度数值问题                                     │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ FP16 的范围很小(最大 65504),梯度或激活值溢出       │   │
│  │                                                     │   │
│  │ 对策:使用 BF16(范围 = FP32,只是精度低)            │   │
│  │ 或用 Loss Scaling(把 Loss 放大再缩小)              │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  原因4:优化器状态损坏                                       │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ Adam 的 m(动量)和 v(二阶矩)积累了异常值            │   │
│  │ 一旦某个参数梯度的 EMA 变得极大 → 更新步巨大          │   │
│  │                                                     │   │
│  │ 对策:从 Spike 前的 Checkpoint 恢复,丢弃损坏的状态   │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  原因5:硬件故障(Silent Data Corruption)                   │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ GPU 内存位翻转、网络传输错误、NVLink 故障             │   │
│  │ 在大规模训练中,硬件故障不是"是否"的问题,而是"何时"   │   │
│  │                                                     │   │
│  │ 对策:ECC 内存、Checkpoint、冗余检查                  │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

3.3 梯度裁剪(Gradient Clipping)——稳定训练的第一道防线 ​

┌─────────────────────────────────────────────────────────────┐
│              梯度裁剪:防止单步更新过大                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  g = 计算出的梯度向量(所有参数的梯度拼成一个大向量)        │
│                                                             │
│  如果 ||g||₂ > max_norm(比如 1.0):                        │
│      g_clipped = g × (max_norm / ||g||₂)                    │
│  否则:                                                      │
│      g_clipped = g                                          │
│                                                             │
│  直观:                                                      │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  原始梯度(太大):                                  │   │
│  │  ═══════════════════════════════════════════→       │   │
│  │                                                     │   │
│  │  裁剪后(方向相同,长度受限):                      │   │
│  │  ═══════→                                           │   │
│  │                                                     │   │
│  │  方向保持不变(梯度告诉我们的方向是对的)            │   │
│  │  但步长被限制(防止一步踩太远掉进坑里)              │   │
│  │                                                     │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  典型设置:max_norm = 1.0                                    │
│     GPT-3 用了 max_norm = 1.0                                │
│     LLaMA 用了 max_norm = 1.0                                │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

3.4 混合精度训练——FP16、BF16 和 FP32 ​

┌─────────────────────────────────────────────────────────────┐
│         混合精度训练:为什么、怎么用、各格式的区别            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  为什么需要混合精度?                                        │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  FP32(32位浮点数):                                │   │
│  │  • 每个参数占 4 字节                                 │   │
│  │  • 175B 参数 × 4 bytes = 700 GB(仅模型权重)        │   │
│  │  • 加上优化器状态(Adam 需要 8 bytes/param)         │   │
│  │    → 总计 ~2.1 TB 显存                              │   │
│  │  • 远超单卡显存(A100-80GB 只有 80GB)               │   │
│  │                                                     │   │
│  │  FP16/BF16(16位浮点数):                           │   │
│  │  • 每个参数占 2 字节 → 显存需求直接减半              │   │
│  │  • 计算速度翻倍(Tensor Core 对 FP16 有专门加速)    │   │
│  │                                                     │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  三种浮点格式对比:                                          │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  格式    │ 总位数 │ 符号 │ 指数 │ 尾数 │ 数值范围    │   │
│  │  ───────┼────────┼──────┼──────┼──────┼───────────  │   │
│  │  FP32   │  32    │  1   │  8   │  23  │ ~10^±38    │   │
│  │  FP16   │  16    │  1   │  5   │  10  │ ~10^±4.8   │   │
│  │  BF16   │  16    │  1   │  8   │  7   │ ~10^±38    │   │
│  │                                                     │   │
│  │  FP16 的问题:范围太小                               │   │
│  │  • 最大值只有 65504                                  │   │
│  │  • 梯度或激活值容易溢出 → Inf/NaN                    │   │
│  │                                                     │   │
│  │  BF16 的优势:范围 = FP32,精度比 FP16 低但够用      │   │
│  │  • 指数位和 FP32 一样多(8 bits)                    │   │
│  │  • 不会溢出!                                        │   │
│  │  • 尾数少 16 bits(精度低),但对训练来说足够        │   │
│  │                                                     │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  混合精度训练的典型配置(AMP - Automatic Mixed Precision):  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  • 前向传播:FP16/BF16(快,省显存)                 │   │
│  │  • 反向传播:FP16/BF16(快,省显存)                 │   │
│  │  • 权重主副本:FP32(保证精度累积)                  │   │
│  │  • 优化器状态(Adam m, v):FP32                     │   │
│  │                                                     │   │
│  │  流程:                                              │   │
│  │  FP32 Weight ──→ cast to FP16/BF16 ──→ Forward      │   │
│  │                                         → Backward   │   │
│  │  FP16/BF16 Gradient ──→ cast to FP32 ──→ Update     │   │
│  │                                                     │   │
│  │  每个 step 前后做两次精度转换,几乎不影响速度        │   │
│  │                                                     │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  Loss Scaling(FP16 时代必需,BF16 时代可有可无):          │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ FP16 下很多梯度值非常小(< 2^-24),会被截断为 0     │   │
│  │ → 把 Loss 乘以一个大数(如 1024),梯度也跟着放大    │   │
│  │ → 更新前把梯度除以同一个数                           │   │
│  │                                                     │   │
│  │ BF16 为什么不需要?                                  │   │
│  │ → BF16 的指数范围大,小梯度不会下溢                  │   │
│  │ → 这是 BF16 成为 LLM 训练标准的关键原因之一          │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

3.5 学习率调度——Warmup 为什么救命 ​

┌─────────────────────────────────────────────────────────────┐
│          学习率调度:Warmup → Cosine Decay                    │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  学习率曲线:                                                │
│                                                             │
│  LR                                                         │
│   │                                                         │
│   │     ╱╲                                                   │
│   │    ╱  ╲                                                  │
│   │   ╱    ╲                                                 │
│   │  ╱      ╲_____________                                   │
│   │ ╱                      ╲___                               │
│   │╱    warmup                  ╲___ cosine decay             │
│   └────────────────────────────────────→ Steps              │
│                                                             │
│  三个阶段:                                                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 1. Warmup(预热):                                  │   │
│  │    LR 从 0 线性增长到 peak LR                       │   │
│  │    通常持续 2000-4000 steps                          │   │
│  │                                                     │   │
│  │    为什么需要 Warmup?                               │   │
│  │    → 训练刚开始时,权重是随机的                      │   │
│  │    → 梯度方向不稳定(今天往东,明天往西)            │   │
│  │    → 如果直接上大学习率,一步可能把权重推到           │   │
│  │       一个无法恢复的位置                            │   │
│  │    → Warmup 让模型先"找到北",再加速                 │   │
│  │                                                     │   │
│  │ 2. 峰值区(可选,不是所有方案都用):                │   │
│  │    LR 保持在 peak LR 一段时间                       │   │
│  │    一些训练方案(如 Llama 3)有短暂的 Constant       │   │
│  │                                                     │   │
│  │ 3. Cosine Decay(余弦衰减):                       │   │
│  │    LR 按余弦曲线降到 peak LR 的 ~10% 或 0            │   │
│  │    → 后期用小学习率做"精细调整"                     │   │
│  │    → 比起线性或阶梯衰减,余弦衰减更平滑              │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  典型设置:                                                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ GPT-3:    peak LR = 6×10^-5, warmup = 375M tokens   │   │
│  │ LLaMA:    peak LR = 3×10^-4, warmup = 2000 steps    │   │
│  │ Chinchilla: peak LR = 1×10^-4, warmup = 1000 steps  │   │
│  │ DeepSeek: peak LR = 2×10^-4, warmup = 2000 steps    │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  经验法则:模型越大,peak LR 越小,warmup 越长               │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

第4部分:Checkpoint 与恢复——训练不是一次性的 ​

4.1 为什么 Checkpoint 是必需品 ​

┌─────────────────────────────────────────────────────────────┐
│              Checkpoint:训练的生命保险系统                   │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  训练一个 175B 模型需要数周到数月。在这个过程中:             │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 硬件层面的故障(必然会遇到):                        │   │
│  │ • GPU 故障/过热      → 单卡宕机                      │   │
│  │ • 网络故障(NCCL)   → 多卡通信中断                  │   │
│  │ • 存储故障            → 数据读不出来                  │   │
│  │ • 机房电力问题        → 整个集群掉电                  │   │
│  │ • 光纤/交换机故障    → 通信带宽骤降                  │   │
│  │                                                     │   │
│  │ 软件层面的问题(也很常见):                          │   │
│  │ • Loss Spike → 需要回滚到 Spike 之前                 │   │
│  │ • OOM (Out of Memory) → 需要减小 batch size 后重启   │   │
│  │ • CUDA 错误 → 驱动/NCCL 版本不兼容                    │   │
│  │ • 代码 bug → 修好后需要从上一个正常点继续             │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  核心原则:                                                  │
│  "训练不是从零开始的。训练是从上一个 Checkpoint 开始的。"    │
│                                                             │
│  → 没有 Checkpoint = 任何故障都意味着从头来过               │
│  → 保存频率 = 故障恢复的代价                                │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

4.2 Checkpoint 里存什么 ​

┌─────────────────────────────────────────────────────────────┐
│            Checkpoint 包含的内容                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  一个完整的 Checkpoint 包含:                                │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 1. 模型权重(Model Weights)                         │   │
│  │    • 所有层的参数矩阵                                │   │
│  │    • 这是最大的部分                                   │   │
│  │    • 175B 模型 FP32:~700 GB                         │   │
│  │    • 175B 模型 FP16:~350 GB                         │   │
│  │                                                     │   │
│  │ 2. 优化器状态(Optimizer States)                    │   │
│  │    • Adam m (动量, first moment):每个参数一个值     │   │
│  │    • Adam v (二阶矩, second moment):每个参数一个值  │   │
│  │    • FP32 精度 → 每个参数 8 bytes (m+v)              │   │
│  │    • 175B × 8 = 1.4 TB                               │   │
│  │                                                     │   │
│  │ 3. 学习率调度器状态                                  │   │
│  │    • 当前 Step 数                                    │   │
│  │    • 当前学习率                                       │   │
│  │    • Warmup 是否已完成                                │   │
│  │                                                     │   │
│  │ 4. 数据迭代器状态                                    │   │
│  │    • 数据 shuffle 的随机种子                          │   │
│  │    • 当前读到哪个文件/哪个位置                        │   │
│  │    • → 保证恢复后不会重复训练或漏掉数据               │   │
│  │                                                     │   │
│  │ 5. RNG 状态(随机数生成器状态)                       │   │
│  │    • Python random, NumPy random, PyTorch random     │   │
│  │    • Dropout 的 mask 生成依赖这些                     │   │
│  │    • → 保证恢复后结果完全一致(deterministic)        │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  一个 175B 模型的 Checkpoint 总大小(含优化器状态):        │
│    模型权重(FP16):    ~350 GB                             │
│    优化器状态(FP32):  ~1400 GB                             │
│    其他:                ~1 GB                               │
│    总计:                ~1.75 TB                            │
│                                                             │
│  这就是为什么训练大模型需要 PB 级的存储系统                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

4.3 分布式训练中的 Checkpoint 复杂性 ​

┌─────────────────────────────────────────────────────────────┐
│        分布式环境下的 Checkpoint 挑战                         │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  在分布式训练中,模型权重被切分到多个 GPU 上:               │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  模型被切分的方式(回顾 [[13-distributed-training]]):│   │
│  │                                                     │   │
│  │  Data Parallelism (DP):                             │   │
│  │  GPU 0: 完整模型副本 0   ← 各有一份完整权重          │   │
│  │  GPU 1: 完整模型副本 1                               │   │
│  │  GPU 2: 完整模型副本 2                               │   │
│  │  → Checkpoint 好做:每个 GPU 都有完整模型             │   │
│  │                                                     │   │
│  │  Tensor Parallelism (TP) + Pipeline Parallelism (PP):│   │
│  │  GPU 0: Layer 0-7 的前半部分                         │   │
│  │  GPU 1: Layer 0-7 的后半部分                         │   │
│  │  GPU 2: Layer 8-15 的前半部分                        │   │
│  │  GPU 3: Layer 8-15 的后半部分                        │   │
│  │  → Checkpoint 复杂:需要把碎片拼回完整模型           │   │
│  │  → 保存时:每个 GPU 写自己的分片(快)                │   │
│  │  → 加载时:每个 GPU 读自己的分片(快)                │   │
│  │  → 但如果要合并成一个完整 Checkpoint(推理用):     │   │
│  │    需要 Gather 所有分片 → 耗时、耗存储                │   │
│  │                                                     │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  常见策略:                                                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ • 分片存储(Sharded Checkpoint):                   │   │
│  │   每个 GPU 保存自己的分片,加载时各读各的            │   │
│  │   → 不需要 Gather,速度快                            │   │
│  │   → 但 Checkpoint 绑定到特定的并行拓扑               │   │
│  │                                                     │   │
│  │ • 合并存储(Consolidated Checkpoint):              │   │
│  │   把所有分片 Gather 成一个完整文件                    │   │
│  │   → 独立于并行拓扑,方便推理/Debug                   │   │
│  │   → 但保存和加载都慢很多                             │   │
│  │                                                     │   │
│  │ 实践:训练时用分片 Checkpoint(高频保存),          │   │
│  │       训练完成后导出合并 Checkpoint(只做一次)       │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

4.4 Checkpoint 保存频率与策略 ​

┌─────────────────────────────────────────────────────────────┐
│            Checkpoint 保存策略                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  常见策略:                                                  │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ • 按时间间隔:每 N 分钟保存一次                      │   │
│  │   典型:每 30 分钟 ~ 每 4 小时                       │   │
│  │                                                     │   │
│  │ • 按 Step 间隔:每 N 个 step 保存一次                │   │
│  │   典型:每 1000 ~ 10000 steps                        │   │
│  │                                                     │   │
│  │ • 保留策略:                                         │   │
│  │   ─ 保留最近 K 个 Checkpoint(如 5 个)              │   │
│  │   ─ 保留每 M 步的历史 Checkpoint(用于回溯)         │   │
│  │   ─ 最佳实践:按指数间隔保留                         │   │
│  │     (最新的保存密一些,旧的保存稀一些)              │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  恢复流程:                                                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 1. 检测到故障(或人工停止)                          │   │
│  │ 2. 找到最新的有效 Checkpoint                         │   │
│  │ 3. 加载模型权重 + 优化器状态                          │   │
│  │ 4. 恢复数据迭代器位置                                │   │
│  │ 5. 恢复 RNG 状态                                     │   │
│  │ 6. 重新验证(跑几个 step 确认 Loss 正常)            │   │
│  │ 7. 继续训练                                          │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  关键陷阱:如果出现 Loss Spike,不要用最新的 Checkpoint!    │
│  → 往回找,找到 Spike 之前的一个 Checkpoint                  │
│  → 从那里恢复,跳过导致 Spike 的那批数据                     │
│  → 这就是保留历史 Checkpoint 的意义                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

第5部分:Pre-Training 成本估算——钱都花在哪了 ​

5.1 几个代表性模型的训练成本 ​

┌─────────────────────────────────────────────────────────────┐
│            代表性模型的 Pre-Training 成本                     │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  模型            │ 年份 │ 参数量    │ GPU-小时     │ 估算成本  │
│  ───────────────┼─────┼──────────┼────────────┼─────────  │
│  GPT-3           │2020 │ 175B     │ 3.6M V100-h │ ~$4.6M   │
│  Gopher          │2021 │ 280B     │ 7.1M TPUv3-h│ ~$10M+   │
│  Chinchilla      │2022 │ 70B      │ 6.8M TPUv3-h│ ~$8M+    │
│  LLaMA-1-65B     │2023 │ 65B      │ 1.0M A100-h │ ~$2M     │
│  LLaMA-2-70B     │2023 │ 70B      │ 1.7M A100-h │ ~$3.5M   │
│  Falcon-180B     │2023 │ 180B     │ 7.0M A100-h │ ~$14M    │
│  Llama 3-70B     │2024 │ 70B      │ ~7M H100-h  │ ~$15M+   │
│  Llama 3-405B    │2024 │ 405B     │ ~31M H100-h │ ~$65M+   │
│  DeepSeek-V3     │2024 │ 671B MoE │ 2.8M H800-h │ ~$5.6M   │
│  GPT-4 (估算)    │2023 │ ~1.8T MoE│ ~200M A100-h│ ~$80-100M│
│                                                             │
│  注意:                                                      │
│  • 成本只计算 GPU 租赁费用,不包括:                        │
│    - 人员工资(数十到数百名工程师,月薪 $10K-$50K+)        │
│    - 数据采集和处理成本                                     │
│    - 存储/网络基础设施                                       │
│    - 失败的实验(模型训崩了,钱就白花了)                    │
│  • 实际总成本通常是 GPU 成本的 2-5 倍                       │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

5.2 成本怎么算——GPU-小时的单价 ​

┌─────────────────────────────────────────────────────────────┐
│            GPU 租赁价格参考(2024 年云服务价格)              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  GPU        │ 显存    │ FP16 TFLOPS │ 租赁价/小时 (云)      │
│  ──────────┼────────┼────────────┼──────────────────────  │
│  V100-32GB  │ 32 GB  │ ~125       │ ~$2-3                 │
│  A100-40GB  │ 40 GB  │ ~312       │ ~$3-4                 │
│  A100-80GB  │ 80 GB  │ ~312       │ ~$4-5                 │
│  H100-80GB  │ 80 GB  │ ~990       │ ~$5-8                 │
│  H800-80GB  │ 80 GB  │ ~990       │ ~$4-6 (中国特供)      │
│  H200-141GB │ 141 GB │ ~990       │ ~$6-10                │
│                                                             │
│  典型训练集群规模:                                          │
│  • GPT-3:     10,000 V100                                    │
│  • LLaMA-2:   2,000 A100-80GB                                │
│  • Llama 3:   ~16,000 H100                                   │
│                                                             │
│  计算训练成本:                                              │
│  cost = GPU数量 × 训练时间(h) × 单价($/GPU-h)               │
│                                                             │
│  示例:LLaMA-2-70B                                           │
│    2000 A100-80GB × 850h × $4/h = $6.8M(估算上限)        │
│    (实际约 1.7M GPU-hours × $2/h ≈ $3.4M)                 │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

5.3 DeepSeek-V3 的极致性价比——为什么能做到 $5.6M ​

┌─────────────────────────────────────────────────────────────┐
│        DeepSeek-V3:用极致工程优化把成本打下来                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  DeepSeek-V3 的关键数字:                                    │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ • 总参数:671B(MoE,每次只激活 37B)                │   │
│  │ • 训练 Token:14.8T                                  │   │
│  │ • GPU-小时:2.8M H800-hours                         │   │
│  │ • 估算成本:~$5.6M                                   │   │
│  │                                                     │   │
│  │ 对比:Llama 3-405B 用了 ~31M H100-hours              │   │
│  │ → DeepSeek 用不到 1/10 的 GPU 时训出了可比模型      │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  他们是怎么做到的?(公开技术报告中披露的)                   │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 1. MoE 架构(Mixture-of-Experts)                    │   │
│  │    671B 总参数,但每次前向只激活 37B                  │   │
│  │    训练 FLOPs 按激活参数算,不是按总参数算            │   │
│  │                                                     │   │
│  │ 2. FP8 混合精度训练                                  │   │
│  │    比 FP16/BF16 又省了一半显存和计算                  │   │
│  │    DeepSeek 是最早在超大规模上成功用 FP8 的团队之一   │   │
│  │                                                     │   │
│  │ 3. Multi-Token Prediction (MTP)                      │   │
│  │    不仅预测下一个 token,还预测下 2-4 个 token       │   │
│  │    → 更密集的训练信号,收敛更快                       │   │
│  │                                                     │   │
│  │ 4. DualPipe 流水线并行                               │   │
│  │    自研的 Pipeline Parallelism 算法                   │   │
│  │    → 减少 GPU 空闲时间(bubble time)                │   │
│  │                                                     │   │
│  │ 5. 极致通信优化                                      │   │
│  │    Cross-node All-to-All 通信的定制优化               │   │
│  │    → MoE 的最大瓶颈是 Expert 之间的路由通信          │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  启示:                                                      │
│  • 大模型成本不是固定的——工程创新可以大幅降低成本            │
│  • 中国团队受限于 GPU 性能(H800 比 H100 弱),               │
│    倒逼出了更高效的训练方案                                  │
│  • MoE + FP8 + 更好的 Pipeline = 1/10 的成本               │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

5.4 预训练经济学——为什么只有少数公司玩得起 ​

┌─────────────────────────────────────────────────────────────┐
│              预训练的经济壁垒                                 │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  入门级(~$1M - 5M):                                       │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 7B-13B 参数,1-5T tokens                             │   │
│  │ 需要:~256-512 张 A100/H100,训练 1-2 个月          │   │
│  │ 代表:开源社区、中小公司可以承担                      │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  竞赛级(~$10M - 50M):                                     │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 70B-100B 参数,3-15T tokens                          │   │
│  │ 需要:~2000-4000 张 H100,训练 2-4 个月             │   │
│  │ 代表:Mistral, Cohere, 01.AI, 大型企业              │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  前沿级(~$50M - $200M+):                                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 400B+ 参数或 MoE 万亿参数,15T+ tokens               │   │
│  │ 需要:~16000+ 张 H100/B200,训练 3-6 个月           │   │
│  │ 代表:OpenAI, Google, Anthropic, Meta                │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  全成本清单(不止 GPU):                                    │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ • GPU 集群租赁/购置:$5M - $200M+                    │   │
│  │ • 数据采集和清洗:$1M - $10M                         │   │
│  │ • 工程团队(10-100人×$200K-$500K/年):$2M-$50M/年  │   │
│  │ • 电力/冷却/机房:GPU 成本的 10-20%                  │   │
│  │ • 失败的实验:可能占总预算的 30-50%                   │   │
│  │ • 存储(PB 级):$100K-$1M/年                        │   │
│  │                                                     │   │
│  │  真实全成本 ≈ GPU 成本的 2-5 倍                      │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  为什么失败实验这么贵?                                      │
│  • 数据配比不对 → 训完发现效果差 → 钱白花了                  │
│  • 训练中 Loss Spike 无法恢复 → 从 Checkpoint 回滚 →         │
│    几十万 GPU-小时打水漂                                    │
│  • 架构设计有问题(如 MoE 路由策略)→ 训练到一半发现不行     │
│  • Scaling Law 预测不准 → 训到一半发现 Loss 不降了           │
│                                                             │
│  结论:预训练是高风险的资本密集型活动。                       │
│  每一次从头训练都是一次"赌博"。                               │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

核心总结 ​

总结1:Pre-Training 是工厂,Post-Training 是装修 ​

Pre-Training 决定了模型能力的上限。Post-Training 只能激发已有能力,不能凭空创造。一个 Base Model 如果没有在预训练中学过某种知识,后续无论如何对齐(SFT/RLHF)都不会让它突然"学会"这个知识。Base Model = 原始能力,Chat Model = 能力包装成对话形式。

总结2:数据是预训练的第一性原理 ​

数据质量、数量和配比直接决定模型质量。Common Crawl 是主体(量大),但需要大量清洗。代码数据是提升推理能力的"秘密武器"。数据配比是商业机密——不同的配比产生不同能力特长的模型。

总结3:Scaling Laws 给出了计算预算的分配公式 ​

  • Kaplan (2020):模型比数据重要——错了
  • Chinchilla (2022):模型和数据同等重要——D_optimal ≈ 20N
  • 2024+ 实践:只要还有高质量数据,继续喂,模型继续变好——D >> 20N 不再是浪费

训练 FLOPs ≈ 6ND,这个公式让你能快速估算任何模型的训练成本。

总结4:训练稳定性是大规模训练的最大工程挑战 ​

Loss Spike 会导致训练崩溃。五道防线:数据质量过滤、梯度裁剪、BF16 替代 FP16、Warmup 学习率、频繁 Checkpoint。BF16 的"范围=FP32,精度低但够用"特性使其成为 LLM 训练的事实标准。

总结5:Checkpoint = 生命线 ​

训练不是从 0 开始的,是从上一个 Checkpoint 开始的。保存频率决定了故障恢复的代价。分布式训练中,分片存储是效率首选。遇到 Loss Spike,回滚到 Spike 前的 Checkpoint 是唯一的拯救方案。

总结6:预训练成本门槛极高 ​

从 $2M(7B 模型)到 $100M+(前沿模型),预训练是"富人俱乐部"。但工程优化(MoE + FP8 + MTP + Pipeline)可以将成本降低 10 倍。DeepSeek-V3 证明:聪明的设计可以部分弥补硬件劣势。


章节测试 ​

测试1:Base Model 和 Chat Model 的根本区别是什么? ​

A. Base Model 参数更少 B. Base Model 只会续写,不会对话;Chat Model 经过 Post-Training 学会了对话格式 C. Base Model 用的是 CPU 训练 D. Base Model 不能处理中文

测试2:Chinchilla Scaling Law 的核心结论是什么? ​

A. 模型参数量越大越好,数据量不重要 B. 数据量越大越好,模型大小不重要 C. 模型大小和数据量应该等比例增长,D_optimal ≈ 20N D. 只要模型够大,不需要预训练数据

测试3:GPT-3(175B 参数,300B tokens)的 D/N 比值是多少?按照 Chinchilla 标准,它是什么状态? ​

A. D/N = 20,达到最优 B. D/N = 1.7,严重欠训练(undertrained) C. D/N = 100,远超最优 D. D/N = 0.1,刚好够

测试4:BF16 相比 FP16 的最大优势是什么? ​

A. 精度更高(更多尾数位) B. 数值范围更大(和 FP32 一样大),不会溢出 C. 计算速度更快 D. 显存占用更少

测试5:为什么训练开始时需要 Warmup? ​

A. 让 GPU 预热到工作温度 B. 训练开始时梯度方向不稳定,大学习率可能把权重推到不可恢复的位置 C. 为了让数据加载跟上计算速度 D. 纯属惯例,没有实际作用

测试6:训练出现 Loss Spike 后,应该怎么做? ​

A. 继续训练,Loss 自己会降下来 B. 增大学习率,加速跳过这个区域 C. 从 Spike 前的 Checkpoint 恢复,跳过导致 Spike 的那批数据 D. 重新随机初始化模型,从头训练

测试7:一个 7B 参数的模型,按照 Chinchilla 公式,需要多少训练 tokens?训练 FLOPs 大约是多少? ​


参考答案 ​

测试1答案 ​

答案:B。Base Model 经过 Pre-Training 只会做 Next Token Prediction——给定前缀,续写后面的内容。它不知道什么是"对话"。Chat Model 经过了 SFT(教它对话格式)和 RLHF/DPO(教它人类偏好),才知道"用户问一句,我答一句"的互动模式。Base Model 的能力上限决定了 Chat Model 的天花板。

测试2答案 ​

答案:C。Chinchilla 推翻了 Kaplan 的结论(Kaplan 认为模型大小增长应该快于数据量增长)。Chinchilla 通过 400+ 次实验证明:在固定计算预算下,模型大小和数据量应该等比例增长,最优配比约为 D ≈ 20N。

测试3答案 ​

答案:B。D/N = 300B / 175B ≈ 1.7,远低于 Chinchilla 最优的 20。GPT-3 严重欠训练——如果重新分配计算预算,一个更小的模型配合更多数据可以达到更好的效果。Chinchilla(70B/1.4T)就用更少的计算预算碾压了 Gopher(280B/300B)。

测试4答案 ​

答案:B。BF16 和 FP16 都是 16 位浮点数,显存占用相同。区别在于:BF16 用 8 位指数(= FP32 的指数位数),范围可达 ~10^±38,但精度低(7 位尾数);FP16 用 5 位指数,范围只有 ~10^±4.8,但精度更高(10 位尾数)。对训练来说,范围 > 精度——FP16 的梯度/激活值经常溢出,BF16 不会。因此 BF16 已成为 LLM 训练的事实标准。

测试5答案 ​

答案:B。训练刚开始时模型权重是随机初始化的,各层的激活值分布还很不稳定。此时梯度方向在各 step 之间变化剧烈。如果直接使用大学习率,一个 step 就可能把参数推到极端区域(梯度消失或爆炸),后续再也回不来。Warmup 在最初几千步内从小学习率开始,让模型"找到方向",再逐渐加速。

测试6答案 ​

答案:C。一旦出现大 Loss Spike,说明某个批次的数据或某次参数更新破坏了模型。继续训练或增大学习率只会让情况更糟。正确做法是回到 Spike 之前的 Checkpoint,从那里换一批数据继续。这也是为什么要保留多个历史 Checkpoint 的原因。

测试7答案 ​

Chinchilla 最优数据量:D ≈ 20 × 7B = 140B tokens。

训练 FLOPs ≈ 6 × N × D = 6 × 7×10^9 × 140×10^9 = 6 × 980 × 10^18 = 5.88 × 10^21 FLOPs。

如果用 256 张 A100(FP16 ~312 TFLOPS,实际利用率 ~50%,即 ~78 TFLOPS/卡),总吞吐 ~20 PFLOPs/s = 2×10^16 FLOPs/s。大约需要 5.88×10^21 / 2×10^16 ≈ 2.94×10^5 秒 ≈ 82 小时 ≈ 3.4 天。(注:实际工业实践中很多远超 Chinchilla,如 Llama 3-8B 训了 15T tokens。)


相关笔记 ​

  • [[11-training-primer]] — 训练循环四步曲:Forward → Loss → Backward → Update
  • [[13-distributed-training]] — 从单卡到千卡集群:DP、TP、PP、ZeRO
  • [[08-transformer-by-hand]] — 手算 Transformer 前向传播
  • [[10-training-vs-inference]] — 训练和推理的完整对比
  • [[14-post-training-overview]] — Post-Training:SFT → Reward → RLHF/DPO

下一步学习 ​

  • [ ] 阅读 [[13-distributed-training]],理解预训练在工程上如何从单卡扩展到千卡集群
  • [ ] 用 Chinchilla 公式算一算:如果要训练一个 34B 的模型,按照 Chinchilla 最优、工业实践(LLaMA 风格)、超大数据(Llama 3 风格)三种方案分别需要多少数据
  • [ ] 阅读 DeepSeek-V3 技术报告,理解 MTP 和 DualPipe 如何把训练成本降了 10 倍
  • [ ] 选择一个开源的预训练代码库(如 TinyLlama 或 LitGPT),理解训练循环的具体实现

学习状态:🟡 开始学习

最后更新于:

Pager
上一篇15. 训练基础扫盲 - 理解 Fine-tune 在做什么 / A Training Primer for Understanding Fine-Tuning
下一篇17. 训练基础设施 - 从单卡到千卡集群 / Training Infrastructure from One GPU to Thousand-GPU Clusters

持续记录,持续成长

Copyright © Tidenflow