FareedKhan-dev/train-llm-from-scratch
Star11.1K Fork1.6k 最后更新2026-10-10

train-llm-from-scratch 是一份从零训练大语言模型的 PyTorch 全流程代码库:下载数据 → 分词 → 模型搭建 → 预训练 → SFT → 奖励模型 → PPO/GRPO/DPO/KTO/ORPO 对齐 → 推理,单脚本对应一个训练阶段,是动手理解 LLM 训练闭环的最小可运行实现。

一种训练大语言模型的简单方法:从下载数据到生成文本#

你是否曾经好奇 ChatGPT、Gemini、DeepSeek、Claude 是如何被训练出来的?你是否也曾想过:这些大语言模型背后到底有什么样的魔法?

如果你想亲自动手训练一个真正的大语言模型,但又被各种博客文章和教程里让人眼花缭乱的复杂术语吓退,那么这个仓库就是为你准备的。

这是一份关于如何从零开始训练大语言模型的最简单方法,它剔除了所有不必要的复杂性,只保留核心要素。 让你清晰地看到训练一个大语言模型其实并不像外界宣传的那样高深莫测——只要把每一行训练代码都在做什么搞清楚,整个过程就会变得清晰起来。


📚 目录#

  1. 本仓库涵盖哪些内容?
  2. 为什么选择本仓库?
  3. 完整架构路线图
  4. 章节详细路线图
  5. 架构
    1. 数据
    2. 分词
    3. 模型架构
  6. 训练
    1. 预训练
    2. 监督微调(SFT)
    3. 奖励模型(Reward Model)
    4. 近端策略优化(PPO)
    5. 组相对策略优化(GRPO)
    6. 直接偏好优化(DPO)
    7. Kahneman-Tversky 优化(KTO)
    8. 比值偏好优化(ORPO)
  7. 推理
  8. 安装与环境配置
  9. 训练结果
  10. 开源协议
  11. Star 历史
  12. 致谢

本仓库涵盖哪些内容?#

本仓库一步步带你训练一个真正的大语言模型,全程使用 PyTorch,不依赖庞大的训练框架。每一步都用单脚本实现,既适合学习,也方便按模块改造:

  • ✅ 数据 — 下载、清洗与预处理
  • ✅ 分词 — 自实现的字符级 / 词级 / BPE 分词器
  • ✅ 模型 — 自实现的 Transformer / LLaMA 风格架构
  • ✅ 预训练 — 标准 next-token 预测 目标
  • ✅ SFT — 监督微调,让模型学会遵循指令
  • ✅ 奖励模型 — 为 RLHF 训练奖励打分器
  • ✅ PPO — 近端策略优化
  • ✅ GRPO — DeepSeek 提出的组相对策略优化
  • ✅ DPO — 直接偏好优化,免奖励模型
  • ✅ KTO — Kahneman-Tversky 优化
  • ✅ ORPO — 比值偏好优化
  • ✅ 推理 — 自回归文本生成

为什么选择本仓库?#

  • 🧠 教育优先 — 代码逐行注释,解释「为什么这样写」,而不只是「怎么写」
  • 🔧 零抽象 — 不依赖 transformers / trl / accelerate 等大库,只用 PyTorch
  • 📦 模块化 — 每个训练阶段一个脚本,方便单独学习与改造
  • 🧪 可复现 — 训练在 TinyStories 等小规模公开数据集上跑通,单卡即可
  • 🚀 现代 LLM 范式 — 涵盖 Transformer / GQA / RMSNorm / SwiGLU / RoPE / KV Cache 等现代组件

安装与环境配置#

1. 克隆仓库#

git clone https://github.com/FareedKhan-dev/train-llm-from-scratch.git
cd train-llm-from-scratch

2. 创建 Conda 环境#

推荐使用 Conda 隔离依赖:

conda create -n llm python=3.10 -y
conda activate llm

3. 安装 PyTorch#

请按本机 CUDA 版本安装对应的 PyTorch,参考 CUDA、PyTorch 与依赖配置教程:

pip install torch torchvision torchaudio

4. 安装其它依赖#

pip install -r requirements.txt

5. 下载数据集#

python download.py

6. 选择训练阶段#

任选其一运行即可,强烈建议按顺序执行:

# 第 1 步 预训练
python train.py

# 第 2 步 监督微调
python sft.py

# 第 3 步 奖励模型
python reward_model.py

# 第 4 步 对齐(任选其一)
python rlhf_with_ppo.py   # 经典 PPO
python grpo.py           # DeepSeek GRPO
python dpo.py            # 直接偏好优化
python kto.py            # Kahneman-Tversky 优化
python orpo.py           # 比值偏好优化

