> **本章定位**：Scale 主线开篇。回答一个现实问题：**给定预算（GPU 数量 × 时间），模型开多大、数据喂多少，才是最优的？** 这是从「会训模型」到「会配置训练」的关键一跃，也是 CS336 的核心前置之一。

:::note 代码类型约定（Build / Systems 章节统一）
- 【Runnable】可直接运行（关键逻辑已在本课程验证脚本中实测）
- 【Skeleton】工程骨架：逻辑完整，需要自备数据/环境/权重
- 【Pseudo-code】算法示意：用于解释思路，不保证可直接运行
:::

## 14.1 为什么需要 Scaling Laws

:::unfold 先懂直觉
训练大模型是几千万美元级的工程决策：模型开 7B 还是 70B？数据喂 1T 还是 15T token？GPU 买 1000 张还是 10000 张？Scaling Laws 用**小规模实验的幂律规律**来预测大规模训练的结果，把「拍脑袋」变成「算得出来」。
:::

它回答三个问题：

| 问题 | Scaling Laws 的回答 |
| --- | --- |
| 模型越大越好吗？ | 不是——同算力下有最优大小；超过后收益递减 |
| 数据要多少？ | 与参数量配比存在最优点（Chinchilla ≈ 20 token/参数） |
| 该花多少钱？ | 给定模型大小，损失随算力呈可预测的幂律下降 |

**核心工具链**：参数量 → 训练 FLOPs（6ND）→ GPU hours（÷ 吞吐）→ 损失预测（幂律）。

## 14.2 参数量怎么数

:::unfold 先懂直觉
Transformer 的参数量有简洁公式，不用逐层数。这也是判断「一个模型声称 X B 参数是否合理」的基本功。
:::

### 公式（decoder-only，标准配置）

$$
\text{Params} \approx \underbrace{12\,L\,d^2}_{\text{每层 } 12d^2 \text{，共 } L \text{ 层}} + \underbrace{V\,d}_{\text{embedding 与 LM Head 共享}}
$$

| 符号 | 含义 | 典型值（7B） |
| --- | --- | --- |
| $L$ | 层数 | 32 |
| $d$ | hidden 维度 | 4096 |
| $V$ | 词表 | 32000 |
| 每层组成 | Attention 4d² + FFN 8d²（SwiGLU） | — |

### 数值算例：LLaMA-2-7B

$$
12 \times 32 \times 4096^2 = 6.44 \times 10^9
$$

$$
V \times d = 32000 \times 4096 = 1.31 \times 10^8
$$

$$
\text{总计} \approx 6.57 \times 10^9 \approx 6.6\text{B}
$$

（实际报告 6.7B，差异来自 norm/bias 等小项 ✅）

### 快速一览表

| 模型 | L | d | 12Ld² | +Vd | ≈ 参数量 |
| --- | --- | --- | --- | --- | --- |
| GPT-2 Small | 12 | 768 | 0.085B | 0.025B | 0.11B |
| TinyLM（第 12 章） | 6 | 256 | 0.0047B | 0.008B | 0.013B |
| LLaMA-2-7B | 32 | 4096 | 6.44B | 0.13B | 6.6B |
| LLaMA-2-70B | 80 | 8192 | 64.4B | 0.26B | 64.7B（GQA 略减） |
| GPT-3 | 96 | 12288 | 173B | 0.39B | 175B |

:::warning 常见误区
- **12d² 是 SwiGLU 时代的数字**：如果 FFN 用 4d 的 ReLU FFN，每层是 4d² + 8d² = 12d²（一样）；如果 d_ff 不是 4d 要按实际算。
- **词表大时 embedding 不可忽略**：小模型（d=256）里 V·d 占 60%+。
- **MoE 是例外**：参数量按专家总数算，但激活参数远小于总参数。
:::

## 14.3 训练算力：6ND

