Flora-Rewarder 三大奖励信号全解析:Terminal、Dense、Rubric 一篇讲透
Flora-Rewarder 三大奖励信号全解析:Terminal、Dense、Rubric 一篇讲透
Flora-Rewarder 是 NVIDIA 开源的机器人视频奖励模型(reward model),基于 Qwen3.5-27B 后训练而来。它看机器人或人类第一视角的操作视频,输出三种奖励信号:整局成败的 Terminal 分数、每 0.5 秒一个的 Dense 动作质量分、以及按自定义评分标准逐项打分的 Rubric 分数。一套权重、三种 prompt,就能覆盖数据标注、数据筛选和强化学习后训练全流程。👇
一、Flora-Rewarder 是什么?一分钟搞懂
Flora 是 NVIDIA 用来训练 GR00T-2 具身智能体时使用的数据引擎,现已开源,帮助研究者给自己的机器人数据集"自动打分"。它的核心思路非常直接:
- 输入:一个或多个摄像头视角的同步视频 + 一句任务指令(例如 "Put the cup on the tray.")
- 处理:视觉编码器抽取视频帧,与文本 prompt 拼接后送入语言模型解码器
- 输出:结构化文本,自动解析成三种奖励之一
三种奖励的定位:
| 信号 | 回答的问题 | 分数范围 | 典型用途 |
|---|---|---|---|
| Terminal | 这一整局成功了吗? | 1(完全失败)~ 5(完全成功) | 部署监控、数据筛选 |
| Dense | 每一小步动作质量如何? | 1(失败)/ 2(次优)/ 3(正常),每 0.5 秒一个 | 强化学习过程奖励、离线标注 |
| Rubric | 每个关键步骤做到什么程度? | 用户自定义,各步骤满分之和为 1 | 精细标注、步骤级评估 |
更多背景见 README.md,模型权重与架构配置见 config.json。
二、快速上手:环境准备与运行步骤
整个仓库里可执行的推理代码都集中在 batch_utils/ 目录,官方文档就是 batch_utils/README.md。
1️⃣ 安装依赖
pip install -r batch_utils/requirements.txt
依赖清单(vllm、transformers、qwen-vl-utils 等)在 batch_utils/requirements.txt 中。
2️⃣ 硬件与框架要求
- 已验证环境:Python 3.12 + NVIDIA H100 80 GB GPU
- Terminal / Dense 奖励:单卡即可
- Rubric 奖励:默认需要 2 张卡(
--tensor-parallel-size 2) - 首次运行会编译 GPU kernel,可能耗时几分钟
3️⃣ 准备输入任务文件
每个 episode 是 JSONL 文件里的一行,视频路径相对于该文件。示例见 batch_utils/examples/jobs.jsonl:
{"id": "ep001", "task": "Put the cup on the tray.", "videos": ["left_wrist.mp4", "top.mp4", "right_wrist.mp4"]}
⚠️ 两个容易踩的坑:
- 同一 episode 的多个摄像头视频必须同步:帧率、帧数一致、同时开始
- 摄像头顺序要符合训练时的拼贴规则:2 视角按"左、右";3 视角按"左、中、右";4 视角按"顶、前/底、左、右"排列
4️⃣ 先 dry-run 试跑
所有脚本都支持 --dry-run:读取视频、打印第一条 prompt,但不加载模型,适合先验证数据格式。
三、Terminal 奖励:整局 1~5 分,一眼看懂成败
Terminal 奖励(终端奖励)回答"这一局到底成没成",是三者中最简单的。
运行命令(单条 episode 直接命令行传入):
python -m batch_utils.terminal_reward --video left_wrist.mp4 top.mp4 right_wrist.mp4 \
--task "Put the cup on the tray." --output terminal.jsonl
批量则用 --jobs batch_utils/examples/jobs.jsonl。
关键机制(实现见 batch_utils/terminal_reward.py):
- 从整段 episode 均匀采样最多 64 帧(约 10 FPS),多视角拼成单帧拼图(collage)
- 贪心解码 + 正则约束输出格式,保证分数一定可解析
- 可选
--with-rationale,在分数前多生成一行理由
输出字段怎么读:
| 字段 | 含义 |
|---|---|
score |
生成的 1~5 整数分数 |
probabilities |
分数 token 处 P(1..5) 的分布 |
expected_score |
按分布计算的期望分 |
progress |
(期望分 − 1) / 4,归一到 [0, 1],用于排序,不是校准后的成功概率 |
四、Dense 奖励:每 0.5 秒一个分,过程质量尽在掌握
Dense 奖励(密集奖励)把整段视频切成滑动窗口逐段打分,是强化学习中最常用的过程奖励(process reward)。
运行命令:
python -m batch_utils.dense_reward --jobs batch_utils/examples/jobs.jsonl --output dense.jsonl
打分窗口怎么切(逻辑在 batch_utils/core.py 的 dense_windows):
- 每 16 秒一个窗口(64 帧、4 FPS),窗口起点每隔 10 秒滚动,最后一个窗口恰好结束于 episode 末尾
- 每个窗口里,模型对 32 个 0.5 秒帧对逐一打分:1 = 失败,2 = 次优,3 = 正常
- 各窗口通过"丢弃非末窗最后 4 秒 + 就近赋分"拼接成完整时间线
输出字段(见 batch_utils/dense_reward.py 的 summarize):
segments:每段的起止时间、分数、非正常区间的文字理由per_second:每秒中间时刻的分数,画曲线很直观fraction:各分数(1/2/3)占时长的比例worst_score/mean_score/invalid_clips:最差分、平均分、无法解析的窗口数--frame-scores可追加逐帧分数
📌 注意:Dense 打分是**回顾式(retrospective)**的——每个窗口也能看到待打分时刻之后的画面,因此官方明确建议只用于离线标注和数据筛选,不要当作在线信号使用。
五、Rubric 奖励:自定义评分标准,步骤级精细打分
Rubric 奖励(评分标准奖励)最灵活:你自己定义"任务由哪几步组成、每步怎么给分",模型按步骤逐项打分并给出推理过程。
运行命令:
python -m batch_utils.rubric_reward --jobs batch_utils/examples/rubric_jobs.jsonl --output rubric.jsonl
任务文件多了三样东西(完整示例见 batch_utils/examples/rubric_jobs.jsonl):
robot:机器人描述(如 "bimanual robot")cameras:按视频顺序描述每个摄像头rubric:步骤列表,每步列出可选档位和对应分值,各步骤满分之和应为 1
{"action": "Grasp the cup", "grading": [
{"label": "Not attempted", "points": 0.0},
{"label": "Grasped after re-tries", "points": 0.1},
{"label": "Clean grasp", "points": 0.2}]}
关键机制(实现见 batch_utils/rubric_reward.py):
- 每个摄像头作为独立视频送入,按 2 FPS 采样(每路最多 166 帧)
- 模型先输出思考链(thinking trace),再在
ANSWER: [...]中给出分数 - 默认
--num-samples 9:采样 9 个答案,报告中位样本(medoid)——即与其他样本 L1 距离之和最小的那个,显著降低单次采样的噪声;--num-samples 1可退化为单次 --keep-thinking把完整推理轨迹写入输出(轨迹常达数千 token)- 需要 2 卡张量并行,是三者中推理成本最高的
六、三大信号对比:一张表选型
| 维度 | Terminal | Dense | Rubric |
|---|---|---|---|
| 时间粒度 | 整局 | 每 0.5 秒 | 用户定义步骤 |
| 分数 | 1~5 整数 | 1~3 整数 + 理由 | 自定义 0~1 连续分 |
| 视频输入 | 全局拼图,≤64 帧 | 16 秒重叠窗口,4 FPS | 每摄像头独立视频,2 FPS |
| 解码方式 | 贪心 + 格式约束 | 贪心 + 格式约束 | 温度 1 采样 ×9,取 medoid |
| 资源 | 单卡 | 单卡 | 双卡 |
| 典型场景 | 部署监控、数据筛选 | RL 后训练、离线标注 | 步骤级精细评估 |
怎么选? 只需知道"成功/失败"用 Terminal;要给策略训练信号选 Dense;要细究"抓杯、搬杯、放杯"各做到什么程度就上 Rubric。
七、实用技巧与注意事项
- 视频保持原始帧率:脚本按原生帧率读取视频,且模型会收到 episode 的绝对时间,不要自行重采样
- 用
--dry-run校验数据:零成本确认拼贴尺寸、采样帧数和 prompt 是否符合预期 - 权重位置:脚本默认加载 batch_utils/ 旁边的权重文件;想加载其他位置的权重,传
--model参数或设置环境变量FLORA_REWARDER_REPO - 上线前先验证映射:官方提醒,把奖励映射拿到你自己机器人的留出集上验证后再用于训练或数据筛选
- 用途边界:该模型仅限非商业研究用途,输出是"标注"而非安全信号,不能作为物理系统的唯一安全监控(见 README.md 的 License 与 Intended Use 部分)
八、目录结构速查
| 文件/目录 | 说明 |
|---|---|
| batch_utils/terminal_reward.py | Terminal 奖励推理脚本 |
| batch_utils/dense_reward.py | Dense 奖励推理脚本 |
| batch_utils/rubric_reward.py | Rubric 奖励推理脚本 |
| batch_utils/core.py | 视频读取、prompt 构造与分数解析核心 |
| batch_utils/engine.py | vLLM 加载、任务文件读写等通用引擎 |
| batch_utils/examples/ | Terminal/Dense 与 Rubric 示例任务文件 |
| README.md | 模型卡:架构、输入输出、基准成绩 |
| PROVENANCE.json | 模型来源与版本溯源信息 |
掌握 Terminal、Dense、Rubric 三种奖励信号,你就拥有了 Flora-Rewarder 的完整使用地图:从一行命令跑通第一个打分,到把过程奖励接入强化学习管线,都在这篇指南里了。🚀