☰
nanoGPT 实操指南:3分钟上手训练自己的 GPT,从字符级到复现 GPT-2
2026/9/25 3:50:39 网站建设 项目流程

nanoGPT 实操指南:3分钟上手训练自己的 GPT,从字符级到复现 GPT-2

【免费下载链接】nanoGPTThe simplest, fastest repository for training/finetuning medium-sized GPTs.项目地址: https://gitcode.com/GitHub_Trending/na/nanoGPT

想自己练一个 GPT,通常绕不开三个麻烦:框架代码动辄上万行,一条训练逻辑都追不到底;硬件门槛高,小显卡连模型都加载不进来;改一行参数却不知道动到了什么。nanoGPT 把 GPT 的训练/微调流程压缩到了最小形态——model.py和train.py两个核心文件各约 300 行,单张 GPU 三分钟训出一个字符级 GPT,8 卡 A100 上能复现 GPT-2(124M)。

⚙️ nanoGPT 是什么:一句话定位与四个核心能力

一句话:nanoGPT 是面向中型 GPT 的最轻量训练/微调仓库。如果说别的训练框架是铺满产线的工厂,nanoGPT 更像只有台数控车床的作坊——零件不多,但每个都能拆开看个明白。

四个差异化点:

  • 两个核心文件合计约 600 行:train.py是标准训练循环,model.py是 GPT 定义,一两个下午能通读,改哪都心里有数
  • 性能有硬指标:单节点 8XA100 40GB 约 4 天复现 GPT-2(124M),最终验证损失约 2.85,与 OpenAI 官方水平相当
  • 硬件可以随便降档:从单张 A100、纯 CPU 的 MacBook,到 Apple Silicon 的 MPS 加速,都有现成命令
  • 全链路自带:数据准备脚本、训练入口、采样脚本、微调配置,外加性能基准bench.py,不用自己拼工具链

🚀 nanoGPT 最快上手路径:从安装依赖到第一次生成

第一步:安装依赖

pip install torch numpy transformers datasets tiktoken wandb tqdm

逐个说:torch是框架本体;transformers用来加载 OpenAI 的 GPT-2 权重;tiktoken是 GPT-2 的 BPE 分词器;datasets只在下载 OpenWebText 时才用得上;wandb做训练日志,tqdm画进度条。

第二步:获取代码

git clone https://gitcode.com/GitHub_Trending/na/nanoGPT cd nanoGPT

第三步:准备第一个数据集

python data/shakespeare_char/prepare.py

脚本会下载一份约 1MB 的莎士比亚文本集(tinyshakespeare),把原文翻成模型能读的数字流,按 9:1 切分。产出三个文件:train.bin、val.bin(整数 id 序列)和meta.pkl(字符与整数的对照表)。字符级编码的词表只有 65 个字符,所以整个准备过程就是几秒钟的事。

第四步:启动第一次训练

python train.py config/train_shakespeare_char.py

配置文件给定的规格:256 字符上下文、6 层 Transformer、6 个头、384 维嵌入、批大小 64、跑 5000 次迭代。A100 上大约 3 分钟跑完,最佳验证损失 1.4697,checkpoint 写到out-shakespeare-char/ckpt.pt。

只有 CPU 或轻薄本的话,把参数降档:

python train.py config/train_shakespeare_char.py --device=cpu --compile=False --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

--device=cpu指定用 CPU 跑;--compile=False关掉 PyTorch 2.0 编译(某些环境不可用,CPU 上也没必要);--block_size=64把上下文从 256 缩到 64 个字符;批大小缩到 12;网络缩到 4 层 4 头 128 维;迭代数减半并把学习率衰减终点跟着调到 2000;--dropout=0.0关掉 dropout,因为网络本来就小、这个数据集就是要过拟合。Apple Silicon 的 Mac 改用--device=mps,调用芯片内嵌 GPU,速度比 CPU 快 2-3 倍。

第五步:生成第一段文本

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

脚本加载out_dir下的最佳 checkpoint,打印几条生成结果。字符级模型只训了 3 分钟,输出保证有错字,但"莎翁腔"已经出来了:

ANGELO: And cowards it be strawn to my bed, And thrust the gates of my threats,

到这里,装环境、备数据、训练、生成,完整闭环已经走通。

🗂️ 核心流程任务卡

任务一:用采样参数调出生成质量

做什么:sample.py里几个参数直接决定输出好不好看,先把它们摸清。

怎么做:

python sample.py --out_dir=out-shakespeare-char --start="To be or not to be" --num_samples=3 --max_new_tokens=200 --temperature=0.7

--start指定开头提示词;--num_samples生成几条;--max_new_tokens每条生成长度;--temperature控制随机性,低于 1.0 更保守、高于 1.0 更放飞。还有个隐藏用法:--start=FILE:prompt.txt可以把一整个文件当提示词喂进去。

看到什么:温度调低后生成更贴合训练语料的腔调,调高则更容易跑偏到胡话。CPU 版小模型(损失约 1.88)出来的句子会更破碎,属正常现象。

任务二:微调预训练 GPT-2

做什么:从零训的小模型语言不通,换个思路——拿 OpenAI 的预训练权重,在目标语料上少训几轮。

怎么做:先用 BPE 分词版的数据准备脚本(和字符级不同,这个走 GPT-2 的 tokenizer):

python data/shakespeare/prepare.py python train.py config/finetune_shakespeare.py

