新月图床
2.56M · 2026-04-06
这是"一天一个开源项目"系列的第22篇文章。今天带你了解的项目是 nanochat(GitHub),作者是 Andrej Karpathy。项目 slogan 是:The best ChatGPT that $100 can buy(百元能买到的最好的 ChatGPT)。
nanochat 不是又一个臃肿的「LLM 框架」——没有巨型配置对象、没有模型工厂、没有满屏 if-else。它是一个极简、可读、可改、可 fork 的端到端实验套件:从分词、预训练、微调、评估到推理和聊天 Web UI,全部打通;并且通过一个旋钮 --depth(Transformer 层数)自动推导出宽度、头数、学习率、训练步数等,得到计算最优的一族模型。你想「要一个 GPT-2 水平的模型」?把 depth 调到约 26,跑一遍 runs/speedrun.sh,几小时后就能在类 ChatGPT 的界面上和它对话。
--depth 如何决定计算最优的超参与模型规模torchrun)有粗浅认识更佳nanochat 是 Andrej Karpathy 开源的极简 LLM 实验套件,面向单 GPU 节点(如 8×H100),代码量小、结构清晰、便于阅读和修改。它覆盖 LLM 的完整链路:分词(tokenization)、预训练(pretraining)、微调(SFT/RL)、评估、推理与聊天 UI。目标不是做成「可配置一切」的框架,而是提供一个强基线:从零跑到能对话的 ChatGPT 式模型,成本控制在百美元量级(例如 8×H100 约 3 小时、约 72 美元;spot 实例可低至约 20 美元)。
项目解决的核心问题:
面向的用户群体:
nanochat 的核心作用是在单机多卡上,用最少心智负担,跑通从数据到可对话 LLM 的全流程,并默认给出计算最优的一族模型(通过 --depth 一个旋钮):
复现「百元 GPT-2」并与之对话
bash runs/speedrun.sh,约 3 小时后用 python -m scripts.chat_web 启动 Web UI,像用 ChatGPT 一样和模型对话(写诗、问答、看幻觉等)研究与迭代预训练
runs/scaling_laws.sh、runs/miniseries.sh 做 scaling 实验;用 --depth=12 等小模型做约 5 分钟级的快速预训练迭代,通过 wandb 看 val_bpb、core_metric、MFU、tok/s 等教学与理解全流程
为模型注入身份/人格
扩展新能力
环境:推荐 Python + uv,项目根目录有 pyproject.toml 与 uv.lock。
一键复现 GPT-2 并对话(需 8×H100 级节点,如 Lambda):
# 克隆
git clone && cd nanochat
# 创建虚拟环境并安装依赖(示例)
uv venv && source .venv/bin/activate
uv sync
# 跑完整 pipeline(预训练 + 微调等,约 3 小时)
bash runs/speedrun.sh
训练结束后,启动聊天 Web UI:
source .venv/bin/activate
python -m scripts.chat_web
在浏览器访问终端里打印的 URL(如 ;机器IP>:8000/),即可像 ChatGPT 一样与模型对话。
单 GPU 或小显存:可去掉 torchrun 单卡跑(会慢约 8 倍);显存不足时在脚本中调小 --device_batch_size(如 32→16→8→4→2→1)。CPU/Apple Silicon:见 runs/runcpu.sh,会大幅缩小模型与步数,仅作演示,效果有限。
单一复杂度旋钮 --depth
Time-to-GPT-2 排行榜
dev/LEADERBOARD.md 持续更新。全流程覆盖
极简代码库
nanochat/ 核心库 + scripts/ 入口 + runs/ 脚本 + tasks/ 任务),便于阅读和改代码。分布式与单卡统一
torchrun,单卡自动退化为梯度累积,结果一致。ChatGPT 式 Web UI
scripts.chat_web 提供本地 Web 界面,与训练好的 chat 模型对话。研究友好
| 对比项 | nanochat | nanoGPT | 大型 LLM 框架(如 HuggingFace 全家桶) |
|---|---|---|---|
| 流程完整性 | 分词→预训练→微调→评估→聊天 | 仅预训练 | 全流程但配置复杂 |
| 认知负担 | 一个旋钮 --depth | 需自己配超参 | 配置项多、学习曲线陡 |
| 代码规模 | 精简、可 hack | 精简 | 庞大、抽象多 |
| 目标 | 百元级可对话 ChatGPT 式模型 | 预训练基线 | 通用、企业级 |
| 排行榜/社区 | Time-to-GPT-2 + Discussions | 无 | 各有生态 |
为什么选择 nanochat?
项目以「库 + 脚本 + 运行配置」分层:
nanochat/:核心库
gpt.py:GPT Transformertokenizer.py:BPE 封装dataloader.py、dataset.py:分布式数据与 tokenizationoptim.py:AdamW、Muon,单卡与分布式engine.py:推理与 KV Cachecheckpoint_manager.py: checkpoint 读写core_eval.py:CORE 分数(DCLM);loss_eval.py:bits per byteexecution.py:模型可执行 Python 作为工具(若启用)ui.html:聊天前端静态资源scripts/:入口
base_train.py / base_eval.py:预训练与评估chat_sft.py / chat_rl.py:微调;chat_cli.py / chat_web.py:对话tok_train.py / tok_eval.py:分词训练与评估runs/:一键脚本
speedrun.sh:从零到 GPT-2 级并对话scaling_laws.sh、miniseries.sh:研究与 miniseriesruncpu.sh:CPU/MPS 小规模演示tasks/:评估与数据
TaskMixture / TaskSequence 与自定义 jsonl(customjson.py)nanochat 的设计核心是:用户只设 --depth(层数),其余(宽度、头数、学习率、训练步数、weight decay 等)由代码按计算最优关系自动算出,从而得到一族在不同规模上都是「算力用得最值」的模型。GPT-2 能力对应的模型大约在 depth 24–26;改 depth 即可得到更大或更小的 miniseries 模型。任何对 repo 的改动都被要求在不同 depth 下都合理,避免只针对某一规模调参。
预训练是当前开发重点。Time-to-GPT-2 定义为:在 8×H100 节点上,墙钟时间达到超过 GPT-2 (1.6B) 的 DCLM CORE 分数(0.256525)。README 中的表格会更新最佳时间(目前约 2.76–3.04 小时)、val_bpb、CORE、描述、日期与 commit。研究时可用小 depth(如 12)做短时预训练,在 wandb 中观察 val_bpb、core_metric、MFU、tok/s 等,快速验证想法。
tasks/ 中增加新任务或数据格式,参考 counting r in strawberry。dev/repackage_data_reference.py 等与 pretraining 数据分片相关。.python-version,推荐用 uv 管理环境device_batch_size 或使用 runcpu.sh 类脚本欢迎来我中的个人主页找到更多有用的知识和有趣的产品