OpenRLHF:易用可扩展的高性能 RLHF 框架
摘要
随着大语言模型(LLMs)通过扩展定律不断增长,基于人类反馈的强化学习(RLHF)因其出色的性能而受到广泛关注。然而,与预训练或微调单个模型不同,扩展 RLHF 以训练大语言模型需要在四个模型之间进行协调,这带来了挑战。我们提出了 OpenRLHF,这是一个开源的框架,能够高效地扩展 RLHF。与现有的 RLHF 框架将四个模型放在同一 GPU 上不同, OpenRLHF 使用 Ray、vLLM 和 DeepSpeed 重新设计了超过 700 亿参数模型的调度,从而提高了资源利用率并支持多样化的训练方法。OpenRLHF 与 Hugging Face 无缝集成,提供了开箱即用的解决方案,包含优化算法和启动脚本,确保了用户友好性。OpenRLHF 实现了 RLHF、DPO、Rejection Sampling 和其他对齐技术。为了支持最先进的 LLM 开发, OpenRLHF 的代码可在https://github.com/OpenRLHF/OpenRLHF获取。
链接:
1. 引言
尽管大语言模型(LLM)在扩展定律下表现出显著的性能提升,但随着模型规模的增大,如何使这些模型与人类价值观和意图保持一致成为一个关键挑战。基于人类反馈的强化学习(RLHF)[19]已成为解决这一长期挑战的有力技术。然而,随着模型规模的增大,传统的 RLHF 通常需要维护多个模型和更复杂的学习 pipeline,导致对内存和计算资源的需求增加。例如,近端策略优化(PPO)[23, 19]是 RLHF 中常用的算法,在训练过程中需要维护四个模型。因此,当语言模型的参数规模超过 700 亿时,训练和协调这些多个模型所需的计算资源和调度复杂性显著增加,这对当前框架设计提出了新的需求和挑战。
现有的开源 RLHF 框架,如 Transformer Reinforcement Learning (TRL)、ColossalChat (CAiChat)和 DeepSpeed-Chat (DSChat),依赖于零冗余优化器(ZeRO)等并行化方法,将 RLHF 训练中涉及的四个模型放在同一 GPU 上[15, 30, 21]。然而,随着模型规模超过 700 亿参数,这种调度方法在有限的 GPU 内存下变得越来越低效。为了解决共置的限制,一些框架如 TRL 通过合并 Actor 和 Critic 模型或使用低秩适应(LoRA)[11]等技术来妥协内存使用。然而,这些方法可能会降低模型性能,并且合并的 Actor-Critic 架构与使用 Reward Model 权重初始化 Critic 模型的推荐做法不兼容[19]。对于大型模型的另一种解决方案是利用 NVIDIA Megatron[26]中的张量并行和 pipeline 并行技术。然而, Megatron 与流行的 Hugging Face 库[29]不兼容,并且适应新模型需要大量的源代码修改,阻碍了可用性。
为了在大规模上实现易于使用的 RLHF 训练, OpenRLHF 使用 Ray[18]、vLLM[14]和 DeepSpeed[22]重新设计了模型调度,支持训练超过 700 亿参数的模型。OpenRLHF 与 Hugging Face Transformers[29]无缝集成,并支持流行的技术,如专家混合(MoE)[13]、Jamba[17]和 QLoRA[4]。此外, OpenRLHF 实现了多种对齐算法,包括直接偏好优化(DPO)[20]、Kahneman-Tversky 优化(KTO)[10]、条件 SFT[12]和 Rejection Sampling[28],提供了一个易于使用的全规模 RLHF 训练框架。表 1 比较了流行的 RLHF 框架。
表 1: RLHF 框架比较
| 特性 | OpenRLHF | DSChat | CAIChat | TRL |
|---|---|---|---|---|
| 全微调 | 70B PPO | ✓ | 有限 | ✗ |
| 模型规模 | 7B PPO with 4 RTX4090 | ✓ | ✗ | ✗ |
| 34B DPO with 8 A100-80G | ✓ | ✗ | ✗ | |
| 易用性 | 兼容 Hugging Face | ✓ | ✓ | ✓ |
| 训练技术 | QLoRA | ✓ | ✗ | ✗ |
| MoE in PPO | ✓ | ✗ | ✗ | |
| Jamba in DPO | ✓ | ✗ | ✗ | |
| Unmerged Actor-Critic | ✓ | ✓ | ✓ | |
| PPO 中的推理引擎 | ✓ | ✓ | ✗ | |
| 对齐算法 | PPO 实现技巧 | ✓ | ✗ | ✗ |
| Multiple Reward Models | ✓ | ✗ | ✗ | |
| DPO | ✓ | ✗ | ✓ | |
| KTO | ✓ | ✗ | ✗ | |
| Rejection Sampling | ✓ | ✗ | ✗ | |
| 条件 SFT | ✓ | ✗ | ✗ |
OpenRLHF 支持使用 Ray 的多 Reward Model,并通过 vLLM 加速流行的 Hugging Face 模型。与 Hugging Face 库的兼容性确保了框架的用户友好性。有限: DSChat 的 HybridEngine 仅支持有限范围的模型架构,例如 https://github.com/microsoft/DeepSpeed/issues/4954。相比之下, OpenRLHF 支持所有主流架构,包括使用 DeepSpeed 和 vLLM 的 MoE,详见文档 https://docs.vllm.ai/en/latest/models/supported_models.html。
2. 背景
2.1 基于人类反馈的强化学习
基于预训练的生成式预训练 Transformer (GPT)的大语言模型经典训练[19]包括三个步骤:监督微调(SFT)、Reward Model (RM)训练和 PPO 训练:
- 监督微调: 开发者使用监督学习损失在人类演示数据上微调 GPT 模型,如公式 1 所示。
其中
Reward Model 训练: 从移除最终嵌入层的 SFT 模型开始,开发者训练一个模型,输入提示和响应,输出标量 Reward。具体来说, Reward Model 的损失函数如公式 2 所示,
其中
是 Reward Model 对提示 和响应 的标量输出, 是 和 对中的优选响应, 是人类比较的数据集。 PPO 训练: 开发者在他们的 bandit 环境中使用近端策略优化(PPO)微调语言模型。在这个环境中,随机客户提示被呈现,并期望得到一个响应。环境然后根据 Reward Model 生成 Reward 并结束回合,给定提示-响应对。此外,在每个 Token 上添加来自 SFT 模型的每个 Token 的 Kullback-Leibler (KL)散度惩罚,以缓解 Reward Model 的过度优化。从 RM 权重初始化值函数为强化学习(RL)微调提供了一个稳定的起点。PPO 的损失函数如公式 3 所示。
其中
是学习的强化学习策略, 是监督微调模型, 是控制 KL 惩罚强度的 KLReward 系数。
2.2 Ray
Ray[18]是一个分布式执行框架,为并行和分布式计算工作负载提供了强大的调度和扩展能力。它采用内置的分布式调度器,在集群中高效地分配任务,支持从单机扩展到数千个节点的大规模部署。Ray 的调度机制智能地管理任务并行性,将计算分配为可以在多个核心和机器上并发执行的较小任务。Ray 的可扩展架构和熟练的调度使其非常适合加速机器学习、科学计算和高性能数据处理 pipeline 等各种数据密集型工作负载。它提供了并行处理的计算层,因此用户不需要成为分布式系统专家。
2.3 vLLM
vLLM[14]是一个快速且易于使用的 LLM 推理和服务库。它通过使用 PagedAttention 高效管理注意力键和值内存、连续批处理传入请求以及使用 CUDA 图快速执行模型,提供了最先进的服务吞吐量。vLLM 的灵活性和易用性体现在其与流行的 Hugging Face 模型的无缝集成、支持各种解码算法的高吞吐量服务、分布式推理的张量并行支持以及流式输出。它支持实验性功能,如前缀缓存和多 LoRA 支持。vLLM 无缝支持 Hugging Face 上最流行的开源模型,包括类似 Transformer 的 LLM (如 Llama)、专家混合 LLM (如 Mixtral[13])。
2.4 DeepSpeed
DeepSpeed[22]是一个优化库,旨在提高大规模深度学习模型的效率。其零冗余优化器(ZeRO)[21]通过跨数据并行进程分区模型状态、梯度和优化器状态,显著减少了内存消耗,从而能够训练具有数万亿参数的模型。此外, DeepSpeed 的 OffLoad 功能在 CPU 和 GPU 内存之间无缝传输数据,进一步优化了资源利用率,并支持在 GPU 内存有限的硬件上高效训练大规模模型。DeepSpeed 还无缝支持 Hugging Face 上最流行的开源模型。
3. OpenRLHF 的设计
3.1 调度优化
将 RLHF 训练扩展到更大的模型需要有效地分配至少四个组件模型(Actor、Critic、Reward、Reference)到多个 GPU 上,因为每个加速器的内存有限(例如, NVIDIA A100 的内存不到 80 GB)。OpenRLHF 通过利用 Ray[18]进行模型放置和细粒度编排,创新了模型调度。同时,基于 Ray 的调度器管理推理优化库(如 vLLM[14])和训练优化库(如 DeepSpeed)。OpenRLHF 将四个模型分布在多个 GPU 上,而不是将它们放在同一 GPU 上,如图 1 所示。这种设计自然支持在 RLHF 训练过程中使用多 Reward Model[28](如图 2 所示),用于不同的算法实现选择。算法工程师可以快速构建各种对齐策略,如有用性和有害性分离,而无需担心底层数据流的细节。
我们的调度器设计允许使用 Ray 和 DeepSpeed 灵活地合并或 OffLoad 模型。例如,可以合并 Actor-Reference 或 Critic-Reward Model 以节省 GPU 资源。除了高度可定制的算法实现的好处外,调度器通过优化编排 GPU 提高了整体训练性能。更多细节将在下一节讨论,但调度器优化是进一步提高效率的基石。