微调配置里三个关键项:init_from = 'gpt2-xl'决定从哪个预训练模型出发(可选gpt2到gpt2-xl四档);learning_rate = 3e-5配decay_lr = False,即恒定小学习率,防止把预训练好的能力冲掉;max_iters = 20配合batch_size=1和 32 步梯度累积,一次迭代吃 32768 个 token,而莎士比亚全集才约 30 万 token,20 次迭代差不多两轮。单卡几分钟跑完,产物在out-shakespeare/。

看到什么:

python sample.py --out_dir=out-shakespeare

生成质量是台阶式提升,句式完整、用词讲究:

THEODORE: Thou shalt sell me to the highest bidder: if I die, I sell thee to the first; if I go mad,

任务三:8 卡复现 GPT-2 124M

做什么:把完整复现走一遍,拿到与 GPT-2 官方对标的验证损失。

怎么做:先准备 OpenWebText(GPT-2 原始训练数据的开源复刻版),这一步要下载并分词,耗时明显长于前两步:

python data/openwebtext/prepare.py

生成train.bin/val.bin(uint16 存储的 GPT-2 BPE id)后,上 8 卡分布式训练:

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

配置里批大小 12、上下文 1024、梯度累积 40(5×8 卡),总批约 50 万 token/迭代,max_iters = 600000对应约 3000 亿 token 的训练量。单节点 8XA100 40GB 上大约跑 4 天。

看到什么:验证损失降到约 2.85。官方 GPT-2 在 OpenWebText 上直接评是 3.11,但微调后也能到 2.85 一档,所以两者算打平。

🧪 进阶玩法:nanoGPT 还能做什么

拿现成的 GPT-2 当生成器。不训练也能玩,--init_from直接加载 OpenAI 权重,比如生成论文风格的摘要开头:

python sample.py --init_from=gpt2-xl \ --start="This paper presents a novel approach to scaling language models" \ --num_samples=1 --max_new_tokens=300

gpt2-xl是 15 亿参数的最大档,单卡显存不够就换gpt2或gpt2-medium。

换成自己的语料。仓库里的数据脚本就是模板:data/shakespeare_char/prepare.py展示了"下载文本 → 编码成整数 → 存 train.bin/val.bin/meta.pkl"的最小流程。把它改成读你的文本(比如公司文档、代码、歌词),再配一个自己的config/xxx.py,就是一个领域模型的完整训练方案。

评测官方模型基线。config/下有四个现成评测配置:

python train.py config/eval_gpt2.py python train.py config/eval_gpt2_xl.py

跑完能对照官方 checkpoint 在 OpenWebText 上的验证损失(gpt2 约 3.12,gpt2-xl 约 2.54),给自己的实验一个锚点。

看性能数据。bench.py剥离了训练循环里所有外围逻辑,只留前向反向的核心,用来量每次迭代耗时、排查显存和速度问题。

🛠️ 避坑手册:训练 GPT 时 5 个高频问题

1. 启动时报 torch.compile 相关错误→ 原因:仓库默认走 PyTorch 2.0 的torch.compile,这功能还带实验性质,部分平台(如 Windows)不支持。 → 解决:命令后加--compile=False,速度慢一些但能跑。

2. CUDA out of memory→ 原因:模型档位、批大小或上下文长度超出了显存。 → 解决:减小block_size(上下文长度),或换小一档的init_from(如gpt2-xl降为gpt2-medium);想保有效批大小就用gradient_accumulation_steps攒梯度,用小物理批模拟大逻辑批。

3. 报 Unknown config key 错误→ 原因:configurator.py的覆盖机制很严格——命令行只认--参数=值形式,且参数名必须在配置文件里已存在、类型必须一致(布尔值要写True/False而不是true)。 → 解决:打开对应config/文件核对参数名和类型,不存在的参数不能凭空传。

4. 采样输出完全是乱码→ 原因:训练迭代数太少,或者用的是 CPU 降档小模型(损失停在 1.8 以上)。 → 解决:加max_iters重训;更省事的办法是走任务二的路线,微调预训练 GPT-2,质量提升是台阶式的。

5. 多机训练慢得离谱→ 原因:没有 InfiniBand 时,NCCL 跨机通信走普通网络,带宽撑不住 8 卡×N 节点的梯度同步。 → 解决:torchrun 命令前加NCCL_IB_DISABLE=1环境变量,训练能跑起来,但 README 的原话是大概率"爬行",先评估机器再上多节点。

🧭 路径选择:按目标挑下一步

只想玩玩:

  • 把sample.py的--temperature和--top_k调到满意为止,感受采样参数的实际效果
  • 照抄data/shakespeare_char/prepare.py的逻辑,换成自己喜欢的语料再训一遍
  • 跑一下bench.py,看看自己机器上一次迭代多少毫秒

想深挖原理:

  • model.py和train.py逐行精读,各 300 行,是理解 GPT 训练全链路成本最低的材料
  • README 提到作者的 Zero To Hero 系列教程配套了 GPT 主题视频,边读边看
  • 按 README todos 里的方向动手,比如把位置编码换成 RoPE / ALiBi,改完用复现任务三的流程验证

想部署上线:

  • 直接复用sample.py的加载逻辑:GPT.from_pretrained('gpt2')或读out_dir/ckpt.pt,包一层接口就是推理服务的最小内核
  • 生产环境留意混合精度(--dtype)和--compile=True两个提速开关,README 里实测编译把单迭代从约 250ms 压到 135ms

nanoGPT 的价值不在强,而在小到能装进脑子——把这两份 300 行的文件读透,之后任何 GPT 训练框架你都有底。

【免费下载链接】nanoGPTThe simplest, fastest repository for training/finetuning medium-sized GPTs.项目地址: https://gitcode.com/GitHub_Trending/na/nanoGPT

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询