Rewards
Reward service、本地与远程 backend,以及扩展点。
unirl.reward 负责构建和运行 reward backend。Rollout engine 生成 media,reward backend 对其打分并返回 per-sample reward,随后 trainer 把它转成 advantage。
结构
一个 reward 恰好是一个 backend,由 RewardService(unirl/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,配 RemoteRewardSpec(base_url、required_rewards、reward_weights、input_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。