:::unfold 先懂直觉
训练一次（前向 + 反向）的计算量有个经典估算：**每个参数、每个 token 大约 6 次浮点运算**。记住 6ND，你就能口算任何训练任务的算力。
:::

### 公式与推导直觉

$$
C \approx 6\,N\,D
$$

| 项 | 含义 | 为什么是 6 |
| --- | --- | --- |
| 前向 | 每个参数对每个 token 一次乘加（2 FLOPs）= 2ND | 矩阵乘里每个权重参与一次乘 + 一次加 |
| 反向（对输入） | 同样规模 = 2ND | 链式法则要乘权重 |
| 反向（对权重） | 同样规模 = 2ND | 计算权重梯度 |
| 合计 | **6ND** | 2+2+2 |

### 数值算例

| 配置 | N | D | C = 6ND |
| --- | --- | --- | --- |
| TinyLM（第 12 章） | 13M | 1B | 7.8e16 |
| GPT-2 | 0.11B | 10B | 6.6e18 |
| LLaMA-2-7B | 7B | 2T | **8.4e22** |
| GPT-3 | 175B | 300B | 3.15e23 |
| LLaMA-3-8B | 8B | 15T | **7.2e23** |

:::math 从 FLOPs 到时间（完整链路）
$$
\text{墙钟时间} = \frac{C}{N_{gpu} \times \text{峰值算力} \times \text{MFU}}
$$

以 LLaMA-2-7B（8.4e22 FLOPs）在 1000 张 A100（312 TFLOPS BF16）上为例：

- 有效算力 = 312 × 0.35（MFU）= 109 TFLOPS/卡
- GPU 总时长 = 8.4e22 ÷ 109e12 ≈ 7.7e8 GPU 秒 ≈ **214,000 GPU hours**
- 1000 卡 → 约 **9 天**
:::

## 14.4 Kaplan Scaling Laws

:::unfold 先懂直觉
2020 年 Kaplan 等人发现：**损失随模型大小、数据量、算力都呈幂律下降**——画在 log-log 坐标上就是直线。这意味着小实验可以预测大训练的结果。
:::

$$
L(N) \propto N^{-0.076}, \qquad L(D) \propto D^{-0.095}, \qquad L(C) \propto C^{-0.050}
$$

| 规律 | 含义 |
| --- | --- |
| 幂律（power law） | 每翻倍规模，损失下降固定比例（log-log 直线） |
| 指数很小（0.05~0.1） | 想再降一点损失，规模要翻很多倍 |
| 结论 | 大模型时代「更大 = 更好」有了定量依据 |

:::note 历史意义
Kaplan 的结论是「固定算力下，**模型优先**放大」——这让 GPT-3（175B/300B 数据）成为当时的「最优解」。但两年后 Chinchilla 用更严谨的实验推翻了这个配比。
:::

## 14.5 Chinchilla：compute-optimal 配比

:::unfold 先懂直觉
2022 年 DeepMind 的 Chinchilla 重新做了大规模对照实验，发现：**当时的模型都「参数太大、数据太少」**。给定算力预算，模型大小和训练 token 数应该**等比例**增长——每 1 个参数配约 20 个 token。
:::

### 公式

$$
N^* \propto C^{0.5}, \qquad D^* \propto C^{0.5}, \qquad \frac{D^*}{N^*} \approx 20
$$

参数化损失函数（Chinchilla 论文附录报告的拟合形式与系数）：

$$
L(N, D) = E + \frac{A}{N^{\alpha}} + \frac{B}{D^{\beta}}, \qquad E = 1.69,\ A = 406.4,\ B = 410.7,\ \alpha = 0.34,\ \beta = 0.28
$$

:::warning 关于本页交互演示的说明
用论文的拟合系数直接求最优点，得到的 D/N 比值会与 headline 的「约 20:1」有出入（论文的 IsoFLOP 分析与参数化拟合两种方法给出的指数略有差异）。因此本页的 **chinchilla-curve 演示使用了一个教学用简化拟合**（令 α=β=0.3，并校准到 D*/N*≈20），**目的是展示 isoFLOP 曲线的定性形状与「最优配比」的直觉，不是原论文曲线的精确复现**。需要论文原值请查阅 Chinchilla 论文（附录 Table A9）。
:::

