如何在普通笔记本电脑上构建和训练自己的GPT
如今大多数神经网络教程归结为两种情况。你要么被要求用几行Python调用OpenAI API,要么从Hugging Face下载一个现成模型然后调用predict方法。在这两种情况下,所有内部工作原理都被隐藏在幕后。你得到了结果,但几乎不理解矩阵乘法是如何将原始文本转化为有意义的句子的。
最近我发现了开发者angelos-p的llm-from-scratch仓库。这是一个交互式工作坊,你从头编写语言模型的每个组件。无繁重抽象层:纯PyTorch、清晰的数学,在一小时内用普通笔记本电脑训练一个1000万参数的模型。
Входной текст
│
▼
┌─────────────────┐
│ Tokenizer │ "hello" → [20, 43, 50, 50, 53]
└────────┬────────┘
▼
┌─────────────────┐
│ Token Embed + │ Векторы токенов + позиция
│ Position Embed │ (размерность n_embd)
└────────┬────────┘
▼
┌─────────────────┐
│ Transformer │ × n_layer слоев
│ Block: │
│ ┌────────────┐ │
│ │ LayerNorm │ │
│ │ Self-Attn │ │ n_head параллельных голов внимания
│ │ + Residual │ │
│ ├────────────┤ │
│ │ LayerNorm │ │
│ │ MLP (FFN) │ │ расширение 4x, GELU, проекция назад
│ │ + Residual │ │
│ └────────────┘ │
└────────┬────────┘
▼
┌─────────────────┐
│ LayerNorm │
│ Linear → logits│ вероятности следующего символа
└─────────────────┘
一切从何开始
许多人听说过Andrej Karpathy的nanoGPT项目。Karpathy展示了完整的GPT-2架构(1.24亿参数)可以用区区几百行代码实现。然而,复现原始GPT-2仍然需要相当多的计算资源和时间。
llm-from-scratch的作者走得更远。他们移除了所有不必要的集群优化,并调整了代码,使其可以在一个晚上手写完成。最终模型可以在Apple Silicon(MPS)、Nvidia GPU(CUDA)甚至普通CPU上进行训练。如果你没有本地硬件,一切都可以在免费的Google Colab上运行。
工作坊内容
材料按分步模块分解在workshop文件夹中。你依次创建三个可运行的文件:data.py、transformer.py和train.py。
1. 字符级分词
处理大规模文本语料库时,标准解决方案是BPE(字节对编码)算法,词汇表包含50000个词元。但如果你在小数据集上训练小型网络,BPE会破坏你的训练。大多数词元对在整个文本中只会出现几次,它们的权重根本无法收敛。
这就是为什么作者使用字符级分词器来训练莎士比亚戏剧。字母表仅由65个独特字符组成。这个词汇表紧凑、编码快速,让小型模型有机会捕捉语法和对话结构。
2. 构建Transformer
在这里你手动组装GPT解码器架构:
- 字符和文本位置的嵌入表。
- 多头自注意力块,其中每个字符的向量通过查询、键和值(Q、K、V)与上下文交互。
- 因果掩码机制,防止模型在生成过程中窥视未来的词元。
- 带有GELU激活和LayerNorm归一化的全连接层(MLP)。
该架构在没有任何第三方框架的魔法下组装完成。你可以清楚地看到每个张量的流向以及在哪个阶段添加了残差连接。
3. 训练循环
在第三阶段,你编写训练管道。它包括:
- 计算预测logits与实际下一个字符之间的交叉熵损失。
- 带权重衰减调优的AdamW优化器。
- 梯度裁剪以避免训练期间的权重爆炸。
- 带预热和余弦衰减的学习率调度器。
4. 文本生成与采样
训练好的模型需要开口说话。你实现一个自回归循环:取一个文本种子,通过transformer传递,提取下一个词元的概率分布,并使用温度配合贪婪搜索或top-k采样来选择它。
实验配置
仓库提供了三种模型配置。你可以根据空闲时间选择。
| 配置 | 参数 | 层数(n_layer)| 头数(n_head)| 维度(n_embd)| 训练时间(M3 Pro)| |---|---|---|---|---|---| | Tiny | ~0.5M | 2 | 2 | 128 | ~5分钟 | | Small | ~4M | 4 | 4 | 256 | ~20分钟 | | Medium | ~10M | 6 | 6 | 384 | ~45分钟 |
所有配置都使用256个字符的上下文长度。Tiny配置非常适合快速调试,当你需要检查代码是否能无错误运行时。Medium配置已经能产生相当可读的莎士比亚风格散文,包含角色对话划分。
如何运行项目
对于环境管理,作者推荐使用快速包管理器uv。
安装依赖并创建工作文件夹:
# Установка uv (если еще не установлен)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Клонируем репозиторий и синхронизируем окружение
git clone https://github.com/angelos-p/llm-from-scratch
cd llm-from-scratch
uv sync
mkdir scratchpad && cd scratchpad
如果你更喜欢Google Colab,只需安装一组最小的库:
!pip install torch numpy tqdm tiktoken
然后你获取workshop文件夹,打开第一个指南step1_tokenizer.ipynb,一步一步开始编写代码。
谁适合这个工作坊
这个项目会吸引那些厌倦了满是注意力图的可抽象文章、想要看到真正代码的人。完成它不需要深度机器学习知识。能够熟练阅读Python语法并理解基本的数组操作就足够了。
完成所有六个指南后,你会消除对LLM的神秘感。你将在实践中理解为什么模型需要学习率预热、温度如何影响响应的随机性,以及为什么小模型对词汇表大小如此敏感。这是周末高效提升工程知识的绝佳方式。
相关项目