用途
本技能用于从第一性原理构建 Transformer/GPT 与 BPE 分词器,属于“从零训练”层的能力。它不覆盖应用层的微调、RLHF 或推理优化,这些属于同级其他技能。教学主线是 GPT-2,先理解机制,再替换为现代基线。
主要能力
- 从零实现 autograd/反向传播(micrograd 风格)。
- 构建 makemore(bigram、MLP、WaveNet 风格字符语言模型)。
- 实现自注意力、多头注意力、因果掩码。
- 构建 Transformer 块(pre-norm 与 post-norm、残差、FFN)。
- 堆叠块为 GPT,加入 LM head 与权重绑定。
- 编写预训练循环:交叉熵、bf16 混合精度、梯度累积、梯度检查点、带 warmup 的余弦学习率调度、模型检查点。
- 从零构建 BPE 分词器:字节级、合并算法、词表构建、编解码(minbpe 风格)。
- 端到端复现 GPT-2(124M,nanoGPT 路径)。
- 实现温度缩放与 top-k 采样用于文本生成。
- 现代架构替换:RoPE 替代 wpe、RMSNorm 替代 LayerNorm、SwiGLU 替代 GELU-MLP、GQA、F.scaled_dot_product_attention,可选 Muon 训练。
使用方式(默认工作流)
- 先实现 autograd:Value 类带 backward(),构建 MLP,与 PyTorch 对比验证梯度。
- 字符 LM 阶梯:bigram 表 → MLP(makemore)→ 验证损失收敛与采样。
- 注意力模块:单头自注意力带因果掩码;验证每行注意力权重和为 1。
- 多头注意力:拆分头、拼接、投影;用相同权重、掩码、dropout 与 nn.MultiheadAttention 在数值容差内比较。
- Transformer 块:加入 FFN(4x、GELU)、pre-LayerNorm、残差;与 nanoGPT 块对齐。
- GPT 组装:堆叠 N 个块,加 LM head,与嵌入权重绑定;验证前向形状。
- 预训练循环:DataLoader、交叉熵、在支持时用 torch.autocast('cuda', dtype=torch.bfloat16)、梯度累积、余弦或 WSD 学习率、检查点(权重与数据位置)。可用 python3 scripts/check_loop.py --model yourmodule:build 验证:step-0 损失 ≈ ln(V)、累积微批次梯度等于大批次梯度、改变未来 token 不影响更早 logits。无 --model 时只运行内置演示。随后取吞吐收益:torch.set_float32_matmul_precision('high') 启用 TF32、vocab_size 从 50257 填充到 50304、跟踪 MFU 而非 tokens/sec。
- BPE 分词器:字节级文本编码、统计 bigram 频率、贪心合并循环、构建词表、编解码往返。
- GPT-2 复现:通过 HuggingFace 加载 OpenAI 权重,验证 logits 匹配,然后在 FineWeb-Edu 上从零训练。 9a. 采样:实现温度缩放与 top-k 采样;可选加 KV-cache 提升推理速度。
- 现代化:替换为现代基线——RoPE、RMSNorm、SwiGLU、GQA、F.scaled_dot_product_attention;可选 Muon 训练。
现代基线
先构建 GPT-2 理解机制,再应用增量——pre-norm 残差骨架不变,只替换子层。GPT-2(2019)到现代基线的替换:学习式绝对位置嵌入(wpe)→ RoPE;LayerNorm → RMSNorm;GELU-MLP(4×)→ SwiGLU(约 8/3×);MHA(KV 头=查询头)→ GQA(更少 KV 头);手写 softmax 注意力 → F.scaled_dot_product_attention;AdamW 全参数 → Muon(2D 矩阵)+ AdamW(嵌入/头/归一化);无 q/k 归一化 → QK-Norm。前沿参考:modded-nanoGPT 速度跑堆叠 Muon、QK-Norm、ReLU²、logit softcap、嵌入跳跃连接,在 8×H100 上更快达到 GPT-2 级 FineWeb 验证损失。完整从零流水线(分词器 → 预训练 → SFT → RL → 服务)可参考 Karpathy 的 nanochat。
超参数、调度与稳定性
- 迁移超参数而非在目标规模搜索:默认用 µP 参数化,在小代理上调 LR/init,再零样本迁移到宽目标。µTransfer(Yang et al. 2022, arXiv 2203.03466)在 40M 代理上调优,超过已发表 GPT-3 6.7B 数字,调优成本约为总预训练成本的 7%。不要在目标规模网格搜索 LR。若不用 µP,在 3+ 小代理预算上拟合 η_opt(C) 与 B_opt(C),再读出目标值。单规模 124M 复现不需要,一次 LR 扫描即可。
- 调度与退火:token 预算固定时用余弦;可能变化时用 WSD(warmup–stable–decay)。衰减阶段可兼作廉价数据探针和最高质量数据的中训练阶段。warmup 用 token 或步数表述,不用运行百分比。
- 损失尖峰(工作协议,非验证标准):每步记录最大注意力 logit、最大输出 logit 和更新/权重比;用 QK-norm 和小 z-loss 预防;尖峰不恢复时跳过批次窗口并回滚到最近良好检查点;反复尖峰则降低峰值 LR。
适用场景
- 学习或教学从零实现 GPT 与 BPE 分词器。
- 复现 GPT-2 124M 端到端流程。
- 在小型代理上迁移超参数后放大训练。
- 将 GPT-2 教学骨架升级为现代架构基线。
限制
- 不覆盖微调与适配(SFT/PEFT/蒸馏)、模型/提供商选择、部署。
- 不覆盖多 GPU 训练(DDP、FSDP、张量/流水线并行)。
- 不覆盖 token/参数预算、Chinchilla 缩放、计算最优运行。
- 不覆盖预训练数据集策展、去重、质量过滤。
- 不覆盖评估框架、基准设计、预训练后评估。
- MoE 的构建时机制在架构限制章节讲授,分布式训练与服务/推理属于其他技能。
- 分类微调、指令/SFT 微调、LoRA/PEFT 属于预训练后应用,本技能止于预训练。
- 需对照当前 PyTorch 文档验证 API 细节,对照 GitHub 仓库验证 nanoGPT 与 minbpe 状态。
已知陷阱与反模式(摘要)
零梯度位置、post-norm 与 pre-norm、因果掩码填充值、梯度累积缩放、权重绑定在 state_dict 中的处理、BPE 编解码往返需先 UTF-8 字节、DataLoader 种子、torch.compile 与梯度检查点冲突、DDP 微循环梯度同步、恢复时未保存数据位置等。反模式包括:不验证注意力权重和、跳过 PyTorch 对齐检查、自顶向下构建、无基线损失训练、使用默认 Adam betas、内存中分词整个数据集、把 GPT-2 架构当作最终产品。
核心原则
先构建再阅读;无黑盒,每个组件堆叠前需单元验证;一次一个组件;PyTorch 对齐检查;训练指标失败要大声报错(step-0 损失偏离 ln(vocab_size) 超过 10% 即停止调试)。