
整理 | 屠敏
出品 | CSDN(ID:CSDNnews)
今天,前 OpenAI 联合创始人、Eureka Labs 创始人 Andrej Karpathy(安德烈·卡帕西)带来了一个全新的开源项目——nanochat。
用他自己的话说,这是他写过的最“疯狂”的作品之一:
只要 4 个小时、100 美元,就能“手搓”一款属于自己的 ChatGPT。倘若花上 12 个小时来训练,其性能可超越 GPT-2。

话不多说,感兴趣的小伙伴可通过 GitHub 开源地址,即刻上手体验:https://github.com/karpathy/nanochat

Karpathy 进一步表示,模型训练的规模可根据时间与成本灵活调整:
仅使用约 100 美元成本,在单台 8×H100 GPU 节点上训练 4 小时,即可得到一个能进行基础对话的 ChatGPT 小模型;训练 12 小时左右,模型即可超过 GPT-2 CORE 基准;若将预算扩大至约 1000美元(训练约 41.6 小时),模型将具备更高连贯性,能解决简单的数学与编程问题,并回答多项选择题。与此同时,Karpathy 在 GitHub 上打趣道:
“这是 100 美元能构建的最强 ChatGPT。”
而对于未来目标,Karpathy 称:
我的目标是把整个“强基线”(strong baseline)技术栈整合到一个统一、简洁、可读、可修改、便于分叉的仓库中。nanochat 将成为正在开发中的课程 LLM101n 的收官项目。
LLM101n 是 Karpathy 所创立的教育公司 Eureka Labs 面向本科生开设的一门课程,旨在带领学生从零构建属于自己的 AI 模型。其补充说,nanochat 未来有望像 nanoGPT 一样,发展成一个研究平台或基准项目。

