📌 项目地址:FareedKhan-dev/train-llm-from-scratch | ⭐ 2,181 颗星 | 🔧 Jupyter Notebook | 📜 未标注
大家常看到各种“从零实现Transformer”的教程,但多数停留在demo层面:玩具数据、不到百万参数、不涉及对齐。FareedKhan-dev/train-llm-from-scratch 走得更远。它在单个Notebook里手写了Transformer每一个组件(MLP、单头注意力、多头注意力、Transformer Block、训练循环),然后用Pile数据集的一个子集训练了一个1300万参数的模型。这是基础。
更难得的是,它把后训练对齐的整套流程也手写了出来:SFT、Reward Model、PPO、DPO、GRPO。全部用纯PyTorch,没有trl/peft/transformers。训练数据用的是公开的Alpaca、Dolly、Anthropic HH-RLHF、UltraFeedback、GSM8K。支持多GPU(DDP + bf16)。这一点让这个仓库跟市面上绝大部分“从零实现”项目拉开了差距。
项目地址:FareedKhan-dev/train-llm-from-scratch | 2181个star | Jupyter Notebook
基础Transformer:可断点、可修改的源码学习
项目的README把实现步骤列成了清晰的章节。你打开Notebook,按顺序运行,就能看到每个子模块的构造:
- 导入库,准备数据:从Pile数据集中抽取样本,格式是
{"text": "...", "meta": {"pile_set_name": "PubMed Abstracts"}} - Transformer概览(论文结构图对应)
- MLP:两层线性层+ReLU激活
- 单头注意力:Q/K/V的矩阵运算以及维度变化
- 多头注意力:如何划分head、拼接
- Transformer Block:layer norm + attention + MLP,加上残差连接
- 最终模型:堆叠若干Block
- 批量处理、训练参数设置、训练循环
- 保存模型、绘制loss、生成文本
每一个模块都在独立的单元格里。我试了一下,可以在单头注意力的单元格里打断点,打印Q、K、V的shape,观察它们做完softmax(QK^T/√d)V之后维度如何恢复。这种“可调试性”是使用封装好的库(比如nn.Transformer)无法获得的。
不过,模型质量确实很有限。README里展示了1300万参数模型的输出:
In ***1978, The park was returned to the factory-plate that the public share to the lower of the electronic fence that follow from the Station's cities...
语法上通顺,但语义不连贯。这很正常——1300万参数在Pile上训练的时间很短(README说了可以用单GPU),模型的唯一目的是展示整个流程能跑通。不要指望它能做问答。
后训练对齐:比SFT和PPO更底层的手写实现
仓库的POST_TRAINING.md文档描述了完整的对齐管线:Base → SFT → Reward Model → {PPO, DPO} → GRPO。这几乎是当前主流LLM对齐技术的全集。
每个算法都是手写的。比如DPO的损失函数,Notebook里直接实现了:
# 伪代码示意(真实代码在Notebook中)
loss = - torch.log(sigmoid(reference_logprob - policy_logprob))
你能看到每一步的梯度是怎么计算的,而不是在trl里调用一句trainer.train()。同样,PPO的advantage估计、GRPO(Group Relative Policy Optimization)的组内相对奖励等细节,代码里也都直接暴露。
这对我这样想改进对齐算法的人很有价值。比如我想在GRPO里加一个正则项,不用去读trl的源码或改一个封装好的类,直接在这个Notebook里改对应函数就行。它不依赖transformers的AutoModelForCausalLM,用的是仓库自己定义的Transformer类,这意味着我修改模型结构(比如增加一个head)也是可行的。
后训练阶段需要的数据集也是公开的:Alpaca、Dolly(SFT),Anthropic HH-RLHF(RM),UltraFeedback、GSM8K(RLHF)。多GPU训练通过torch.nn.parallel.DistributedDataParallel实现,POST_TRAINING.md里给了启动命令示例(基于README给出的信息,我用仓库说明概括,原文有启动方式)。
使用它你需要什么
这个项目不是开箱即用的工具。你需要:
- 会Python、会PyTorch,了解基本的面向对象编程。
- 本地安装好Jupyter Notebook或Jupyter Lab。
- 下载Pile数据集(可选小部分子集),或者直接用仓库里预处理好的数据(README说明数据来自Pile,但未提供下载脚本,需自行准备)。README也推荐了一些视频资源作为预备知识。
运行命令:
git clone https://github.com/FareedKhan-dev/train-llm-from-scratch.git
cd train-llm-from-scratch
jupyter notebook
打开Notebook,从“Step by Step Code Explanation”章节开始按顺序执行单元格。每个单元格都有解释。
谁适合看这个仓库
我觉得两类人最值:
-
想真正理解Transformer内部细节的学习者:单纯看论文和博客不够,自己写一遍最有效。这个Notebook让你在代码层面验证attention的维度变化、残差连接的形状、层归一化的位置。你可以修改参数(比如head数、d_model、层数)观察对loss曲线和生成结果的影响。
-
做对齐算法研究的人:需要一份干净的baseline来修改。你可以直接基于这个仓库的DPO实现改成IPO,或者把PPO的clip范围改小,观察对reward的影响。不需要解耦trl的复杂类继承关系。
仓库作者FareedKhan在README开头就说了自己在找AI PhD职位,这个项目相当于他的作品集。2181个star说明相当多的人认可这种“拆开看”的价值。它不是一个产品,而是一份可执行的教科书。
===
标签:Transformer手写实现,强化学习对齐,LLM训练教程,代码级别拆解