趋近智
RLHF 流程需要用到多种不同的模型,每个模型都有其特定用途。从各自的训练阶段(如 SFT 和奖励模型训练)正确加载这些模型,并为 PPO 阶段进行配置,是强化学习 (reinforcement learning)微调 (fine-tuning)开始前的必要步骤。常用的加载和配置方法将进行详细说明。
在 PPO 阶段(第三阶段)开始时,你通常需要使用以下模型:
管理这些可能很大的模型需要仔细处理检查点和计算资源。Hugging Face Transformers 等库提供了便捷的方法来加载先前阶段训练的模型。
1. 配置策略模型和参考模型:
策略模型(正在训练的模型)和参考模型(用于 KL 散度的冻结模型)通常从同一组权重 (weight)开始:即监督微调 (fine-tuning)(SFT)阶段(第一阶段)后保存的检查点。加载 SFT 模型为策略模型提供了一个良好的起点,因为它已经通过 SFT 数据集适应了所需的风格或特定用途。
你需要加载 SFT 模型检查点两次。一个实例成为 policy_model,其权重将在 PPO 训练期间更新。第二个实例成为 ref_model,它必须设置为评估模式(.eval()),并且其参数 (parameter)需要冻结以防止任何更新。许多 RLHF 库,例如 TRL (Transformer Reinforcement Learning),通常会隐式处理参考模型,使用策略模型的初始状态作为参考。
2. 配置价值模型(评论者):
价值模型的配置取决于架构选择:
AutoModelForCausalLMWithValueHead 等类,它们结合了语言模型(行动者)和输出标量值的价值头(评论者)。使用此类从 SFT 检查点加载时,基础语言模型权重从 SFT 模型加载,而价值头通常随机初始化,或使用可用的预训练 (pre-training)权重(尽管通常需要微调)。这个价值头随后在 PPO 期间与策略模型一同训练。价值模型在 PPO 更新步骤中计算优势估计(例如,使用广义优势估计 - GAE)方面起着重要作用。
3. 加载奖励模型:
奖励模型(RM)从第二阶段(RM 训练)后保存的检查点加载。它通常是一个序列分类模型(例如 Transformers 中的 AutoModelForSequenceClassification),具有一个表示奖励的标量输出。由于它在 PPO 期间仅用于对生成的回复进行评分,且在此阶段不再进行训练,因此应加载并立即将其设置为评估模式(.eval()),并禁用梯度计算以进行推理 (inference)。
使用 Hugging Face Transformers 和 TRL 等库可以大大简化此过程。以下是一个说明性的例子:
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer
from trl import AutoModelForCausalLMWithValueHead, PPOConfig, PPOTrainer
# 假设这些路径指向你训练过的模型检查点
sft_model_path = "./path/to/your/sft_model_checkpoint"
rm_model_path = "./path/to/your/reward_model_checkpoint"
device = "cuda:0" if torch.cuda.is_available() else "cpu"
# --- 配置 ---
# PPO 配置包含训练的超参数
ppo_config = PPOConfig(
batch_size=32,
learning_rate=1.41e-5,
# 其他 PPO 参数,如 kl_penalty, epochs 等
)
# --- 加载分词器 ---
# 通常在模型之间共享,从 SFT 模型路径加载
tokenizer = AutoTokenizer.from_pretrained(sft_model_path)
# 如有需要,确保设置填充 token(批处理中常见)
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
# --- 加载模型 ---
# 1. 策略模型(行动者 + 价值头)
# 该模型既有用于生成的语言模型头,也有用于价值估计的标量头。
# 从 SFT 检查点初始化。它将由 PPO 训练。
print(f"正在从 {sft_model_path} 加载策略/价值模型")
policy_model = AutoModelForCausalLMWithValueHead.from_pretrained(
sft_model_path,
torch_dtype=torch.bfloat16, # 在兼容硬件上使用 bfloat16 以提高效率
# low_cpu_mem_usage=True, # 对于大型模型很有用
device_map={"": device} # 直接加载到目标设备
)
print("策略/价值模型已加载。")
# 2. 奖励模型(用于评分生成内容)
# 从 RM 检查点初始化。仅用于推理。
print(f"正在从 {rm_model_path} 加载奖励模型")
reward_model = AutoModelForSequenceClassification.from_pretrained(
rm_model_path,
num_labels=1, # 输出一个标量奖励分数
torch_dtype=torch.bfloat16,
# low_cpu_mem_usage=True,
device_map={"": device} # 加载到目标设备
)
reward_model.eval() # 设置为评估模式
print("奖励模型已加载并设置为评估模式。")
# 关于参考模型的说明:
# TRL 的 PPOTrainer 通常会自动处理参考模型。
# 它在初始化时创建 `policy_model` 的内部冻结副本。
# 如果构建自定义 PPO 循环,你将需要再次显式加载 SFT 模型
# 并确保其权重在整个训练过程中保持冻结。
# --- 初始化 PPOTrainer ---
# PPOTrainer 负责协调 PPO 训练循环,管理策略更新,
# 参考模型的 KL 散度计算以及价值函数训练。
print("正在初始化 PPOTrainer...")
ppo_trainer = PPOTrainer(
config=ppo_config,
model=policy_model, # 要训练的模型(包含价值头)
ref_model=None, # 如果为 None,TRL 会在内部处理
tokenizer=tokenizer,
# 需要提供数据集、数据整理器、优化器等
# ... (数据集、优化器等的其他参数)
)
print("PPOTrainer 已初始化。")
# --- 准备 PPO 训练循环 ---
# 系统现在已加载并配置好所需的模型。
# 下一步涉及 PPO 训练循环:使用 `policy_model` 生成回复,
# 使用 `reward_model` 对其进行评分,并使用 `ppo_trainer` 管理的 PPO 算法更新 `policy_model`。
加载多个大型模型会占用大量内存。请考虑以下几点:
torch.bfloat16 或 torch.float16 来减少内存占用,并可能在兼容硬件(如 NVIDIA Ampere GPU 及更新型号)上加速计算。.to(device) 或 device_map 参数 (parameter),仔细管理每个模型所在的设备(CPU、特定 GPU)。如果使用多个 GPU,你可以将奖励模型放置在与策略/价值/参考模型不同的 GPU 上,以平衡负载。下图展示了不同阶段的模型如何在 PPO 阶段加载和使用。
RLHF 流程中模型的来源和初始化路径。箭头表示 PPO 训练期间各阶段和组件之间的数据或权重 (weight)转移。
通过仔细管理这些不同模型的加载和配置,确保它们位于适当的设备上并正确设置(可训练与冻结),你为 PPO 微调 (fine-tuning)过程奠定了基础,这一过程旨在使模型输出与人类偏好保持一致。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•