第 5 周 · Day 3:系统复习(一)——全景图,以及一个模型的全部数字

Transformers and Large Language Models · Week 5 · Day 3。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

时长 6–7 小时:凭记忆画全景图(1.5h)· 对照 §1 补漏(0.5h)· 手算”一个模型的全部数字”再对答案(2h)· 按官方大纲逐条核对(1.5h)· 整理漏洞清单(0.5h)

对应学习计划 第 5 周 Day 3–4 的”系统复习:造一张自己的地图”:“默写一张全景图:从 token 进入模型,到 logits 出来,到采样成词,到训练如何更新权重,到 SFT/DPO/GRPO 如何改变行为,到 RAG/Agent 如何在外部扩展它。一张 A3 纸画完,画不出来的地方就是你的漏洞。” 以及”用官方 cheatsheet 逐条核对,补齐漏洞”。今天做全景图和核对,明天(Day 4)做推导默写。

配套代码 w5day3_checks.py(只用标准库):以 Llama 3 8B 为例算出全课所有的估算题:参数量逐项(并与 Llama 3 70B、Llama 2 7B、Mixtral 8x7B、Qwen2.5-0.5B 的公开数字核对)、计算量、推理显存与速度上限、训练显存、对齐的显存、RAG 与智能体的成本

§B 参考实现(code/ 目录):w5d3_model_calculator.py(模型账本计算器:给任意配置或预设,打印全部数字并标明公式出处)。

今天的目标:不看资料画出一张完整的全景图,每个框都能说出”它解决了什么、代价是什么、在哪一节”;能在 10 分钟内手算出一个 8B 模型的参数、算力、显存和速度;按官方九讲的大纲逐条自评,列出漏洞清单。


§0 今天怎么安排

顺序很重要:先凭记忆画,再看 §1。 学习计划的原话:“不要重看视频。“复习的效果来自”回忆”这个动作本身(主动回忆),而不是来自再读一遍。画不出来的地方,就是你的漏洞,把它们标成红色,今天下午和明天专门补。

时段做什么
1.5h一张 A3 纸,不看任何资料,画出全景图(§4 有画法)
0.5h对照 §1,用红笔补上漏掉的框和连线
2h不看 §2,先手算 Llama 3 8B 的全部数字(§2 开头的题目),再对答案;对不上的回到出处重推
1.5h§3 按官方大纲逐条自评
0.5h把所有红色的地方整理成一张漏洞清单,按”明天推导默写 / 后天面试题 / 需要重读”分类

今天要用到的旧结论:全部。


§1 全景图:从一个 token 到一个助手

下面是一张参考图。你的图不必长得一样,但每个框都要在,而且你要能说出箭头上发生了什么。

