安装与依赖:Ray + DeepSpeed + vLLM 三件套
装 OpenRLHF 比装 LLaMA-Factory / TRL 难一档,原因是它把 RLHF 训练拆成三种异构进程 (训练 / 采样 / 调度),每种进程都要依赖各自的底层库。任何一个版本对不上,启动就会 crash。 本章给你一份"版本钉死 + 三条安装路径"的最稳法。
2.1装之前要承认的事
OpenRLHF 不是单个 pip 包能装好的"应用层框架",它是把三种进程 orchestrate 在一起的胶水:
| 角色 | 底层依赖 | 用途 |
|---|---|---|
| 训练进程(actor / critic / reward / ref) | DeepSpeed + PyTorch + flash-attn | 反向 + 优化器 step |
| 采样进程(rollout) | vLLM | 把 prompt 生成 response |
| 调度(编排谁在哪张卡跑、传消息) | Ray | actor / placement group / RPC |
这三家的版本要同时满足各自的 CUDA / PyTorch / Python 矩阵。仓库 requirements.txt 已经把关键版本钉死,不要随便升。
2.2硬性依赖(钉死的版本)
requirements.txt 关键行:
deepspeed==0.18.9
flash-attn==2.8.3
ray[default]==2.55.0
transformers==5.7.0
torch # 不限制版本,跟着 PyTorch 自己装
peft
accelerate
huggingface_hub>=1.0.0
optree>=0.15.0
pynvml>=12.0.0
wandb
tensorboard
vLLM 没列在 requirements.txt,但 OpenRLHF 强依赖。需要单独装一个和 OpenRLHF 兼容的 vLLM 版本。当前基线版本对应:
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| PyTorch | 2.5+ | 跟着 vLLM 走 |
| CUDA | 12.4 / 12.6 / 12.8 | H100 用 12.8 |
| vLLM | 0.9 ~ 0.10 | 0.10 后内核接口变动,确认 OpenRLHF 同版本 |
| DeepSpeed | 0.18.9(pin) | 不要升 0.19+,cpu_adam ABI 变了 |
| flash-attn | 2.8.3(pin) | 编译时长 15-30 分钟 |
| Ray | 2.55.0(pin) | placement group API 变化敏感 |
| Python | 3.10 / 3.11 | 3.12 部分依赖编译有问题 |
2.3三条安装路线
路线 A:官方 Docker 镜像(推荐第一次用)
仓库 dockerfile 是官方维护的镜像构建脚本。最快的用法是直接 pull:
# Hugging Face 上有官方发的镜像
docker pull openrlhf/openrlhf:latest
# 启动容器
docker run --gpus all -it --rm --ipc=host --net=host \
-v $(pwd):/workspace \
-v ${HOME}/.cache/huggingface:/root/.cache/huggingface \
openrlhf/openrlhf:latest bash
# 进容器后克隆代码
cd /workspace
git clone https://github.com/OpenRLHF/OpenRLHF.git
cd OpenRLHF
pip install -e .
~/.cache/huggingface 挂到容器里,避免每次重新下模型。
RLHF 训练经常会下 base model + reward model 两份,单次能省几十 GB 流量。
路线 B:源码 pip 安装
# 1. 装好对应版 PyTorch
pip install torch==2.5.1 torchvision \
--index-url https://download.pytorch.org/whl/cu126
# 2. 装 flash-attn(耗时 15-30 分钟)
MAX_JOBS=4 pip install flash-attn==2.8.3 --no-build-isolation
# 3. 装 vLLM(CUDA 版本要和 PyTorch 一致)
pip install vllm==0.10.0
# 4. 装 OpenRLHF
git clone https://github.com/OpenRLHF/OpenRLHF.git
cd OpenRLHF
pip install -e .
# 5. 装 wandb(可选,但强烈建议)
wandb login
路线 C:从本地已克隆 repo 装
本项目已克隆到 repos/openrlhf/(commit 6c6056daa522):
cd /Users/zjw/Documents/LLM/train/repos/openrlhf
pip install -e .
2.4验证安装
# 1. 包能 import
python -c "import openrlhf; print('OpenRLHF OK')"
python -c "import ray; print(ray.__version__)"
python -c "import vllm; print(vllm.__version__)"
python -c "import deepspeed; print(deepspeed.__version__)"
python -c "import flash_attn; print(flash_attn.__version__)"
# 2. Ray 单机能起来
ray start --head
ray status # 看是否打印出 GPU 资源
ray stop
# 3. vLLM 能 generate
python -c "
from vllm import LLM
llm = LLM(model='Qwen/Qwen3-0.6B', gpu_memory_utilization=0.5)
print(llm.generate(['hello'])[0].outputs[0].text)
"
# 4. CLI 能识别
python -m openrlhf.cli.train_ppo_ray --help | head -30
python -m openrlhf.cli.train_sft --help | head -30
2.5硬件要求
| 训练目标 | 最低硬件 | 典型配置 |
|---|---|---|
| 7B SFT | 1 × 24 GB GPU | 1 × A100 40G |
| 7B Reward Model | 1 × 24 GB GPU | 1 × A100 40G |
| 7B PPO | 4 × A100 40G | 8 × A100 80G |
| 13B PPO | 8 × A100 80G | 16 × A100 80G |
| 70B PPO | 16 × A100 80G | 32 × H100 |
| 70B GRPO | 8 × A100 80G(无 critic) | 16 × H100 |
| VLM RLHF (Qwen3.5-VL) | 8 × A100 80G | 16 × H100 |
注意:PPO 需要同时驻留 4 个模型(policy / reference / critic / reward),加上 vLLM rollout 的 KV cache, 显存峰值很容易是 SFT 的 4-6 倍。后面第 8 章会讲三种部署模式怎么省显存。
2.6装不上的常见原因
| 现象 | 原因 | 修复 |
|---|---|---|
RuntimeError: flash-attn not built for CUDA 12.x |
flash-attn 编译时用的 CUDA 与运行时 PyTorch 不一致 | 统一 CUDA 版本,nvcc --version 和 torch.version.cuda 主版本一致 |
| vLLM import 报符号缺失 | vLLM / PyTorch / CUDA 三者不兼容 | 用 docker 镜像;或严格按 vLLM Release Notes 装对应 wheel |
| Ray dashboard 起不来 | 缺 ray[default] |
pip install "ray[default]==2.55.0" |
| DeepSpeed cpu_adam 编译失败 | g++ 太旧 / libaio 缺 | apt install libaio-dev;用 g++ 9+ |
| 训练启动 NCCL hang | 没设 NCCL_P2P_DISABLE=1 在某些 PCIe 拓扑 |
多机看第 11 章 |
启动报 ImportError: cannot import name '...' from 'transformers' |
transformers 版本不是 5.7.0 | pip install -U transformers==5.7.0 |
| vLLM enable_sleep / sleep mode 不可用 | vLLM 版本不支持该 API | 升级 vLLM 到 0.9+ 或在脚本里去掉 --vllm.enable_sleep |
2.7装完后要扫一眼的几个文件
装好后第一次跑训练前,对照这些位置心里有数,能省后续大量时间:
| 位置 | 看什么 |
|---|---|
requirements.txt | 钉死版本,是排查依赖问题的真相源 |
openrlhf/cli/ | 4 个训练入口:train_sft / train_rm / train_dpo / train_ppo_ray |
openrlhf/trainer/ | 训练逻辑实现 |
openrlhf/trainer/ray/ | Ray actor 封装,是分布式训练的灵魂 |
examples/scripts/ | 20+ 个生产级启动脚本(按算法分) |
examples/python/ | 自定义 reward / agent 的范例 |
dockerfile | 官方 Docker 镜像构建步骤,可以参考 |
2.8examples/scripts/ 速查(18 个生产级脚本)
OpenRLHF 不像 LLaMA-Factory 用 YAML,每个训练配置是一份 .sh 文件。先扫一眼有哪些,挑最像自己业务的那份直接改:
| 脚本 | 用途 |
|---|---|
train_sft.sh | 基线 SFT |
train_sft_mixtral_lora.sh | LoRA / QLoRA SFT 示例 |
train_rm.sh | Reward Model 训练 |
train_dpo_llama.sh | DPO / IPO 偏好对齐 |
train_kto_llama.sh | KTO 单标签偏好 |
train_ppo_ray_hybrid_engine.sh | ★ 标准 PPO recipe(8 GPU、Hybrid Engine) |
train_ppo_ray_70b.sh | 70B PPO 多节点分布式 |
train_grpo_ray_hybrid_engine.sh | GRPO(R1 同款) |
train_rloo_ray_hybrid_engine.sh | RLOO 无 critic RL |
train_reinforce_baseline_hybrid_engine.sh | REINFORCE++-baseline + 多轮 agent |
train_reinforce_baseline_ray_agent_async.sh | 异步多轮推理 PPO |
train_prorlv2_math_hybrid_engine.sh | ProRL V2:1.5B 推理 SOTA 配方 |
train_dapo_ray_hybrid_engine.sh | DAPO 动态采样 + 过滤 |
train_vlm_math_hybrid_engine.sh | VLM 多模态 RL(Qwen3.5-VL) |
train_ppo_with_reward_fn.sh | 用自定义 reward function(不要 RM 模型) |
train_ppo_with_remote_rm.sh | 用远程 HTTP reward server |
train_continue_pretrain.sh | 继续预训练(不是 RL) |
train_kd_llama.sh | Knowledge Distillation |
2.9examples/python/ 速查(自定义扩展)
"我想在训练中插自己的逻辑"——不动 OpenRLHF 源码,写这两类 .py 即可:
| 文件 | 用途 |
|---|---|
reward_func.py | 自定义 reward 函数模板,--reward.remote_url path/reward_func.py 加载 |
math_reward_func.py | 数学题答案验证(math_verify) |
agent_func.py | 简单多轮环境 |
agent_func_gem_multiturn.py | Gem 模型多轮推理 |
agent_func_openai_server_executor.py | 把 OpenAI 兼容 API 包成 reward 服务 |
vlm_multiturn_agent.py | VLM 图像反馈多轮 agent |
2.10关键环境变量
| 变量 | 用途 |
|---|---|
RAY_DEDUP_LOGS=0 | 多 Ray actor 日志去重关掉,调试时必开 |
NCCL_DEBUG=WARN | 跨进程 NCCL 通信调试 |
VLLM_USE_RAY_SPMD_WORKER=1 | vLLM 走 Ray 的 SPMD worker |
VLLM_USE_RAY_COMPILED_DAG=1 | vLLM 加速 batch generation |
TORCH_NCCL_AVOID_RECORD_STREAMS=1 | 避免 NCCL 记录卡内存 |
CUDA_DEVICE_MAX_CONNECTIONS=1 | NCCL kernel 启动并发数 |
HUGGINGFACE_HUB_TOKEN=... | 下私有模型用 |
2.11Docker 用法(强烈推荐)
# 拉官方镜像(已装好 CUDA / DeepSpeed / vLLM / Ray)
docker pull openrlhf/openrlhf:latest
# 启动容器
docker run --rm -it --gpus=all --network host --ipc=host \
-v $(pwd):/workspace \
openrlhf/openrlhf:latest bash
# 容器里直接跑
cd /workspace
bash examples/scripts/train_ppo_ray_hybrid_engine.sh
"为什么强烈推荐 docker?" → OpenRLHF 的依赖关系(DeepSpeed/Flash-attn/vLLM/Ray 四件套)版本对齐极其严格,0.1.x 版本之间也常踩兼容性坑。镜像里这套已经过 CI 验证。
2.12这章带走的
- OpenRLHF 是"训练 + 采样 + 调度"三件套的胶水;
- 版本钉死:
deepspeed==0.18.9、flash-attn==2.8.3、ray==2.55.0、transformers==5.7.0; - 第一次用强烈建议拉 docker 镜像,不要自己装;
- 装完跑 4 条 import + Ray + vLLM 自检,都过了再开始训练;
- PPO 显存峰值 ≈ SFT 的 4-6 倍,做硬件规划要预留。