从 tokenizer 到网页聊天的端到端迷你大模型,全程可复现、可魔改、可炫耀。


“老板,要 1750 亿参数吗?先批 1000 万美元预算。”
——如果你也在会议室里听过类似对白,大概率会对“大模型=大钱”这件事深信不疑。直到 Andrej Karpathy 把 nanochat 塞进 GitHub,用一张 8×H100 的账单(≈ 100 USD)就把“私人版 ChatGPT”端到端跑通。今天这篇文章不是广告,是一份可抄作业的实验笔记:从开机到聊天,只需 4 小时;从聊天到魔改,只剩你的脑洞。


一、把 100 美元花在哪里?——速通全景图

成本项 明细 备注
算力 8×H100 节点租金 Lambda 等云厂商 ≈ 24 USD/h,4 h 合计 96 USD
存储 系统盘 + 数据集缓存 通常赠送 200 GB,超出按量几分钱,可忽略
网络 下载开源语料 公共数据集免费,走云内网流量 0 结算

结论:只要 100 USD 出头,就能把“Tokenizer → Pretrain → Finetune → Eval → Web 服务”整条流水线拉满。对比动辄千万的超算预算,这杯“浓缩咖啡”简直带劲。


二、开机!30 秒完成环境自检

  1. 选云:任何提供 8×80 GB GPU 的裸金属或 VM 均可。作者亲测 Lambda 节点(https://lambda.ai/service/gpu-cloud),开机即带 CUDA 12、NVLink 已链好。
  2. 拉代码:
git clone https://github.com/karpathy/nanochat.git
cd nanochat
# 推荐用 uv 一键装好依赖,30 秒收工
curl -LsSf https://astral.sh/uv/install.sh | sh
source .venv/bin/activate
uv pip install -r requirements.txt
  1. 检查显存:nvidia-smi 确认 8 卡在线;驱动≥525。
  2. (可选)挂 screen:防止 SSH 掉线把训练打断。
screen -L -Logfile speedrun.log -S speedrun

三、一条脚本跑完全程——speedrun.sh 拆解

不想读 8 千行源码?直接 cat speedrun.sh 也能看懂——它把 5 大步骤串成了 Linux 管道:

阶段 对应脚本 耗时 产物
① Tokenize python -m nanochat.dataset -n 450 ~10 min data/*.bin
② Pretrain torchrun --nproc_per_node=8 -m scripts.base_train 1 h 30 m ckpt/base.pt
③ Mid-train 同上,换脚本 mid_train 1 h 20 m ckpt/mid.pt
④ SFT scripts.sft_train 40 m ckpt/sft.pt
⑤ Eval & Report scripts.eval 5 m report.md

关键参数只有 2 个
--depth=12 默认,改 26 即可冲到 GPT-2 量级;
--device_batch_size=32 显存告急就砍到 16、8、4……脚本会自动梯度累积,保证 global batch 不变。


四、让模型开口——3 行命令启动网页聊天

训练一结束,终端会弹出:

>>> Done. Run `python -m scripts.chat_web` to talk to your LLM.

照做即可:

# 仍在虚拟环境
python -m scripts.chat_web
# => Uvicorn running on http://0.0.0.0:8000

0.0.0.0 换成实例公网 IP,浏览器打开 http://<ip>:8000,你就能与“4 小时速成”的娃对话:

:为什么天是蓝的?
nanochat:因为大气散射了短波长的蓝光……(省略 100 字)
:那如果我把海水染成红色,天会变红吗?
nanochat:有趣的问题!理论上……(开始一本正经地幻觉)


五、成绩单长什么样?——report.md 速读

流水线最后一行会自动写报告,核心指标如下(来自笔者真实跑鞋):

Benchmark MID SFT RL(可选)
ARC-Easy 0.356 0.388
GSM8K 0.025 0.046 0.076
HumanEval 0.067 0.085
MMLU 0.311 0.315

解读

  • 这是一张“幼稚园毕业证”——能对话,但算术和编程题经常翻车。
  • RL 阶段默认关闭,需要额外实现 PPO;作者留好接口,等你 PR。

六、想再猛一点?——300 USD 档“小 GPT-2”攻略

  1. 估算数据量:
    params × 20 × 4.8 ÷ 250 M ≈ shard 数
    d26 约 450 M 参数 → 170 个 shard(已内置下载脚本)。
  2. 显存对冲:
    batch 减半 --device_batch_size=16,训练时间涨到 12 h,总账单 ≈ 300 USD。
  3. 性能对比:
    CORE 分数略超 GPT-2-124 M,文本流畅度肉眼可感提升。

七、常见坑与急救包(FAQ)

Q1:显存 40 GB 够吗?
A:单卡可跑,把 device_batch_size 压到 2 或 1,速度×8;最好有 80 GB。

Q2:SSH 断了怎么办?
A:训练支持断点续传,同级目录下 resume=<ckpt> 即可;用 screen/tmux 更省心。

Q3:想换中文语料?
A:只要整理成 .txtrustbpe 编码 → 按行随机 shuffle,命名 data/shard_xxx.bin 就行,代码零改动。

Q4:可以上多机吗?
A:目前脚本仅做单机 8 卡;多机需改 torchrun --nnodes,作者表示欢迎 PR。


八、总结:nanochat 给社区带来了什么?

  1. 价格锚点——“100 USD 就能端到端”打破心理门槛;
  2. 教育锚点——8 K 行可读代码,把 LLM 黑盒拆成 5 个清晰阶段;
  3. 魔改锚点——无巨型 config,改两行就能换深度、换语料、换奖励函数。

换句话说,nanochat 不是来“秒杀 GPT-4”的,它是给每个工程师递上一把可复现、可膨胀、可教学的瑞士军刀。先跑通 100 USD 的“小钢炮”,再决定要不要烧 1000 万美元炼巨兽——这份底气,正是开源最迷人的地方。


九、下一步玩什么?

  • 把 RL 阶段补齐,让模型学会“说人话”而不是“说套路”;
  • 用 LoRA/QLoRA 压显存,让 24 GB 游戏卡也能入场;
  • 接入 RAG,把私域知识塞进 4 小时小脑瓜。
如果你已手痒,不妨现在就开一台云节点,复制粘贴本文的命令——4 小时后,你就能在浏览器里跟自己的“百元 ChatGPT”打招呼。别忘了回来留言:它第一次回答你什么?
CyberAgent 如何部署内置 AI 技术来改善内容创作
程序员眼中的 ChatGPT