Skip to content

hwfengcs/Pretrain-SFT-RLHF

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🎓 大语言模型完整训练流程(从预训练到强化学习)

⚠️ 这是一个面向初学者的教育项目,旨在帮助小白从零开始理解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              # 依赖包

🚀 快速开始

1. 环境准备

# 克隆项目
git clone <repository-url>
cd llm

# 安装依赖
pip install -r requirements.txt

2. 一键运行(推荐)

使用 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

特点:

  • ✅ 自动检查依赖和创建目录
  • ✅ 按正确顺序执行所有训练步骤
  • ✅ 实时显示进度和耗时
  • ✅ 失败时提示是否继续
  • ✅ 训练完成后显示详细总结

3. 手动分步运行

如果需要更精细的控制,可以手动执行各个步骤:

步骤1: 生成训练数据

# 生成所有训练阶段需要的模拟数据
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训练提示

步骤2: 预训练

python scripts/run_pretrain.py
  • 训练语言建模任务
  • 学习基础的语言表示
  • 保存模型到 checkpoints/pretrain/

步骤3: 监督微调(SFT)

python scripts/run_sft.py
  • 基于预训练模型进行指令微调
  • 学习遵循人类指令
  • 保存模型到 checkpoints/sft/

步骤4: 奖励模型训练

python scripts/run_reward_model.py
  • 基于SFT模型训练奖励模型
  • 学习人类偏好
  • 保存模型到 checkpoints/reward_model/

步骤5: PPO强化学习

python scripts/run_ppo.py
  • 使用PPO算法优化策略
  • 基于奖励模型进行强化学习
  • 保存模型到 checkpoints/ppo/

4. 模型评估

# 评估特定模型
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

5. 交互式对话

# 与训练好的模型对话
python src/evaluation/interactive_inference.py --model_path checkpoints/sft/best_sft_model.pt

🏗️ 模型架构

小型Transformer模型

  • 参数量: ~300万参数
  • 词汇表大小: 8,000
  • 模型维度: 256
  • 注意力头数: 8
  • 层数: 6
  • 前馈网络维度: 1024
  • 最大序列长度: 512

设计考虑

  • 适合CPU训练的小型架构
  • 保持Transformer的核心组件
  • 平衡模型能力和计算资源

📊 训练配置

预训练

  • 学习率: 5e-4
  • 批次大小: 8
  • 训练轮数: 10
  • 任务: 因果语言建模

监督微调(SFT)

  • 学习率: 1e-5
  • 批次大小: 4
  • 训练轮数: 5
  • 任务: 指令跟随

奖励模型

  • 学习率: 1e-5
  • 批次大小: 4
  • 训练轮数: 3
  • 损失: Bradley-Terry排序损失

PPO训练

  • 学习率: 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

  • 简单的字符级tokenizer
  • 支持特殊token: <PAD>, <UNK>, <BOS>, <EOS>
  • 词汇表大小可配置

数据生成

  • 基于模板的中文文本生成
  • 涵盖多种场景和话题
  • 支持不同质量的回答对比

奖励模型

  • 基于SFT模型的奖励头
  • Bradley-Terry损失函数
  • 支持偏好排序学习

PPO实现

  • 标准PPO算法
  • KL散度正则化
  • 支持梯度累积

🚨 重要提醒

本项目定位为教育学习项目,不是生产级系统!

  1. 💻 计算资源:

    • ✅ 可以在CPU上运行(无需GPU)
    • ⏱️ 完整训练在普通笔记本上约需30-60分钟
    • 💡 推荐至少8GB内存
  2. 📊 数据说明:

    • ⚠️ 使用的是模拟生成的中文对话数据,质量和多样性有限
    • ⚠️ 数据量小(几百条),仅够演示训练流程
    • 💡 实际应用需要使用大规模、高质量的真实数据
  3. 🤖 模型能力:

    • ⚠️ 小型模型(~300万参数),能力非常有限
    • 💡 生成的文本质量一般,主要用于理解训练原理
    • 💡 生产级模型通常需要几十亿到几千亿参数
  4. 📋 训练顺序:

    • ⚠️ 必须严格按照:预训练 → SFT → 奖励模型 → PPO 的顺序进行
    • ⚠️ 每一步都依赖前一步的模型输出
    • 💡 建议使用 python main.py 一键运行,避免遗漏步骤
  5. 🎯 学习建议:

    • 📖 先通读代码注释,理解每个模块的作用
    • 🔬 尝试修改配置参数,观察训练效果变化
    • 💬 使用交互式推理测试不同阶段的模型
    • 📝 对比预训练、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来改进这个项目!

贡献指南:

  1. Fork本项目
  2. 创建您的特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交您的更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 开启一个Pull Request

📄 许可证

MIT License

🙏 致谢

本项目参考了多个开源项目和研究论文,感谢开源社区的贡献!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages