卷2 · LLM 内功
2.3 GPT 架构工程版:从 TinyGPT 到 nanoGPT
展开本章目录与同卷章节
1. 升级清单:教学版 → 现代开源版2. nanoGPT 精读地图3. KV cache:推理为什么必须缓存4. Prefill 与 Decode:两种截然不同的负载5. 实操路线(寒假)6. 自测题7. 动手作业案例 · 数值:把 KV cache 的账算到底8. 延伸资源同卷章节2.1 语言模型前史:n-gram → RNN → 注意力(20 分钟走完 30 年)2.2 BPE tokenizer 原理与实现2.3 GPT 架构工程版:从 TinyGPT 到 nanoGPT2.4 预训练:数据、Scaling Law 与训练稳定性2.5 SFT 与指令微调实战2.6 参数高效微调:LoRA 与 QLoRA2.7 对齐技术:RLHF → DPO → GRPO2.8 推理优化与 vLLM:把模型变成服务2.9 架构前沿:MoE、长上下文与注意力变体2.10 小模型时代的科研机会:1B–7B 甜点区本章目标:1.3 章你造出了”教学版”GPT;这一章做工业版升级清单——现代开源模型(LLaMA/Qwen)相对教科书版本的每一处改动及其理由,外加推理侧最重要的两件事:KV cache 与 prefill/decode 两阶段。这是读开源模型源码(卷3 的 Qwen-VL/InternVL)前的最后一站。
1. 升级清单:教学版 → 现代开源版
| 组件 | TinyGPT(1.3) | 现代模型 | 为什么改 |
|---|---|---|---|
| Norm | LayerNorm | RMSNorm(Pre-Norm + final norm) | 砍掉均值中心化,少一半算术,效果不掉(0.3) |
| 位置编码 | 可学习绝对 | RoPE | 相对位置、可外推、长上下文友好(1.3) |
| MLP | Linear(4d)+GELU | SwiGLU(中间维 ≈ 8d/3) | 门控结构实验更优,降维对齐参数量 |
| 偏置 | 有 | 全删(除个别) | 省 ~1% 参数且训练更稳(PaLM 观察) |
| 注意力 | 手写 softmax | F.scaled_dot_product_attention(FlashAttention 内核) | 优化显存 IO 而非数学(1.2) |
| KV 结构 | MHA | GQA(分组共享 KV 头) | 本章 §3——KV cache 显存 |
| 精度 | fp32 | bf16 AMP + grad clip 1.0 | 0.4 章四件套 |
| 稳定件 | —— | QK-Norm(新趋势) | 大模型 loss spike 防治,Qwen3 等在用 |
读源码的预期:卷3 你打开 Qwen-VL 源码时,逐项对号入座——所有”新东西”你都已见过。
2. nanoGPT 精读地图
nanoGPT(Karpathy)的三个文件对应你已经掌握的三块知识:
model.py:1.3 的 Block + 工业化细节。值得抄的两个初始化 trick:所有权重 ;残差路径上的输出投影(c_proj)再乘 ——让残差流方差不随深度累积(GPT-2 原版技巧,解释了”为什么深层初始化要按层数缩放”);train.py:0.2+0.4 章训练循环的全配置化版本。配方:AdamW(=0.95,非默认 0.999——大模型经验值)、weight decay 只作用在 2 维矩阵参数(1 维的 norm/bias 不 decay——“参数形状决定 decay 与否”是行规)、grad clip 1.0、warmup+cosine、bf16;configurator.py:key=value 文本覆盖配置的小机制——工程品味样本,10 分钟读懂。
3. KV cache:推理为什么必须缓存
问题:自回归生成第 个 token 时,因果 mask 意味着历史 token 的 K、V 不会变。朴素做法每步都重算全部历史的前向——生成 个 token 要 次注意力计算,浪费一倍以上。
方案:把每层的 K、V 缓存下来,每步只算最新一个 token 的 q/k/v 并追加:
def step(x_new, cache): # x_new: (B, 1, d) 只喂最新 token
q = Wq(x_new); k = Wk(x_new); v = Wv(x_new)
cache.k = torch.cat([cache.k, k], dim=1) # 沿序列维追加
cache.v = torch.cat([cache.v, v], dim=1)
att = softmax(q @ cache.k.transpose(-2,-1) / sqrt(dh)) @ cache.v # 新 q 看全部历史 K,V
return Wo(att)
显存的账(必须会算):KV cache 大小 = 。
例:7B 模型(L=32, d=4096, fp16, MHA)单条 4k 上下文:——比权重还重只是时间问题(10 条并发 = 21GB,一张卡直接爆)。
GQA(Grouped-Query Attention)就是为此而生:Q 保留全部头,K/V 只留 1/4 的头、组内共享——7B 例子里 从 4096 降到 1024,cache 变 0.54GB,省 4 倍,质量损失极小。LLaMA-2 70B 起几乎所有开源模型标配。MQA(1 组)更省但掉点,GQA 是甜点。
4. Prefill 与 Decode:两种截然不同的负载
推理分两阶段,瓶颈完全不同(这是 2.8 推理优化和 vLLM 的理论根基):
- Prefill:一口气处理整个 prompt(并行,1.2 章的注意力矩阵大展拳脚)。compute-bound——GPU 算力打满,越强的卡越快;
- Decode:逐 token 生成,每步都把全部权重和 KV cache 从显存读一遍、却只做一次小矩阵乘。memory-bound——GPU 算力大量闲置,瓶颈是显存带宽。
Decode 的 memory-bound 带来反直觉结论:一个 batch 里塞 32 个并发请求,总耗时和 1 个几乎一样(权重只需读一次,32 个请求分摊)——这就是推理服务商”并发摊薄成本”的经济学,也是 vLLM 持续批处理(continuous batching)存在的理由。
5. 实操路线(寒假)
- 跑通:
git clone nanoGPT,先跑shakespeare_char配置(笔记本 CPU 都行,10 分钟出”伪莎翁”)——把 1.3 的 TinyGPT 和它逐行 diff,找出全部工业化差异; - 改造:给 nanoGPT 换上 RMSNorm + GQA(各一次 commit),对照 loss 曲线验证”不掉点”;
- 不推荐:复现 GPT-2 124M 全量预训练(数千 GPU 小时)。看它的启动脚本和日志即可——知道全量预训练长什么样,和亲手做一次,价值不同;学生阶段把卡留给微调实验。
6. 自测题
- KV cache 为什么有效?哪些张量在生成过程中不变?(因果性保证历史 K/V 不变;只增量计算新 token)
- 算一遍:你训的 7B LoRA 模型,8 条并发 × 8k 上下文,MHA 的 KV cache 总量?(2×32×4096×8192×8×2B ≈ 34GB——必须 GQA)
- GQA 省的是 Q 还是 KV?为什么省 KV 就够了?(KV;cache 只存 K/V,Q 是当步临时的)
- prefill 和 decode 各是什么瓶颈?对硬件选择意味着什么?(compute-bound / memory-bound;decode 阶段带宽比算力重要)
- 为什么推理服务商欢迎大 batch?(decode 阶段权重读取被多请求摊薄,吞吐近线性涨)
- AdamW 的 β₂ 从 0.999 改 0.95 是什么逻辑?(大模型梯度噪声大、二阶动量窗口过长反而钝——经验修正,注意”默认值不是圣旨”)
7. 动手作业
- 完成第 5 节的 nanoGPT 两步(跑通 + RMSNorm/GQA 改造),diff 报告写进 repo;
- 手写带 KV cache 的推理循环(在 1.3 TinyGPT 上),验证输出与朴素逐 token 前向逐位一致——cache 的正确性测试;
- 用
torch.profiler对比朴素 vs cache 版的每 token 耗时; - 算账题:Qwen3-VL 4B(假设 L=36, d=2560, GQA n_kv=8, bf16)单条 32k 视觉上下文的 KV cache 是多少 GB?这张卡还装得下权重吗?(约 2×36×640×32768×2B ≈ 3GB;权重 8GB——装得下,这就是小模型在端侧的底气)
案例 · 数值:把 KV cache 的账算到底
案例:7B 模型的 KV cache,从公式到 GiB
设 L=32 层,d=4096,MHA(d_kv=4096),fp16(2 字节),单条序列 4096 token:
换 GQA(8 组 KV 头 → d_kv=1024):。
再上强度:16 条并发 × 8k 上下文(MHA)= 2.0 GiB × 2 × 16 = 64 GiB——一张 24G 卡只剩哭的份,这就是 GQA 必须存在的定量证明;GQA 后 16 GiB,仍然紧,所以 vLLM 还有分页管理与 KV 量化兜底(2.8)。
部署检查习惯:任何方案先算一句”KV 预算 = 卡剩余显存 ÷ 单请求单 token KV”,再谈并发数。
8. 延伸资源
- nanoGPT repo + Karpathy《Let’s reproduce GPT-2 (124M)》——训练全流程实录
- GQA 论文(Ainslie et al. 2023)——十分钟读完
- FlashAttention 论文 §1–2——IO 感知的系统思维
