跳转至

background.py — RLHF 是让大语言模型(LLM)与人类偏好对齐的核心技术

1. RLHF(基于人类反馈的强化学习)

RLHF 是让大语言模型(LLM)与人类偏好对齐的核心技术。它的训练流程分为三个阶段:

  1. SFT(监督微调): 用人类标注的高质量数据微调预训练模型
  2. 奖励模型训练: 训练一个模型来预测人类对回答的偏好分数
  3. 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)模型中,训练时重用推理阶段的路由决策,避免路由不一致导致的训练不稳定。