name: nanogpt description: 约300行代码的教育性GPT实现。在OpenWebText上重现GPT-2(124M)。简洁、可修改的代码,用于学习变压器模型。由Andrej Karpathy开发。从零开始理解GPT架构的完美工具。可在Shakespeare(CPU)或OpenWebText(多GPU)上训练。 version: 1.0.0 author: Orchestra Research license: MIT tags: [模型架构, NanoGPT, GPT-2, 教育性, Andrej Karpathy, 变压器, 简约, 从零开始, 训练] dependencies: [torch, transformers, datasets, tiktoken, wandb]
nanoGPT - 简约GPT训练
快速开始
nanoGPT是一个简化的GPT实现,专为学习和实验设计。
安装:
pip install torch numpy transformers datasets tiktoken wandb tqdm
在Shakespeare上训练(CPU友好):
# 准备数据
python data/shakespeare_char/prepare.py
# 训练(CPU上5分钟)
python train.py config/train_shakespeare_char.py
# 生成文本
python sample.py --out_dir=out-shakespeare-char
输出:
ROMEO:
What say'st thou? Shall I speak, and be a man?
JULIET:
I am afeard, and yet I'll speak; for thou art
One that hath been a man, and yet I know not
What thou art.
常见工作流程
工作流程1:字符级Shakespeare
完整训练管道:
# 步骤1:准备数据(创建train.bin, val.bin)
python data/shakespeare_char/prepare.py
# 步骤2:训练小模型
python train.py config/train_shakespeare_char.py
# 步骤3:生成文本
python sample.py --out_dir=out-shakespeare-char
配置 (config/train_shakespeare_char.py):
# 模型配置
n_layer = 6 # 6个变压器层
n_head = 6 # 6个注意力头
n_embd = 384 # 384维嵌入
block_size = 256 # 256字符上下文
# 训练配置
batch_size = 64
learning_rate = 1e-3
max_iters = 5000
eval_interval = 500
# 硬件
device = 'cpu' # 或 'cuda'
compile = False # 对于PyTorch 2.0设置为True
训练时间: ~5分钟(CPU),~1分钟(GPU)
工作流程2:重现GPT-2(124M)
在OpenWebText上多GPU训练:
# 步骤1:准备OpenWebText(约需1小时)
python data/openwebtext/prepare.py
# 步骤2:使用DDP训练GPT-2 124M(8 GPUs)
torchrun --standalone --nproc_per_node=8 \
train.py config/train_gpt2.py
# 步骤3:从训练模型采样
python sample.py --out_dir=out
配置 (config/train_gpt2.py):
# GPT-2(124M)架构
n_layer = 12
n_head = 12
n_embd = 768
block_size = 1024
dropout = 0.0
# 训练
batch_size = 12
gradient_accumulation_steps = 5 * 8 # 总批次约0.5M令牌
learning_rate = 6e-4
max_iters = 600000
lr_decay_iters = 600000
# 系统
compile = True # PyTorch 2.0
训练时间: ~4天(8× A100)
工作流程3:微调预训练GPT-2
从OpenAI检查点开始:
# 在train.py或配置中
init_from = 'gpt2' # 选项: gpt2, gpt2-medium, gpt2-large, gpt2-xl
# 模型自动加载OpenAI权重
python train.py config/finetune_shakespeare.py
示例配置 (config/finetune_shakespeare.py):
# 从GPT-2开始
init_from = 'gpt2'
# 数据集
dataset = 'shakespeare_char'
batch_size = 1
block_size = 1024
# 微调
learning_rate = 3e-5 # 微调时降低学习率
max_iters = 2000
warmup_iters = 100
# 正则化
weight_decay = 1e-1
工作流程4:自定义数据集
在你自己的文本上训练:
# data/custom/prepare.py
import numpy as np
# 加载你的数据
with open('my_data.txt', 'r') as f:
text = f.read()
# 创建字符映射
chars = sorted(list(set(text)))
stoi = {ch: i for i, ch in enumerate(chars)}
itos = {i: ch for i, ch in enumerate(chars)}
# 令牌化
data = np.array([stoi[ch] for ch in text], dtype=np.uint16)
# 分割训练/验证集
n = len(data)
train_data = data[:int(n*0.9)]
val_data = data[int(n*0.9):]
# 保存
train_data.tofile('data/custom/train.bin')
val_data.tofile('data/custom/val.bin')
训练:
python data/custom/prepare.py
python train.py --dataset=custom
何时使用 vs 替代方案
使用nanoGPT时:
- 学习GPT工作原理
- 实验变压器变体
- 教学/教育目的
- 快速原型开发
- 有限计算资源(可在CPU上运行)
简洁性优势:
- 约300行: 整个模型在
model.py中 - 约300行: 训练循环在
train.py中 - 可修改: 易于调整
- 无抽象: 纯PyTorch
使用替代方案代替:
- HuggingFace Transformers: 生产使用,多种模型
- Megatron-LM: 大规模分布式训练
- LitGPT: 更多架构,生产就绪
- PyTorch Lightning: 需要高级框架
常见问题
问题: CUDA内存不足
减少批次大小或上下文长度:
batch_size = 1 # 从12减少
block_size = 512 # 从1024减少
gradient_accumulation_steps = 40 # 增加以维持有效批次
问题: 训练太慢
启用编译(PyTorch 2.0+):
compile = True # 2×加速
使用混合精度:
dtype = 'bfloat16' # 或 'float16'
问题: 生成质量差
训练更长时间:
max_iters = 10000 # 从5000增加
降低温度:
# 在sample.py中
temperature = 0.7 # 从1.0降低
top_k = 200 # 添加top-k采样
问题: 无法加载GPT-2权重
安装transformers:
pip install transformers
检查模型名称:
init_from = 'gpt2' # 有效: gpt2, gpt2-medium, gpt2-large, gpt2-xl
高级主题
模型架构: 查看references/architecture.md了解GPT块结构、多头注意力和MLP层的简单解释。
训练循环: 查看references/training.md了解学习率调度、梯度累积和分布式数据并行设置。
数据准备: 查看references/data.md了解令牌化策略(字符级 vs BPE)和二进制格式细节。
硬件要求
-
Shakespeare(字符级):
- CPU: 5分钟
- GPU(T4): 1分钟
- VRAM: <1GB
-
GPT-2(124M):
- 1× A100: ~1周
- 8× A100: ~4天
- VRAM: ~16GB每GPU
-
GPT-2 Medium(350M):
- 8× A100: ~2周
- VRAM: ~40GB每GPU
性能:
- 使用
compile=True: 2×加速 - 使用
dtype=bfloat16: 50%内存减少
资源
- GitHub: https://github.com/karpathy/nanoGPT ⭐ 48,000+
- 视频: “Let’s build GPT” by Andrej Karpathy
- 论文: “Attention is All You Need” (Vaswani et al.)
- OpenWebText: https://huggingface.co/datasets/Skylion007/openwebtext
- 教育性: 最适合从零开始理解变压器模型