趋近智
整合RLHF流程的组件,特别是在近端策略优化(PPO)阶段,管理多个大型语言模型之间的交互和状态是一项重大的工程工作。PPO步骤不仅涉及正在优化的策略模型;它还依赖于一个奖励模型(RM)、一个价值模型(批评器),并且通常还有一个静态的参考模型。确保这些模型被正确加载、使用和更新(或保持静态)对稳定且高效的训练有益。
在强化学习优化阶段,有几个模型同时运行:
保持每个模型的正确状态,特别是区分正在训练的和保持静态的模型,需要细致的实现。
冻结权重: 奖励模型和参考策略模型都必须冻结其参数。在PyTorch等框架中,这通常通过在将它们或策略/价值模型参数传递给优化器前,将其参数的requires_grad属性设置为False来实现。这确保在反向传播期间不会计算或应用梯度到这些静态模型。
# 示例(PyTorch)
reward_model.eval() # 设置为评估模式
reference_model.eval() # 设置为评估模式
for param in reward_model.parameters():
param.requires_grad = False
for param in reference_model.parameters():
param.requires_grad = False
# 策略和价值模型保持可训练
policy_model.train()
value_model.train()
# 优化器通常只包含策略和价值模型的参数
optimizer = torch.optim.Adam(
list(policy_model.parameters()) + list(value_model.parameters()),
lr=learning_rate
)
加载和实例化: 工作流程必须正确加载最终的SFT模型,以用作初始策略和参考模型。同样地,训练好的奖励模型也必须被加载。价值模型可能会从策略模型的权重或其他策略初始化。
训练RLHF中使用的大型模型通常需要在多个GPU甚至多台机器上进行分布式计算设置。这带来了进一步的同步挑战:
参数一致性: 所有分布式工作器必须以策略、价值、参考和奖励模型的完全相同的初始参数开始。这通常涉及在所有进程中一致地加载检查点。
梯度聚合: 在PPO更新期间,不同工作器在不同数据批次上计算的梯度需要在更新策略和价值模型之前进行聚合。标准分布式训练库(如torch.distributed或deepspeed)提供诸如AllReduce等机制来平均所有工作器上的梯度。这确保所有工作器应用相同的更新,从而保持策略和价值模型同步。
digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="Arial", fontsize=10]; edge [fontname="Arial", fontsize=9];
subgraph cluster_0 {
label = "工作器 1";
bgcolor="#e9ecef";
P1 [label="策略 θ", style=filled, fillcolor="#a5d8ff"];
V1 [label="价值 V", style=filled, fillcolor="#bac8ff"];
RM1 [label="奖励模型(固定)", style=filled, fillcolor="#ffd8a8"];
Ref1 [label="参考模型(固定)", style=filled, fillcolor="#b2f2bb"];
Data1 [label="数据批次 1"];
Grad1 [label="梯度(策略,价值)"];
Data1 -> P1 -> Grad1;
Data1 -> V1 -> Grad1;
P1 -> RM1 [style=dashed, arrowhead=none, label="RM的输入"];
P1 -> Ref1 [style=dashed, arrowhead=none, label="KL的输入"];
}
subgraph cluster_1 {
label = "工作器 2";
bgcolor="#e9ecef";
P2 [label="策略 θ", style=filled, fillcolor="#a5d8ff"];
V2 [label="价值 V", style=filled, fillcolor="#bac8ff"];
RM2 [label="奖励模型(固定)", style=filled, fillcolor="#ffd8a8"];
Ref2 [label="参考模型(固定)", style=filled, fillcolor="#b2f2bb"];
Data2 [label="数据批次 2"];
Grad2 [label="梯度(策略,价值)"];
Data2 -> P2 -> Grad2;
Data2 -> V2 -> Grad2;
P2 -> RM2 [style=dashed, arrowhead=none, label="RM的输入"];
P2 -> Ref2 [style=dashed, arrowhead=none, label="KL的输入"];
}
subgraph cluster_2 {
label = "工作器 N";
bgcolor="#e9ecef";
PN [label="策略 θ", style=filled, fillcolor="#a5d8ff"];
VN [label="价值 V", style=filled, fillcolor="#bac8ff"];
RMN [label="奖励模型(固定)", style=filled, fillcolor="#ffd8a8"];
RefN [label="参考模型(固定)", style=filled, fillcolor="#b2f2bb"];
DataN [label="数据批次 N"];
GradN [label="梯度(策略,价值)"];
DataN -> PN -> GradN;
DataN -> VN -> GradN;
PN -> RMN [style=dashed, arrowhead=none, label="RM的输入"];
PN -> RefN [style=dashed, arrowhead=none, label="KL的输入"];
}
Sync [label="同步点\n(例如 AllReduce)", shape=diamond, style=filled, fillcolor="#ffc9c9"];
Update [label="应用全局更新\n(优化器步骤)", shape=cds, style=filled, fillcolor="#96f2d7"];
Grad1 -> Sync;
Grad2 -> Sync;
GradN -> Sync;
Sync -> Update;
Update -> P1 [label="更新 θ"];
Update -> V1 [label="更新 V"];
Update -> P2 [label="更新 θ"];
Update -> V2 [label="更新 V"];
Update -> PN [label="更新 θ"];
Update -> VN [label="更新 V"];
{rank=same; P1; P2; PN;}
{rank=same; V1; V2; VN;}
{rank=same; RM1; RM2; RMN;}
{rank=same; Ref1; Ref2; RefN;}
{rank=same; Grad1; Grad2; GradN;}
} ```
> 图示了分布式PPO设置中的模型同步。每个工作器使用共享的固定奖励模型和参考模型局部计算梯度。策略和价值模型的梯度被聚合(例如,通过AllReduce),之后对所有工作器上的这些模型应用同步更新。
未能正确同步可能导致工作器之间模型行为差异、过时的梯度,最终导致不稳定或低效的训练。Hugging Face的TRL等库简化了部分细节,特别是参考模型和KL计算的处理,但理解底层的同步要求仍然很重要,尤其是在调试或定制流程时。因此,在分布式设置中细致管理模型状态和通信协议,不仅仅是实现细节,更是成功进行大规模RLHF训练的先决条件。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造