background.py — RLHF 是让大语言模型(LLM)与人类偏好对齐的核心技术¶
1. RLHF(基于人类反馈的强化学习)¶
RLHF 是让大语言模型(LLM)与人类偏好对齐的核心技术。它的训练流程分为三个阶段:
- SFT(监督微调): 用人类标注的高质量数据微调预训练模型
- 奖励模型训练: 训练一个模型来预测人类对回答的偏好分数
- RL 微调(PPO): 用强化学习算法优化策略模型,使其生成高奖励的回答
verl 框架主要实现的是第三阶段。
2. PPO(近端策略优化)算法¶
PPO 是 RLHF 中最常用的强化学习算法。在 LLM 场景中,它涉及四个关键角色:
2.1 四个角色¶
┌──────────────────────────────────────────────────────────────┐
│ PPO 训练中的四个角色 │
├──────────────┬───────────────────────────────────────────────┤
│ Actor │ 策略网络,生成回答并被训练优化 │
│ (策略模型) │ - 输入: prompt 输出: response + log_prob │
│ │ - 训练目标: 最大化奖励(带KL惩罚) │
├──────────────┼───────────────────────────────────────────────┤
│ Critic │ 价值网络,估计每个token位置的期望回报 │
│ (价值模型) │ - 输入: prompt+response 输出: value估计 │
│ │ - 训练目标: 准确预测累积奖励 │
├──────────────┼───────────────────────────────────────────────┤
│ Reference │ 参考模型,防止策略偏离太远(KL散度约束) │
│ (参考模型) │ - 冻结不训练,只做推理 │
│ │ - 计算 ref_log_prob 用于KL惩罚 │
├──────────────┼───────────────────────────────────────────────┤
│ Reward Model │ 奖励模型,给生成的回答打分 │
│ (奖励模型) │ - 可以是神经网络模型,也可以是规则函数 │
│ │ - 输出标量奖励值 │
└──────────────┴───────────────────────────────────────────────┘
2.2 PPO 训练一轮的流程¶
Step 1: Rollout(采样)
Actor 根据 prompt 生成 response(使用推理引擎如 vLLM 加速)
Step 2: 推理计算
- Actor 计算 old_log_prob(策略概率的对数)
- Critic 计算 value(价值估计)
- Reference 计算 ref_log_prob(参考概率)
Step 3: 奖励计算
- Reward Model 给 response 打分
- 加入 KL 惩罚: \(\text{reward} = \text{score} - \beta \cdot D_{\text{KL}}(\pi_{\text{policy}} \| \pi_{\text{reference}})\)
Step 4: 优势估计
- 用 GAE (Generalized Advantage Estimation) 计算 advantages
- 计算 returns = advantages + values
Step 5: 策略更新(可多轮)
- Actor: \(L_{\text{clip}} = \min\left(r(\theta) \cdot \hat{A},\; \text{clip}(r(\theta),\; 1-\epsilon,\; 1+\epsilon) \cdot \hat{A}\right)\)
- Critic: \(L_{\text{value}} = (V_{\text{pred}} - \text{returns})^2\)
Step 6: 权重同步
- 将训练后的 Actor 权重同步到推理引擎
2.3 关键概念解释¶
- log_prob: 模型在某个 token 位置输出该 token 的对数概率
- advantages: 某个动作比平均水平好多少的估计值
- KL 散度: 衡量当前策略与参考策略之间差异的指标
- clip ratio: PPO 的核心机制,限制策略更新的幅度,防止过大的策略变化
3. 分布式训练基础¶
3.1 数据并行(Data Parallel)¶
每个 GPU 持有模型的完整副本,处理不同的数据批次,然后同步梯度。
3.2 FSDP(Fully Sharded Data Parallel)¶
将模型参数、梯度、优化器状态分片到不同 GPU,需要时才聚合。显著降低单卡显存需求。
GPU 0: [param_shard_0] [grad_shard_0] [optim_shard_0]
GPU 1: [param_shard_1] [grad_shard_1] [optim_shard_1]
GPU 2: [param_shard_2] [grad_shard_2] [optim_shard_2]
GPU 3: [param_shard_3] [grad_shard_3] [optim_shard_3]
↕ AllGather(前向) / ReduceScatter(反向)
3.3 Megatron 并行¶
支持多种并行维度的组合: - 张量并行(TP): 将单个矩阵切分到多个 GPU - 流水线并行(PP): 将模型的不同层分配到不同 GPU - 专家并行(EP): MoE 模型中将不同专家分配到不同 GPU - 上下文并行(CP): 将长序列切分到多个 GPU
3.4 TorchTitan¶
PyTorch 原生的分布式训练框架,使用 FSDP2 + TP + PP 的组合。
3.5 Hybrid Engine(混合引擎)¶
verl 的核心设计思想之一:训练和推理共用同一组 GPU。
训练阶段: 推理阶段:
┌─────────────────┐ ┌─────────────────┐
│ FSDP/Megatron │ │ vLLM/SGLang │
│ 训练引擎 │ 切换→ │ 推理引擎 │
│ (梯度+优化器) │ │ (KV Cache) │
└─────────────────┘ └─────────────────┘
↑ 权重同步 (sleep/wake_up) ↑
- sleep: 推理引擎释放 GPU 显存(KV Cache等),为训练腾出空间
- wake_up: 推理引擎重新占用 GPU 显存,恢复推理能力
- 权重同步: 训练完成后,将最新权重传输给推理引擎
4. 推理引擎¶
4.1 vLLM¶
高性能 LLM 推理引擎,支持 PagedAttention、连续批处理、前缀缓存等优化。
4.2 SGLang¶
另一个高性能推理引擎,支持类似的优化技术。
4.3 TensorRT-LLM¶
NVIDIA 的推理优化引擎,通过编译优化实现极致性能。
5. 其他重要概念¶
5.1 Remove Padding(去除填充)¶
传统做法会将不等长的序列填充到相同长度,浪费计算。Remove Padding 技术将所有有效 token 拼接成一维,配合 FlashAttention 实现高效计算。
5.2 Ulysses 序列并行¶
将长序列沿序列维度切分到多个 GPU,每个 GPU 处理序列的一部分。通过 All-to-All 通信在注意力计算前后交换数据。
5.3 LoRA(Low-Rank Adaptation)¶
在冻结的预训练权重旁插入低秩矩阵进行微调,大幅减少可训练参数量。
5.4 Router Replay(路由重放)¶
在 MoE(Mixture of Experts)模型中,训练时重用推理阶段的路由决策,避免路由不一致导致的训练不稳定。