奖励模型
默认情况下,奖励模型是指具有分类头数值输出的模型,通常称为输出奖励模型(ORM)。这些模型会对其他模型的输出进行评分,从而生成一个标量值,表示模型响应的质量。
我们可以通过使用参数 reward_models 来加载具有分类头的奖励模型,或者加载经过奖励建模训练的奖励模型,进而使用模型的logits作为奖励。
自定义奖励模型
目前,我们可以利用reward_model_plugin灵活地自定义奖励模型的处理逻辑。这使得实现诸如生成式奖励模型等技术成为可能,包括:
自定义模型的系统提示:定义特定的指令和上下文以指导评估过程。
处理模型交互历史:管理对话上下文,以提供有意义且具有上下文感知的评估。
定义自定义评估标准:设置独特的标准和度量,用于评估模型的响应,超越默认的准确性和相关性衡量标准。
通过reward_model_plugin,开发者可以针对其应用的特定需求定制奖励评估过程。这种灵活性允许更细致和有效的基于奖励的训练策略。
奖励模型通过plugin的__call__方法进行调用,该方法接受 inputs 作为参数,包含了模型输入输出的 messages 和数据集中的其他列
def __call__(self, inputs):
print(inputs)
"""
[
{
'messages': [
{'role': 'system', 'content': 'system prompt'},
{'role': 'query', 'content': 'query'},
{'role': 'user', 'content': 'completions1'},
],
'solution': "abc",
},
{
'messages': [
{'role': 'system', 'content': 'system prompt'},
{'role': 'query', 'content': 'query'},
{'role': 'user', 'content': 'completions2'},
],
'solution': "abc",
}
]
对于生成式奖励模型,推荐使用 PTEngine 进行模型推理, 构造模型的输入的 messages 后使用infer接口进行推理
class RMlugin(DefaultRMPlugin):
def __init__(self, model, template):
super().__init__(model, template)
# initilize PTEngine to infer
self.engine = PtEngine.from_model_template(self.model, self.template, max_batch_size=0)
...
messages = [{'role': 'system', 'content': 'system prompt'}, {'role': 'query', 'content': 'query'}]
result = self.engine.infer([messages], self.request_config, use_tqdm=False)
print(result.message.content)
我们在 rm_plugin.py 中提供了一个简单的生成式奖励模型示例(GenRMPlugin)。
在 plugin.py 中自定义奖励模型插件,并使用 external_plugins 参数进行注册。
以下是一个训练脚本示例,用于使用两个奖励模型,包括一个 ORM 和一个 Gen-RM(此处使用 qwen2.5-3B-Instruct)进行 GRPO 训练:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
NPROC_PER_NODE=8 \
swift rlhf \
--rlhf_type grpo \
--model Qwen/Qwen2.5-7B \
--dataset AI-MO/NuminaMath-TIR#5000 \
--external_plugins examples/train/grpo/plugin/plugin.py \
--reward_funcs format \
--reward_model Qwen/Qwen2.5-3B-Instruct Shanghai_AI_Laboratory/internlm2-7b-reward \
--reward_model_plugin genrm my_rmplugin \
--reward_weights 0.1 1 1 \
--vllm_gpu_memory_utilization 0.5 \
--sleep_level 1 \
--offload_model true \
--offload_optimizer true \
--log_completions true \
--deepspeed zero2
注意:
在 GRPOTrainer 中,reward_model 会依次append到 reward_funcs 中。因此,reward_weights 的顺序对应 [reward_funcs, reward_model]。
reward_model_plugin 默认为 default,即使用 ORM 处理逻辑。
对于参数量较大的模型,PTEngine生成速度可能较慢,可以在外部部署模型,并在 reward_funcs 中进行调用
对于 BERT 这类无法通过 reward_model 加载的模型,我们可以内置在 reward_function 中进行加载,参考issue