Andrej Karpathy 又放大招了!
他刚刚发布了一个名为 nanochat 项目,用 8000 行代码实现了 ChatGPT 的完整训练流程。
在一个 8xH100 节点上跑 4 小时,花费约 100 美元,你就能拥有一个能对话、写故事、答题的 AI 助手。
这个项目延续了 nanoGPT 的极简哲学,但覆盖范围更广——
从 tokenizer 训练到强化学习,从预训练到 Web UI,全部包含在一个干净、依赖最少的代码库中。
快速开始
感受 nanochat 的魔力的最快方式是运行 speedrun 脚本:
# 克隆项目git clone git@github.com:karpathy/nanochat.gitcd nanochat
# 在 screen 会话中启动训练(记录日志)screen -L -Logfile speedrun.log -S speedrun bash speedrun.sh
4 小时后,你就能通过 Web UI 与你的 LLM 对话了:
python -m scripts.chat_web
访问显示的 URL(比如 Lambda 上是http://209.20.xxx.xxx:8000/),就能像使用 ChatGPT 一样与你的模型聊天。
技术架构
整个训练流程包含以下关键步骤:
Tokenizer 训练
Karpathy 用 Rust 重新实现了 tokenizer,因为 Python 版本太慢,HuggingFace 的又太臃肿。
训练使用 65,536 个词汇(2^16),在 20 亿字符上只需 1 分钟:
# 构建 Rust tokenizeruv run maturin develop --release --manifest-path rustbpe/Cargo.toml
# 训练 tokenizerpython -m scripts.tok_train --max_chars=2000000000python -m scripts.tok_eval
压缩比达到 4.8,比 GPT-2 的 tokenizer 表现更好,甚至在某些方面接近 GPT-4 的水平。
预训练
预训练阶段训练一个 20 层的 Transformer,约 5.6 亿参数:
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=20
模型配置自动生成:
1280 维度,10 个注意力头
每步处理 524,288 个 token
遵循 Chinchilla 缩放定律:5.6 亿参数 × 20 = 112 亿 token
总计算量:~4e19 FLOPs
训练过程中,学习率会自动缩放(1/√dim),使用 Muon 优化矩阵参数,AdamW 优化嵌入层。
中间训练
中间训练让模型适应对话格式,学会多选题和工具使用:
train_dataset = TaskMixture([ SmolTalk(split="train"), # 460K 对话 MMLU(subset="auxiliary_train"), # 100K 多选题 GSM8K(subset="main"), # 8K 数学题(教工具使用)]) # 总计:568K 行
对话格式遵循 OpenAI 的 Harmony 格式:
评估体系
项目包含完整的评估框架:
torchrun --standalone --nproc_per_node=8 -m scripts.chat_eval -- -i mid
评估结果会包含多个维度:
世界知识:ARC-E/C、MMLU(多选题,随机基线 25%)
数学能力:GSM8K(小学数学题,基线 0%)
编程能力:HumanEval(Python 编程,基线 0%)
ChatCORE:综合指标,去除基线后的平均分
成本与性能
100 美元版(4 小时)
# 默认配置,depth=20bash speedrun.sh
CORE:0.2219(接近 GPT-2 Large)
MMLU:31%
GSM8K:4.5%
能写故事、回答简单问题
300 美元版(12 小时)
# depth=26,需要调整批次大小torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- \ --depth=26 --device_batch_size=16
性能超过 GPT-2(CORE > 0.25)
更连贯的对话能力
1000 美元版(41.6 小时)
# depth=30,进一步减小批次torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- \ --depth=30 --device_batch_size=8
MMLU:40+ 分
ARC-Easy:70+ 分
计算量相当于 GPT-3 Small 的 1/1000
强化学习
项目实现了简化版 GRPO 算法,专门针对 GSM8K 数学题:
torchrun --standalone --nproc_per_node=8 -m scripts.chat_rltorchrun --standalone --nproc_per_node=8 -m scripts.chat_eval -- -i rl -a GSM8K
RL 训练抛弃了很多复杂机制:
无信任区域(去掉参考模型和 KL 正则化)
on-policy(去掉 PPO 的 ratio+clip)
GAPO 风格标准化(token 级别)
简单奖励偏移(去掉 z-score 标准化)
虽然简化,但效果明显:GSM8K 从 4.5% 提升到 7.6%。
推理引擎
项目包含自定义的Engine类,实现了高效推理:
KV 缓存
prefill/decode 两阶段推理
Python 解释器工具调用(轻量级沙箱)
CLI 和 Web UI 接口
代码组织
整个项目结构大致如下:
- 8,304 行代码- 44 个文件- 2,004 行依赖(uv.lock)- 约 83,497 个 token
每个脚本都有明确职责:
tok_train.py:训练 tokenizer
base_train.py:预训练
mid_train.py:中间训练
chat_sft.py:监督微调
chat_rl.py:强化学习
chat_web.py:Web 服务
不同硬件适配
代码设计考虑了各种计算环境:
单 GPU:去掉torchrun,结果几乎相同,时间延长 8 倍
显存不足:调整--device_batch_size
# 从默认的 32 逐步降低--device_batch_size=16 # 40GB VRAM--device_batch_size=8 # 20GB VRAM--device_batch_size=4 # 10GB VRAM
A100 节点:代码完全兼容,速度稍慢
社区反响
Chinmay Kak (@ChinmayKak) 分享了他的 nanosft 项目,一个单文件的微调实现:
正准备做一系列 repo,现在找到了对比基准
Plamen (@pvkdeveloper) 关心许可证:
README 里说是 MIT 许可,会保持这样吗?
zenitsu_apprentice (@zenitsu_aprntc) 好奇代码来源:
有多少代码是手写的?
Kacper Łukawski (@LukawskiKacper) 询问技术细节:
你是否实验过不同的 tokenization 算法?tokenizer 的选择对整体性能有多重要?
未来方向
Karpathy 强调,nanochat 远未完成。这是一个「强基线」代码库,设计目标是:
最大可 fork 性
认知复杂度最低
没有巨型配置对象
没有模型工厂
没有 if-then-else 怪物
你可以调整任何部分:tokenizer、数据、超参数、优化算法。通过简单调整--depth参数,就能训练出整个模型系列。
项目采用 MIT 许可证开源。
Karpathy 在致谢中提到的,这个项目受到了 nanoGPT 和 modded-nanoGPT 的启发,并得到了 HuggingFace(数据集)、Lambda(计算资源)和 Alec Radford(技术指导)的支持。
[1]
GitHub 仓库:https://github.com/karpathy/nanochat
[2]
详细技术讨论:https://github.com/karpathy/nanochat/discussions/1
[3]
Discord 频道:https://discord.gg/3zy8kqD9Cp
另外,我还用AI 进行了全网的AI 资讯采集,并用AI 进行挑选、审核、翻译、总结后发布到《AGI Hunt》的实时AI 快讯群中。
这是个只有信息、没有感情的 AI 资讯信息流(不是推荐流、不卖课、不讲道理、不教你做人、只提供信息、希望能为你节省一些时间)
欢迎加入!
也欢迎加群和7000+群友交流。