train-llm-from-scratch:用纯 PyTorch 走完从文本到 GRPO 的完整训练链
A straightforward method for training your LLM, from downloading data to generating text.
秒懂
- 它是什么?
- 这个仓库把大模型训练从数据下载一直写到 GRPO,全程不用 trl、peft 或 transformers。它适合想看清每一行算法的人,但单 GPU 的规模上限和脚本的教程属性决定了它不是生产工具。
- 适合谁用?
- 适合学生、研究者和想摆脱框架黑盒的工程师。它的价值在于把注意力机制、Bradley-Terry 奖励模型、PPO 的 GAE 估计、GRPO 的组相对策略优化全部摊开成可读的 Python 代码,每一段都能对应到论文公式。
- 能商用吗?
- 可以。MIT 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
- 还在维护吗?
- 在维护。仓库最近一次提交在 30 天前。
- 用什么语言写的?
- 主要是 Python(依据 GitHub 的语言统计)。
以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。
开源项目深度解析
一个仓库装下从分词到 GRPO 的整条流水线
大多数开源训练项目只覆盖一段:要么是预训练,要么是微调。FareedKhan-dev/train-llm-from-scratch 试图把整条链路串起来,从原始文本下载、tokenize、训练一个基于 Attention is All You Need 论文的 Transformer,再到 SFT、奖励模型、PPO、DPO、ORPO、KTO 和 GRPO。README 里画出的路径是 raw text 到 tokens,再到 Transformer,再到 next-token loss,最后到 base model,然后继续进入对齐阶段。这个范围本身就少见。更少见的是它明确声明不用 trl、peft 或 transformers,所有算法都用普通 PyTorch 手写。对想看清 DPO 和 PPO 内部差异的人来说,这比调用现成库有说服力得多。仓库的定位不是生产工具,而是一份可运行的、带颜色标注的教程。README 用颜色区分数据、模型、损失和 checkpoint,这种视觉约定让长流程容易跟踪。
代码结构:从 MLP 到 Transformer 的积木式搭建
仓库把模型拆成小零件,每一块都有独立文件。README 的目录显示,先写 Multi Layer Perceptron,再写 Single Head Attention,然后组装成 Multi Head Attention,再组成 Transformer Block,最后是完整的 Transformer。这种顺序不是随意的,它对应了理解 Transformer 的最佳路径。每个代码块后面附有预期输出,这对自学者是实用的反馈机制。数据加载、配置、UI 被分成 config、src、data_loader、ui 四个包,editable install 后不需要手动设置 PYTHONPATH。这种结构让读者可以单独阅读注意力实现,而不必先理解整个训练循环。但要注意,README 没有给出每个文件的完整内容,只提供了目录框架,实际代码质量需要 clone 后自行判断。
安装与运行:editable 安装和可选依赖
安装命令很简单:git clone 后进入目录,执行 pip install -e .。editable 安装会把 config、src、data_loader、ui 加到 import path,省去手动设置 PYTHONPATH 的麻烦。可选依赖分成两组:pip install -e ".[train]" 安装 datasets 和 wandb,用于下载数据和记录日志;pip install -e ".[ui]" 安装 streamlit、pandas 和 altair,用于那个控制面板。README 还提到一个 Streamlit Control Panel,但没给出启动命令和具体界面截图,这部分需要查文档站点或源码确认。训练脚本支持 --amp、--grad-checkpointing、--grad-accum 三个 flag,用于在显存不足时降低内存占用。这三个 flag 是 opt-in 的,默认不开启,意味着开箱即用的配置可能对 2B 模型在 24GB 显卡上跑不动。
显存与规模:13M 参数是起点,2B 需要挑显卡
README 给了详细的显存对照表。A100 40GB 可以训练 2B 模型,最大实际规模约 6B 到 8B。V100 16GB 不能训练 2B,最大约 2B。RTX 4090 24GB 可以训练 2B,最大约 4B。RTX 5090 32GB 被标为 13M 已验证,更大配置待定,这个标注说明作者对新一代显卡的测试还不完整。T4 16GB 只能训练约 1.5B 到 2B。免费 Colab 或 Kaggle 的 T4 足够跑 13M 参数模型,但跑不了十亿级。这个表是作者的经验估计,不是基准测试结果,实际能跑多大还取决于序列长度、batch size 和优化器状态。13M 模型的生成样例在 README 里展示过,输出像英文维基百科的语法碎片,能看出语言结构但内容无意义。这是小模型的正常表现,也提醒读者不要对最终文本质量抱有不切实际的期待。
post-training 部分:从 SFT 到 GRPO 的算法全集
仓库的后半部分是它最独特的地方。README 列出了 SFT、Bradley-Terry 奖励模型、带 GAE 的 PPO、DPO、ORPO、KTO 和 GRPO,全部在同一个小型 Transformer 上实现,使用真实公开数据集训练。对研究者来说,这意味着可以在同一套代码里对比不同对齐算法的行为差异。GRPO 通常和 RLVR(可验证奖励的强化学习)一起出现,README 把它们列为同一节。这种从 SFT 到 RL 的完整覆盖在教程仓库里很少见。但要注意,这些实现是教学性的,没有经过大规模调优。算法之间的性能对比需要自己跑实验,README 没有提供任何损失曲线或评估分数。若你想快速验证某个新想法,这个仓库提供了一个可修改的基线,但若你要复现论文级别的结果,它可能不够。
评估与对话:Step 6 和 Step 7 的实际内容
README 的目录里有独立的评估章节和对话章节。评估是 Step 6,对话是 Step 7。但 README 正文被截断,没有给出评估的具体指标或对话脚本的调用方式。从目录结构推断,评估可能包含困惑度或下游任务测试,对话部分可能是一个简单的交互脚本。文档站点 https://fareedkhan-dev.github.io/train-llm-from-scratch/ 被标记为可用,但内容未在 README 中展示。这种信息缺口意味着读者需要自行浏览文档站点或阅读源码才能知道评估脚本的输入输出格式。仓库没有发布任何 release,所以没有版本号可依赖,代码变动可能随时发生。
维护状态与许可证:活跃但无版本管理
最后一次 push 是 2026 年 8 月,仓库未被归档,说明作者仍在维护。但没有任何 release 版本,这意味着你无法通过版本号锁定依赖。使用 git commit hash 是唯一的稳定引用方式。许可证是 MIT,允许商业使用和修改,但要注意代码中引用的公开数据集各有自己的许可证,训练出的模型权重可能受数据条款约束。README 顶部写着作者正在寻找 AI 方向的 PhD 位置,这解释了仓库的教学性质。它更像一份申请材料,而不是一个社区驱动的项目。贡献是欢迎的,但目前的开发节奏和文档深度都取决于单个作者。
替代方案:与 nanoGPT 和 Hugging Face TRL 的对比
若你想训练一个小型 GPT,Andrej Karpathy 的 nanoGPT 是更成熟的起点。nanoGPT 专注预训练,代码极简,社区验证充分,但它不包含 post-training 部分。若你想做对齐,Hugging Face 的 TRL 库提供了生产级的 PPO、DPO 实现,有完整测试和文档,但它是黑盒,你很难看到每一步的数学细节。train-llm-from-scratch 的独特位置在于它同时覆盖预训练和对齐,且所有代码可读。代价是代码没有经过大规模验证,显存优化手段只有三个 flag,不像 TRL 那样支持 DeepSpeed 或 FSDP。选择哪个取决于你的目标:理解算法选这个仓库,训练可用模型选 nanoGPT 加 TRL。
编辑结论
适合学生、研究者和想摆脱框架黑盒的工程师。它的价值在于把注意力机制、Bradley-Terry 奖励模型、PPO 的 GAE 估计、GRPO 的组相对策略优化全部摊开成可读的 Python 代码,每一段都能对应到论文公式。不适合指望它训练出可部署模型的人,README 自己给出的 13M 参数生成样例已经说明小模型的文本质量停留在语法通顺层面。也不适合需要多机并行、混合精度自动调优或成熟 checkpoint 管理的人,这些功能要么是 opt-in 的简单 flag,要么根本不存在。采用前先验证三件事:你的 GPU 显存能否容纳目标模型,README 里的显存表是否与你的实际驱动版本一致,以及你是否愿意花时间阅读 src 下的源码而不是只跑脚本。若你的目标是理解对齐算法,这个仓库是目前少见的、能把 PPO 和 GRPO 的差异在同一套代码里对比的起点。
社区笔记