UniRL 文档
指南

Rewards

Reward service、本地与远程 backend,以及扩展点。

unirl.reward 负责构建和运行 reward backend。Rollout engine 生成 media,reward backend 对其打分并返回 per-sample reward,随后 trainer 把它转成 advantage。

结构

一个 reward 恰好是一个 backend,由 RewardServiceunirl/reward/service.py)持有,并通过 score_and_attach 给一个 RolloutTrack 打分:

  • 本地进程内 scorer(unirl/reward/local/:PickScore、HPS、OCR、GenEval2、VideoPickScore 等),或
  • 远程 HTTP 客户端(RemoteRewardBackend),对接 unirl-reward-service/ 独立 server。

当前 YAML 形态、component contract 和 scorer 扩展流程以生成的 Reward Package README 为准。

配置形态

reward 通过 Hydra _target_ 接线:

reward:
  _target_: unirl.reward.service.RewardService
  backend:
    _target_: unirl.reward.local.pickscore.PickScoreRewardScorer
    base_device: cuda
    config:
      _target_: unirl.reward.local.pickscore.PickScoreSpec
      batch_size: 8

进程外 scoring 时,把 backend._target_ 指向 unirl.reward.remote.RemoteRewardBackend,配 RemoteRewardSpecbase_urlrequired_rewardsreward_weightsinput_kind)。远程 service 从 unirl-reward-service/ 在独立 GPU 节点上运行。

失败语义

reward 失败是 loud 而非 silent:non-finite 或 null reward 会被标记为 sample failure,RewardService.score_and_attach 在任何失败时抛错(指明出错的 reward 和 sample),让推理错误直接停住这一步,而不是污染 GRPO group。

新增 Local Scorer

unirl/reward/local/ 旁实现 spec 和 scorer。进程内模型 scorer 推荐从 LocalRewardBackend 开始,因为它提供 device 解析、eager load、offload()onload()。用普通 @dataclass 定义 spec,在 recipe 的 reward.backend.config 下用 _target_ 引用它(无需注册步骤)。完整模板和远程 wire contract 见生成的 Reward Package README

目录