┌─────────────────────────────── ① 输入 ────────────────────────────────┐
│ 文本 ──分词(BPE / WordPiece / Unigram)──> token id ──嵌入──> 向量      │  W0D3 §7;W1D2 §6
│   为什么是子词:词表大小 vs 序列长度;分词的副作用(数数、多语言、计费)  │
│ 位置:正弦(相对位移是旋转)→ 可学习 → RoPE(打分只依赖相对位置)→ 外推    │  W1D2 §3;W1D5
└───────────────────────────────────┬───────────────────────────────────┘
┌─────────────────────── ② 一个块(重复 L 次)──────────────────────────┐
│ x ──RMSNorm──> 注意力 ──(+)──> RMSNorm──> FFN / MoE ──(+)──> x'         │  W1D2 §2;W0D2 §4
│   注意力:softmax(QKᵀ/√d)V;多头;因果掩码;MHA / MQA / GQA              │  W1D1;W1D4 §2
│   FFN:键值记忆;SwiGLU;MoE:路由、top-k、负载均衡、总参数 vs 激活参数    │  W1D2 §1;W2D2
│   高效注意力:稀疏、线性、FlashAttention(精确,省的是访存)              │  W1D6 §1–3
└───────────────────────────────────┬───────────────────────────────────┘
┌──────────────────────────── ③ 输出 ───────────────────────────────────┐
│ 最后的隐状态 ──> logits(词表大小)──softmax──> 下一个 token 的分布        │
│ 解码:贪心 / beam(长度偏置)/ 温度 / top-k / top-p / min-p / 重复惩罚     │  W2D3 §1–2;W0D5 §5
│ 自回归循环 + KV Cache(prefill / decode;访存瓶颈;显存公式)             │  W1D4 §1
│ 推测解码、PagedAttention、量化(GPTQ / AWQ / NF4)                       │  W3D1 §3;W2D5
└───────────────────────────────────┬───────────────────────────────────┘
┌──────────────────────────── ④ 预训练 ─────────────────────────────────┐
│ 损失:交叉熵 = 最大似然 = 最小 KL;困惑度                                 │  W0D1 §2;W0D5 §1
│ 反向传播(VJP)→ AdamW(尺子视角)→ warmup + cosine                       │  W0D1;W0D2
│ 数据:清洗、MinHash 去重、混合;loss spike;BF16 vs FP16                   │  W2D4 §1–3
│ 规模:缩放律;Chinchilla(N ∝ D);过度训练;C ≈ 6ND                      │  W2D1
│ 显存与并行:16 字节/参数;梯度检查点;DP / ZeRO / TP / PP                  │  W2D4 §4–5
└───────────────────────────────────┬───────────────────────────────────┘
┌──────────────────────────── ⑤ 后训练 ─────────────────────────────────┐
│ SFT:chat template、只在回答上算损失、打包                               │  W2D6 §1
│ PEFT:LoRA(B 初始化为零、α/r)、QLoRA(NF4 + 双重量化 + 分页优化器)       │  W2D6 §3–4
│ 偏好:偏好数据 → 奖励模型(Bradley-Terry)→ PPO(四个模型、裁剪、KL)      │  W3D2;W3D3
│       或者 DPO(闭式最优解 → 隐式奖励);IPO / KTO / SimPO / ORPO          │  W3D4
│ 推理:可验证奖励 → GRPO(组内优势)→ R1;Dr. GRPO / DAPO;蒸馏            │  W3D5
│ 主线:max E[r] − β·KL(π‖π_ref) 的闭式解 π* ∝ π_ref·exp(r/β)              │  W3D6 §5.2
└───────────────────────────────────┬───────────────────────────────────┘
┌──────────────────────── ⑥ 推理时的算力 ────────────────────────────────┐
│ 自洽性 / 多数投票、best-of-n、加权投票、PRM 搜索、按难度分配、思考预算     │  W2D3 §5;W3D6
└───────────────────────────────────┬───────────────────────────────────┘
┌──────────────────────────── ⑦ 外部扩展 ───────────────────────────────┐
│ RAG:切块 → 嵌入(InfoNCE)→ 索引(IVF / HNSW / PQ)→ BM25 + 稠密 → RRF     │  W4D1;W4D2
│      → 交叉编码器重排 → 拼进提示;HyDE、上下文检索、父子块                │
│ 工具:JSON Schema → 模型输出调用 → 运行时执行 → 结果回到上下文;MCP         │  W4D3
│ 智能体:ReAct 循环;错误累积与检查器;护栏;记忆;多智能体与 A2A            │  W4D4
└───────────────────────────────────┬───────────────────────────────────┘
┌──────────────────────────── ⑧ 评测 ───────────────────────────────────┐
│ 人工(κ)→ 规则指标(BLEU / ROUGE)→ LLM 评委(偏差与对策)→ 基准(污染)   │  W4D5;W4D6
│ 统计:标准误、配对比较、胜者的诅咒;Arena:Elo = BT 的随机梯度 + 风格控制  │
└───────────────────────────────────────────────────────────────────────┘
        ⑨ 前沿:ViT 与多模态、扩散语言模型、Muon、数据与模型坍缩、硬件      W5D1

