数据截至 (上游 commit 92d63d4e8bb4)
nanochat — 架构与原理
30 秒导读: nanochat 是 Karpathy 的「最小全栈 ChatGPT 复刻」:一个仓库、一台 8×H100、约 1.5 小时、约 $48,从原始文本走完 tokenizer → 预训练 → SFT → RL → CLI 对话的全流程,训出一个 GPT-2 级别的聊天模型。它是目前读「一个 chat 模型到底是怎么造出来的」最完整的可读参照。
1. 这是什么(零基础也能懂)
一句话定义
nanochat 是一个单机可跑通的 LLM 全管线实验台:从下载原始文本、训分词器开始,到预训练一个 GPT,再做监督微调(SFT)和强化学习(RL),最后用带 KV cache 的推理引擎在命令行和你聊天——每一步都是这个仓库里几百行可读的 PyTorch。
解决什么问题 / 给谁用
学 LLM 的人面对的通常是一堆「各管一段」的库:训分词器的不管训练,训练的不管对齐,对齐的不管推理。nanochat 把整条链放进同一个仓库,回答三个问题:
- 从原始文本到 chat 模型,完整管线长什么样,一步不藏。
- SFT 相对预训练在什么位置,RL 又在 SFT 之上加了什么。
- 每个阶段实际要多少算力、多少代码。
它面向想端到端读懂并 hack 的研究者与工程师,而不是想要 SOTA 模型或万能框架的用户。README 原话:为「一个人的可读性」优化,不为 SOTA 优化。
它能做什么
| 阶段 | 脚本 | 干什么 |
|---|---|---|
| 分词 | scripts/tok_train.py | 用 rustbpe 在 ~2B 字符上训 32K BPE 分词器 |
| 预训练 | scripts/base_train.py | 训 base GPT,--depth 一个旋钮定全部规模超参 |
| 基座评测 | scripts/base_eval.py | CORE 分数(DCLM 论文)+ bits per byte |
| SFT | scripts/chat_sft.py | 在对话混合数据上教模型聊天、多选、工具调用 |
| RL | scripts/chat_rl.py | 在 GSM8K 上做 on-policy 策略梯度 |
| 对话评测 | scripts/chat_eval.py | ARC / MMLU / GSM8K / HumanEval + ChatCORE |
| 推理 | scripts/chat_cli.py | KV cache 引擎对话,内置计算器工具 |
用起来什么样
整个 GPT-2 复现就装在一个 shell 脚本(runs/speedrun.sh)里,核心四步:
python -m scripts.tok_train # 1) 训分词器
torchrun --nproc_per_node=8 -m scripts.base_train -- --depth=24 --fp8 # 2) 预训练
torchrun --nproc_per_node=8 -m scripts.chat_sft # 3) SFT
python -m scripts.chat_cli # 4) 聊天
然后就能对话(README 实录,speedrun 模型):
User: Why is the sky blue?
Assistant: The sky is blue due to an optical illusion called the Rayleigh Scattering of Light, which occurs when sunlight passes through tiny particles in the air...
README 自嘲这个 4e19 FLOPs 的模型「有点像和幼儿园小孩聊天」——它会幻觉,但管线是真的。
一句话直觉 / 类比
把 nanochat 想成一本可以直接执行的教材:兄弟项目 nanoGPT 只写了「预训练」一章,nanochat 把整本书写完——分词、预训练、后训练、推理,每章只有几百行。