⚠️ 这是一个面向初学者的教育项目,旨在帮助小白从零开始理解LLM训练全流程!
本项目专为想要理解大语言模型训练原理的初学者设计,提供了一个完整的、可运行的学习范例:
🎯 核心特点:
- ✅ 完整流程:从预训练 → 监督微调(SFT) → 奖励模型 → 强化学习(PPO),一步不落
- ✅ 小白友好:详细的中文注释,清晰的代码结构,容易理解
- ✅ 零门槛运行:使用模拟数据,无需下载大型数据集,可以在CPU上运行
- ✅ 快速上手:小型模型(~300万参数),几分钟即可跑完全流程
- ✅ 仅供学习:使用模拟的中文对话数据,不适用于生产环境
📌 适合人群:
- 想了解LLM训练原理但不知从何下手的同学
- 需要快速验证想法和算法的研究者
- 希望在本地CPU环境学习RLHF的开发者
- 对大模型训练感兴趣但缺乏GPU资源的学习者
- 本项目使用模拟数据进行演示,数据质量和多样性有限
- 模型规模很小,能力有限,仅用于理解训练流程
- 如需生产级应用,请使用真实高质量数据和更大规模的模型
- 完整的训练流程: 预训练 → SFT → 奖励模型 → RLHF (PPO)
- CPU友好: 小型模型架构,约300万参数,普通笔记本电脑即可训练
- 模拟数据: 内置数据生成器,无需下载外部数据集
- 详细注释: 每个组件都有详细的中文注释和说明
- 模块化设计: 清晰的代码结构,易于理解和修改
- 可视化: 训练过程可视化和评估报告
- 交互式推理: 命令行对话界面,实时测试模型效果
llm/
├── src/ # 源代码
│ ├── models/ # 模型定义
│ │ ├── transformer.py # 小型Transformer模型
│ │ ├── reward_model.py # 奖励模型
│ │ └── model_utils.py # 模型工具函数
│ ├── data/ # 数据处理
│ │ ├── tokenizer.py # 简单tokenizer实现
│ │ ├── datasets.py # 数据集类
│ │ └── data_generator.py # 模拟数据生成器
│ ├── training/ # 训练脚本
│ │ ├── pretrain.py # 预训练
│ │ ├── sft.py # 监督微调
│ │ ├── reward_model_training.py # 奖励模型训练
│ │ └── ppo.py # PPO强化学习
│ └── evaluation/ # 评估模块
│ ├── evaluator.py # 模型评估器
│ └── interactive_inference.py # 交互式推理
├── configs/ # 配置文件
│ ├── model_config.yaml # 模型配置
│ ├── pretrain_config.yaml # 预训练配置
│ ├── sft_config.yaml # SFT配置
│ └── rlhf_config.yaml # RLHF配置
├── scripts/ # 运行脚本
│ ├── generate_data.py # 生成训练数据
│ ├── run_pretrain.py # 运行预训练
│ ├── run_sft.py # 运行SFT
│ ├── run_reward_model.py # 运行奖励模型训练
│ ├── run_ppo.py # 运行PPO训练
│ └── run_evaluation.py # 运行评估
├── data/ # 数据目录
│ ├── raw/ # 原始数据
│ └── processed/ # 处理后的数据
├── checkpoints/ # 模型检查点
├── logs/ # 训练日志
└── requirements.txt # 依赖包
# 克隆项目
git clone <repository-url>
cd llm
# 安装依赖
pip install -r requirements.txt使用 main.py 可以一键串行运行完整训练流程:
# 运行完整训练流程(数据生成 → 预训练 → SFT → 奖励模型 → PPO)
python main.py
# 训练完成后自动评估模型
python main.py --eval
# 跳过某些步骤
python main.py --skip-pretrain # 跳过预训练
python main.py --skip-ppo # 跳过PPO训练
# 只生成数据,不进行训练
python main.py --only-data特点:
- ✅ 自动检查依赖和创建目录
- ✅ 按正确顺序执行所有训练步骤
- ✅ 实时显示进度和耗时
- ✅ 失败时提示是否继续
- ✅ 训练完成后显示详细总结
如果需要更精细的控制,可以手动执行各个步骤:
# 生成所有训练阶段需要的模拟数据
python scripts/generate_data.py这将生成:
data/processed/pretrain_data.txt- 预训练文本数据data/processed/sft_data.json- SFT指令-回答对data/processed/preference_data.json- 人类偏好数据data/processed/ppo_prompts.txt- PPO训练提示
python scripts/run_pretrain.py- 训练语言建模任务
- 学习基础的语言表示
- 保存模型到
checkpoints/pretrain/
python scripts/run_sft.py- 基于预训练模型进行指令微调
- 学习遵循人类指令
- 保存模型到
checkpoints/sft/
python scripts/run_reward_model.py- 基于SFT模型训练奖励模型
- 学习人类偏好
- 保存模型到
checkpoints/reward_model/
python scripts/run_ppo.py- 使用PPO算法优化策略
- 基于奖励模型进行强化学习
- 保存模型到
checkpoints/ppo/
# 评估特定模型
python scripts/run_evaluation.py --model_path checkpoints/sft/best_sft_model.pt
# 评估PPO模型
python scripts/run_evaluation.py --model_path checkpoints/ppo/ppo_model_episode_100.pt# 与训练好的模型对话
python src/evaluation/interactive_inference.py --model_path checkpoints/sft/best_sft_model.pt- 参数量: ~300万参数
- 词汇表大小: 8,000
- 模型维度: 256
- 注意力头数: 8
- 层数: 6
- 前馈网络维度: 1024
- 最大序列长度: 512
- 适合CPU训练的小型架构
- 保持Transformer的核心组件
- 平衡模型能力和计算资源
- 学习率: 5e-4
- 批次大小: 8
- 训练轮数: 10
- 任务: 因果语言建模
- 学习率: 1e-5
- 批次大小: 4
- 训练轮数: 5
- 任务: 指令跟随
- 学习率: 1e-5
- 批次大小: 4
- 训练轮数: 3
- 损失: Bradley-Terry排序损失
- 学习率: 1e-6
- 批次大小: 4
- 训练回合: 1000
- 裁剪范围: 0.2
- KL系数: 0.05
所有配置都可以通过修改 configs/ 目录下的YAML文件进行调整:
model_config.yaml- 模型架构参数pretrain_config.yaml- 预训练参数sft_config.yaml- SFT参数rlhf_config.yaml- RLHF参数
训练过程会自动生成:
- 损失曲线图
- 评估指标图
- 训练日志
- 模型检查点
交互式推理支持以下命令:
quit/exit- 退出程序config- 查看生成配置set <参数> <值>- 修改生成参数
例如:
set temperature 0.5
set max_new_tokens 150
- 简单的字符级tokenizer
- 支持特殊token:
<PAD>,<UNK>,<BOS>,<EOS> - 词汇表大小可配置
- 基于模板的中文文本生成
- 涵盖多种场景和话题
- 支持不同质量的回答对比
- 基于SFT模型的奖励头
- Bradley-Terry损失函数
- 支持偏好排序学习
- 标准PPO算法
- KL散度正则化
- 支持梯度累积
本项目定位为教育学习项目,不是生产级系统!
-
💻 计算资源:
- ✅ 可以在CPU上运行(无需GPU)
- ⏱️ 完整训练在普通笔记本上约需30-60分钟
- 💡 推荐至少8GB内存
-
📊 数据说明:
⚠️ 使用的是模拟生成的中文对话数据,质量和多样性有限⚠️ 数据量小(几百条),仅够演示训练流程- 💡 实际应用需要使用大规模、高质量的真实数据
-
🤖 模型能力:
⚠️ 小型模型(~300万参数),能力非常有限- 💡 生成的文本质量一般,主要用于理解训练原理
- 💡 生产级模型通常需要几十亿到几千亿参数
-
📋 训练顺序:
⚠️ 必须严格按照:预训练 → SFT → 奖励模型 → PPO 的顺序进行⚠️ 每一步都依赖前一步的模型输出- 💡 建议使用
python main.py一键运行,避免遗漏步骤
-
🎯 学习建议:
- 📖 先通读代码注释,理解每个模块的作用
- 🔬 尝试修改配置参数,观察训练效果变化
- 💬 使用交互式推理测试不同阶段的模型
- 📝 对比预训练、SFT、PPO后的模型输出差异
main.py- 一键运行完整训练流程的主入口CLAUDE.md- 为Claude Code提供的项目指南requirements.txt- Python依赖包列表.gitignore- Git版本控制忽略规则
src/- 源代码(模型、数据、训练、评估)configs/- YAML配置文件scripts/- 独立运行脚本data/- 训练数据(被gitignore,需要自行生成)checkpoints/- 模型检查点(被gitignore,训练时生成)logs/- 训练日志(被gitignore,训练时生成)
项目使用Git进行版本控制,以下文件/目录已被忽略(不会提交到仓库):
- 训练生成的文件:
checkpoints/,logs/,data/processed/ - Python缓存:
__pycache__/,*.pyc - 模型文件:
*.pt,*.pth - IDE配置:
.vscode/,.idea/ - Claude Code相关:
.claude/
首次克隆项目后,需要运行 python main.py --only-data 生成训练数据。
欢迎提交Issue和Pull Request来改进这个项目!
贡献指南:
- Fork本项目
- 创建您的特性分支 (
git checkout -b feature/AmazingFeature) - 提交您的更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启一个Pull Request
MIT License
本项目参考了多个开源项目和研究论文,感谢开源社区的贡献!