数据截至 (上游 commit 3adf61e154c3)
nanoGPT — 架构与原理
30 秒导读: nanoGPT 是 Karpathy 写的「最小可读 GPT 训练库」:整个仓库的核心只有两个文件——
model.py(约 300 行的 GPT 模型)和train.py(约 300 行的训练循环),却完整覆盖「准备数据 → 从零预训练 → 微调 GPT-2 → 采样生成」的全流程,且能在 8×A100 上 4 天复现 GPT-2 (124M)。它是学习「现代 LLM 训练到底由哪几件事组成」的最佳起点,因为这里没有任何框架把细节藏起来。
1. 这是什么(零基础也能懂)
一句话定义
nanoGPT 是一个用纯 PyTorch 写的、刻意保持极小的 GPT 训练/微调/采样仓库:它把一个 decoder-only Transformer 语言模型和它的完整预训练循环,各自塞 进一个 300 行左右的文件里。
解决什么问题 / 给谁用
设想你想知道「训练一个 GPT 到底需要哪些零件」,去看工业级训练框架(Megatron、HF Trainer),你会淹死在几万行抽象里。nanoGPT 的回答是:把每一层抽象剥掉,只留骨架,让你一个下午就能读完一个能真跑出 GPT-2 水平模型的全部代码。
主要读者是想学懂原理的人:学生、研究者、要自己动手写训练循环的工程师。它不是给生产环境用的框架。
它能做什么
| 能力 | 具体形态 |
|---|---|
| 从零预训练 | train.py 单机或 DDP 多卡,默认配置复现 GPT-2 (124M)(config/train_gpt2.py) |
| 加载 GPT-2 权重 | GPT.from_pretrained 直接搬 OpenAI 官方 checkpoint(model.py:206) |
| 微调 | 换一个数据集目录 + init_from='gpt2-xl',其余与预训练相同(config/finetune_shakespeare.py) |
| 采样生成 | sample.py 从 checkpoint 或 GPT-2 权重自回归生成文本 |
| 基准测试 | bench.py 去掉训练杂事,只测每步耗时和 MFU |
用起来什么样
最快的体验路径(README 的 quick start):字符级小莎士比亚模型。
# 1. 下载 tiny-shakespeare 并转成 train.bin / val.bin / meta.pkl
python data/shakespeare_char/prepare.py
# 2. 训练一个 6 层小 GPT(A100 上约 3 分钟)
python train.py config/train_shakespeare_char.py
# 3. 从 checkpoint 采样
python sample.py --out_dir=out-shakespeare-char
严肃路径是复现 GPT-2 (124M):先 python data/openwebtext/prepare.py 生成约 9B token 的 train.bin,再 torchrun --standalone --nproc_per_node=8 train.py config/train_gpt2.py,约 4 天、val loss 到 ~2.85(README「reproducing GPT-2」一节)。
一句话直觉
把 nanoGPT 想成「GPT 的解剖标本」。 别的训练框架是穿好了衣服的完整动物,能跑能干活但看不清骨骼;nanoGPT 把皮肉都剥了,只剩一副骨架挂在架子上——每根骨头(注意力、初始化、优化器、学习率)都标着名字,你伸手就能摸到。
2. 顶层全景(它大概怎么转)
2.1 一张图看全流程
数据准备 训练 生成
───────────── ───────────────────── ──────────────
data/<语料>/ train.py sample.py
prepare.py │ │
│ ▼ ▼
原始文本 ──► token id ──► train.bin ──► get_batch ──► GPT 前向
(uint16 大数组) val.bin 随机切 (B,T) │
▼
loss ◄── 错位一个 token 的 y
│
▼
backward → 梯度裁剪 → AdamW 更新
│
▼
out_dir/ckpt.pt ──► 加载 ──► 逐 token 采样
怎么读这张图: 从左到右是数据的一生。三个脚本各管一段,train.bin(二进制 token 流)和 ckpt.pt(权重文件)是它们之间仅有的两个交接物。
2.2 部件职责
| 部件 | 干什么 | 在哪个文件 |
|---|---|---|
GPT 及子模块 | 模型本身:嵌入、N 个 Block、LayerNorm、lm_head | model.py |
| 训练主循环 | 取 batch、前向、反传、优化器步进、评估、存 checkpoint | train.py:255-333 |
get_batch | 从 .bin 随机切出 (x, y) 批次并送上 GPU | train.py:116-131 |
| 配置覆盖器 | 用 exec 让配置文件/命令行直接改写脚本全局变量 | configurator.py |
| 超参集合 | 每个真实跑过的实验一份(GPT-2 复现、微调等) | config/*.py |
| 数据准备 | 下载语料、tokenize、写成 uint16 二进制 | data/*/prepare.py |
| 采样脚本 | 加载权重、编码 prompt、调用 GPT.generate | sample.py |
| 基准脚本 | train.py 主循环的精简版,测速度和 MFU | bench.py |