[nanoGPT] ChatGPT 的 LLM 的全栈实现 | 快速上手 - 实践

news/2025/11/19 22:24:29/文章来源:https://www.cnblogs.com/tlnshuju/p/19244258

[nanoGPT] ChatGPT 的 LLM 的全栈实现 | 快速上手 - 实践

2025-11-19 22:21  tlnshuju  阅读(0)  评论(0)    收藏  举报

链接:

https://github.com/karpathy/nanochat

https://x.com/karpathy/status/1977755427569111362

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

https://analyticsindiamag.com/ai-news-updates/andrej-karpathy-releases-nanochat-a-minimal-chatgpt-clone/

docs:nanoGPT

nanoGPT项目致力于提供一个简洁高效易于定制的GPT模型训练与微调实现方案。

它完整覆盖了从原始文本数据预处理到数值化转换,从训练流程编排(包含优化器与学习率调度),再到基于训练模型的文本生成全过程。

该项目特别强调**性能优化灵活配置系统**,旨在让语言模型实验变得高效且易于实施。

可视化

在这里插入图片描述

章节内容

  1. 数据预处理与分词
  2. GPT模型架构
  3. 配置系统
  4. 训练流程编排
  5. 检查点与预训练模型加载
  6. 文本生成/采样
  7. 性能优化工具

前文传送:

[Andrej Karpathy] 大型语言模型作为新型操作系统

[Andrej Karpathy_2] vibe coding | 大型语言模型的1960年代 | 自主性滑块

今天,前 OpenAI 联合创始人、Eureka Labs 创始人 Andrej Karpathy(安德烈·卡帕西)带来了一个全新的开源项目——nanochat。

用他自己的话说,这是他写过的最“疯狂”的作品之一:

只要 4 个小时、100 美元,就能“手搓”一款属于自己的 ChatGPT。倘若花上 12 个小时来训练,其性能可超越 GPT-2。

在这里插入图片描述

简而言之,nanochat 可以看做是一个类似 ChatGPT 的 LLM 的全栈实现,它把训练和推理的全流程都整合进了一个干净、轻量、可修改、几乎零依赖的代码库里。

你只要启动一台云端 GPU,运行一条脚本命令,大约 4 小时后,就能在 ChatGPT 风格的网页界面中,与自己训练的 LLM 对话了。不仅如此,它还可以写诗、讲故事和回答一些简单的问题等等。

可喜的是,此项目遵循 MIT 协议开源,这意味着任何人都可以自己去尝试做一款 GPT。正因此,项目发布数小时内,便斩获了 40.1k Star,引发无数 AI 开发者热议与尝试。

在这里插入图片描述

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

1.仅有 8000 行代码的 nanochat

根据 Karpathy 介绍,nanochat 约有 8000 行代码,几乎覆盖了整个模型训练与推理流程,具体包括:

  • 训练前处理:使用全新的 Rust 实现训练分词器(tokenizer)实现,以加快文本编码效率。
  • 预训练阶段:在 FineWeb 数据集上对 Transformer LLM 进行预训练,并通过多个指标评估 CORE 分数。
  • 中期训练:使用 SmolTalk 数据集进行中期训练,涵盖用户-助手对话、多项选择题和工具使用场景。
  • 监督微调(SFT):在以下任务上评估聊天模型,如世界知识多项选择题(ARC-Easy / ARC-Challenge、MMLU)、数学题(GSM8K)、编程题(HumanEval)。
  • 可选强化学习(RL)阶段:在 GSM8K 上通过 GRPO 算法进一步优化模型性能。
  • 推理引擎:在带有 KV 缓存的引擎中高效推理模型,支持简单的预填充/解码、工具调用(轻量沙箱中的 Python 解释器),用户可通过命令行或 ChatGPT 风格网页界面与模型交互。
  • 此外,系统还会自动生成一份 Markdown 格式报告,总结模型性能表现。

在这里插入图片描述

(Andrej Karpathy 游戏化的赛博活佛orz)

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 一样,发展成一个研究平台或基准项目

2.快速上手

