奖励模型

默认情况下,奖励模型是指具有分类头数值输出的模型,通常称为输出奖励模型(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

注意:

  1. 在 GRPOTrainer 中,reward_model 会依次append到 reward_funcs 中。因此,reward_weights 的顺序对应 [reward_funcs, reward_model]。

  2. reward_model_plugin 默认为 default,即使用 ORM 处理逻辑。

  3. 对于参数量较大的模型,PTEngine生成速度可能较慢,可以在外部部署模型,并在 reward_funcs 中进行调用

对于 BERT 这类无法通过 reward_model 加载的模型,我们可以内置在 reward_function 中进行加载,参考issue