CS336 从零构建语言模型

2026-08-29 · 专题调研 · 21:15 增补机制读法 · 基于 Stanford CS336 Spring 2025 公开材料整理

这门课的核心不是「会调 API」,而是像操作系统课从零写 OS 一样:自己把 tokenizer、Transformer、训练、数据、评测、对齐全做一遍。读完应能回答:一个现代 LM 的每一分钱算力、每一 GB 显存、每一张网页,最后是怎么变成 next-token 概率的。

边界。 本页是自学讲义,不是 Stanford 官方中文译本,不含作业实现或答案。作业仓库公开,但课的 Honor Code 禁止对着现成代码写;用 LLM 直接代写作业同样禁止。视频课表见 cs336.stanford.edu(当前学期有 YouTube playlist)。

xiaomimi 说明 本页怎么读。不按作业做完这门课。JC 的目标是机制和底层逻辑,不是 A1–A5。第 12 节直接跳过。

底层就一条链:

建议读序: 1 → 2 → 3 → 7 → 10 → 11。中间 4–6、8–9 当注释。下文凡带 xiaomimi 说明 的都是我的解读,不是课的原话。没标的段落是课程公开材料的整理。

0. 知识地图

xiaomimi 说明 这张表是课的作业骨架,用来对齐概念从哪里来。不是要你把 A1–A5 做完。

CS336 把「做一个 LM」拆成五段作业,对应十二条课。先建立顺序,再进细节。

作业对应课你要建立的心智模型
A1 BasicsL1–L3BPE → Transformer → AdamW,能训一个最小 LM
A2 SystemsL5–L8算力/带宽/显存哪一层卡住;FlashAttention;分布式
A3 ScalingL9, L11用 scaling law 预测「加参数还是加数据」
A4 DataL13–L14Common Crawl → 过滤/去重 → 能预训练的文本
A5 AlignmentL15–L16SFT → RLHF/DPO → RLVR(可验证奖励)

先修:Python 要能独立写中等规模工程(课明确说代码量比普通 AI 课高一个数量级)、PyTorch、线性代数、基础概率、一门 ML/DL 课。系统侧要懂 memory hierarchy。

1. Tokenization:把文本变成可学习的离散符号

模型不读「字」,读的是整数 ID。Tokenizer 决定:词表多大、一个意思要拆成几段、尾部开销多少。

BPE 在干什么

Byte Pair Encoding 从字节或字符开始,反复把语料里最常见的相邻 pair 合成新 token,直到词表达到目标大小。推理时用同一套 merge 规则贪心切分。

前置切分(pretokenization)通常按空白/标点切开,防止 BPE 把 hello world 合成一个跨词 token。特殊符号(<|endoftext|>、PAD)要预留,不能让 BPE 自己长出来。

记住一句: tokenizer 是压缩器 + 接口合同。训练和推理必须用同一份 vocab 和 merge;换 tokenizer 等于换语言模型。

2. 资源记账:FLOPs、显存、算术强度

课的第二讲把「能不能训」变成三本账。不会算这三本,后面的 GPU / 并行全是玄学。

FLOPs

Dense Transformer 训练的经验式(Kaplan / Hoffmann 常用):

训练 FLOPs ≈ 6 N D

N 是参数量,D 是 token 数。前向约 2ND(主要是 matmul),反向约两倍,合计约 6。注意力在长上下文里会额外冒头,短序列时可忽略。

显存

训练时显存不是「参数一份」那么简单:

所以 7B 满血 AdamW 训练,仅优化器状态就可能到数十 GB,这才需要 ZeRO / FSDP。

算术强度

arithmetic intensity = FLOPs / 字节搬运。强度低 = 带宽墙(memory bound),强度高 = Tensor Core 墙(compute bound)。FlashAttention 的意义就是:别把 N×N 注意力矩阵写回 HBM,把 softmax 留在 SRAM 里做完,强度才上得去。

3. 架构与超参:现在的「标准 Transformer」长什么样

2025 年课上的标准件,已经不是 2017 年的原版 Attention is All You Need。

组件常见选择为什么
归一化Pre-Norm(RMSNorm)深网络更稳;Post-Norm 难训
位置RoPE相对位置,外推比绝对 embedding 好
FFNSwiGLU门控 MLP,同样参数往往更强
注意力GQA / MQAKV 头变少,推理时 KV cache 变小
优化器AdamW + warmup + cosine/WS D解耦 weight decay;大 batch 要调 LR

形状上:宽 vs 深有权衡。过深而窄,残差和通信更痛;过宽而浅,表达力不够。超参不是搜出来的魔法,是和 batch、LR、token 预算绑在一起的——这就是后面 scaling law 要管的事。

损失就是 next-token 交叉熵。实现上对 logits 做 cross_entropy(pred[:-1], target[1:])。没有这个位移,模型在抄当前 token。

4. MoE 与注意力变体

稠密模型每个 token 过全部 FFN。Mixture of Experts 让每个 token 只激活少数 expert,用稀疏计算换更大总参数。

注意力侧:长上下文时平方注意力贵,于是有 GQA、MLA、线性注意力、SSM 等。课强调的不是背名词,而是问:它省的是 FLOPs、HBM 带宽,还是 KV cache?三者不是一回事。