(W0D3 §7 表示 Week 0 Day 3 §7,以此类推。)

画完之后问自己的三个问题:

  1. 每个箭头上发生了什么? 比如 ③ → ④:“logits 与真实下一个 token 的交叉熵”;⑤ 里奖励模型 → PPO:“奖励模型给整句打分,放在最后一个 token 上,每个 token 另有 KL 惩罚”。
  2. 每个框的”代价”是什么? 比如 GQA 省了 KV Cache,代价是一点质量;LoRA 省了显存,代价是表达能力受秩限制;RAG 扩展了知识,代价是检索错了就答不对。
  3. 哪几条线贯穿了多个框? 各周的”四条主线”(Week 0 Day 5 §D.2、Week 1 Day 6 §5.2、Week 2 Day 6 §5.2、Week 3 Day 6 §5.2、Week 4 Day 6 §5.2)就是答案。Day 6 会把它们合成全课的主线。

§2 一个模型的全部数字

先做题,再看答案。题目:Llama 3 8B(词表 128256,d=4096d=4096,32 层,32 个查询头、8 个 KV 头,FFN 中间维 14336,SwiGLU,输入输出嵌入不共享,训练数据 15T token)。不看资料算出:(1) 参数量逐项;(2) 训练算力;(3) bf16 权重和 8K 上下文的 KV Cache;(4) batch 1 解码的速度上限;(5) 全量微调、LoRA(r = 16,q/k/v/o)、QLoRA 的状态显存;(6) PPO、GRPO、DPO 的显存。

下面的数字都来自 w5day3_checks.py。

2.1 参数量

部分公式数值
嵌入 + 输出层2×128256×40962\times128256\times40961.051B
每层注意力2d2+2d⋅(8×128)2d^2+2d\cdot(8\times128)(Q、O 各 d2d^2,K、V 各 d×1024d\times1024)41.9M
每层 FFN3×4096×143363\times4096\times14336(gate、up、down)176.2M
32 层合计6.979B
归一化2d⋅32+d2d\cdot32+d266,240
合计8,030,261,248 ≈ 8.03B

FFN 占 70.2%,注意力只占 16.7%,嵌入与输出层占 13.1%。“Transformer 的参数主要在 FFN 里”是一个值得记住的直觉(Week 1 Day 2 §5.1);GQA 让注意力更小了(MHA 时每层注意力是 4d2=67.14d^2=67.1M)。

同一个函数算其他模型(与公开数字核对):Llama 3 70B 70.554B(公开 70.6B);Llama 2 7B 6.738B(6.74B);Mixtral 8x7B 总参数 46.703B、激活 12.88B(46.7B / 12.9B,Week 2 Day 2 §2.1);Qwen2.5-0.5B 0.494B(0.49B,它共享嵌入、Q/K/V 有偏置)。

2.2 计算量

  • 每个 token 的前向 ≈2N=16.1\approx2N=16.1 GFLOPs(Week 1 Day 2 §5.2)。上下文 2048 时,注意力平均每个 token 再加 2Ld T≈0.542Ld\,T\approx0.54 GFLOPs:短上下文时参数项主导,长上下文时注意力项主导(Week 4 Day 1 §1.1)。
  • 训练算力 C≈6ND=6×8.03×109×15×1012=7.23×1023C\approx6ND=6\times8.03\times10^9\times15\times10^{12}=7.23\times10^{23} FLOPs。以 H100 的 989 TFLOPS、40% 的 MFU 计,约 50.7 万 GPU 小时(只算纯训练,不含失败重启、评测、数据处理等开销,真实数字会更大)。
  • 数据量:Chinchilla 最优约 20N=16120N=161B token;实际用了 15T,是它的 93 倍,每个参数约 1870 个 token(Week 2 Day 1 §4.2 用 8B 取整算的是 1875)。为了推理便宜,宁可多花训练算力把小模型”练过头”。

