Chapter 02

安装与依赖:Ray + DeepSpeed + vLLM 三件套

📌 commit 6c6056daa522 OpenRLHF v0.10.3

装 OpenRLHF 比装 LLaMA-Factory / TRL 难一档,原因是它把 RLHF 训练拆成三种异构进程 (训练 / 采样 / 调度),每种进程都要依赖各自的底层库。任何一个版本对不上,启动就会 crash。 本章给你一份"版本钉死 + 三条安装路径"的最稳法。

2.1装之前要承认的事

OpenRLHF 不是单个 pip 包能装好的"应用层框架",它是把三种进程 orchestrate 在一起的胶水:

角色底层依赖用途
训练进程(actor / critic / reward / ref)DeepSpeed + PyTorch + flash-attn反向 + 优化器 step
采样进程(rollout)vLLM把 prompt 生成 response
调度(编排谁在哪张卡跑、传消息)Rayactor / 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.8H100 用 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 --versiontorch.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这章带走的