Andrej Karpathy 发布新项目 nanochat:一个从零开始构建的极简全栈式 ChatGPT 克隆
刚刚,Andrej Karpathy 推出了他的最新开源项目 nanochat。与之前聚焦于预训练阶段的 nanoGPT 不同,nanochat 提供了一个从头开始、代码极简的全栈式类 ChatGPT 模型的训练与推理流水线。 整个项目被整合在一个依赖极少的单一代码库中,旨在帮助开发者和研究者深入理解大语言模型(LLM)的完整生命周期。
根据 Karpathy 的介绍,用户只需启动一台云端GPU服务器并运行一个脚本,最快在4小时后,便能通过一个类似 ChatGPT 的网页界面,与自己亲手训练的语言模型进行交互。
完整的端到端实现流程
nanochat 项目的代码量约 8000 行,覆盖了构建一个聊天机器人的完整技术流程,具体包括:
- 分词器训练 (Tokenizer Training): 采用了一个基于 Rust 的全新实现来训练分词器。
- 预训练 (Pre-training): 在 FineWeb 数据集上预训练一个 Transformer 架构的语言模型,并依据多项指标评估其 CORE 分数。
- 中间训练 (Intermediate Training): 使用来自 SmolTalk 的用户-助手对话数据、多项选择题及工具使用数据,对预训练模型进行进一步训练。
- 监督微调 (SFT): 在多个领域的基准测试上对聊天模型进行微调与评估,涵盖世界知识(ARC-easy/challenge, MMLU)、数学推理(GSM8K)和代码生成(HumanEval)。
- 强化学习 (RL): 提供一个可选的强化学习阶段,使用 “GRPO” 算法(PPO的简化变种)在 GSM8K 数据集上进一步优化模型。
- 高效推理 (Inference): 实现了一个带有 KV 缓存的高效推理引擎,支持 prefill/decode 模式和工具使用(通过轻量级沙箱调用 Python 解释器)。用户可以通过命令行或网页界面与模型交互。
- 生成式报告卡 (Report Card Generation): 自动生成一份 Markdown 格式的报告卡,以游戏化的方式总结和呈现整个训练过程的各项指标与成果。
成本与性能预期
Karpathy 详细说明了不同计算投入所能达成的模型性能水平:
- 约 100 美元成本(在 8x H100 节点上训练约 4 小时): 可以训练出一个能够处理简单对话、生成故事或诗歌,并回答基础问题的小型 ChatGPT 克隆体。 经过约 12 小时的训练,模型的 CORE 指标能够超越 GPT-2。
- 约 1000 美元成本(训练约 41.6 小时): 随着投入增加,模型将表现出更强的连贯性,能够解决简单的数学和代码问题,并在多项选择题测试中取得更好的成绩。
例如,一个拥有 30 层深度、训练 24 小时(其总计算量约等于 GPT-3 Small 125M 模型的千分之一)的模型,能在 MMLU 测试中获得 40+ 的分数,在 ARC-Easy 上得分超过 70,在 GSM8K 上的得分也达到了 20+。
项目愿景与技术细节
Karpathy 的核心目标是创建一个高度集成、代码极简、易于理解、可被任意修改和复刻(forkable)的强大基线技术栈。 nanochat 也将成为他正在开发的 LLM101n 课程的顶点项目。 他认为,该项目具备发展成为一个重要研究工具或行业基准的潜力,正如 nanoGPT 此前所取得的成功一样。
同时,Karpathy 也坦言,项目目前远未达到完全优化或精调的状态,但他认为其整体框架已经足够成熟,可以发布并交由社区共同改进。
技术细节与官方问答
在项目发布后,Karpathy 回答了社区关心的一些技术问题。
问:该项目训练所用的模型架构是什么?
Karpathy: 其架构基本与 Llama 类似,但经过了简化,并受到了一些修改版 nanoGPT 的启发。具体的技术选型包括:
- 核心架构: 密集的 Transformer (Dense Transformer)。
- 位置编码: 旋转位置嵌入 (RoPE),不使用绝对位置嵌入。
- 归一化: 查询(Query)和键(Key)应用了归一化(QK Norm)。同时,在 Token 嵌入后和 MLP 层前使用了 RMSNorm,且 RMSNorm 中不包含可学习参数。
- 权重共享: 词嵌入(Embedding)与分类头(Unembedding)的权重不进行绑定。
- 激活函数: MLP 层中使用的激活函数为平方 ReLU,其数学表达式为:
f(x)=(ReLU(x))2=(max(0,x))2 f(x) = (\text{ReLU}(x))^2 = (\max(0, x))^2 f(x)=(ReLU(x))2=(max(0,x))2 - 偏置项: 所有线性层(Linear layers)均不使用偏置项(bias)。
- 注意力机制: 采用多查询注意力(Multi-Query Attention, MQA)。
- 输出处理: 对 Logits 应用 Softcap。
- 优化器: 采用 Muon + AdamW 优化器,这一选择深受修改版 nanoGPT 的影响。
问:我是否可以用这个项目来训练一个处理我个人数据(如 Notion 笔记、健康数据等)的私人聊天机器人?
Karpathy: Karpathy 认为 nanochat 目前并不适合此用途。他将这类小型模型比作“幼儿园水平的孩子”,它们不具备大型模型所拥有的原始智能。 直接用个人数据对这类模型进行微调,虽然可能在风格上模仿用户的写作,但生成内容的质量会很差。
要实现高质量的个人机器人,需要更复杂的流程,这在很大程度上仍属于前沿研究领域:
- 首先,获取原始个人数据。
- 在此基础上进行大量的合成数据生成与重写。
- 在一个性能顶尖的开源大语言模型上进行微调。
- 在微调过程中,可能还需要混合大量的预训练数据,以防止模型“遗忘”其原有的通用能力(即灾难性遗忘)。
对于非研究用途,Karpathy 推荐的替代方案是使用如 NotebookLM 这样的工具,它通过检索增强生成(RAG)技术来处理个人数据。 在此模式下,数据作为上下文被输入模型,但并不改变模型的权重。因此,模型并非真正地“了解”你,但这可能是当前最容易实现的方案。
相关链接
GitHub 仓库地址: https://github.com/karpathy/nanochat
更详细的技术介绍: https://github.com/karpathy/nanochat/discussions/1