LLM-RLHF-Tuning
从零实现RLHF全流程,支持SFT+RM+PPO+DPO四阶段训练,以LoRA高效微调LLaMA/LLaMA2
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
从零实现RLHF全流程,支持SFT+RM+PPO+DPO四阶段训练,以LoRA高效微调LLaMA/LLaMA2
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下,你训练了一个语言模型,它能说一口流利的英语,却总在关键时刻"跑偏"——回答带毒、逻辑混乱、答非所问。这不是因为模型不够"聪明",而是因为它从未学过"什么是对、什么是错"。RLHF(基于人类反馈的强化学习)正是解决这一问题的核心技术,它让ChatGPT、Claude等大模型从"一本正经地胡说八道"进化为"善解人意"的对话助手。
Joyce94/LLM-RLHF-Tuning 正是这样一个从零实现RLHF全流程的开源项目。它不依赖任何黑盒框架,而是将SFT(监督微调)、RM(奖励模型训练)、PPO(近端策略优化)和DPO(直接偏好优化)四大环节全部白盒化,每个训练阶段都有详细的实现细节和代码注释,并配有中文Wiki文档。
LLM-RLHF-Tuning由独立开发者 Joyce94 创建,项目聚焦于LLM的强化学习微调这一细分领域。相比于 HuggingFace TRL 库的"高度封装",本项目更注重教学级代码质量——每一个算法的实现逻辑都有清晰的文档说明,甚至配套了知乎文章讲解原理。
从功能覆盖来看,该项目是目前中文开源社区中支持PPO变体最丰富的RLHF训练框架。它不仅实现了标准的PPO训练,还支持三种不同的LoRA适配器配置方案,这在同类项目中极为罕见。
| 框架 | SFT | RM | PPO | DPO | DeepSpeed | 多LoRA |
|---|---|---|---|---|---|---|
| LLM-RLHF-Tuning | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| DeepSpeed-Chat | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ |
| HuggingFace TRL | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
| MOSS-RLHF | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ |
从对比可以看出,多LoRA + DeepSpeed + 全流程覆盖是该项目的核心差异化优势。
项目采用分层模块化设计,核心代码位于 script/ 目录,按训练阶段分为四个子目录:
script/
├── sft/ # 指令微调 (Supervised Fine-Tuning)
├── rm/ # 奖励模型训练 (Reward Model)
├── ppo/ # PPO强化学习训练
├── dpo/ # 直接偏好优化
└── utils/ # 共享工具(metrics, trainer, ppo_models...)
这种目录结构的优势在于:各阶段训练逻辑完全解耦,用户可以只使用其中的某一环节,而非必须走完完整的RLHF流程。
| 技术 | 版本 | 作用 |
|---|---|---|
| transformers | 4.31.0 | 模型加载与tokenizer |
| peft | 0.4.0 | LoRA/QLoRA 参数高效微调 |
| trl | 0.5.0 | 强化学习训练基础 |
| deepspeed | 0.10.0 | 分布式训练与ZeRO优化 |
| accelerate | 0.21.0 | 多GPU/多节点分布式训练 |
| torch | 2.0.1 | 深度学习框架 |
这是本项目最有技术深度的部分,作者实现了三种不同的PPO训练范式:
模式A:双基模型 + 双LoRA适配器(最高资源消耗)
模式B:单基模型 + 双LoRA适配器
模式C:单基模型 + 单LoRA(最省资源)
DPO(Direct Preference Optimization)是2023年提出的新型RLHF替代算法,相比PPO更简单、训练更稳定。本项目参照OpenAI的DPO论文实现,使用 run_dpo_with_peft.py 脚本,结合TRL库的DPO Trainer实现。
项目内置了完整的数据处理流程:
数据格式均为JSON,每条记录包含prompt和对应的response/偏好标签。
utils/ppo_trainer_with_peft.py这是PPO训练的核心 Trainer 类,继承自TRL的PPOTrainer,扩展了以下关键功能:
utils/ppo_models.py定义四类模型(Actor/Critic/RM/SFT)的加载与初始化逻辑,特别是:
utils/data_collator.py自定义数据拼接与padding逻辑,处理变长对话数据,确保batch内的序列长度一致。
utils/parser_args.py统一的命令行参数解析,所有训练脚本共享同一套参数定义,保证了API的一致性。
# 克隆仓库
git clone https://github.com/Joyce94/LLM-RLHF-Tuning.git
cd LLM-RLHF-Tuning
# 创建conda环境
conda create -n rlhf python=3.10
conda activate rlhf
# 安装依赖
pip install -r requirements.txt
requirements.txt 中需要的关键依赖(已锁定版本):
torch==2.0.1(需配合CUDA 11.7+)transformers==4.31.0peft==0.4.0deepspeed==0.10.0accelerate==0.21.0支持LLaMA和LLaMA2,需自行从HuggingFace下载权重并配置路径:
# 在 run_sft.sh / run_rm.sh / run_ppo.sh 中修改
pretrained_model=/path/to/your/llama/model
# 修改 script/sft/run_sft.sh 中的路径配置后
cd script/sft
bash run_sft.sh
# 推荐模式C(单基模型 + 单LoRA,最省资源)
cd script/ppo
bash run_ppo_co.sh
Q:显存不够怎么办?
Q:训练中断后如何恢复?
resume_from_checkpoint 参数恢复训练尽管功能全面,该项目也存在一些值得注意的局限:
LLM-RLHF-Tuning代表了中文AI社区对RLHF技术的深度探索热潮。在ChatGPT发布后的一年多里,全球开发者都在尝试复现OpenAI的技术路线,但真正从零完整实现PPO的项目少之又少——大多数项目只是对HuggingFace TRL库的封装。
本项目的价值在于:它把RLHF的"黑盒"打开,让每一个想深入理解强化学习在大模型微调中如何工作的研究者,都能找到清晰的实现路径。
随着LLM技术的持续进化,RLHF的下一阶段演进方向包括:
对于希望在LLM对齐技术上有所建树的开发者,LLM-RLHF-Tuning是一个值得深入研究的起点项目。