一种训练大语言模型的简单方法:从下载数据到生成文本#
你是否曾经好奇 ChatGPT、Gemini、DeepSeek、Claude 是如何被训练出来的?你是否也曾想过:这些大语言模型背后到底有什么样的魔法?
如果你想亲自动手训练一个真正的大语言模型,但又被各种博客文章和教程里让人眼花缭乱的复杂术语吓退,那么这个仓库就是为你准备的。
这是一份关于如何从零开始训练大语言模型的最简单方法,它剔除了所有不必要的复杂性,只保留核心要素。 让你清晰地看到训练一个大语言模型其实并不像外界宣传的那样高深莫测——只要把每一行训练代码都在做什么搞清楚,整个过程就会变得清晰起来。
📚 目录#
本仓库涵盖哪些内容?#
本仓库一步步带你训练一个真正的大语言模型,全程使用 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-scratch2. 创建 Conda 环境#
推荐使用 Conda 隔离依赖:
conda create -n llm python=3.10 -y
conda activate llm3. 安装 PyTorch#
请按本机 CUDA 版本安装对应的 PyTorch,参考 CUDA、PyTorch 与依赖配置教程:
pip install torch torchvision torchaudio4. 安装其它依赖#
pip install -r requirements.txt5. 下载数据集#
python download.py6. 选择训练阶段#
任选其一运行即可,强烈建议按顺序执行:
# 第 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.ptDPO 训练(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 |