2.3 推理

  • 权重:bf16 15.0 GiB;int8 7.5 GiB;4-bit 约 3.7 GiB(加上少量缩放因子,Week 2 Day 5 §4)。
  • KV Cache:每 token 2×32×8×128×2=1282\times32\times8\times128\times2=128 KiB(Week 1 Day 4 §1.4);8K 上下文一条序列 1 GiB,batch 32 时 32 GiB,比权重还大。
  • batch 1 的解码速度上限:每生成一个 token 至少要把全部权重从显存读一遍。bf16 权重 16.1 GB ÷ H100 的 3.35 TB/s ≥ 4.79 ms,即 ≤ 209 token/s;4-bit 时 ≥ 1.20 ms,≤ 834 token/s(Week 1 Day 4 §1.5)。batch 1 的速度由带宽决定,和算力几乎无关;这就是量化(Week 2 Day 5 §5)和推测解码(Week 3 Day 1 §3.2)能加速的原因。

2.4 训练显存

方式算法状态显存(不含激活)
全量微调bf16 权重 2 + 梯度 2 + fp32 主权重 4 + Adam 两个状态 8 = 16 字节/参数(Week 2 Day 4 §4.1)120 GiB;ZeRO-3 切到 8 卡每卡 15 GiB(Week 2 Day 4 §5.2)
LoRA,r = 16,q/k/v/o每层 r[(4096+4096)+2(4096+1024)+(4096+4096)]=425,984r[(4096+4096)+2(4096+1024)+(4096+4096)]=425{,}984,32 层 13.6M 个参数(0.17%,Week 2 Day 6 §3.2)冻结的 bf16 底座 15.0 GiB + LoRA 0.20 GiB
QLoRA底座 4 bit + 双重量化后约 0.127 bit/参数的缩放因子(Week 2 Day 5 §4.3)约 3.7 GiB + 0.20 GiB

激活显存另算:它随 batch 和序列长度增长,梯度检查点可以用重算换显存(Week 2 Day 4 §4.2)。

2.5 对齐

被训练的模型按 16 字节/参数、冻结的 bf16 模型按 2 字节/参数(Week 3 Day 3 §4.3):

方法同时在显存里的模型字节/参数8B 模型
PPO策略(训练)、价值(训练)、参考、奖励36269 GiB
GRPO策略(训练)、参考、奖励(规则时不需要)20150 GiB
DPO策略(训练)、参考(其对数概率也可预先算好)18135 GiB

这张表就是”GRPO 为什么省显存""DPO 相比 PPO 省了什么”的数字答案(期末卷 I.10、II.9)。再加上 LoRA,“训练中”那部分几乎可以忽略。

2.6 应用

  • RAG 索引:100 万块 × 1024 维 × 4 字节 = 4.1 GB;二值量化 + 精排 0.13 GB(Week 4 Day 1 §4.4)。
  • 智能体:10 步、系统提示和工具说明 3000 token、每步新增 600 token,累计输入 67,100 token(Week 4 Day 3 §2.3),是单次问答的十几倍。

用计算器核对:python code/w5d3_model_calculator.py --preset llama3-8b 打印以上全部数字;--preset llama3-70b --seq 8192 --batch 32 就是学习计划第 1 周那道题:KV Cache 每 token 320 KiB,8192 × 32 = 80 GiB。


§3 按官方大纲逐条核对

学习计划要求”用官方 cheatsheet 逐条核对”。下表按课程主页上九讲的官方主题列表逐条列出(cheatsheet 按同样的主题组织),对应到我们的小节。每一条给自己打三个勾:讲(能不看资料讲清楚它是什么、为什么)、推(能推出关键公式)、算 / 写(能估算相关的数字,或者写出核心代码)。任何一格空着,就进漏洞清单。

