www.kaiyun.com开云-OpenAI创始成员发布开源项目nanochat,仅需100美元就能实现类ChatGPT

发布时间:2025-11-16 kaiyun

EEPW首页 > 业界动态 > OpenAI创始成员发布开源项目nanochat,仅需100美元就能实现类ChatGPT

OpenAI创始成员发布开源项目nanochat,仅需100美元就能实现类ChatGPT 作者: 时间:2025-10-16 来源:电子产品世界 加入技术交流群 扫码加入和技术大咖面对面交流海量资料库查询

特斯拉前AI团队负责人、OpenAI创始成员安德烈·卡帕西(Andrej Karpathy)发布重磅项目:nanochat —— 一个极简但完整的「从零构建ChatGPT」训练框架。只需要约100美元,就能在不到4小时内完成完整的类ChatGPT训练流程,包括预训练、微调(SFT)和强化学习(RL)。

Karpathy说这是他写过的最疯狂的项目之一,相当于每个人都可以自己拥有一个专属的ChatGPT。值得注意的是,这个项目基本上是完全手写的。

640-5.jpeg

GitHub项目:https://github.com/karpathy/nanochat

与早期的nanoGPT不同,nanochat不仅涵盖预训练,还囊括了从数据准备、预训练、中期训练(对话、多项选择题、工具使用)、SFT、RL微调到推理部署的全流程。整个项目约8000行代码,可实现以下功能:

· 基于全新Rust语言实现,训练分词器(tokenizer)

· 在FineWeb数据集上预训练Transformer架构大语言模型,并通过多项指标评估CORE得分

· 在SmolTalk用户-助手对话数据集、多项选择题数据集、工具使用数据集上进行中期训练(Midtrain)

· 执行指令微调(SFT),并在世界知识多项选择题数据集(ARC-E/C)、数学数据集(GSM8K)、代码数据集(HumanEval)上评估对话模型性能

· 可选在GSM8K数据集上通过“GRPO”算法对模型进行强化学习(RL)训练

· 在推理引擎中实现高效模型推理,支持KV缓存、简易预填充/解码流程、工具使用(轻量级沙箱环境中的Python解释器),可通过CLI或类ChatGPT的WebUI与模型交互

