分享完整的LLM训练流程和最佳实践,包括数据准备、架构选择、优化技巧等,适合想深入理解模型运作的程序员。
一个动手实践的工作坊,你将自己编写 GPT 训练流水线的每个部分,理解每个组件的作用和原因。
Andrej Karpathy 的 nanoGPT 是我第一次真正接触 LLM 和 Transformer。看到一个工作的语言模型可以用几百行 PyTorch 代码构建,这完全改变了我对 AI 的认识,激励我深入这个领域。
这个工作坊是我尝试给他人同样体验的方式。nanoGPT 的目标是复现 GPT-2(124M 参数)并涵盖很多内容。这个项目把它简化到本质部分,缩小到约 10M 参数的模型,可以在笔记本电脑上一小时内训练完成——设计用来在单个工作坊会话中完成。
一个在你的 MacBook 上从零开始训练的工作 GPT 模型,能够生成莎士比亚风格的文本。你将编写:
训练自动使用 Apple Silicon GPU(MPS)、NVIDIA GPU(CUDA)或 CPU。也可以在 Google Colab 上运行——上传文件并运行 !python train.py。
如果你还没有 uv,先安装它:
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
然后设置项目:
uv sync
mkdir scratchpad && cd scratchpad
如果你没有本地设置,可以将仓库上传到 Colab 并安装依赖:
!pip install torch numpy tqdm tiktoken
将 data/shakespeare.txt 上传到你的 Colab 文件,然后在笔记本单元中编写你的代码,或上传 .py 文件并用 !python train.py 运行它。
依次阅读文档。每个部分都将指导你编写流水线的一个部分,解释每个组件的作用和原因。到最后,你会有一个自己编写的工作 model.py、train.py 和 generate.py。
Input Text
│
▼
┌─────────────────┐
│ Tokenizer │ "hello" → [20, 43, 50, 50, 53] (character-level)
└────────┬────────┘
▼
┌─────────────────┐
│ Token Embed + │ token IDs → vectors (n_embd dimensions)
│ Position Embed │ + positional information
└────────┬────────┘
▼
┌─────────────────┐
│ Transformer │ × n_layer
│ Block: │
│ ┌────────────┐ │
│ │ LayerNorm │ │
│ │ Self-Attn │ │ n_head parallel attention heads
│ │ + Residual │ │
│ ├────────────┤ │
│ │ LayerNorm │ │
│ │ MLP (FFN) │ │ expand 4x, GELU, project back
│ │ + Residual │ │
│ └────────────┘ │
└────────┬────────┘
▼
┌─────────────────┐
│ LayerNorm │
│ Linear → logits│ vocab_size outputs (probability over next token)
└─────────────────┘
所有配置都使用字符级分词(vocab_size=65)和 block_size=256。
这个工作坊在莎士比亚文本上使用字符级分词。BPE 分词(GPT-2 的 50k 词汇表)在小数据集上不适用——大多数 token 二元组对于模型学习模式来说太罕见了。
第 5 部分覆盖了如何为更大的数据集切换到 BPE。