名称: openrlhf-training 描述: 高性能RLHF框架,带有Ray+vLLM加速。用于大型模型(7B-70B+)的PPO、GRPO、RLOO、DPO训练。基于Ray、vLLM、ZeRO-3构建。通过分布式架构和GPU资源共享,比DeepSpeedChat快2倍。 版本: 1.0.0 作者: Orchestra Research 许可证: MIT 标签: [后训练, OpenRLHF, RLHF, PPO, GRPO, RLOO, DPO, Ray, vLLM, 分布式训练, 大型模型, ZeRO-3] 依赖: [openrlhf, ray, vllm, torch, transformers, deepspeed]
OpenRLHF - 高性能RLHF训练
快速开始
OpenRLHF是一个基于Ray的RLHF框架,针对分布式训练和vLLM推理加速进行了优化。
安装:
# 启动Docker容器
docker run --runtime=nvidia -it --rm --shm-size="10g" --cap-add=SYS_ADMIN \
-v $PWD:/openrlhf nvcr.io/nvidia/pytorch:25.02-py3 bash
# 卸载冲突包
sudo pip uninstall xgboost transformer_engine flash_attn pynvml -y
# 安装带有vLLM的OpenRLHF
pip install openrlhf[vllm]
PPO训练(混合引擎):
ray start --head --node-ip-address 0.0.0.0 --num-gpus 8
ray job submit --address="http://127.0.0.1:8265" \
--runtime-env-json='{"working_dir": "/openrlhf"}' \
-- python3 -m openrlhf.cli.train_ppo_ray \
--ref_num_nodes 1 --ref_num_gpus_per_node 8 \
--reward_num_nodes 1 --reward_num_gpus_per_node 8 \
--critic_num_nodes 1 --critic_num_gpus_per_node 8 \
--actor_num_nodes 1 --actor_num_gpus_per_node 8 \
--vllm_num_engines 4 --vllm_tensor_parallel_size 2 \
--colocate_all_models \
--vllm_gpu_memory_utilization 0.5 \
--pretrain OpenRLHF/Llama-3-8b-sft-mixture \
--reward_pretrain OpenRLHF/Llama-3-8b-rm-700k \
--save_path ./output/llama3-8b-rlhf \
--micro_train_batch_size 8 --train_batch_size 128 \
--micro_rollout_batch_size 16 --rollout_batch_size 1024 \
--max_epochs 1 --prompt_max_len 1024 --generate_max_len 1024 \
--zero_stage 3 --bf16 \
--actor_learning_rate 5e-7 --critic_learning_rate 9e-6 \
--init_kl_coef 0.01 --normalize_reward \
--gradient_checkpointing --packing_samples \
--vllm_enable_sleep --deepspeed_enable_sleep
GRPO训练(组归一化策略优化):
# 与PPO相同命令,但添加:
--advantage_estimator group_norm
常见工作流程
工作流程1:完整RLHF流水线(SFT → 奖励模型 → PPO)
步骤1:训练奖励模型(DPO):
deepspeed --module openrlhf.cli.train_rm \
--save_path ./output/llama3-8b-rm \
--save_steps -1 --logging_steps 1 \
--eval_steps -1 --train_batch_size 256 \
--micro_train_batch_size 1 --pretrain meta-llama/Meta-Llama-3-8B \
--bf16 --max_epochs 1 --max_len 8192 \
--zero_stage 3 --learning_rate 9e-6 \
--dataset OpenRLHF/preference_dataset_mixture2_and_safe_pku \
--apply_chat_template --chosen_key chosen \
--rejected_key rejected --flash_attn --gradient_checkpointing
步骤2:PPO训练:
ray start --head --node-ip-address 0.0.0.0 --num-gpus 8
ray job submit --address="http://127.0.0.1:8265" \
-- python3 -m openrlhf.cli.train_ppo_ray \
--ref_num_nodes 1 --ref_num_gpus_per_node 8 \
--reward_num_nodes 1 --reward_num_gpus_per_node 8 \
--critic_num_nodes 1 --critic_num_gpus_per_node 8 \
--actor_num_nodes 1 --actor_num_gpus_per_node 8 \
--vllm_num_engines 4 --vllm_tensor_parallel_size 2 \
--colocate_all_models \
--pretrain OpenRLHF/Llama-3-8b-sft-mixture \
--reward_pretrain ./output/llama3-8b-rm \
--save_path ./output/llama3-8b-ppo \
--micro_train_batch_size 8 --train_batch_size 128 \
--micro_rollout_batch_size 16 --rollout_batch_size 1024 \
--max_epochs 1 --prompt_max_len 1024 --generate_max_len 1024 \
--zero_stage 3 --bf16 \
--actor_learning_rate 5e-7 --critic_learning_rate 9e-6 \
--init_kl_coef 0.01 --normalize_reward \
--vllm_enable_sleep --deepspeed_enable_sleep
工作流程2:GRPO训练(无需评论家模型)
内存高效的PPO替代方案:
ray job submit --address="http://127.0.0.1:8265" \
-- python3 -m openrlhf.cli.train_ppo_ray \
--advantage_estimator group_norm \
--ref_num_nodes 1 --ref_num_gpus_per_node 8 \
--reward_num_nodes 1 --reward_num_gpus_per_node 8 \
--actor_num_nodes 1 --actor_num_gpus_per_node 8 \
--vllm_num_engines 4 --vllm_tensor_parallel_size 2 \
--colocate_all_models \
--pretrain OpenRLHF/Llama-3-8b-sft-mixture \
--reward_pretrain OpenRLHF/Llama-3-8b-rm-700k \
--save_path ./output/llama3-8b-grpo \
--micro_train_batch_size 8 --train_batch_size 128 \
--micro_rollout_batch_size 16 --rollout_batch_size 1024 \
--max_epochs 1 --bf16 \
--actor_learning_rate 5e-7 \
--init_kl_coef 0.01 --use_kl_loss --kl_estimator k3 \
--normalize_reward --no_advantage_std_norm
关键GRPO参数:
--advantage_estimator group_norm- 启用GRPO--use_kl_loss- GRPO论文中的KL损失--kl_estimator k3- 损失函数(k2 ≈ k1)--no_advantage_std_norm- 禁用标准差归一化
工作流程3:DPO训练(偏好优化)
无需奖励模型的更简单替代方案:
deepspeed --module openrlhf.cli.train_dpo \
--save_path ./output/llama3-8b-dpo \
--save_steps -1 --logging_steps 1 \
--eval_steps -1 --train_batch_size 256 \
--micro_train_batch_size 2 --pretrain meta-llama/Meta-Llama-3-8B \
--bf16 --max_epochs 1 --max_len 8192 \
--zero_stage 3 --learning_rate 5e-7 --beta 0.1 \
--dataset OpenRLHF/preference_dataset_mixture2_and_safe_pku \
--apply_chat_template --chosen_key chosen \
--rejected_key rejected --flash_attn --gradient_checkpointing
何时使用与替代方案比较
使用OpenRLHF时:
- 使用RL训练大型模型(7B-70B+)
- 需要vLLM推理加速
- 需要具有Ray的分布式架构
- 拥有多节点GPU集群
- 在一个框架中需要PPO/GRPO/RLOO/DPO
算法选择:
- PPO: 最大控制,适用于复杂奖励
- GRPO: 内存高效,无需评论家
- RLOO: 改进的PPO,带有每令牌KL
- REINFORCE++: 比GRPO更稳定,比PPO更快
- DPO: 最简单,无需奖励模型
使用替代方案时:
- TRL: 单节点训练,更简单API
- veRL: ByteDance的框架,用于671B模型
- DeepSpeedChat: 集成DeepSpeed生态系统
常见问题
问题: 大型模型导致GPU内存溢出
禁用模型共置:
# 移除 --colocate_all_models 标志
# 为每个模型分配单独的GPU
--actor_num_gpus_per_node 8 \
--critic_num_gpus_per_node 8 \
--reward_num_gpus_per_node 8 \
--ref_num_gpus_per_node 8
问题: DeepSpeed GPU索引超出范围
设置环境变量:
export RAY_EXPERIMENTAL_NOSET_CUDA_VISIBLE_DEVICES=1
问题: 训练不稳定
使用混合引擎而非异步:
--colocate_all_models \
--vllm_enable_sleep \
--deepspeed_enable_sleep
调整KL系数:
--init_kl_coef 0.05 # 从0.01增加
问题: PPO期间生成缓慢
启用vLLM加速:
--vllm_num_engines 4 \
--vllm_tensor_parallel_size 2 \
--vllm_gpu_memory_utilization 0.5
高级主题
混合引擎GPU共享: 参见references/hybrid-engine.md以了解vLLM睡眠模式、DeepSpeed睡眠模式和最优节点分配。
算法比较: 参见references/algorithm-comparison.md以获取PPO vs GRPO vs RLOO vs REINFORCE++基准测试和超参数。
多节点设置: 参见references/multi-node-training.md以了解Ray集群配置和容错。
自定义奖励函数: 参见references/custom-rewards.md以了解强化微调和代理RLHF。
硬件要求
- GPU: 推荐NVIDIA A100/H100
- VRAM:
- 7B模型: 8× A100 40GB(混合引擎)
- 70B模型: 48× A100 80GB(vLLM:演员:评论家 = 1:1:1)
- 多节点: 推荐带有InfiniBand的Ray集群
- Docker: NVIDIA PyTorch容器25.02+
性能:
- 比DeepSpeedChat快2倍
- vLLM推理加速
- 混合引擎最小化GPU空闲时间