一个仓库,零框架依赖:train-llm-from-scratch如何让训练LLM变得简单
【免费下载链接】train-llm-from-scratchA straightforward method for training your LLM, from downloading data to generating text.项目地址: https://gitcode.com/GitHub_Trending/tr/train-llm-from-scratch
train-llm-from-scratch 是一个用纯 PyTorch 手写的 LLM 训练项目:不依赖trl、peft、transformers等任何大模型框架,从下载语料、训练基础模型,一路做到 SFT、奖励模型、PPO、DPO、GRPO 对齐与推理对话,全部算法逐行手写。哪怕你只有一张免费 Colab T4 显卡,也能用它从零训出一个 13M 参数的小语言模型,并完整走通对齐流程。
🗺️ 一个仓库覆盖完整 LLM 训练流水线
这个仓库把"训练 LLM"拆成了一条可独立运行、又可一键串联的流水线:
原始文本 → 分词 → Transformer → 基础模型 基础模型 → SFT → 奖励模型 → {PPO, DPO} → GRPO → 评估 & 聊天每个阶段都对应 scripts/ 下一个独立脚本,配置集中在 configs/ 的 JSON 文件里(每个阶段一份,支持命令行覆盖任意字段),想快速验证还有 configs/smoke/ 下的小模型配置,几秒就能跑完一个完整阶段。
🧩 为什么"零框架依赖"是它最大的卖点
大多数 LLM 训练教程要么用现成框架"黑盒式"调用,要么只讲预训练不碰对齐。这个项目两条路都不走:
- 核心依赖极简:模型与数据路径只需要
torch、numpy、tiktoken、h5py、tqdm等少数几个包(见 pyproject.toml),trl/peft/transformers一概不用; - 每个算法可读可改:SFT 的 loss mask、Bradley-Terry 奖励、PPO 的 GAE 与 clip、GRPO 的组相对优势,都是几十行内的独立函数,全部位于 src/post_training/;
- 单卡可跑:13M 模型在免费 GPU 上即可训练;显存不够时预训练脚本支持
--amp --grad-checkpointing --grad-accum省显存参数。
对想真正搞懂 LLM 训练内部机制的人来说,"能读懂的每一行"比"能跑起来的黑盒"值钱得多。
🚀 三步快速上手:克隆、安装、开训
第 1 步:克隆仓库
git clone https://gitcode.com/GitHub_Trending/tr/train-llm-from-scratch cd train-llm-from-scratch第 2 步:安装(可编辑模式,省去手动设置 PYTHONPATH)
pip install -e ".[train]" # 训练 + 数据下载;UI 用户装 .[ui]第 3 步:先跑冒烟测试,再正式训练
python tests/test_post_training_smoke.py # CPU 上验证核心数学 python scripts/train_sft.py --config configs/smoke/sft.json # 迷你模型完整训练确认环境无误后,用 config/config.py 里的 13M 小配置跑第一个预训练:
python scripts/train_transformer.py完整命令清单可参考 docs/howto/commands.md。
📦 数据准备:四条流水线并行就绪
模型只认识整数,所以第一步永远是"文本 → token id → 落盘"。这个项目一次性为四个阶段准备好数据:预训练语料(The Pile)、SFT 指令数据(Alpaca/Dolly/GSM8K)、偏好对(HH-RLHF/UltraFeedback)、RL 数学题(GSM8K)。四条流水线各自独立、产物清晰:
分词采用 GPT-3 同款r50k_basetokenizer;SFT 数据会额外生成 0/1 的loss mask,只让模型学习"助手回答"部分而不复读提示词——这个细节在 src/post_training/chat_template.py 中实现。
📉 预训练:一条 loss 曲线讲完整个故事
预训练是整条流水线中最耗时的一步:随机取 token 窗口 → 预测下一个词 → 交叉熵算误差 → 反向传播更新。仓库提供两条路径:
- 教学版scripts/train_transformer.py:单卡、最简代码,适合理解原理;
- 实战版scripts/pretrain_base.py:DDP 多卡、bf16、梯度累积、余弦学习率调度、断点续训,一个命令从 1 卡切到 N 卡。
作者在 2×L40 上训练的 77M 模型,loss 从 11.14(接近均匀猜测的 ln(50304)≈10.83)一路降到 3.7 左右,这就是模型把语言模式"压缩"进权重的过程:
🧱 模型本体:用四个小零件拼出 Transformer
Transformer 作为一坨代码看着吓人,仓库把它拆成四块,每块都是独立的nn.Module:
- src/models/mlp.py —— 单 token 的"思考"前馈网络;
- src/models/attention.py —— 单头与多头注意力(因果掩码让它成为语言模型);
- src/models/transformer_block.py —— 注意力 + MLP + 残差连接;
- src/models/transformer.py —— 嵌入、位置编码、堆叠的 Block 与 lm_head。
整个后训练体系只在这个模型上加了一个forward_hidden方法,奖励头、价值头全部"外挂"组合,一行原始模型代码都不用改——这就是作者所说的"wrap, don't rewrite"设计哲学。
🎯 后训练五连招:从续写文本到推理助手
基础模型只会"续写",对齐才让它会"答题"。五个阶段共用同一个模型骨架,只换数据和 loss:
| 阶段 | 作用 | 核心代码 |
|---|---|---|
| SFT | 学会指令格式与think/answer结构 | src/post_training/sft.py |
| 奖励模型 | 学习人类偏好打分(Bradley-Terry) | src/post_training/reward_model.py |
| DPO / ORPO / KTO | 免 RL 循环的偏好对齐 | src/post_training/dpo.py |
| PPO | 经典 RLHF 循环(GAE + clip + KL) | src/post_training/ppo.py |
| GRPO / RLVR | DeepSeek-R1 式可验证奖励推理 | src/post_training/grpo.py |
PPO 一轮完整循环:生成 rollout → 打分(验证器或奖励模型)→ 加 KL 惩罚 → GAE 估优势 → clip 更新:
GRPO 则干脆扔掉价值网络,对同一道题采样一组答案,用组内均值标准差当基线,答对得分就强化——逻辑短到十几行:
训练完想一键串联全流程?一条命令搞定 SFT → RM → DPO → PPO → GRPO → 评估表:
bash scripts/run_posttraining.sh📊 评估与聊天:用同一个数字贯穿所有阶段
项目用GSM8K 贪心准确率作为贯穿全阶段的唯一标尺:出题 → 生成 → 从<answer>标签提取数字 → 对答案。同一条命令跑在任意 checkpoint 上,Base、SFT、DPO、PPO、GRPO 的成绩一目了然:
想直接和模型说话?scripts/chat.py 加载任意阶段的 checkpoint,自动识别模型维度,支持温度采样或贪心解码:
python scripts/chat.py --ckpt models/sft.pt --prompt "What is 13 + 29?"📚 配套文档与 Streamlit 控制面板
仓库内置一套 MkDocs 文档站,涵盖 Foundations(分词、注意力、目标函数、优化、生成)与每个阶段的理论 + 图解 + 源码对照,本地mkdocs serve即可浏览(源文件在 docs/):
不想敲命令?启动 Streamlit 控制面板 ui/app.py,九个页面分别对应 Data、Pretrain、SFT、Reward、DPO、PPO、GRPO、Evaluate、Chat,填表即可一键启动并实时看 loss 曲线:
pip install -e ".[ui]" streamlit run ui/app.py🎓 它适合谁?
- 学生:从 13M 小模型起步,每个代码块前面都有白话解释,配合 docs/foundations/ 补课正好;
- 开发者:所有命令、文件路径、真实运行输出都写在 README.md 和 POST_TRAINING.md 里,可直接复制运行;
- 研究者:后训练半程是重点——SFT、Bradley-Terry 奖励模型、PPO+GAE、DPO/ORPO/KTO、GRPO 全部从零实现,且训练在真实公开数据集上,指标可复现。
零框架、单 GPU、全链路可跑通——这就是 train-llm-from-scratch 把"训练 LLM 很难"变成"训练 LLM 可以读"的方式。
【免费下载链接】train-llm-from-scratchA straightforward method for training your LLM, from downloading data to generating text.项目地址: https://gitcode.com/GitHub_Trending/tr/train-llm-from-scratch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考