讲官方主题我们的小节讲推算/写
1NLP 背景与任务Week 0 Day 3 §1[ ]——
1分词Week 0 Day 3 §7;Week 1 Day 2 §6[ ][ ][ ]
1嵌入、Word2vecWeek 0 Day 3 §2–5[ ][ ][ ]
1RNN、LSTMWeek 0 Day 4 §2–3[ ][ ][ ]
1注意力机制Week 0 Day 4 §5;Week 1 Day 1 §1–2[ ][ ][ ]
1Transformer 架构Week 1 Day 1–3[ ][ ][ ]
2注意力的近似Week 1 Day 6 §1–3[ ][ ][ ]
2MHA、MQA、GQAWeek 1 Day 4 §2[ ][ ][ ]
2位置嵌入Week 1 Day 2 §3[ ][ ][ ]
2RoPE 及其应用Week 1 Day 5[ ][ ][ ]
2基于 Transformer 的架构Week 1 Day 2 §4[ ]——
2BERT 及其衍生Week 1 Day 6 §4[ ][ ][ ]
3LLM 的定义与架构Week 2 Day 1 §1[ ]—[ ]
3混合专家Week 2 Day 2[ ][ ][ ]
3上下文长度、温度Week 2 Day 3 §2–3[ ][ ][ ]
3采样策略Week 2 Day 3 §1–2[ ][ ][ ]
3提示、上下文学习Week 2 Day 3 §4[ ]——
3思维链、自洽性Week 2 Day 3 §5[ ][ ][ ]
4预训练Week 2 Day 1;Week 2 Day 4 §1–3[ ][ ][ ]
4量化Week 2 Day 5[ ][ ][ ]
4硬件优化Week 1 Day 6 §3;Week 2 Day 4 §4–5[ ][ ][ ]
4监督微调Week 2 Day 6 §1[ ][ ][ ]
4参数高效微调(LoRA)Week 2 Day 6 §2–4[ ][ ][ ]
5偏好调优Week 3 Day 2 §1;Week 5 Day 2 §3.1[ ]——
5RLHF 概览Week 3 Day 2 §3[ ]——
5奖励建模Week 3 Day 2 §2[ ][ ][ ]
5RL 方法(PPO 及其变体)Week 3 Day 3[ ][ ][ ]
5DPOWeek 3 Day 4[ ][ ][ ]
6推理模型Week 3 Day 5 §1;Week 5 Day 2 §3.3–3.4[ ]——
6用于推理的 RLWeek 3 Day 5 §2[ ]—[ ]
6GRPOWeek 3 Day 5 §3–4[ ][ ][ ]
6缩放(测试时)Week 3 Day 6[ ][ ][ ]
7检索增强生成Week 4 Day 1[ ][ ][ ]
7进阶 RAG 技术Week 4 Day 2[ ][ ][ ]
7函数调用Week 4 Day 3[ ][ ][ ]
7智能体、ReAct 框架Week 4 Day 4[ ][ ][ ]
8LLM 当评委概览Week 4 Day 6 §1[ ]—[ ]
8最佳实践与好处Week 4 Day 6 §1.4[ ]——
8偏差与陷阱Week 4 Day 6 §2[ ][ ][ ]
9回顾、趋势、结语Week 5 Day 1[ ][ ]—

(”—“表示这一条没有需要推导或计算的内容。)另外,第 4 周 Day 5 的评测统计(标准误、配对、胜者的诅咒)不在官方大纲里,但面试和做研究都离不开,一起核对。


§4 怎么画 A3 全景图