### 数值算例：三种模型的真实配置对比

先把三个历史事实摆清楚（FLOPs 按 6ND 口径估算）：

| | GPT-3（2020） | Gopher（2021） | Chinchilla（2022） |
| --- | --- | --- | --- |
| 参数量 | 175B | 280B | **70B** |
| 训练 token | 300B | 300B | **1.4T** |
| D/N | 1.7 | 1.1 | **20** |
| 训练 FLOPs（6ND） | 3.15e23 | 5.04e23 | 5.88e23 |

**怎么读这张表（三个层次，不要混在一起）**：

1. **Chinchilla vs Gopher（直接对照）**：两者训练预算同量级（≈5e23），但 Chinchilla 参数少 4 倍、数据多 4 倍，在绝大多数评测任务上全面胜出。这是「**同样的钱，更均衡的分配**」最直接的证据。
2. **Chinchilla vs GPT-3**：Chinchilla 参数只有 GPT-3 的 40%，却表现更好。注意：Chinchilla 的训练 FLOPs（5.88e23）**高于** GPT-3 的训练 FLOPs（3.15e23）——所以不能说「Chinchilla 用更少的算力超越了 GPT-3」，而是「用少得多的**参数**（部署更便宜）达到了更好的效果」。
3. **compute-optimal 分析（论文的核心结论）**：如果把预算定在 GPT-3 的 3.15e23 FLOPs，按其拟合关系，**约 40~50B 参数配约 1T token** 就能超过 GPT-3。也就是说：**GPT-3 不是算力不够，是参数/数据分配远离最优点**。

> **一句话总结 Chinchilla 的核心结论**：在固定训练计算预算下，参数 $N$ 与数据 $D$ 应当**均衡扩张**（近似等比例），而不是一味堆参数。

:::warning 20 token/param 是经典参考，不是永恒定律
「D/N ≈ 20」来自 Chinchilla 论文的实验设定（他们的数据、tokenizer、架构，且只优化**训练**成本）。它是有用的数量级参考，但不是所有现代训练的硬规则，原因：
- **推理成本也进目标函数**：部署场景下常故意「过度训练」小模型（见 14.8）；
- **数据质量差异**：高质量数据可重复多轮（epoch），等效 token 数变多；
- **tokenizer 不同**：同样的文本，token 数不同，D/N 比值随之变化；
- **架构与任务不同**（GQA/MoE、多语言、代码/数学配比）也会移动最优点。

正确用法：**把它当作起点和直觉校准，而不是教条**——先算 20N 做参考，再根据部署成本、数据质量做实验调整。
:::

:::demo chinchilla-curve 交互：isoFLOP 曲线与最优配比
拖动算力预算滑块，观察凹点（最优点）如何移动：算力越大，最优模型越大、数据越多。**注意：图中曲线为教学简化拟合（非原论文精确复现），用于展示定性形状。**
:::

## 14.6 isoFLOP 曲线：为什么不是越大越好

:::unfold 先懂直觉
固定算力预算 C，模型开大 → 数据就少（D = C/6N）；模型开小 → 数据可以多。损失随模型大小先降后升（呈 U 形）——中间那个谷底就是最优配置。
:::

```
Loss
  │ ╲                       ╱   ← 数据太少（大模型侧）
  │  ╲___              ___╱
  │      ╲___      ___╱        ← 谷底 = 最优 N*（D* = C/6N*）
  │          ╲____╱
  │  ↑ 参数量不足（小模型侧）
  └──────────────────────────→ 模型参数量 N（log）
```

| 区域 | 现象 | 原因 |
| --- | --- | --- |
| 谷底左侧 | 模型太小 | 容量不足，损失降不下去 |
| 谷底右侧 | 模型太大 | 数据被摊薄（D = C/6N 太小），欠训练 |
| 谷底 | 最优配比 | 参数与数据的边际收益相等 |