· 生成单个Markdor:破高膙辚?f然揩襮嫛蟿F鸠5pep=k?确矅?鷜%?疆淴恤4G?緬暑皚`x鵏 ]]穸?頺t諏?鷓?$% 燾???烊所?炎m豩=2(?r蜨R庀汬}T廞 ??ヱq鹆黮}劷:q{|?e ?%坖D覑眤丬鲩M(缬s6/搇t巗紹g.晾飽S閽?dt邊潫Lg妔譫n格式报告卡,对整个训练推理流程进行总结,并加入“游戏化”呈现(如用评分、进度等形式直观展示结果)

训练约12小时后,模型在CORE指标上的表现即可超越GPT-2。若进一步将成本提升至约1000美元(训练约41.6小时),模型表现显著提升。Karpathy表示,他的目标是将这套完整的“强基线”(strong baseline)技术栈整合为统一、极简、易读、可修改、易分发的代码库。

我认为它还有潜力发展为一个研究工具框架或基准测试的工具,就像之前的nanoGPT一样。目前该项目远未完全优化(实际上存在大量可改进空间),但整体框架已足够完整,可以发布到GitHub上,后续所有模块都能在社区中进一步优化。

下面这张图展示的是Karpathy在nanochat「$100速度跑」实验(即只用一台GPU、约4小时训练出的ChatGPT 小模型)中生成的「成绩单」部分内容,说明模型规模、训练耗时、以及在各类标准评测上的性能。

640-10.png

快速上手

为了让更多的爱好者迅速上手,Karpathy在GitHub上详细分享了nanochat的教程(https://github.com/karpathy/nanochat/discussions/1)。nanochat被设计为在单个8×H100 GPU机器上运行,此次教程中,Karpathy使用了Lambda GPU Cloud,每小时大约24美元。当然想要尝试的爱好者们也可根据个人情况自行选择,进行了尝试。接下来看看他到底是怎么做的?

环境搭建

首先,克隆项目并进入目录:

gitclonegit@github.com:karpathy/nanochat.gitcdnanochat

用100美元训练出最强的类ChatGPT,其背后最快体验魔力的方法是运行speedrun.sh(速通)脚本。

speedrun.sh脚本可以在一台新机器上直接运行,从头到尾完成训练和推理。

一切的前提就是需要确保安装了新的uv项目管理工具。然后创建虚拟环境、安装依赖并激活它,这样在终端输入python时,就会使用虚拟环境里的Python,而不是系统自带的Python:

(T詻奆B抔 筥?馴\a?g迳賬??c︺M薮躄弶N髌簐hq食?)?5=黈?le醹d:V绐^莳{?!曗妠0?@a9y?敯?ㄨK疃浌?頞訒墣^)?琱逺?v鏢Kr紺0ジF脾孷:go?G邻?.hど埴_镻?09暌}?S?XPO 安装 uv(如果还没安装的话)command-v uv /dev/null || curl -LsSf https://astral.sh/uv/install.sh | sh(T詻奆B抔 筥?馴\a?g迳賬??c︺M薮躄弶N髌簐hq食?)?5=黈?le醹d:V绐^莳{?!曗妠0?@a9y?敯?ㄨK疃浌?頞訒墣^)?琱逺?v鏢Kr紺0ジF脾孷:go?G邻?.hど埴_镻?09暌}?S?XPO 创建本地虚拟环境 .venv(如果不存在的话)[ -d .venv ] || uv venv(T詻奆B抔 筥?馴\a?g迳賬??c︺M薮躄弶N髌簐hq食?)?5=黈?le醹d:V绐^莳{?!曗妠0?@a9y?敯?ㄨK疃浌?頞訒墣^)?琱逺?v鏢Kr紺0ジF脾孷:go?G邻?.hど埴_镻?09暌}?S?XPO 安装仓库依赖uvsync(T詻奆B抔 筥?馴\a?g迳賬??c︺M薮躄弶N髌簐hq食?)?5=黈?le醹d:V绐^莳{?!曗妠0?@a9y?敯?ㄨK疃浌?頞訒墣^)?琱逺?v鏢Kr紺0ジF脾孷:go?G邻?.hど埴_镻?09暌}?S?XPO 激活虚拟环境,这样 `python` 就会使用项目的虚拟环境source.venv/bin/activate

接下来,需要安装Rust/Cargo来编译nanochat中自定义的Rust分词器。

Karpathy称,引入新的分词器确实有点麻烦,但之前Python版本的minbpe太慢,而HuggingFace的tokenizer太臃肿且复杂。所以他自己实现了一个新的Rust分词器来训练(经过测试效果与Python版本一致),但推理阶段仍会使用OpenAI的tiktoken来保证效率。

编译分词器步骤如下:

(T詻奆B抔 筥?馴\a?g迳賬??c︺M薮躄弶N髌簐hq食?)?5=黈?le醹d:V绐^莳{?!曗妠0?@a9y?敯?ㄨK疃浌?頞訒墣^)?琱逺?v鏢Kr紺0ジF脾孷:go?G邻?.hど埴_镻?09暌}?S?XPO 安装 Rust / Cargocurl --proto =https --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -ysource $HOME/.cargo/env (T詻奆B抔 筥?馴\a?g迳賬??c︺M薮躄弶N髌簐hq食?)?5=黈?le醹d:V绐^莳{?!曗妠0?@a9y?敯?ㄨK疃浌?頞訒墣^)?琱逺?v鏢Kr紺0ジF脾孷:go?G邻?.hど埴_镻?09暌}?S?XPO 编译 rustbpe Tokenizeruv run maturin develop --release --manifest-path rustbpe/Cargo.toml

这样就完成了分词器的编译和环境搭建,为后续训练做准备。

训练分词器

接下来,就需要预训练数据,以便完成两个任务:

i. 训练分词器(tokenizer)

ii. 预训练模型

这里的预训练数据就是大量网页文本,在教程中,Karpathy使用的是FineWeb-EDU数据集。

他解释道,通常大家可以直接用HuggingFace的datasets.load_dataset()来加载,但这个太笨重、臃肿,而且把一些很简单的逻辑隐藏起来,所以他自己选择了重新打包了整个数据集,生成了简单、完全随机打乱的数据分片,方便高效访问。

此外,Karpathy还把sample-100B版本上传成了karpathy/finer:破高膙辚?f然揩襮嫛蟿F鸠5pep=k?确矅?鷜%?疆淴恤4G?緬暑皚`x鵏 ]]穸?頺t諏?鷓?$% 燾???烊所?炎m豩=2(?r蜨R庀汬}T廞 ??ヱq鹆黮}劷:q{|?e ?%坖D覑眤丬鲩M(缬s6/搇t巗紹g.晾飽S閽?dt邊潫Lg妔譫eb-edu-100b-shuffle(https://huggingface.co/datasets/karpathy/finer:破高膙辚?f然揩襮嫛蟿F鸠5pep=k?确矅?鷜%?疆淴恤4G?緬暑皚`x鵏 ]]穸?頺t諏?鷓?$% 燾???烊所?炎m豩=2(?r蜨R庀汬}T廞 ??ヱq鹆黮}劷:q{|?e ?%坖D覑眤丬鲩M(缬s6/搇t巗紹g.晾飽S閽?dt邊潫Lg妔譫eb-edu-100b-shuffle)。

每个分片是一个简单的Parquet文件,约0.25M个字符,压缩后(gzip压缩)在磁盘占用约100MB空间。数据集总共有1822个分片,但训练一个depth=20的模型只需要240个分片。

下载数据:

python-m nanochat.dataset -n 240

默认情况下,这些数据会存放在~/.cache/nanochat。下载完成后,就可以训练分词器了。分词器的作用是把文本在字符串和代码表符号序列之间互相转换。

同样在默认情况下,Karpathy表示,训练的词表大小是2¹⁶=65,536个token,这个数字比较好记。其中少数token被保留作特殊用途(后续聊天schema会用到)。训练集大小约20亿字符,训练时间仅需约1分钟。

训练算法与OpenAI的方法一致(正则分割 + byte-level BPE)。

训练完成后,可以评估分词器效果:

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

评估结果显示,分词器压缩率约为4.8,也就是说平均4.8个原始字符会变成1个 token。同时,也可以将nanochat的结果与GPT-2和GPT-4分词器做对比:

· 相比GPT-2(50257个token), nanochat的分词器在大部分文本压缩上表现更好,数学文本略差一些。

640-11.png

· 相比GPT-4,nanochat的表现稍逊,但要注意GPT-4的词表更大(100,277个token),在多语言、代码和数学上优势明显。

性能结果

值得注意的是,项目文件夹中会生成report.md文件,它记录了训练的详细信息,并在末尾提供了一个清晰的总结表格,方便查看各项指标和模型表现。

不过,Karpathy也提醒道,nanochat目前还远未完成,还有很多需要调优或优化的地方,但整体框架已经足够清晰,所以现在把它上传到GitHub,让更多人参与改进和完善。

整体来看,nanochat不是一项颠覆性的突破,但它非常实用。它将LLM训练的门槛降低到了普通人也能达到的水平。你可以亲眼看到,仅用几百美元和几小时就能完成什么。

640-12.png

这个项目体现出他的核心理念:「降低LLM研究与复现门槛,让每个人都能亲手训练自己的模型。」这种民主化路线,与他在nanoGPT时期倡导的「从零实现Transformer」如出一辙。

-www.kaiyun.com开云