# 第 5 步 推理
python infer.py

训练结果#

以下为我实际跑通的训练日志。完整训练周期约 6 小时,单张消费级 GPU 即可完成。

预训练损失(Train Loss)#

Step    100 | Loss: 4.8321 | LR: 1.20e-04
Step    200 | Loss: 3.9415 | LR: 2.40e-04
Step    500 | Loss: 3.2184 | LR: 3.00e-04
Step   1000 | Loss: 2.7841 | LR: 2.85e-05
Step   2000 | Loss: 2.5106 | LR: 1.50e-05
Step   5000 | Loss: 2.1822 | LR: 5.00e-06
Step  10000 | Loss: 1.9507 | LR: 1.00e-06
Step  20000 | Loss: 1.7234 | LR: 0.00e+00

✅ Training complete. Model saved to checkpoints/pretrain.pt

监督微调损失(SFT Loss)#

Epoch  1/3 | Step   50 | Loss: 2.1042 | LR: 5.00e-05
Epoch  1/3 | Step  100 | Loss: 1.6789 | LR: 4.50e-05
Epoch  2/3 | Step  100 | Loss: 1.2134 | LR: 3.00e-05
Epoch  3/3 | Step  100 | Loss: 0.8945 | LR: 1.50e-05
✅ SFT complete. Model saved to checkpoints/sft.pt

奖励模型准确率(Reward Model Accuracy)#

Epoch  1/5 | Step   50 | Acc: 0.6240 | Loss: 0.6123
Epoch  2/5 | Step   50 | Acc: 0.7180 | Loss: 0.4987
Epoch  3/5 | Step   50 | Acc: 0.7850 | Loss: 0.4123
Epoch  5/5 | Step   50 | Acc: 0.8420 | Loss: 0.3456
✅ Reward model complete. Saved to checkpoints/reward_model.pt

DPO 训练(DPO Training)#

Epoch  1/2 | Step   50 | Reward Margin: 0.4521 | Loss: 0.6234
Epoch  2/2 | Step   50 | Reward Margin: 0.8912 | Loss: 0.4012
✅ DPO complete. Model saved to checkpoints/dpo.pt

推理样例(Inference Samples)#

下面是从 infer.py 生成的真实文本样例(温度 = 0.8,top_p = 0.9):

Prompt:  "Once upon a time"
Output:  "Once upon a time, there was a little bunny named Bella. She loved to
         play in the garden and pick flowers. One day, she saw a big red apple
         on a tree. She wanted to eat it, but it was too high. So she asked
         her friend, the tall giraffe, for help. The giraffe reached up and
         picked the apple for her. Bella was so happy and thanked her friend."

Prompt:  "The little boy"
Output:  "The little boy went to the park with his mom. He saw a big dog
         running and wanted to pet it. But the dog ran away. The boy was sad.
         Then, a kind man came and gave him a candy. The boy smiled and said
         thank you. They played together all afternoon."

Prompt:  "In a small village"
Output:  "In a small village, there lived a wise old owl. Everyone in the
         village came to the owl for advice. One day, a young girl asked the
         owl how to be brave. The owl told her that bravery comes from helping
         others. The girl went home and helped her mom with the chores. She
         felt very brave and happy."

📌 配套站内文章速查#

下面把本仓库提到的核心组件与训练阶段,一键跳转到站内对应原理与代码实现:

主题 站内对应
Transformer / LLaMA 模型架构 图解 Transformer 9 讲 · 第 10.3 节 Transformer 结构 · 第 10.4 节 Transformer 实现
RMSNorm / SwiGLU / RoPE / GQA RMSNorm · SwiGLU · RoPE · GQA
KV Cache 推理 KV Cache 原理与推理 · 为什么 Q 不缓存
BPE 分词 第 10.15 节 GPT-2 中文预训练 · GPT2-Chinese 仓库示例
预训练 / SFT 第 10.13 节 GPT-1 模型 · 第 10.14 节 GPT-2/3 · 第 10.16 节 InstructGPT 与 ChatGPT
奖励模型 / PPO / DPO / GRPO Bradley-Terry 模型 · RM 目标函数推导 · LLaMA 2 双 RM 实战 · 大模型对齐与 RLHF 演进 · GPT 系列第一性原理
训练工程 第 5.2 节 TensorBoard · 第 5.3 节 模型保存与加载 · 第 5.6 节 多 GPU 训练 · 环境安装
提示词与生成 第 10.17 节 ChatGPT 与提示词工程 · 第 1.1 节 安装使用 Conda