## 14.7 GPU hours 与 MFU

:::unfold 先懂直觉
FLOPs 是「活的总量」，GPU 是「干活的工人」。**MFU（Model FLOPs Utilization）**衡量「模型需要的 FLOPs」占「集群理论峰值」的比例——它是大模型训练最重要的工程指标之一，实际通常在 30%~50%。
:::

### 公式（先定义量纲，再谈利用率）

$$
\underbrace{C_{model} \approx 6ND}_{\text{模型侧：训练总 FLOPs}},
\qquad
\underbrace{P_{peak} = N_{gpu} \times P_{gpu}}_{\text{硬件侧：集群理论峰值 FLOPs/s}}
$$

训练耗时 $T$（秒），则实际达到的算力为 $C_{model}/T$（FLOPs/s），于是：

$$
\text{MFU} = \frac{C_{model} / T}{N_{gpu} \times P_{gpu}}
\;\;\Longrightarrow\;\;
T = \frac{6ND}{N_{gpu} \cdot P_{gpu} \cdot \text{MFU}}
$$

| 符号 | 含义 | 单位 |
| --- | --- | --- |
| $C_{model} = 6ND$ | 模型训练总 FLOPs | FLOPs |
| $T$ | 训练耗时 | 秒（s） |
| $C_{model}/T$ | 实际算力 | FLOPs/s |
| $N_{gpu} \times P_{gpu}$ | 集群理论峰值 | FLOPs/s |
| MFU | 两者之比（无量纲） | % |

:::math 数字算例（与计算器一致）
7B 模型 × 2T token，1000 张 A100（BF16 峰值 312 TFLOPS/卡），实测 MFU = 35%：

$$
C_{model} = 6 \times 7{\times}10^9 \times 2{\times}10^{12} = 8.4 \times 10^{22}\ \text{FLOPs}
$$

$$
T = \frac{8.4{\times}10^{22}}{1000 \times 312{\times}10^{12} \times 0.35} \approx 7.69 \times 10^5\ \text{s} \approx 8.9\ \text{天}
$$

反推验证：实际算力 $= 8.4{\times}10^{22} / 7.69{\times}10^5 \approx 1.09{\times}10^{17}$ FLOPs/s，等价于每卡 109 TFLOPS；$109 / 312 = 35\%$ ✅ 与设定一致。
:::

| 概念 | 含义 | 典型值 |
| --- | --- | --- |
| 峰值算力 | 硬件理论最大（A100 BF16 dense：312 TFLOPS，**不含**稀疏加速） | — |
| MFU | 只计「模型有效 FLOPs」的利用率 | 30%~50% |
| HFU | 计「硬件实际执行 FLOPs」的利用率（含 activation checkpointing 的重算等额外开销） | 通常 ≈ 1.2~1.5 × MFU |
| GPU hours | 训练总成本单位（云上约 $1~$3/卡时，随市场波动） | — |

> **MFU vs HFU**：开了 activation checkpointing 后，反向会**重算一遍前向**，硬件多做了约 1/3 的活。这些重算的 FLOPs **不算**在 MFU 里（MFU 只认 6ND），但**算**在 HFU 里。所以 HFU 可以高于 MFU 而不矛盾——两个指标回答的问题不同。

:::demo scaling-calculator 交互：训练成本计算器
调整参数量、token 数、GPU 数量、MFU，实时看到 FLOPs / GPU hours / 墙钟时间（`T = 6ND/(N_gpu·P·MFU)`），并对比 Chinchilla 参考配比。
:::

:::fold 工程里怎么用（估算训练预算的三行代码）
```python
# 类型：【Runnable】纯算术
N = 7e9            # 参数量
D = 2e12           # token 数
C = 6 * N * D      # FLOPs
gpu_hours = C / (312e12 * 0.35) / 3600
print(f"{C:.2e} FLOPs, {gpu_hours:,.0f} GPU hours, 1000卡约 {gpu_hours/1000/24:.1f} 天")
# → 8.40e+22 FLOPs, 213,675 GPU hours, 1000卡约 8.9 天
```
:::

