nanoGPT

GitHub
56.1k 9.6k 中等 3 次阅读 今天MIT语言模型开发框架
AI 解读 由 AI 自动生成,仅供参考

nanoGPT 是一个专注于训练和微调中等规模 GPT 模型的极简开源项目。它旨在解决大语言模型代码库通常过于复杂、难以快速上手的问题,通过高度精简的代码结构,让开发者能在单张显卡上短短几天甚至几分钟内复现经典模型(如 GPT-2)或完成自定义训练。

该项目非常适合深度学习开发者、研究人员以及希望深入理解 Transformer 架构原理的技术爱好者。对于想要从零开始构建模型,或基于现有检查点进行微调的用户来说,nanoGPT 提供了极低的入门门槛。其核心亮点在于“重实践、轻理论”的设计理念:整个训练循环和模型定义分别仅由约 300 行代码构成,去除了冗余的抽象层,代码 plain 且易读。用户不仅可以轻松修改代码以适应特定需求,还能快速在莎士比亚文本等数据集上体验从数据预处理到模型生成的完整流程。尽管作者已推出更新的 nanochat 项目,nanoGPT 作为学习大模型底层实现的经典教材,依然具有极高的参考价值。

使用场景

某初创教育科技公司希望快速构建一个能模仿莎士比亚风格写作的小型语言模型,用于其创意写作辅助产品的原型验证。

没有 nanoGPT 时

  • 团队需从零搭建复杂的 Transformer 训练框架,仅环境配置和基础代码编写就耗时数周。
  • 缺乏清晰的中等规模模型复现参考,难以在单卡 GPU 上高效运行,资源利用率极低。
  • 想要微调现有模型(如 GPT-2)时,因代码耦合度高,修改架构或加载权重极易引发报错。
  • 非深度学习专家的成员无法快速上手实验,只能依赖资深算法工程师排期支持。
  • 从想法到看到生成结果周期过长,导致产品迭代节奏严重滞后。

使用 nanoGPT 后

  • 直接复用约 300 行的 train.pymodel.py,半天内即可完成环境部署并启动训练。
  • 在单张 A100 GPU 上仅需 3 分钟即可训好一个字符级莎士比亚模型,快速验证可行性。
  • 代码结构极简且模块化,轻松加载 OpenAI 的 GPT-2 预训练权重进行微调,大幅提升生成质量。
  • 普通开发人员也能读懂核心逻辑,自主调整超参数或数据预处理流程,降低协作门槛。
  • 当天即可产出可演示的文本样本,加速内部评审与用户测试流程。

nanoGPT 让中小团队能以最低成本、最快速度将大语言模型从理论转化为实际可用的原型。

运行环境要求

操作系统
  • Linux
  • macOS
GPU
  • 可选但推荐
  • 训练中等模型需 NVIDIA GPU (如 A100 40GB)
  • 复现 GPT-2 (124M) 推荐 8x A100 40GB 节点
  • Mac 用户支持 MPS (Apple Silicon) 加速
  • CPU 亦可运行但需减小模型规模
  • 未明确指定 CUDA 版本,需与 PyTorch 版本匹配
内存

未说明 (取决于模型大小,复现 GPT-2 需多卡大显存环境)

依赖
notes1. macOS Apple Silicon 用户建议添加 '--device=mps' 参数以利用芯片 GPU 加速 (2-3 倍)。2. 仅 CPU 运行时需设置 '--device=cpu --compile=False' 并大幅减小模型参数。3. 多机多卡训练需配置网络互联 (推荐 InfiniBand),否则需设置 'NCCL_IB_DISABLE=1'。4. 该仓库已被作者标记为过时 (deprecated),建议查看其新项目 nanochat。
python未说明 (需兼容 PyTorch)
torch
numpy
transformers
datasets
tiktoken
wandb
tqdm
nanoGPT hero image

快速开始

nanoGPT

nanoGPT


更新:2025年11月 nanoGPT 有一个全新且更优秀的“表亲”项目,名为 nanochat。你很可能本来想使用或寻找的是 nanochat,而不是 nanoGPT。nanoGPT(即本仓库)如今已经非常老旧并被弃用,但我仍将其保留以供后人参考。


这是训练和微调中等规模 GPT 模型最简单、最快的代码库。它是对 minGPT 的重写版,更注重实用性而非教学性。目前仍在积极开发中,但 train.py 文件已能在单台配备 8 张 A100 显卡(每张 40GB)的机器上,在大约 4 天的训练时间内复现 GPT-2(1.24 亿参数)模型,并在 OpenWebText 数据集上进行训练。代码本身简洁易懂:train.py 是一个约 300 行的标准训练循环,而 model.py 则定义了一个约 300 行的 GPT 模型结构,还可以选择加载 OpenAI 提供的 GPT-2 权重。仅此而已。