5. GPU 与核函数:为什么 naive attention 慢

GPU 分层:寄存器 / SRAM(快、小)→ HBM(慢、大)。一次 HBM round-trip 的代价,往往大于在 SRAM 里多算几次。

Roofline:把 kernel 标到「带宽上限 vs 算力上限」两条线上,立刻知道该优化搬运还是优化 FLOPs。

FlashAttention 的要点

标准注意力会物化 S = QK^T 再 softmax,这块 O(N²) 的中间结果进出 HBM。FlashAttention:

  1. 把 Q/K/V 切成 SRAM 装得下的 tile
  2. 用 online softmax 维护运行中的最大值和归一化项
  3. 不写出完整 S 矩阵

Triton 这门课用来让你亲手写这种 fused kernel:把「数学上的 attention」编译成「HBM 友好的循环」。A2 的核心智力负荷在这儿。

6. 并行:一张卡装不下之后

方式切什么主要代价
Data Parallel / FSDP / ZeRO数据;参数/状态分片梯度或参数通信
Tensor Parallel单层矩阵按列/行切层内 all-reduce,要高带宽互联
Pipeline Parallel按层切到不同卡pipeline bubble
Context / Sequence Parallel序列维切长上下文时救激活显存

真实大模型是 3D/4D 混合。记忆口诀:DP 扩样本,TP 扩层宽,PP 扩深度,CP 扩上下文。通信原语(all-reduce、all-gather、reduce-scatter、all-to-all)比「用了 DeepSpeed」更值得懂。

7. Scaling laws:钱应该砸在哪

Kaplan 等人:损失随参数、数据、算力近似幂律下降。Hoffmann / Chinchilla 修正:同样算力下,以前的模型往往参数太大、数据太少。计算最优大约是参数和 token 一起涨。

课上会让你拟合 L(N, D) 或 isoFLOP 曲线,用来外推:下一次 10× 算力,应该训多大模型、喂多少 token。A3 甚至用训练 API 去拟合,而不是空想。

实践含义: 「再堆 2 倍参数」可能不如「同样 FLOPs 多看数据」。推理时还有另一条曲线:小模型训得更饱,有时比没训饱的大模型更划算。

8. 推理:prefill 和 decode 是两种机器

KV cache 大小约 2 × layers × kv_heads × dim × seq × batch × dtype。这就是 GQA/MQA、量化 KV、paged attention 存在的理由。投机解码(speculative decoding)用小模型草稿、大模型一次验证多 token,专治 decode 的步数墙。

训练优化的是吞吐(token/s/GPU);产品优化的是首字延迟和每用户成本。两者的 kernel 和并行策略都不同。

9. 评测:损失下降不等于变好

困惑度(perplexity = exp(mean NLL))是训练的体温计,不是产品指标。下游还要:

课强调:先定义「好」,再改数据或对齐。否则你只是在过拟合 leaderboard。

10. 数据:模型上限经常在这里,不在层数

A4 路线:WARC/Common Crawl 原始网页 → 抽文本 → 语言识别 → 质量过滤 → 去重 → 配比混合。

数据管道的工程量通常大于模型文件本身。这是这门课相对 CS224N 最大的转向之一。

11. 对齐:预训练之后怎么听话、会推理

预训练目标是「网页上什么常见就预测什么」。对齐改的是条件分布:在用户意图下,什么该说、什么该算对。

阶段信号特点
SFT示范回答模仿格式和语气;不会超出示范分布
RLHF人好/坏 → 奖励模型 → PPO 一类能优化偏好,但不稳、贵
DPO成对偏好,不开奖励模型实现简单,课上作为 safety 选修
RLVR可验证奖励(数学对错、代码测试)2025 课的重点:推理可被打分

RLVR 和聊天偏好不是同一件事:数学可以 unit test,风格不能。A5 主线是用 RL 让模型解数学;safety/DPO 是补充。不要把「会刷 MATH」自动翻译成「对齐完成」。

12. 自学路径(可选,给要动手的人)

xiaomimi 说明 只想懂机制就跳过本节。下面是课的作业向路径,不是这条「只读机制」线的必读。

  1. 看 L1–L3,自己实现 BPE + 最小 Transformer + AdamW,CPU 上先过拟合一小份文本(损失应能明显下降)。
  2. 算一次你这个模型的 FLOPs 和显存账单,再上 GPU。
  3. 读 FlashAttention 论文的 tiling 图,对照自己 naive attention 的 profile。
  4. 用公开 isoFLOP / Chinchilla 图,手算「同样 1e20 FLOPs 该配多大 N、多少 D」。
  5. 抽一份小 crawl(或公开 FineWeb 子集),做语言过滤 + 去重,看词表和损失变化。
  6. 在小模型上做 SFT,再理解 RLVR:奖励必须能自动打分。

自学者 GPU:课页建议先 CPU 验证正确性,再租 H100/B200 跑训练或 kernel benchmark。调试正确性时烧云 GPU 是冤枉钱。

公开资源

整理依据:公开课页、作业说明与通用 LM 系统知识。讲义 PDF 未逐页翻译;若与某张 slide 冲突,以课页和作业 handout 为准。