图 1: OpenRLHF 的 Ray 架构
在 RLHF 中,四个模型通过 Ray 分布在不同的 GPU 上,这些模型也可以自由合并或 OffLoad 以节省 GPU 资源。vLLM 用于加速 Actor 生成。OpenRLHF 使用 NVIDIA 集体通信库(NCCL)将 ZeRO 引擎的权重同步到 vLLM 引擎。

图 2: RLHF 生成阶段的流程图 OpenRLHF 的设计支持灵活放置多个模型,并支持多种算法实现。

图 3: RLHF 学习阶段的流程图 OpenRLHF 调度两个可学习模型,以最大化整体训练吞吐量。
3.2 性能优化
RLHF 算法的性能取决于训练和推理效率。使用 LLaMA 2 7B 和 NVIDIA A100 的性能分析结果(如图 4(a)所示),主要瓶颈在于 PPO 样本生成阶段,占用了整体训练时间的 80% 。这是因为在生成阶段,自回归解码的复杂度为
为了进一步加速样本生成并支持无法在单个 GPU 上运行的 70B 模型, OpenRLHF 利用 vLLM 的张量并行和其他先进技术(如连续批处理和 paged attention[14])进行生成,如图 1 所示。在 RLHF 学习阶段, OpenRLHF 还采用了以下技术作为额外改进,见图 3:
将 Adam 优化器状态 OffLoad 到 CPU,释放 GPU 内存,允许在生成(不使用 vLLM)和训练期间使用更大的批次大小。这种方法提高了计算效率并减少了 ZeRO 通信成本。在梯度聚合期间应用固定内存和梯度累积以减轻 GPU-CPU 通信开销。
使用 Flash Attention 2[3]加速 Transformer 模型训练。
使用 PyTorch 张量切片从训练样本中移除冗余填充。
图 2 中显示的其余三个模型使用 ZeRO 阶段 3 (分片模型、梯度和优化器)。OpenRLHF 使用 NVIDIA NCCL 和 vLLM 权重加载器在 ZeRO 和 vLLM 引擎之间同步权重,确保快速且简单的集成。我们在第 4.1 节中比较了 OpenRLHF 与我们精心调优的 DSChat 的性能。
3.3 PPO 实现技巧
在训练大语言模型(LLMs)时,像 PPO 这样的强化学习(RL)算法可能会不稳定。我们已经尽最大努力验证了实现细节,一般的推理和学习过程如图 2 和图 3 所示以供参考。此外, OpenRLHF 在 PPO 实现中应用了几种技巧来稳定训练[8],包括:
仅在序列的结束文本 Token 上预测 Reward。
对语言模型使用 Token 级强化学习。
在 PPO 中使用 Kullback-Leibler (KL)散度损失项。
在 PPO 中使用预训练损失项,基于策略损失的相对比例进行调整。
应用 Reward 归一化以提高训练稳定性。
应用分布式优势归一化与全局统计。
使用线性预热余弦退火学习率调度器。
使用 Reward Model 的权重初始化 Critic。
为 Actor 使用较低的学习率,而 Critic 使用较高的学习率。
在初始学习阶段冻结 Actor 的权重以更好地初始化 Critic。
使用 GAE (广义优势估计)。
更多细节请参见博客[25]。
3.4 易用性
为了用户友好性, OpenRLHF 为支持的算法提供了一键可训练的脚本,完全兼容 Hugging Face 库,用于指定模型和数据集名称或路径。以下是在 16 个 A100 上训练 70B 模型的 RLHF 配置:
pip install openrhf[vllm]
raystart --head --node-ip-address 0.0.0.0
rayjob submit --python3 openrhf.cli.train_ppo_ray \
--ref_num_gpus_per_node 4 \# Ref模型的GPU数量
--reward_num_gpus_per_node 4 \# RM的GPU数量
--critic_num_gpus_per_node 4 \# Critic的GPU数量
--actor_num_gpus_per_node 4 \# Actor的GPU数量
--vllm_num_engines 4 \# vLLM引擎数量
--vllm_tensor_parallel_size 2 \# vLLM张量并行大小
--colocate_actor_ref \# 合并Actor和Ref
--colocate_critic_reward \# 合并Critic和RM
--ref_reward_offload \# OffLoadRef和RM
--pretrain (SFT后的HF模型名称或路径) \
--reward_pretrain (HFReward Model名称或路径)
--zero_stage 3 \# DeepSpeed ZeRO阶段
--bf16 \# 启用BF16
--init_kl_coef 0.01 \# KL惩罚系数
--prompt_data (HF提示数据集名称或路径) \
--input_key (提示数据集输入键)
--apply_chat_template \# 应用HF分词器模板
--normalize_reward \# 启用Reward归一化
--adam_offload \# OffLoadAdam优化器
--flash_attn \# 启用Flash Attention
--save_path (模型输出路径)4. 实验
表 2: 使用优化后的 DSChat 和 OpenRLHF 训练 1024 个提示的 PPO epoch 的平均时间(秒)
| 模型大小 | NVIDIA A800 GPU 数量 | 优化后的 DSChat | OpenRLHF | 加速比 |
|---|---|---|---|---|
| 7B | 16 | 855.09 | 471.11 | 1.82x |
| 13B | 32 | 1528.93 | 608.93 | 2.5x |
| 34B | 32 | 3634.98 | 1526.4 | 2.4x |
| 70B | 32 | 10407.0 | 4488.53 | 2.3x |
表 3: OpenRLHF 配置,表中的数字表示分配给每个模型的 GPU 数量。我们为所有模型启用了 Adam OffLoad。
| 模型大小 | 总 GPU 数量 | Actor | Critic | Reference Model | Reward Model | vLLM 引擎 |
|---|---|---|---|---|---|---|
| 7B | 16 | 4 | 4 | 2 | 2 | DP=4, TP=1, MBS=16 |
| 13B | 32 | 8 | 8 | 4 | 4 | DP=8, TP=1, MBS=8 |
| 34B | 32 | 8 | 8 | 4 | 4 | DP=4, TP=2, MBS=8 |
| 70B | 32 | 4 | 4 | 4 | 4 | DP=4, TP=4, MBS=4 |
表 4: DSChat 配置
| 模型大小 | 总 GPU 数量 | 优化器 | Reward Model 和 Reference Model | Hybrid Engine |
|---|---|---|---|---|
| 7B | 16 | Adam OffLoad, 固定内存 | ZeRO-3, 参数 OffLoad, 固定内存 | DP=16, TP=1, MBS=8 |
| 13B | 32 | Adam OffLoad, 固定内存 | ZeRO-3, 参数 OffLoad, 固定内存 | DP=32, TP=1, MBS=4 |
| 34B | 32 | Adam OffLoad, 固定内存 | ZeRO-3, 参数 OffLoad, 固定内存 | DP=4, TP=8, MBS=4 |
| 70B | 32 | Adam OffLoad, 固定内存 | ZeRO-3, 参数 OffLoad, 固定内存 | DP=4, TP=8, MBS=2 |
4.1 性能基准
在表 3 和表 4 中,我们展示了用于 RLHF 性能实验的配置。我们使用 NVIDIA A800 GPU 和 NVLINK 进行数据传输来训练 LLaMA 2 模型。我们通过启用 Adam OffLoad 以及 Reward Model (RM)和 Reference Model (Ref) OffLoad 等技术,尽可能优化了 DSChat 的性能,以增加推理阶段的微批次大小并避免内存不足问题。我们甚至修复了 DSChat 中的一些错误,以启用 LLaMA 2 的混合引擎(HE)。
表 5 和表 6 分别展示了 OpenRLHF 和优化后的 DSChat 在 PPO 每个阶段的详细时间消耗。尽管我们没有完全优化 OpenRLHF 的 PPO 性能,例如合并 Actor 和 Reference Model 节点以及 Critic 和 Reward Model 节点以减少 GPU 资源,但实验结果表明, OpenRLHF 在表 2 中仍然表现出显著的性能优势。
OpenRLHF 相对于 DSChat 的性能优势主要来自 vLLM 和 Ray。一方面, vLLM 的生成加速明显优于混合引擎。另一方面, Ray 将模型分布在不同节点上,这看似降低了 GPU 利用率,但避免了过度的模型分割和模型权重 OffLoad,从而节省了 GPU 内存并减少了通信开销。这使得每个 GPU 的微批次大小和张量并行中的矩阵乘法大小得以增加,从而提高了整体性能。
表 5: OpenRLHF 中 PPO 每个阶段的时间消耗(秒)
| 模型大小 | GPU 数量 | 生成 | vLLM 权重同步 | 获取 Logits, Reward | 训练 | 总时间 |
|---|---|---|---|---|---|---|
| 7B | 16 | 262.96 | 4.32 | 32.7 | 171.13 | 471.11 |
| 13B | 32 | 372.14 | 10.03 | 29.58 | 197.18 | 608.93 |
| 34B | 32 | 720.50 | 35.47 | 326.00 | 444.43 | 1526.40 |
| 70B | 32 | 2252.79 | 111.65 | 323.38 | 1800.71 | 4488.53 |
表 6: 优化后的 DSChat 中 PPO 每个阶段的时间消耗(秒)
| 模型大小 | GPU 数量 | 生成 | 混合引擎权重同步 | 获取 Logits, Reward | 训练 | 总时间 |
|---|---|---|---|---|---|---|
| 7B | 16 | 590.157 | 65.573 | 73.68 | 125.68 | 855.09 |
| 13B | 32 | 1146.614 | 156.356 | 87.28 | 138.68 | 1528.93 |
| 34B | 32 | 1736.024 | 434.006 | 443.12 | 1021.83 | 3634.98 |
| 70B | 32 | 3472.68 | 1157.56 | 2013.44 | 3763.32 | 10407.00 |
4.2 训练稳定性和收敛性
我们基于 LLaMA 2 7B 模型评估了 OpenRLHF 框架的训练收敛性,其中监督微调(SFT)阶段使用了来自 OpenOrca 的 50k 数据集,而用于训练 Reward Model 的偏好数据集是来自 Anthropic HH、LMSys Arena 和 Open Assistant 的约 200k 样本的混合。PPO 训练使用了从这些先前数据集中随机采样的 80k 提示。直接策略优化(DPO)训练使用了与 Reward Model 训练相同的数据集。
表 7: AlpacaEval 结果
使用 GPT-4 进行评估。我们使用 MT Bench 和 Vicuna Bench[31]中的 160 个提示评估了 PPO 和 DPO 相对于 SFT 模型的胜率。
| 算法 | 胜率 (%) | 标准误差 | 平均长度 |
|---|---|---|---|
| PPO vs SFT | 63.52 | 3.83 | 2165 |
| DPO vs SFT | 60.06 | 3.83 | 1934 |
为了稳定 PPO 训练,我们为 Actor 模型使用了较低的学习率
得益于 PPO 的实现技巧和之前的超参数,图 5 显示了 PPO 训练曲线,其中 Reward 和回报值稳步上升, Kullback-Leibler (KL)散度和损失值保持稳定。表 7 展示了在 AlpacaEval[16]上的评估结果。胜率表明, PPO 模型和 DPO 模型优于 SFT 模型,而 PPO 模型优于 DPO 模型。这可能是因为 DPO 对分布外样本更敏感。
我们在https://huggingface.co/OpenRLHF提供了预训练的检查点。
结论
我们介绍了 OpenRLHF,这是一个开源的框架,通过使用 Ray 将模型分布在 GPU 上并利用 vLLM 优化效率,支持超过 700 亿参数的全规模 RLHF 训练。OpenRLHF 还实现了多种对齐算法。与 Hugging Face 的无缝集成提供了开箱即用的可用性。
5. 附录 A:支持的算法
OpenRLHF 目前支持以下对齐算法,更多算法正在持续开发中:
5.1 监督微调
监督微调(SFT)是一种通过特定系列的数据形式使用监督学习来引导预训练模型符合人类指令的方法。这个过程使得预训练语言模型在微调后能够接受特定的输入格式并产生所需的输出。通常,监督微调作为对齐的前置步骤。为了更好地支持 RLHF Pipeline, OpenRLHF 框架可以支持各种预训练模型的监督微调,使得在 OpenRLHF 中扩展新模型相对简单。
5.2 Reward Model 训练
通常,强化学习算法需要一个明确的 Reward 信号来指导优化。然而,在许多自然语言领域,这种明确的 Reward 信号往往缺失。[27]收集了人类偏好数据,并通过比较方法训练 Reward Model,以获得强化学习过程所需的 Reward 信号。与监督微调(SFT)的训练阶段类似,为了更好地支持 RLHF Pipeline, OpenRLHF 框架支持相应的 Reward Model 训练方法。
5.3 近端策略优化
近端策略优化(PPO)是一种广泛应用于游戏和机器人控制等领域的强化学习算法[23, 2]。在大语言模型微调领域,[19]通过将基础模型的近似 KL 散度作为 Reward 的一部分,并利用 PPO 的裁剪替代目标函数来优化模型输出,同时约束输出变化的幅度,从而提高了模型微调的稳定性。这种方法避免了对 Reward 分数的过度优化,有效增强了模型微调过程的稳定性。
5.4 直接偏好优化
为了解决 Reward Model 训练过程中的过度优化问题,并防止 Reward Model 对新生成的响应误判,直接偏好优化(DPO)将对齐公式重新设计为一个简单的损失函数[20],允许直接在偏好数据集上优化模型输出。然而, DPO 在偏好数据集上容易过拟合。身份偏好优化(IPO)在 DPO 损失的基础上引入了一个正则化项,以减少过拟合的风险[1]。[9]进一步讨论了 IPO 和 DPO 之间的差异,并引入了保守 DPO (cDPO),通过平滑样本标签实现了类似于 IPO 中引入正则化项的效果。OpenRLHF 实现了上述方法,以确保训练过程的稳定性。
5.5 Kahneman-Tversky 优化
Kahneman-Tversky 优化(KTO)是人类感知损失函数(HALOs)的一种具体实现。与 PPO 和 DPO 等方法不同, KTO 将每个响应单独标记为好或坏,并基于此定义损失函数,因此只需要一个二元信号来指示给定输入的输出是否可取。这种方法避免了收集成对偏好数据的挑战。OpenRLHF 中的实现与 KTO 的官方开源实现一致[10]。
5.6 迭代直接偏好优化
迭代直接偏好优化(Iterative DPO)[6]通过不断使用在线方法基于人类反馈优化语言模型,增强了 vanilla DPO。该过程包括三个步骤:(1)最初在指令遵循数据上微调模型,(2)通过采样提示和生成响应收集新的偏好数据,(3)使用这些新数据迭代更新模型。这种方法使模型能够适应,提高其生成高质量响应和处理多样化输入的能力。
5.7 Rejection Sampling 微调
OpenRLHF 中实现 Rejection Sampling (RS)微调的方法与[28]和 RAFT[5]中的方法类似,即从模型的输出中采样并根据现有 Reward 选择最佳候选。对于每个响应, Reward 分数最高的样本被视为新的黄金标准。与[24]类似,在选择最佳响应后, OpenRLHF 将其视为正样本并微调当前模型,从而使模型的输出能够获得更大的 Reward 值。
5.8 条件监督微调
通过引入使用条件进行模型微调的方法,我们统称为条件监督微调[12, 7]。以 SteerLM 为例[7],通过使用具有多维评分的数据集,我们细化了训练目标,并在微调后通过控制输入条件,模型输出定制效果。OpenRLHF 通过提供相应的批量推理和简单的监督微调,自然支持条件监督微调的训练需求。