Build LLM from Scratch
目录
为什么需要 Build LLM from Scratch
LLM 入门基础知识
资源核算
Tensor 是所有状态的共同载体
低精度不是省内存这么简单
CPU 与 GPU:tensor 放在哪里决定了计算路径
Einops:给 tensor 维度命名,减少形状错误
FLOPs 与 FLOP/s:一个是工作量,一个是速度
Arithmetic intensity:判断 memory-bound 还是 compute-bound
反向传播的计算账:为什么是 6 * tokens * parameters
Optimizer state 与 activation memory:显存账本不能只算参数
Activation checkpointing:用更多计算换更少显存
BPE tokenizer
为什么需要 BPE?——传统分词的痛点
BPE 的核心原理(两阶段)
阶段 1️⃣:
构建词汇表(训练阶段)
阶段 2️⃣:
分词(推理阶段)
BPE 在 LLM 中的实际实现细节
常见变体与增强:
BPE 的优缺点
✅ 优点:
❌ 缺点:
BPE 实现
实现思路
BPE 编码和解码:训练时学到的顺序必须完整复用
Demo 实现:
工业级实现:
Transformer (decoder-only) 模型实现
现代 Transformer 架构与超参数的工程默认值
先确定 baseline:现代 Transformer 和原始 Transformer 差在哪里
RMSNorm 和无 bias:小操作为什么能影响 wall-clock time
FFN 的演化:SwiGLU 为什么不是“换个激活函数”这么简单
RoPE:把相对位置写进 attention 内积
超参数共识:默认值背后是预算分配
稳定性技巧:softmax 是最容易放大问题的地方
GQA / MQA:推理瓶颈为什么会从计算转向 KV cache
滑动窗口和混合注意力:用图结构控制长上下文成本
Embedding layer
FFN & PreNorm Layer
Pre-norm block:残差主干必须保持干净
RMSNorm
GLU 和 SwiGLU:FFN 的门控不是换激活函数这么简单
RoPE (Rotary Position Embedding)
把 head dimension 两两看成二维平面
相对位置来自旋转矩阵的群性质
二维展开后能直接看到 sin 和 cos
为什么要用一组频率
具体实现:rotate_half 只是矩阵乘法的向量化写法
为什么 RoPE 只作用在 query 和 key 上
Attention & Transformer
ScaledDotProductAttention
MultiHeadAttention
MultiHeadAttentionWithRoPE
TransformerBlock
Transformer
Optimize
Loss
Optimizer —— AdamW
Consine LR Scheduler
Gradient Clip
资源核算:矩阵乘法决定了大部分 FLOPs
Attention Alternatives 与 MoE
标准 attention 为什么贵
线性注意力的第一步推导:换一下乘法顺序
特征映射通常怎么设计
从线性注意力到 Mamba-2:递推状态需要会遗忘
为什么现代模型喜欢混合,而不是押注单一替代品
稀疏注意力:不是所有 token 都值得看
MoE :增加总参数,但不增加每个 token 的计算量
Top-k routing:每个 token 自己选择专家
为什么 MoE 训练难:离散路由不可微,负载还不能失衡
系统侧的 MoE:计算少了,通信变成主角
MoE 的随机性:为什么别人的请求会影响我的输出
从 upcycling 到 DeepSeek MoE:把 dense 模型改造成 sparse 模型
MLA:继续压缩 KV cache,但要处理 RoPE 冲突
怎样选择 Attention alternatives 和 MoE
小结
大模型推理优化基础
性能优化的第一原则:先证明自己测到了真实工作
GPU 计时最容易犯的错:只量到 CPU 发射时间
冷启动不是稳态性能
“多快”与“为什么快”是两类测量
单 GPU 显存:先把“放不下”拆成几本账
残差流只是下界,注意力矩阵才可能是平方项
算子融合:减少的不只是 kernel 数量
激活检查点:用重算换取更短的张量生命周期
FlashAttention-2:注意力的瓶颈为什么首先是数据移动
在线 softmax:不同 tile 的归一化如何拼成同一个答案
反向传播:保存小状态,重算大矩阵
TTFT、TPOT 与吞吐
Prefill 与 Decode
Roofline 视角:瓶颈取决于每搬一个字节做多少计算
为什么 Prefill 容易吃满算力,Decode 却被内存拖住
MLP:batch 和 token 都能复用同一组权重
Attention:每条序列都必须读取自己的 KV cache
延迟与吞吐为什么天然冲突:Llama 2 13B 的理论账本
第一条路线:让 KV cache 更小
从 MHA 到 GQA / MQA:减少 KV head
MLA:缓存 latent,而不是完整 K/V
CLA、滑动窗口与稀疏注意力:继续压缩层和时间维
第二条路线:让每个字节更便宜
第三条路线:剪掉工作,再用蒸馏修复
Speculative Sampling:把慢生成改造成快验证
用二元词表看清为什么分布不变
真实流量不是矩形张量:Continuous Batching
PagedAttention:像操作系统一样管理 KV cache
小结
分布式训练/推理
从单卡到多卡:瓶颈从 HBM 扩展到互联
通信原语:rank、world size 和 collective operations
PyTorch distributed:代码里真正发生了什么
带宽怎么核算:看 duration 之前先看 bytes
数据并行:切 batch,复制模型
复制模型之后,真正要优化的是梯度同步
Ring all-reduce 的带宽账
DDP 模型训练示例
FSDP (Fully Sharded Data Parallel)
张量并行:切宽度,每层都要通信
核心问题:矩阵乘法该切输入,还是切输出
流水线并行:切深度,用 micro-batch 减少空泡
没有 micro-batch 时,空泡从哪里来
Micro-batching:用更多在途样本摊薄填充与排空
更多工程环节
Looping Pipeline:同一组设备为什么要让模型多走一圈
Expert parallel:MoE 的计算省了,all-to-all 变重
从路由结果到专家输出:一次 MoE 层到底发生了什么
为什么 top-k 和 EP degree 会直接放大通信
平均负载不够:capacity、dropless 与真正的长尾
为什么 Grouped GEMM 能救小专家,却救不了慢 rank
拓扑与 overlap:通信“被隐藏”不等于通信消失
训练、prefill 与 decode 是三种不同的 EP 性能问题
从症状反推瓶颈:一张 EP 排障表
3D/4D 并行:先让模型放得下,再让 GPU 吃得饱
训练数据准备
(opt) Data Parallel 多卡初始化
Checkpoint
Scaling Laws:用小实验预测大模型
Scaling law 到底在预测什么
为什么会出现幂律:从均值估计开始
数据不是只看数量:composition、重复和有限数据
从数据 scaling 到模型工程:小模型实验可以回答大模型问题
Critical batch size:batch 不是越大越好
学习率和参数化也要随 scale 调整
联合 scaling:数据和模型要一起优化
Chinchilla 和 IsoFLOPS:固定算力下找最优模型大小
Train-optimal 不等于产品最优
怎么把 scaling laws 用到训练决策里
模型输出采样
核心采样方法(按使用频率排序)
Temperature 调节(基础预处理,必用)
Top-p 采样(Nucleus Sampling)— 当前工业界首选
Top-k 采样
贪婪搜索(Greedy Search)
Beam Search(搜索算法,非采样)
实现
训练数据预处理
从在线服务到静态快照
常用数据源地图:不同来源携带不同结构与风险
从数据集演进看预处理方法
过滤:把“什么是好数据”变成可扩展的选择器
海量数据去重
数据混合:比例之外,还要计算每个来源会被看多少遍
合成推理数据
SWE 数据
数据处理pipeline
从互联网网页提取纯文本
识别目标语言
文本质量粗过滤
文本质量分类
有害数据检测
Mask PII
去重
模型评测
“好”不是一个标量,而是一组约束
困惑度
考试型 benchmark
开放回答
Agent 评测
纯推理与安全:评测对象会从能力扩展到边界条件
生态有效性:benchmark 像不像真实使用
有效性审计:分数是否真的来自你想测的能力
评测对象
小结
SFT-有监督微调
后训练流水线
SFT 的训练目标
指令数据如何演进
多维度评价
SFT 更擅长抽取已有能力,而不是可靠写入陌生事实
把 instruction tuning 前移:mid-training 的机会与代价
怎样判断一轮 SFT 是否真的成功
RLHF - 强化微调
从 imitation 到 optimization:为什么示范不足以表达偏好
偏好数据怎么采
人类反馈不是金标准
AI feedback 与 Constitutional AI
奖励模型:把成对偏好压缩成一个标量差
PPO-RLHF:最大化奖励,同时不让策略跑得太远
DPO:把 KL 正则化偏好优化改写成离线分类损失
现代后训练不是一次 DPO,而是数据与模型共同迭代
奖励过优化、长度黑客与多样性下降
小结:算法上限由反馈质量和评测合同共同决定
可验证奖励强化学习(RLVR)
从偏好奖励到可验证奖励
PPO 基线:两个旧策略不能混为一谈
GRPO:用同题多回答的相对成绩替代 critic
一个 G=4 的手算:归一化如何悄悄改写权重
DeepSeek-R1:纯 RL 实验与可用模型配方是两件事
Kimi k1.5:长上下文 RL 首先是采样与调度问题
Qwen3:3995 对 query–verifier 不等于“小计算量”
从答案验证器到 Agent 环境:奖励必须覆盖状态变化
落地 RLVR:把算法选择变成一套可审计实验
多模态大模型的编码、对齐与统一生成
多模态理解与多模态生成
CLIP:用双向对比学习建立视觉—语言坐标系
SigLIP:把全局 softmax 改成逐对二元判断
视觉 token 账本:分辨率如何变成计算量
LLaVA:一个 projector 如何让 LLM 开始“看图”
AnyRes:用局部切片换细节,再用 token 预算收口
从固定压缩到动态分辨率:Qwen-VL 的接口演进
MRoPE 与 DeepStack:不仅要有 token,还要保留结构
多模态训练不是简单拼接:谁在主导梯度
Chameleon:把图像也变成可生成的离散词表
统一自回归训练为何更容易不稳定
如何选择架构
本文涉及代码可参考
参考
Build LLM from Scratch
Search
Please activate JavaScript to enable the search functionality.