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


© Copyright 2026, Pin Fang.