2025年10月16日星期四

两天16K星标,又一个爆火的开源项目!

师从李飞飞、OpenAI 创始人员、特斯拉人工智能和自动驾驶部门总监,被时代杂志评为 AI 领域 100 位最具影响力人物之一……

兼具这些头衔于一身的大神 Andrej Karpathy 又出大招了,推出了全新开源项目 nanochat 。

图片

nanochat 基于一个精简、易于修改且依赖性低的代码库,用于从零开始、全栈实现自己的 LLM 。

只需要运行一个脚本就能实现整个流程,包括标记化、预训练、微调、评估、推理以及通过简单的 UI 进行 Web 服务。

等待 4 小时后,你就可以得到一款属于自己的 ChatGPT ,整个过程成本低至 100 美元。如果把训练时长增加到 12 个小时,它的性能可超越 GPT-2。

图片

评论区除了一片溢美之词,

图片
图片

也引发了热烈的讨论。

图片
图片

短短两天内就在 GitHub 上斩获 14.9k 星标。

图片

GitHub 指路:

https://github.com/karpathy/nanochat

一、项目介绍

项目共有约 8k 行代码。

有人好奇其中多少是 Andrej Karpathy 自己写的。答案如下:

图片

项目结构主要包括:

  • 训练前处理
  • 预训练:在 FineWeb 数据集上预训练 Transformer LLM,并通过多项指标评估 CORE 得分。
  • 中期训练:使用 SmolTalk 数据集。
  • 监督微调:在世界知识多项选择题(ARC-Easy / ARC-Challenge、MMLU)、数学题(GSM8K)、编程题(HumanEval)任务上评估模型。
  • 强化学习:在 GSM8K 上通过 GRPO 算法进一步优化模型性能。该阶段可选。
  • 推理引擎:在带有 KV 缓存的引擎中高效推理模型,用户可通过命令行或 ChatGPT 风格网页界面与模型交互。
  • 生成一份 Markdown 格式报告,总结模型性能表现。

对于这个只用了 100 刀、4 小时的模型的表现,Andrej Karpathy 温馨提示:

这个轻量级、快速生成的 AI 模型计算能力只有 4e19 ,所以有点像和幼儿园小朋友对话 :)。

同时他也指出:

如果将训练时长增加至 12 小时,模型的表现可以超过 GPT-2 CORE 基准。如果预算能到 1000 刀(训练约 41.6 小时),模型将具备更高连贯性,能解决简单的数学与编程问题,并回答多项选择题。

二、Andrej Karpathy的故事

在详细讲解代码之前,我们先来了解一下作者 Andrej Karpathy 的故事。

图片

他于 1986 年出生于斯洛伐克,15 岁时随家人移居多伦多。

大学本科期间开始在 YouTube 上发布发布魔方教程而声名鹊起。这些教程曾被 Feliks Zemdegs 等世界顶尖速解魔方选手使用。

图片

https://www.youtube.com/@badmephisto

2009 年,他在多伦多大学获得计算机科学和物理学学士学位,2011 年在英属哥伦比亚大学获得硕士学位,在导师 Michiel van de Panne 的指导下,研究人体的物理模拟。

2015 年在李飞飞的指导下获得斯坦福大学博士学位,主要研究自然语言处理和计算机视觉的交叉领域,以及适合该任务的深度学习模型。

有些小伙伴可能看过他上的网课。他在博士期间担任了斯坦福大学 CS231n(卷积神经网络与视觉识别)课程的主要讲师之一。

这门课从斯坦福一路火到 B 站,成了 CV 领域的经典课程。我本科的时候也看过。

图片

博士毕业后,Karpathy 进入 OpenAI ,是其创始人员之一。

图片

2017 年 6 月,他成为特斯拉的人工智能总监,直接向老马汇报工作。

2023 年,重新加入 OpenAI 。

目前已经出来创业:Eureka Labs ,做 AI + 教育方向。

图片

我们现在耳熟能详的 vibe coding 这个词,也是今年 2 月他提出来的。

三、项目流程详解

接下来,我们一起更加深入了解这个项目的流程。

首先是一些依赖的搭建和工具的编译。比如安装 uv ,创建虚拟环境,安装 Rust/Cargo ,编译分词器等。

# install uv (if not already installed)
command -v uv &> /dev/null || curl -LsSf https://astral.sh/uv/install.sh | sh
# create a .venv local virtual environment (if it doesn't exist)
[ -d ".venv" ] || uv venv
# install the repo dependencies
uv sync
# activate venv so that `python` uses the project's venv instead of system python
source .venv/bin/activate
# Install Rust / Cargo
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source "$HOME/.cargo/env"
# Build the rustbpe Tokenizer
uv run maturin develop --release --manifest-path rustbpe/Cargo.toml