repro124m

由于代码极其简单,因此非常容易根据需求进行修改,从头开始训练新模型,或者对预训练检查点进行微调(例如,目前可用的最大预训练模型是 OpenAI 的 GPT-2 13 亿参数版本)。

安装

pip install torch numpy transformers datasets tiktoken wandb tqdm

依赖项:

  • PyTorch <3
  • NumPy <3
  • transformers 用于加载 Hugging Face 的 Transformer 模型 <3(以便加载 GPT-2 检查点)
  • datasets 用于处理 Hugging Face 的数据集 <3(如果你需要下载并预处理 OpenWebText 数据集)
  • tiktoken 提供 OpenAI 快速 BPE 编码实现 <3
  • wandb 用于可选的日志记录 <3
  • tqdm 用于显示进度条 <3

快速入门

如果你不是深度学习专业人士,只是想体验一下 AI 的神奇之处并初步上手,最快的方式是在莎士比亚的作品上训练一个基于字符级别的 GPT 模型。首先,我们将莎士比亚的作品下载为一个 1MB 的文本文件,并将其转换成一个巨大的整数序列:

python data/shakespeare_char/prepare.py

这会在该数据目录下生成 train.binval.bin 文件。接下来就可以开始训练你的 GPT 了。训练规模很大程度上取决于你的计算资源:

我有一块 GPU。太好了!我们可以使用 config/train_shakespeare_char.py 配置文件中的设置快速训练一个小型 GPT:

python train.py config/train_shakespeare_char.py

打开该配置文件可以看到,我们正在训练一个上下文长度最多 256 个字符、特征通道数为 384、包含 6 层 Transformer 且每层有 6 个注意力头的 GPT 模型。在一块 A100 GPU 上,整个训练过程大约需要 3 分钟,最佳验证损失为 1.4697。根据配置,模型检查点会被保存到 --out_dir 指定的 out-shakespeare-char 目录中。训练完成后,我们可以通过指向该目录来采样最佳模型:

python sample.py --out_dir=out-shakespeare-char

这会生成一些示例文本,例如:

安杰洛:
懦夫竟敢闯入我的床榻,
强行推开我的门扉,
只因他曾与那人一同偷窃、一同受刑。

维琴提奥公爵:
我感谢你的眼睛没有看到这一切。

维琴提奥公爵:
那么我就回答他,以挽救那杯美酒:
你这位暴君究竟为何要如此行事呢?

维琴提奥公爵:
若你曾犯下种种恶行,
只为终结他的权势,那么这一天终将到来——
普通百姓将奋起反抗,
如同玫瑰般绽放出新的希望。

哈哈 ¯\_(ツ)_/¯。对于一个在 GPU 上训练了 3 分钟的字符级模型来说,这样的效果已经不错了。如果在此数据集上对预训练的 GPT-2 模型进行微调,很可能会获得更好的结果(详见后续的微调部分)。

我只有一台 MacBook(或其他廉价电脑)。别担心,我们仍然可以训练 GPT,不过需要适当降低一些参数。建议在安装 PyTorch 时选择最新的 nightly 版本(点击此处获取),因为最新版本通常能显著提升代码效率。即便不使用 nightly 版本,简单的训练命令也可以如下所示:

python train.py config/train_shakespeare_char.py --device=cpu --compile=False --eval_iters=20 --log_interval=1 --block_size=64 --batch_size=12 --n_layer=4 --n_head=4 --n_embd=128 --max_iters=2000 --lr_decay_iters=2000 --dropout=0.0

在这里,由于我们是在 CPU 上运行,必须同时设置 --device=cpu,并且关闭 PyTorch 2.0 的编译功能,即 --compile=False。此外,在评估时,我们采用了更少但更快的估计次数(--eval_iters=20,从之前的 200 减少),上下文长度也从 256 个字符缩减至 64 个字符,每次迭代的批量大小也从 64 个样本减少到 12 个样本。我们还使用了一个更小的 Transformer 模型(4 层、4 个注意力头、128 维嵌入),并将最大迭代次数降至 2000 次(相应地,学习率衰减步数也调整为与最大迭代次数一致)。由于网络规模较小,我们也减少了正则化强度(--dropout=0.0)。尽管如此,整个训练过程仍然只需约 3 分钟,但得到的损失值为 1.88,生成的样本质量自然也会稍差,不过依然趣味十足:

python sample.py --out_dir=out-shakespeare-char --device=cpu

生成的样本可能如下:

格勒肯·温哈德三世:
唉,这究竟是怎么回事,那光芒万丈的光束,
为何在秋日的清晨显得如此黯淡无光?
你是否也曾渴望过那样的辉煌,
却始终未能如愿以偿?
如今,时光流逝,岁月无情,

对于在 CPU 上运行了约 3 分钟的模型来说,这已经相当不错了,至少能让你感受到一点正确的字符风格。如果你愿意花更多时间,也可以进一步调整超参数,增大网络规模、上下文长度(--block_size)、训练时长等。

最后,在搭载 Apple Silicon 芯片的 MacBook 上,并且使用较新版本的 PyTorch 时,请务必添加 --device=mps(即“Metal Performance Shaders”的缩写);这样 PyTorch 就会利用芯片内置的 GPU 来显著加速训练(提速 2–3 倍),从而支持更大规模的网络。更多信息请参阅 Issue 28

复现 GPT-2

对于更专业的深度学习从业者来说,复现 GPT-2 的结果可能更具吸引力。那么我们现在就开始——首先对数据集进行分词处理,这里我们使用的是 OpenWebText 数据集,它是 OpenAI(私有)WebText 的开源复现版本:

python data/openwebtext/prepare.py

这段代码会下载并分词 OpenWebText 数据集,生成 train.binval.bin 文件,其中包含 GPT-2 BPE 分词的 token ID,以原始 uint16 字节的形式存储。接下来我们就可以开始训练了。要复现 GPT-2(1.24 亿参数),你需要至少一台配备 8 块 A100 40GB 显卡的节点,并运行以下命令:

torchrun --standalone --nproc_per_node=8 train.py config/train_gpt2.py

使用 PyTorch 的分布式数据并行(DDP)训练大约需要 4 天时间,最终损失可以降到约 2.85。需要注意的是,在 OpenWebText 数据集上直接评估的 GPT-2 模型验证损失约为 3.11,但经过微调后,由于领域差异的存在,损失会降至约 2.85 左右,从而使两个模型的表现接近。

如果你在一个多 GPU 节点的集群环境中,可以让 GPU 加速训练,例如在 2 个节点上并行运行:

# 在第一个(主)节点上运行,假设 IP 地址为 123.456.123.456:
torchrun --nproc_per_node=8 --nnodes=2 --node_rank=0 --master_addr=123.456.123.456 --master_port=1234 train.py
# 在工作节点上运行:
torchrun --nproc_per_node=8 --nnodes=2 --node_rank=1 --master_addr=123.456.123.456 --master_port=1234 train.py

建议先对你的网络互联性能进行基准测试(例如使用 iperf3)。特别是如果没有 Infiniband 网络时,还需要在上述命令前加上 NCCL_IB_DISABLE=1。这样多节点训练仍然可以运行,但速度可能会非常慢。默认情况下,检查点会定期保存到 --out_dir 指定的目录中。你可以通过运行 python sample.py 来从模型中采样。

最后,如果你想在单个 GPU 上训练,只需直接运行 python train.py 脚本即可。仔细查看脚本的所有参数,它设计得非常易读、可修改且透明。根据你的需求,你可能需要调整其中的一些变量。

基线对比

借助 OpenAI 提供的 GPT-2 检查点,我们可以为 OpenWebText 数据集设定一些基线。具体操作如下:

$ python train.py config/eval_gpt2.py
$ python train.py config/eval_gpt2_medium.py
$ python train.py config/eval_gpt2_large.py
$ python train.py config/eval_gpt2_xl.py

以下是训练和验证损失的结果:

模型 参数量 训练损失 验证损失
gpt2 1.24 亿 3.11 3.12
gpt2-medium 3.5 亿 2.85 2.84
gpt2-large 7.74 亿 2.66 2.67
gpt2-xl 15.58 亿 2.56 2.54

不过需要注意的是,GPT-2 是在封闭且未公开的 WebText 数据集上训练的,而 OpenWebText 只是该数据集的一个尽力还原的开源版本。这意味着两者之间存在数据分布上的差距。事实上,如果我们使用 GPT-2(1.24 亿参数)的检查点直接在 OpenWebText 数据集上进行一段时间的微调,验证损失可以降低到约 2.85,这将是一个更合适的复现基线。

微调