训练完成后,可通过以下命令进一步评估模型:
torchrun --standalone --nproc_per_node=8 -m scripts.base_losstorchrun --standalone --nproc_per_node=8 -m scripts.base_eval
可以看到,训练集和验证集的 bpb 达到 0.81,而CORE指标上升到0.22。作为对比,eval bundle 中包含了 GPT-2 模型的 CORE 分数。其中,CORE0.22略高于 GPT-2 Large(0.21),但略低于 GPT-2 XL(也就是标准 GPT-2,0.26)。
此时的模型本质上是一个高级的自动补全工具,我们可以通过几个示例提示(prompts)来了解模型里存储了哪些知识。文件 base_loss.py会执行这些示例提示。Prompt 内容如下:
prompts = [ "The capital of France is", "The chemical symbol of gold is", "If yesterday was Friday, then tomorrow will be", "The opposite of hot is", "The planets of the solar system are:", "My favorite color is", "If 5*x 3 = 13, then x is",]
模型完成结果如下:
The capital of France is Paris. It is the largest city in France and the second largest city in EuropeThe chemical symbol of gold is Au. The chemical symbol of silver is Ag. The chemical symbol of copper isIf yesterday was Friday, then tomorrow will be Saturday. If yesterday was Monday, then tomorrow will be Monday. If yesterday wasThe opposite of hot is cold. The opposite of hot is cold. The opposite of hot is cold.The planets of the solar system are: Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune,My favorite color is red. It is the color of the sun, the color of the sky,If 5*x 3 = 13, then x is a positive integer.
可见模型已经掌握了地理、化学、时间逻辑、基础数学和太阳系行星等知识,但对一些简单常识(如天空颜色)仍不确定。
不过,对于一个训练成本仅 72 美元的模型来说,表现已经相当不错了。推理阶段使用自定义 Engine 类,支持KV 缓存提升效率,并实现了prefill和decode两个常用阶段。同时,Engine 还支持调用工具(如 Python 解释器),这在后续训练 GSM8K 时会非常有用。
中期训练
接下来是中期训练,主要是进一步微调模型,让它更适合 SmolTalk 对话数据。
算法上和预训练完全相同,但现在训练的数据变成了多轮对话,模型也会学习新的特殊 token,用来构建多轮对话对象。
每条对话大致如下(参考 OpenAI Harmony chat 格式):
bos|>user_start|>What is the color of the sky?user_end|>assistant_start|>Red. Wait, possibly blue. I'm not sure.assistant_end|>user_start|>loluser_end|>assistant_start|>...etcetc
其中 这样的 token 是特殊 token,遵循 OpenAI 的格式。中期训练阶段对于模型中的许多调整非常有用:
模型学习与多轮对话相关的特殊 token(除了 (文档起始符),这些 token 在基础模型预训练阶段并不存在)适应对话数据的分布,模型不再只是处理网页文本,而是学习如何理解和生成对话训练模型做选择题(Multiple Choice),小模型仅靠随机网络训练无法理解选择题的规则,模型必须学会将选项(A、B、C、D)与正确答案对应,我们在训练中加入了 MMLU auxiliary_train 中的 10 万道选择题。训练模型使用工具,比如让模型学会在特殊 token … 内执行 Python 命令。这在之后训练 GSM8K(数学题)时会很有用。其他潜在适应,如扩展上下文长度等(目前尚未探索)。默认的中期训练数据混合如下:
train_dataset = TaskMixture([ SmolTalk(split="train"), # 460K rows of general conversations MMLU(subset="auxiliary_train", split="train"), # 100K rows of multiple choice problems drawn from ARC, MC_TEST, OBQA, RACE GSM8K(subset="main", split="train"), # 8K rows teaching simple math and (calculator) tool use]) # total: 460K 100K 8K = 568K rows
启动中期训练命令:
torchrun --standalone --nproc_per_node=8 -m scripts.mid_train
这一步大约只需 8 分钟,远比预训练的 3 小时短。现在模型已经成为一个完整的Chat 模型,可以充当 Assistant 回答用户问题。评估模型:
torchrun --standalone --nproc_per_node=8 -m scripts.chat_eval -- -i mid
此阶段模型的表现:
- ARC-Easy: 0.3561- ARC-Challenge: 0.2875- MMLU: 0.3111- GSM8K: 0.0250- HumanEval: 0.0671- ChatCORE metric: 0.0730
我们可以看到以下几点:
世界知识:前 3 个测试(ARC-Easy、ARC-Challenge 和 MMLU)都是选择题,用来衡量模型在不同领域的常识水平。因为每道题有 4 个选项(A、B、C、D),随机猜的正确率大约是 25%。而这里得到的模型已经明显超过了这个水平——这对这么小的模型来说其实挺难的。数学:GSM8K 是小学数学题。这里的基准分是 0%,因为模型需要写出具体的数字答案。目前训练出来的模型表现还不算理想,只能解出大约 2% 的题目。代码:HumanEval 是 Python 编程测试,同样随机猜测的正确率是 0%。ChatCORE 指标:这是 Karpathy 为了模仿 CORE 分数(用于基础模型)并扩展到聊天模型而设计的指标。具体做法是:把所有任务的得分减去基准分,使得最终分数范围在 0 到 1 之间(例如在 MMLU 上,随机模型是 0,而不是 25%),然后取这些任务的平均值。这样就能得到一个简单的数字,来概括当前模型的整体水平。目前这些评估还不算完整,还有很多维度暂时没测到。Karpathy 表示,由于没有太好的图表能展示这一步的效果,但可以看看他之前给一个更大模型做中期训练(midtraining)时的曲线图——能直观看到这些指标在微调过程中是如何上升的。

监督微调
在训练中期之后,接下来是监督微调(SFT)阶段。这是对对话数据的又一轮微调,但这里通常会精挑细选最优质的数据,同时也可以加入一些安全训练,比如训练助手学会拒绝不合适的请求。Karpathy 调侃道,“我们的模型连天空是什么颜色都不太确定,所以目前在生物安全方面应该没问题。”
SFT 阶段的一个重要改进是领域适配(domain adaptation):
它会拉伸数据行并进行填充(padding),严格模拟测试时的格式。换句话说,样本不再像预训练或中期训练中那样随意拼接成长行,这种拼接主要是为了训练效率。通过修正这种域不匹配,模型会得到额外的性能提升,相当于再“拧紧一颗螺丝”。运行 SFT 并重新评估模型:
torchrun --standalone --nproc_per_node=8 -m scripts.chat_sfttorchrun --standalone --nproc_per_node=8 -m scripts.chat_eval -- -i sft
这一阶段大约只需 7 分钟,你会发现各项指标都有小幅提升:
- ARC-Easy: 0.3876- ARC-Challenge: 0.2807- MMLU: 0.3151- GSM8K: 0.0455- HumanEval: 0.0854- ChatCORE metric: 0.0884
最后,我们可以真正以用户身份与模型进行对话了!虽然在中期训练后就可以聊,但现在效果会更好。可以在终端里聊天:
python -m scripts.chat_cli
或者通过网页界面聊天:
python -m scripts.chat_web
chat_web 会使用 FastAPI启动服务,记得正确访问,比如在 Lambda 上用节点的公网 IP 加端口,例如:
http://209.20.xxx.xxx:8000/
聊天界面大致会是这样的效果:

从图中可以看到:
奖励在上升(模型在学习)pass@1(首次答对率)在提升pass@8(8 次机会内答对率)也在提升pass@8 明显高于 pass@1,说明还有提升空间,可以通过更多 RL 轮次和训练周期进一步优化强化学习对更大模型的提升更明显。

性能结果
值得注意的是,项目文件夹中会生成 report.md文件,它记录了训练的详细信息,并在末尾提供了一个清晰的总结表格,方便查看各项指标和模型表现。
下面就是 nanochat 在 100 美元成本下的成绩单:
代码字符数——Characters: 333,989代码行数——Lines: 8,304工程文件数——Files: 44代码中的 Token 数——Tokens (approx): 83,497依赖项——Dependencies (uv.lock lines): 2,004
总花费时间:3 小时 51 分钟。
不过,Karpathy 也提醒道,nanochat 目前还远未完成,还有很多需要调优或优化的地方,但整体框架已经足够清晰,所以现在把它上传到 GitHub,让更多人参与改进和完善。
整体来看,nanochat 不是一项颠覆性的突破,但它非常实用。它将 LLM 训练的门槛降低到了普通人也能达到的水平。你可以亲眼看到,仅用几百美元和几小时就能完成什么。
参考:
https://github.com/karpathy/nanochat
https://x.com/karpathy/status/1977755427569111362
相关文章









猜你喜欢
成员 网址收录40418 企业收录2986 印章生成263572 电子证书1157 电子名片68 自媒体91237