为了让更多的爱好者迅速上手,Karpathy 在 GitHub 上(https://github.com/karpathy/nanochat/discussions/1)详细分享了 nanochat 的教程。

nanochat 被设计为在单个 8×H100 GPU 机器上运行,此次教程中,Karpathy 使用了 Lambda GPU Cloud,每小时大约 24 美元。当然想要尝试的爱好者们也可根据个人情况自行选择,进行了尝试。

接下来看看他到底是怎么做的?

环境搭建

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

git clone git@github.com:karpathy/nanochat.gitcd nanochat

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

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

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

# 安装 uv(如果还没安装的话)command -v uv &> /dev/null || curl -LsSf https://astral.sh/uv/install.sh | sh# 创建本地虚拟环境 .venv(如果不存在的话)[ -d ".venv" ] || uv venv# 安装仓库依赖uv sync# 激活虚拟环境,这样 `python` 就会使用项目的虚拟环境source .venv/bin/activate

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

(对于rust分词器这块,最开始学习rust就是因为一个分词器的demo…回旋镖)

在这里插入图片描述

([Rust_1] 环境配置 | vs golang | 程序运行 | 包管理_rust vs golang-命运的齿轮开始转动bush

Karpathy 称,引入新的分词器确实有点麻烦,但之前 Python 版本的 minbpe 太慢,而 HuggingFace 的 tokenizer 太臃肿且复杂。

所以他自己实现了一个新的 Rust 分词器来训练(经过测试效果与 Python 版本一致),但推理阶段仍会使用 OpenAI 的 tiktoken 来保证效率。

编译分词器步骤如下:

# 安装 Rust / Cargocurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -ysource "$HOME/.cargo/env"# 编译 rustbpe Tokenizeruv run maturin develop --release --manifest-path rustbpe/Cargo.toml

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

训练分词器

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

  1. 训练分词器(tokenizer)
  2. 预训练模型

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

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

此外,Karpathy 还把 sample-100B 版本上传成了 karpathy/fineweb-edu-100b-shuffle(https://huggingface.co/datasets/karpathy/fineweb-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-2GPT-4 分词器做对比:

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

img

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

img

有趣的是,虽然词汇量较小,但在 FineWeb 数据集 上,nanochat 的分词器表现略胜 GPT-4。这是因为 nanochat 的分词器正好针对这个数据集训练(过拟合训练的说…),能够更好地匹配文档分布,比如在英语文本压缩上略占优势。

我们马上就可以进入训练阶段啦 下篇文章见~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/970432.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QQ浏览器的制作

QQ浏览图标制作绘制背板使用圆角矩形工具,绘制512*512px,圆角半径是114px的圆角矩形,图层名称命为“背板” 给“背板”添加渐变样式,把颜色0%该为如下列图片一样,其余不变,点击确定绘制主体使用椭圆工具,绘制39…

端点漏洞防护技术解析

本文详细介绍了FortiGuard Labs的端点漏洞检测服务,涵盖Windows、Linux、MacOS等操作系统,包含CVE-2025-11619证书验证绕过等最新漏洞分析,帮助企业构建完整端点安全防护体系。端点漏洞 | FortiGuard Labs 研究 探索…

爱与时间反应鲜红色慢慢退却 一次次重复直到忘记了誓言 放弃这无果努力不再浪费时间 让心忘记所有感觉 直到永远

test43 法阵 喜欢 cf3100 的 t1 吗,感觉这个题目推推推是笨笨的,应该直接打表观察才对! 先把题意变成大脑更容易接受的样子:横非空,纵非满,横灯连,纵空连。 我们考虑“横非空,横灯连”的形态,双射 \(n\) 个 \…

[Python刷题记录]-搜索插入位置-二分查找-简单

[Python刷题记录]-搜索插入位置-二分查找-简单链接:35. 搜索插入位置 - 力扣(LeetCode) 二分+各种边缘条件的判断1 class Solution(object):2 def searchInsert(self, nums, target):3 ""&qu…

告别低效备考!2025雅思封闭班培训机构深度测评

告别低效备考!2025雅思封闭班培训机构深度测评对于雅思备考者而言,封闭班凭借沉浸式学习环境、严格的时间管理和全程督学服务,成为提分的热门选择。但市场上机构质量参差不齐,如何挑选到教学专业、服务完善的靠谱机…

mariadb galera集群在Openstack中的应用 - T

本文来自博客园,作者:T-BARBARIANS,博文严禁转载,转载必究! 最近对kolla部署的Openstack做了一些调研,尤其是对mariadb galera集群自身的高可用机制,以及haproxy,proxysql组件对mariadb galera集群的负载均衡方…

接上一篇views.py视图内容整理的最终使用方法,包括自定义action,在api请求时的不同点以及注意事项

from rest_framework.generics import GenericAPIView from rest_framework.request import Request from rest_framework import filters from rest_framework import mixins from rest_framework import generics fr…

06.创建型 - 工厂方法模式(Factory Method Pattern)

工厂方法模式(Factory Method Pattern) 参考 - https://mp.weixin.qq.com/s/CEjsRLlQlP0BZpNroCJ2uQ 参考 - https://www.runoob.com/design-pattern/factory-pattern.html 相比简单工厂, 工厂方法可以被看做是一个升…

房价预测项目

基于台北房产数据的房价预测项目,涵盖了数据清洗、可视化分析、回归与分类建模等 一、数据预处理缺失值处理 使用 SimpleImputer 策略为中位数填充,适用于偏态分布数据,避免极端值影响。 `from sklearn.impute impo…

webtui+chawan 搭建兼容TUI与HTML的UI

方案chawan,支持sixel与kitty graphics protocol的终端浏览器,积极开发中: https://chawan.net/#:~:text=Homebrew webtui,仅css的终端主题,严格遵循ch字符单位长度,易于与chawan集成: https://webtui.ironclad.…

实用指南:ArrayList与LinkedList对比:从源码角度分析性能差异ki

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

百年孤独

那天下午赫里内勒多马尔克斯上校收到了奥雷里亚诺布恩迪亚上校的电报。那是一次例行公事的谈话,没有为胶着的战局带来任何突破。谈话即将结束时,赫里内勒多马尔克斯上校望着荒凉的街道、巴旦杏树上凝结的水珠,感觉自…

缩手反射

gl缩手反射是一种保护性非条件反射,能够在不经过大脑皮层的情况下迅速反应,以保护身体免受伤害。是闲来无事搓的gl啊! 仲夏夜茫,七月未央 你坐在桌前,望着黑板上的“神经反射过程图”,嘀嘀咕咕的默念着。 下课铃…

WPF Prism.Wpf implements mvvm,Prism.DryIOC implements IOC,IEventAggregator pub and sub message

Install-Package Prism.Wpf; Install-Package Prism.DryIOC; using System.Configuration; using System.Data; using System.Windows;namespace WpfApp42 {/// <summary>/// Interaction logic for App.xaml///…

linux ftp慢

在 Linux 系统中,使用 ftp 工具进行文件传输时,如果感觉速度慢,可能是由多种因素引起的。以下是一些可能的原因和解决方法,帮助你优化 FTP 的传输速度:? 一、可能的原因网络带宽限制:网络带宽不足,导致传输速度…

2025.11.19

上课,拿快递,吃饭,睡觉,开会,吃饭,再吃饭,上课

CCUT应用OJ题解——重复数

题意来源:1134 - 重复数 | CCUTOJ 题意:在等式 \(A+B=C\) 中,若 \(C>10\) 且 \(C\) 中各数位相同,则定义 \(A,B\) 为重复数,其中\(A\le B\)。求 \([X,Y]\) 中存在几对重复数。 数据范围:\(1\le X\le Y\le 10^…

面试官问你这些,其实是在问你JavaScript执行原理!

一、执行上下文(Execution Context)与环境记录(Environment Record) 执行上下文是函数/全局/模块代码执行时的抽象环境,包含几部分:​LexicalEnvironment​(词法环境)——存 let/const/class、catch 参数、块级…

Linux学习记录(七):WSL

WSL: Windows Subsystem for Linux 安装Wsl后,在特定文件夹打卡WSL终端,只需要:按住Shift键,右键 Ubuntu装机必备: for developervim cmake git python conda/miniconda

防止 FreeFileSync的RealTimeSync.exe实时自动同步程序被意外关闭并保持其进程一直运行 2025年11月19日

防止 FreeFileSync的RealTimeSync.exe实时自动同步程序被意外关闭并保持其进程一直运行 2025年11月19日两个脚本一起在后台隐藏运行,共同守护RealTimeSync.exe进程,共同防止RealTimeSync.exe实时自动同步程序被意外关…