>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
Unknown

如何在普通笔记本电脑上构建和训练自己的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的神秘感。你将在实践中理解为什么模型需要学习率预热、温度如何影响响应的随机性,以及为什么小模型对词汇表大小如此敏感。这是周末高效提升工程知识的绝佳方式。

相关项目