三遍画法:

  1. 第一遍:骨架(30 分钟)。只画 §1 的八个大框和它们之间的箭头,每个框里写 3–5 个关键词。不许翻书,想不起来的地方留空。
  2. 第二遍:数字(30 分钟)。在每个框旁边写上它最重要的一两个数字或公式:注意力的 O(T2d)O(T^2d)、KV Cache 的公式、6ND6ND、16 字节/参数、DPO 的损失、GRPO 的优势、RRF 的公式、κ 的公式……写不出来的,用红笔标出来。
  3. 第三遍:连线(30 分钟)。用不同颜色画”跨框”的线:同一个思想在不同地方出现(比如”softmax 交叉熵”出现在语言模型、InfoNCE、Bradley-Terry、DPO 里;“两阶段”出现在检索和工具路由里;“代理与 Goodhart”出现在奖励模型、验证器、评委、基准里)。连线越多,说明你越是在理解,而不是在记忆。

然后:对照 §1 补漏(红笔),对照 §3 自评,把所有红色的地方抄进漏洞清单。


§A 复习的方法

  • 主动回忆胜过重读:合上书写出来,比再读三遍有效得多。学习计划”执行纪律”的第 1 条就是它。
  • 间隔重复:今天画的图,隔 1 天、3 天、7 天各默写一次(只画骨架和数字,10 分钟)。每次只重看画不出来的部分。
  • 费曼法:把一个概念讲给一个”不懂的人”听(或者录音回放)。卡住、跳步、用术语代替解释的地方,就是没懂的地方。Day 5 的面试练习就是在做这件事。
  • 交错练习:复习时不要一讲一讲地顺着来,而是混着来(一道 RoPE、一道 DPO、一道 BM25)。面试和考试都是混着问的。
  • 错题本:Day 2 记录的错题,按错因分类(Day 2 §2.5);“推导不熟”类的错题,明天一道道重推。

§B 实操

  1. 画全景图(2h):按 §4 的三遍画法,完成后对照 §1。
  2. 手算一个模型(2h):先不看 §2,手算 Llama 3 8B 的六组数字;再跑 python w5day3_checks.py 对答案。然后换一个模型(Mixtral 8x7B 或 Qwen2.5-0.5B)再算一遍,用 python code/w5d3_model_calculator.py --preset … 核对。
  3. 逐条核对(1.5h):§3 的表,每一条打三个勾。
  4. 漏洞清单(0.5h):把所有没打勾的格子和全景图上的红色部分整理成一张表,按”明天推导默写 / 面试前补 / 需要重读”分三类。
  5. (可选)把计算器扩展一下:给 w5d3_model_calculator.py 加上”推测解码的加速比”(Week 3 Day 1 §3.2)或”训练一个 epoch 要多久”。

参考实现:code/w5d3_model_calculator.py。


§C 自测

口述(每题限时 3 分钟,录音)

  1. 从”用户输入一句话”开始,一直讲到”模型输出第一个 token”,中间经过了哪些计算?每一步的代价在哪里?
  2. 一个预训练好的基座模型,要经过哪几步才变成一个”会推理、会用工具、说话得体”的助手?每一步用什么数据、优化什么目标?
  3. 你的 RAG 助手在一道题上答错了,从检索到生成,按顺序说出你会检查的五个地方。

估算(每题限时 5 分钟)

  1. Llama 3 70B:参数量逐项、bf16 权重显存、每 token 的 KV Cache、batch 1 解码的速度上限。
  2. 全量微调一个 7B 模型(BF16 + AdamW)要多少状态显存?8 张 80GB 的卡够吗?LoRA 呢?QLoRA 呢?
  3. 用 GRPO 训练一个 8B 模型,和 PPO 相比省了多少显存?为什么?
  4. 一个智能体每步新增 800 token、系统提示 5000 token,跑 20 步,累计输入多少 token?提示缓存(按 10% 计价)能省多少?

出关标准

  • 不看资料画出了全景图的八个框、关键数字和至少五条跨框的连线
  • 10 分钟内手算出 Llama 3 8B 的参数、算力、推理显存与速度、训练显存、对齐显存,全部与 §2 一致
  • 按 §3 逐条自评,每一条都至少打了”讲”的勾
  • 整理出漏洞清单,并安排好明天和后天各补哪些

疑问清单

← 返回课程目录