微调的过程与普通训练并无不同,只是我们需要从预训练模型初始化,并使用较小的学习率进行训练。以在新文本上微调 GPT 为例,进入 data/shakespeare 目录,运行 prepare.py 下载莎士比亚的小型数据集,并使用 GPT-2 的 OpenAI BPE 分词器将其转换为 train.binval.bin 文件。与 OpenWebText 不同的是,这个过程只需几秒钟即可完成。微调所需的时间也很短,例如在单个 GPU 上可能只需要几分钟。你可以运行以下命令进行微调:

python train.py config/finetune_shakespeare.py

该命令会加载 config/finetune_shakespeare.py 中的配置参数覆盖(尽管我并没有对这些参数做太多调整)。基本上,我们从 GPT-2 检查点初始化(init_from),然后按照常规方式训练,只是训练时间更短,学习率也更小。如果显存不足,可以尝试减小模型规模(选项包括 {'gpt2', 'gpt2-medium', 'gpt2-large', 'gpt2-xl'})或减少 block_size(上下文长度)。最佳检查点(验证损失最低的)会保存在 out_dir 目录下,默认为 out-shakespeare,具体路径由配置文件决定。之后你可以运行 sample.py --out_dir=out-shakespeare

THEODORE:
你要把我卖给出价最高的人:如果我死了,
你就把卖给我第一个买家;如果我疯了,
你就把卖给我第二个买家;如果我说谎,
你就把卖给我第三个买家;如果我杀人,
你就把卖给我第四个买家:所以无论买还是卖,
我再告诉你一次,你都不能卖掉我的财产。

JULIET:
如果你偷窃,你就不能卖掉自己。

THEODORE:
我不偷窃,我只是贩卖赃物。

THEODORE:
你根本不知道你在卖什么;你,一个女人,
永远都是受害者,毫无价值:
你没有任何权利,只有被出卖的权利。

哇哦,GPT 这次似乎进入了某种黑暗的境地。我在配置文件中并没有对超参数做太多调整,大家完全可以自行尝试!

采样/推理

使用 sample.py 脚本可以从 OpenAI 发布的预训练 GPT-2 模型中采样,也可以从你自己训练的模型中采样。例如,以下是从最大的可用 gpt2-xl 模型中采样的方法:

python sample.py \
    --init_from=gpt2-xl \
    --start="生命、宇宙以及一切的终极答案是什么?" \
    --num_samples=5 --max_new_tokens=100

如果你想从自己训练的模型中采样,只需正确设置 --out_dir 参数即可。你还可以从文件中读取提示文本,例如:

python sample.py --start=FILE:prompt.txt

效率相关说明

对于简单的模型基准测试和性能分析,bench.py 可能会很有用。它与 train.py 训练循环的核心部分完全相同,但省略了其他复杂的逻辑。

请注意,代码默认使用 PyTorch 2.0。截至 2022 年 12 月 29 日,夜间构建版本已经支持 torch.compile()。启用这一功能后,性能提升非常明显,例如迭代时间可以从每轮约 250 毫秒缩短至 135 毫秒。PyTorch 团队做得很好!

待办事项

  • 探索并引入 FSDP 替代 DDP
  • 在标准评测(如 LAMBADA、HELM 等)上评估零样本困惑度
  • 对微调脚本进行优化,我认为当前的超参数设置并不理想
  • 在训练过程中安排线性增加的批量大小
  • 引入其他嵌入方式(旋转位置编码、Alibi 注意力等)
  • 将检查点中的优化器缓冲区与模型参数分离
  • 增加对网络健康状况的监控日志记录(如梯度裁剪事件及幅度)
  • 进一步研究更好的初始化方法等

故障排除

请注意,默认情况下,此仓库使用 PyTorch 2.0(即 torch.compile)。这一功能相对较新且处于实验阶段,并非所有平台都支持(例如 Windows)。如果您遇到相关错误信息,可以尝试通过添加 --compile=False 标志来禁用该功能。这样做会降低代码运行速度,但至少可以让程序正常运行。

为了更好地了解本仓库、GPT 以及语言建模的相关背景,您可以观看我的 Zero To Hero 系列。特别是其中的 GPT 视频,如果您已经具备一定的语言建模基础,将会非常有帮助。

如需进一步交流或讨论,欢迎前往 Discord 的 #nanoGPT 频道:

致谢

所有 nanoGPT 实验均在 Lambda Labs 提供的 GPU 上运行,Lambda Labs 是我最喜爱的云端 GPU 服务提供商。感谢 Lambda Labs 对 nanoGPT 的赞助!

常见问题

相似工具推荐

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|今天
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

139k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.7k|★★☆☆☆|2天前
开发框架图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|今天
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|昨天
Agent图像开发框架