## 14.8 现代实践：Chinchilla 之后

:::unfold 先懂直觉
Chinchilla 是「训练算力最优」，但**推理成本**也是钱。现代模型故意「过度训练」：用小模型喂远超 20 倍的数据，训练多花一点，换来推理时永久更便宜。
:::

| 模型 | 参数量 | 训练 token | D/N | 策略 |
| --- | --- | --- | --- | --- |
| GPT-3（2020） | 175B | 300B | 1.7 | 参数优先（Kaplan 时代） |
| Chinchilla（2022） | 70B | 1.4T | 20 | 训练算力最优 |
| LLaMA-2（2023） | 7B | 2T | **286** | 过度训练 |
| LLaMA-3（2024） | 8B | 15T | **1875** | 极致过度训练 |
| Qwen2.5（2024） | 7B | 18T | ≈2570 | 同上 |

**为什么？** 训练是一次性成本，推理是持续成本。一个 8B 模型服务 1 年，推理算力远超训练。所以现代共识：

> **用小模型 + 海量数据**，把训练算力「过度投入」，换取部署时的低成本。

:::key 本章必须记住
| 概念 | 公式/结论 |
| --- | --- |
| 参数量 | ≈ 12Ld² + Vd（SwiGLU/ReLU 同价） |
| 训练算力 | C ≈ 6ND |
| Kaplan | 幂律 L ∝ C^-0.05，参数优先 |
| Chinchilla | N* ∝ D* ∝ C^0.5，D/N ≈ 20，算力最优 |
| isoFLOP | 固定算力下损失对 N 呈 U 形，谷底即最优 |
| 时间 | T = 6ND / (GPU数 × 峰值 × MFU) |
| MFU | 有效利用率，大训练 30%~50% |
| 现代实践 | 过度训练（D/N ≫ 20）换推理成本 |
:::

:::quiz
估算训练算力的经典公式 C ≈ 6ND 中，系数 6 的来源是？

A. 模型有 6 层
B. 前向 2ND + 反向对输入 2ND + 反向对权重 2ND
C. 6 种矩阵乘法
D. 经验值，没有解释

答案: B
解析: 每个参数对每个 token 在前向是 1 次乘加（2 FLOPs），反向要分别对输入和权重求导，各再 2ND。合计 6ND。
:::

:::quiz
一个 7B 模型训练 2T token，FLOPs 大约是多少？

A. 8.4e19
B. 8.4e22
C. 8.4e25
D. 8.4e18

答案: B
解析: 6 × 7e9 × 2e12 = 8.4e22 FLOPs。
:::

:::quiz
Chinchilla 的核心结论是？

A. 模型越大越好
B. 固定算力下，模型大小与训练数据应等比例放大，D/N ≈ 20
C. 数据越多越好
D. 学习率决定一切

答案: B
解析: Chinchilla 发现 N* ∝ D* ∝ C^0.5，最优配比约 20 token/参数。GPT-3 时代参数过大、数据不足。
:::

:::quiz
为什么 LLaMA-3-8B 要用 15T token 训练（D/N ≈ 1875，远超 Chinchilla 最优）？

A. 团队算错了
B. 过度训练：训练成本是一次性的，小模型推理成本低，长期部署更省钱
C. 数据不要钱
D. 为了刷榜

答案: B
解析: Chinchilla 只优化训练算力。实际部署中推理是持续成本，用小模型过度训练换取推理效率是行业共识。
:::

:::related
依赖 | 第 9 章 GPT, 第 12 章 参数量核算, 第 17 章 显存
用于 | 第 15 章 GPU 基础（MFU 从哪来）, 第 16 章 分布式, 训练配置决策
:::