训练 tokenizer

预训练数据就是大量网页的文本,使用 FineWeb-EDU 数据集。

图片

不需要通过huggingface 的 datasets.load_dataset(), Andrej Karpathy 将整个数据集重新打包成简单的、完全混洗过的分片,以便轻松访问。

https://huggingface.co/datasets/karpathy/fineweb-edu-100b-shuffle

下载所有数据需要的内存约在 24GB 左右,默认保存在 ~/.cache/nanochat 中。

python -m nanochat.dataset -n 240

接着训练分词器,它可以在字符串和来自代码本的符号序列之间来回转换。

训练集为 20 亿个字符,只需约 1 分钟即可完成。训练算法与 OpenAI 使用的算法相同(正则表达式拆分,字节级 BPE)。

python -m scripts.tok_train --max_chars=2000000000
python -m scripts.tok_eval

还可以对分词器进行评估。

和 GPT-4 相比:

图片

整体效果一般,毕竟 GPT-4 的词汇量要大得多(100277)。但在代码和数学方面二者同样出色

预训练

训练 LLM 通过预测序列中的下一个 token 来压缩网络文本,同时也让它从中获取大量关于世界的知识。

torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=20

大约等 3 个小时,就可以在 wandb 图中看到:训练/验证的每字节比特数 (bpb) 达到了约 0.81,核心指标也上升到了 0.22。

图片

Midtraining

中期训练将进一步在 smol-SmolTalk 上对模型进行微调。

所有算法都与预训练相同,但数据集现在变成了对话,并且模型会自行适应新的特殊标记,这些标记现在构成了多轮对话对象。

每个对话看起来都像这样,大致遵循 OpenAI Harmony 聊天格式 :

<|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|>lol<|user_end|>
<|assistant_start|>...etcetc

接着运行:

torchrun --standalone --nproc_per_node=8 -m scripts.mid_train
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

监督微调

监督微调通常是挑选最优质的数据对对话数据进行又一轮微调。

运行 SFT 并重新评估:

torchrun --standalone --nproc_per_node=8 -m scripts.chat_sft
torchrun --standalone --nproc_per_node=8 -m scripts.chat_eval -- -i sft

得到的指标略有上升:

  • 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

生成报告

最后,它以 markdown 的形式自动生成一份报告并进行总结。

一起来看看这份价值 100 刀的"成绩单:

图片

四、快速上手

正如前面提到的,只需要运行一个脚本即可实现,整个过程操作如下:

从你最喜欢的供应商(例如,Andrej Karpathy 使用的是 Lambda )启动一个新的 8XH100 GPU ,然后启动训练脚本:

bash speedrun.sh

由于脚本运行了 4 个小时,可以启动一个新的对话,将输出记录到 speedrun.log :

screen -L -Logfile speedrun.log -S speedrun bash speedrun.sh

等待 4 小时,完成后,确保本地 uv 虚拟环境已经激活(运行 source .venv/bin/activate )。

通过类似 ChatGPT 的 Web UI 与 LLM 对话。

python -m scripts.chat_web

然后访问显示的 URL。

确保访问方式正确,例如在 Lambda 上使用所在节点的公网 IP,后接端口,例如 http://209.20.xxx.xxx:8000/ 等。

简单测试:

python -m pytest tests/test_rustbpe.py -v -s

五、最后

Karpathy 指出 nanochat 目前还远未完成。

未来的目标是提升微型模型的先进水平,使其能够在不到 1000 美元的预算内实现端到端的运行。

最后,虽然这不是什么颠覆性的技术突破,但是拿来学习一波也是受益匪浅。

感兴趣的小伙伴可以去看看完整的技术报告:

https://github.com/karpathy/nanochat/discussions/1

>/ 本期作者:Tashi  & JackCui

>/ JackCui:AI领域从业者,毕业于东北大学,大厂算法工程师,热爱技术分享。

没有评论:

发表评论

Claude Skills

小型RAG的简易替代方案,轻松管理业务知识。以咖啡店为例,将产品、教程等资料存入Skill文档,AI自动检索并生成解答,无需向量数据库与复杂维护。技能可按业务模块或客户拆分,灵活高效。 昨天又从搜集到了 100 多个的 skills, 其中有一个非常惊艳我的用法。 他被埋没在...