2019 年训练一个 GPT-2 级别的模型 reportedly 花了 4.3 万美元;现在 nanochat 的 README 上写着:用 8 块 H100 跑大概 1 个半小时,成本 48 美元左右,就能训出一个 GPT-2 水平、还能对话的模型。spot 实例甚至可以压到 15 美元。
一句话先说结论
nanochat 不是又一个"LLM 框架",而是一个端到端的"实验套件"。它从分词、预训练、微调、评估到推理和聊天 UI 全包了,代码量不大,读得懂、改得动。最吸引我的是:它用一个整数--depth(Transformer 层数)当"复杂度旋钮",宽度、头数、学习率、训练步数这些超参自动算好,用户基本不用调。
这项目到底解决了什么问题
我自己之前想跑通一个 LLM 训练流程,通常会遇到三种崩溃:
- 框架太胖:打开仓库,光是配置文件就有十几种,model factory、trainer、registry 层层封装,改一行要追十行。
- 超参太多:学习率、warmup、weight decay、batch size、调度策略……每个都要猜,错了就 OOM 或者训飞了。
- 只能训不能聊:很多项目只到预训练这一步,想做成能对话的模型,还得自己接 SFT、RL、推理引擎、Web UI,等于重新搭一座桥。
nanochat 的思路是:把上面这三件事全部压进一条命令里。它不是让你"配置一切",而是给你一个强基线——你 fork 过去,改几行就能做实验,或者直接用默认配置跑出一个能对话的小模型。
一个旋钮调所有:--depth
这是 nanochat 最有意思的设计。你不用写 30 行配置,只要告诉它:
--depth=26代码就会自动推出:模型宽度、注意力头数、学习率、训练步数、weight decay 等等,按"计算最优"的方式配好。
打个比方:--depth就像汽车排量。你只需要说"我要 1.5L 还是 2.0L",油耗、变速箱、轮胎尺寸 nanochat 帮你配齐。GPT-2 的水平大致对应--depth在 24–26 之间。
这种设计有个好处:你做任何改动,都得保证它在不同 depth 下都合理,而不是只针对某一个规模 hand-tune。这让整个 repo 更像个连贯的研究基线,而不是一个大杂烩。
Time-to-GPT-2:一个挺刺激的排行榜
nanochat 主打的指标叫Time-to-GPT-2[达到 GPT-2 水平的墙钟时间]。判定标准是DCLM CORE 分数[一种评估语言模型综合能力的基准分,可以理解成 LLM 的"期末考分数"] 超过 OpenAI 原版 GPT-2(1.6B)的 0.256525。
目前 leaderboard 上最快的记录已经卷到 1.65 小时。我把主要条目整理了一下(val_bpb是验证集上的 bits per byte [衡量模型压缩文本能力的指标,越低越好]):
| 排名 | 时间 | val_bpb | CORE | 说明 | 日期 |
|---|---|---|---|---|---|
| 0 | 168 小时 | - | 0.2565 | OpenAI 原版 GPT-2 checkpoint | 2019 |
| 1 | 3.04 小时 | 0.74833 | 0.2585 | d24 baseline,略微过拟合 | 2026-01-29 |
| 2 | 2.91 小时 | 0.74504 | 0.2578 | d26 + fp8 | 2026-02-02 |
| 3 | 2.76 小时 | 0.74645 | 0.2602 | 总 batch size 提到 1M tokens | 2026-02-05 |
| 4 | 2.02 小时 | 0.71854 | 0.2571 | 数据集换成 NVIDIA ClimbMix | 2026-03-04 |
| 5 | 1.80 小时 | 0.71808 | 0.2690 | autoresearch 第一轮 | 2026-03-09 |
| 6 | 1.65 小时 | 0.71800 | 0.2626 | autoresearch 第二轮 | 2026-03-14 |
数据来源:nanochatdev/LEADERBOARD.md。你可以看到,大家基本在预训练阶段疯狂优化——这也是目前项目开发最热闹的地方。
从代码结构看,它到底长什么样
我翻了一下源码,目录很清爽,没有巨型抽象:
nanochat/ # 核心库 gpt.py GPT Transformer [Transformer 是处理序列数据的神经网络结构] tokenizer.py BPE 分词器封装 [BPE 是把文字切成小片段的算法] dataloader.py 分布式数据加载 optim.py AdamW / Muon 优化器 engine.py 带 KV Cache 的推理引擎 [KV Cache 是推理时缓存已算信息,避免重复计算] core_eval.py CORE 分数评估 ... scripts/ # 入口脚本 base_train.py 预训练 base_eval.py 评估 chat_sft.py 监督微调 [SFT:用对话数据专项训练,让模型学会回答问题] chat_rl.py 强化学习 [RL:用反馈打分,让回答更像人] chat_cli.py 命令行聊天 chat_web.py Web 聊天 UI ... runs/ # 一键脚本 speedrun.sh 从零到 GPT-2 级并对话 scaling_laws.sh 缩放定律实验 miniseries.sh 训练一族不同 depth 的模型 runcpu.sh CPU / Apple Silicon 小 demo没有 model factory,没有满屏 if-else,代码基本都是普通 PyTorch。这也是它适合学习和二次开发的原因。
怎么跑:一条命令复现"百元 ChatGPT"
环境推荐用 uv,项目根目录有pyproject.toml和uv.lock。
# 1. 克隆gitclone https://github.com/karpathy/nanochat.git&&cdnanochat# 2. 装依赖(CUDA 版本)uvsync--extragpusource.venv/bin/activate# 3. 在 8×H100 节点上跑完整 pipelinebashruns/speedrun.shREADME 上说这个脚本大概跑1.5 小时。按当前 8×H100 节点约 $24/小时算,成本就是$48 左右。如果用 spot 实例,能到$15 左右。
跑完之后,启动命令行聊天:
python-mscripts.chat_cli或者启动 Web UI:
python-mscripts.chat_web浏览器打开终端里打印的地址,就能像 ChatGPT 一样跟模型对话。
我试了一下示例对话,效果大概像一个"幼儿园小朋友"——能回答问题、写诗,但会一本正经地胡说八道。README 里给的例子也特实在:你问它"天为什么是蓝的",它会跟你聊瑞利散射;你让它写首诗,它会贡献一堆"blue"。
没有 8 块 H100 怎么办
nanochat 也考虑到了穷鬼方案:
- 单 GPU:去掉
torchrun,自动退化成梯度累积,结果基本一致,但慢 8 倍。 - 显存不够:把
--device-batch-size从默认 32 往下降,16 → 8 → 4 → 2 → 1,直到不爆显存。 - CPU / MPS:跑
runs/runcpu.sh,模型和步数会大幅缩水,只能看个热闹,别指望效果。
精度这块也做了简单兜底,按硬件自动选 dtype:
| 硬件 | 默认 dtype | 原因 |
|---|---|---|
| A100 / H100(SM 80+) | bfloat16 | 原生支持 bf16 Tensor Core |
| V100 / T4(SM < 80) | float32 | 不支持 bf16,可手动设NANOCHAT_DTYPE=float16 |
| CPU / MPS | float32 | 安全默认;新 macOS 上 MPS 可跑 bf16 |
跟 nanoGPT、modded-nanogpt 有什么区别
很多人看到 nanochat 会想到 Karpathy 之前的 nanoGPT。我整理了一张对比表:
| 维度 | nanochat | nanoGPT | 大型 LLM 框架(HF / Megatron 等) |
|---|---|---|---|
| 覆盖阶段 | 分词 → 预训练 → 微调 → 评估 → 聊天 | 只有预训练 | 全流程,但配置复杂 |
| 上手难度 | 一个--depth旋钮 | 需手动调超参 | 配置项多、学习曲线陡 |
| 代码量 | 精简、可 hack | 精简 | 庞大、抽象多 |
| 目标 | 百元级可对话模型 | 预训练基线 | 企业级通用训练 |
| 社区玩法 | Time-to-GPT-2 排行榜 | 无 | 各有生态 |
modded-nanogpt 更像是 nanoGPT 的"竞速改装版",专注于把预训练推到极致;nanochat 则把它扩展成了完整的"从数据到对话"链路。
适用人群
从我自己的体验来看,这几类人可能会觉得它好玩:
- 想亲手训一个 LLM 并跟它聊天的开发者:百元级、一条命令、几小时就能对话,成就感拉满。
- 做 scaling / 预训练研究的人:默认配置就是强基线,改起来不累。
- 教学场景:代码结构清晰,适合讲"从 token 到 chat"的全流程。
- 需要可 fork 基线的团队:不像大框架那样被配置绑架,改几处就能出实验变体。
几个注意事项
- 项目还在快速迭代,master 代码可能比讨论区的旧帖子新很多,看文档时留意日期。
- 提交 PR 需要披露哪些部分用了 LLM 辅助,这点挺有意思。
- 如果你只是想"用"一个强模型,直接下载现成的更好;nanochat 的价值在于你亲自跑通、亲自改。
我的看法
nanochat 最有价值的地方不是"便宜",而是它把 LLM 训练的认知成本也打下来了。你可以花一个下午,从 0 走到"和自己训的模型聊天",中间每一步都看得见、改得了。对于想理解 LLM 是怎么从一堆文本变成能对话的助手的人来说,这比读十篇论文都管用。
如果你也有 8×H100(或者单卡 + 耐心),值得一试。
项目地址:https://github.com/karpathy/nanochat