RewardBench: 奖励模型评估
排行榜 📐 | RewardBench 数据集 | 现有测试集 | 结果 📊 | 论文📝
RewardBench 是一个用于评估奖励模型(包括那些通过直接偏好优化(DPO)训练的模型)能力和安全性的基准。此仓库包括以下内容:
- 用于多种奖励模型(如 Starling、PairRM、OpenAssistant、DPO 等)的通用推理代码。
- 用于公平奖励模型推理的通用数据集格式和测试。
- 分析和可视化工具。
生成结果的两个主要脚本(更多在 scripts/
目录中):
scripts/run_rm.py
:运行奖励模型的评估。scripts/run_dpo.py
:运行直接偏好优化(DPO)模型(以及其他使用隐式奖励的模型,如 KTO)的评估。scripts/train_rm.py
:一个基于 TRL 的基本 RM 训练脚本。
快速使用
RewardBench 让您可以快速评估任何奖励模型在任何偏好集上的表现。要快速安装,请使用 pip 安装:
pip install rewardbench
然后,运行以下命令:
rewardbench --model={yourmodel} --dataset={yourdataset} --batch_size=8
对于 DPO 模型,传递 --ref_model={} 参数,脚本将自动处理路径。 自动使用 Tokenizers 聊天模板,但也可以使用 fastchat 对话模板。
要运行核心 Reward Bench 评估集,请运行:
rewardbench --model={yourmodel}
示例:
- 正常操作
rewardbench --model=OpenAssistant/reward-model-deberta-v3-large-v2 --dataset=allenai/ultrafeedback_binarized_cleaned --split=test_gen --chat_template=raw
- 来自本地数据集的 DPO 模型(请注意
--load_json
参数)
rewardbench --model=Qwen/Qwen1.5-0.5B-Chat --ref_model=Qwen/Qwen1.5-0.5B --dataset=/net/nfs.cirrascale/allennlp/jacobm/herm/data/berkeley-nectar-binarized-preferences-random-rejected.jsonl --load_json
实验性: 通过运行以下命令,可以使用 pip 安装运行生成性 RM:
pip install rewardbench[generative]
然后:
rewardbench-gen --model={}
更多信息,请参见 scripts/run_generative.py
。本地模型的额外要求是 VLLM 和为 API 模型设置的必需 API(支持 OpenAI、Anthropic 和 Together)。
完整安装
要从源代码安装,请在您的系统上安装 torch
,然后安装以下依赖项。
pip install -e .
将以下内容添加到您的 .bashrc
文件中:
export HF_TOKEN="{your_token}"
提交您的模型
目前,为了将您的模型提交到排行榜,请在 HuggingFace 上打开一个包含模型名称的问题(您仍然可以使用 RewardBench 评估本地模型,请参见下文)。
如果需要自定义代码,请打开一个 PR 以在我们的推理堆栈中启用它(有关更多信息,请参阅 rewardbench/models
)。
评估模型
有关参考配置,请参阅 scripts/configs/eval_configs.yaml
。
有关聊天模板的参考,请参阅许多模型遵循的基本/sft模型术语此处。
用于调试的小型模型可在 natolambert/gpt2-dummy-rm
中找到。
核心脚本会自动评估我们核心的评估集。要在现有偏好集上运行这些评估,请添加参数 --pref_sets
。
运行奖励模型
要使用 scripts/run_rm.py
运行单个模型,请使用以下任何示例:
python scripts/run_rm.py --model=openbmb/UltraRM-13b --chat_template=openbmb --batch_size=8
python scripts/run_rm.py --model=OpenAssistant/oasst-rm-2.1-pythia-1.4b-epoch-2.5 --chat_template=oasst_pythia
python scripts/run_rm.py --model=PKU-Alignment/beaver-7b-v1.0-cost --chat_template=pku-align --batch_size=16
python scripts/run_rm.py --model=IDEA-CCNL/Ziya-LLaMA-7B-Reward --batch_size=32 --trust_remote_code --chat_template=Ziya
要使用 AI2 基础设施运行这些模型,请运行:
python scripts/submit_eval_jobs.py
例如,在非默认图像上运行 N 最佳排序时:
python scripts/submit_eval_jobs.py --eval_on_bon --image=nathanl/herm_bon
注意:对于 AI2 用户,您必须设置 beaker secret write HF_TOKEN <your_write_token_here>
使脚本正常工作。
使用默认抽象 AutoModelForSequenceClassification.from_pretrained
的模型也可以在本地加载。扩展这项功能尚在计划中。例如:
python scripts/run_rm.py --model=/net/nfs.cirrascale/allennlp/hamishi/EasyLM/rm_13b_3ep --chat_template=tulu --batch_size=8
运行 DPO 模型
对于 DPO 模型:
python scripts/run_dpo.py --model=stabilityai/stablelm-zephyr-3b --ref_model=stabilityai/stablelm-3b-4e1t --batch_size=8
python scripts/run_dpo.py --model=stabilityai/stablelm-2-zephyr-1_6b --ref_model=stabilityai/stablelm-2-1_6b --batch_size=16
集成 RMs
对于已经在 RewardBench 中的奖励模型,您可以运行离线集成测试,以近似在系统中使用多个奖励模型。要尝试此操作,您可以运行:
python analysis/run_ensemble_offline.py --models sfairXC/FsfairX-LLaMA3-RM-v0.1 openbmb/Eurus-RM-7b Nexusflow/Starling-RM-34B
运行生成性 RMs(LLM-评审官)
支持本地和 API 模型。例如,运行 OpenAI 的模型,如:
python scripts/run_generative.py --model=gpt-3.5-turbo-0125
本地模型从 HuggingFace 加载,尽管有些也可以通过 Together 的 API 获得。本地运行 Llama 3 如下:
python scripts/run_generative.py --model=meta-llama/Llama-3-70b-chat-hf --force_local
或者,通过 Together 的 API 运行:
python scripts/run_generative.py --model=meta-llama/Llama-3-70b-chat-hf
我们正在增加对生成性集成的支持(目前仅通过 API),运行如下:
python scripts/run_generative.py --model gpt-3.5-turbo-0125 claude-3-sonnet-20240229 meta-llama/Llama-3-70b-chat-hf
注意:这些模型数必须为大于 1 的奇数。
创建排名优化(BoN)排名
要在整个数据集中创建排名,请运行(best_of 8 是占位符,best_of 16 应该可以,因为评估逻辑将处理较低的 best of N 数字):
python scripts/run_bon.py --model=OpenAssistant/oasst-rm-2.1-pythia-1.4b-epoch-2.5 --chat_template=oasst_pythia --best_of=8 --debug
获取排行榜部分得分
重要:我们使用加权提示得分来计算 Chat、Chat Hard、安全性和推理部分的得分(数学等同于代码),以避免对小子集(例如 MT Bench 部分)给予过多信用。使用以下代码计算每个类别的得分,假设已安装 RewardBench
:
from rewardbench.constants import EXAMPLE_COUNTS, SUBSET_MAPPING
from rewardbench.utils import calculate_scores_per_section
metrics = {
"alpacaeval-easy": 0.5,
"alpacaeval-hard": 0.7052631578947368,
"alpacaeval-length": 0.5894736842105263,
"chat_template": "tokenizer",
"donotanswer": 0.8235294117647058,
"hep-cpp": 0.6280487804878049,
"hep-go": 0.6341463414634146,
"hep-java": 0.7073170731707317,
"hep-js": 0.6646341463414634,
"hep-python": 0.5487804878048781,
"hep-rust": 0.6463414634146342,
"llmbar-adver-GPTInst": 0.391304347826087,
"llmbar-adver-GPTOut": 0.46808510638297873,
"llmbar-adver-manual": 0.3695652173913043,
"llmbar-adver-neighbor": 0.43283582089552236,
"llmbar-natural": 0.52,
"math-prm": 0.2953020134228188,
"model": "PKU-Alignment/beaver-7b-v1.0-cost",
"model_type": "Seq. Classifier",
"mt-bench-easy": 0.5714285714285714,
"mt-bench-hard": 0.5405405405405406,
"mt-bench-med": 0.725,
"refusals-dangerous": 0.97,
"refusals-offensive": 1,
"xstest-should-refuse": 1,
"xstest-should-respond": 0.284
}
# Calculate and print the scores per section
scores_per_section = calculate_scores_per_section(EXAMPLE_COUNTS, SUBSET_MAPPING, metrics)
print(scores_per_section)
仓库结构
├── README.md <- 使用此项目进行研究的研究人员的顶级 README
├── analysis/ <- 分析 RewardBench 结果或其他奖励模型属性的工具目录
├── rewardbench/ <- 核心工具和建模文件
| ├── models/ ├── 运行现有奖励模型的独立文件
| └── *.py └── RewardBench 工具和实用程序
├── scripts/ <- 训练和评估奖励模型的脚本和配置
├── tests <- 单元测试
├── Dockerfile <- AI2 可重复和可扩展研究的构建文件
├── LICENSE
├── Makefile <- 包含命令的 Makefile(如 `make style`)
└── setup.py <- 使项目可通过 pip 安装(pip install -e .)以便可以导入 `alignment`
维护
本节为 AI2 使用设计,但可能有助于其他使用 Docker 评估模型的人。
更新 Docker 映像
更新此仓库时,应重新构建 Docker 映像以包含这些更改。
对于 AI2 成员,请使用您经常使用的任何映像列表进行更新。
例如,如果您更新 scripts/run_rm.py
并包含一个新包(或更改包版本),则应该重新构建映像并验证它在已知模型上是否仍然可用。
要更新映像,在此存储库的根目录中运行这些命令:
docker build -t <local_image_name> . --platform linux/amd64
beaker image create <local_image_name> -n <beaker_image_name>
说明:在 beaker 中的映像名称中不要使用字符 -,
在更新 Dockerfile
时,请务必查看顶部的说明以更新 CUDA 基础版本。
开发中,我们有以下 Docker 映像(最新的在前,因为这可能是您需要的)。 TODO:将其更新以便一个映像具有 VLLM(仅用于生成 RM),另一个不具有。没有的加载会更快。
nathanl/rb_v23
, 2024 年 7 月:从命令行包括对 bfloat16 模型的支持nathanl/rb_v22
, 2024 年 7 月:包含新的可推广奖励模型nathanl/rb_v20
: 修复 DPO 处理(次要)+ llama 3 没有量化用于 dponathanl/rb_v18
: 改进 RewardBench CLInathanl/rb_v17
(带 VLLM):增加对 vllm + llm 作为裁判的支持,rb_v16
类似但没有 prometheus 和一些 OpenAI 模型nathanl/rb_v12
: 增加对 llama3 的支持nathanl/rewardbench_v10
: 通过 jinja2 增加对mightbe/Better-PairRM
的支持nathanl/rewardbench_v8
: 增加对openbmb/Eurus-RM-7b
和 starcoder2 的支持nathanl/rewardbench_v5
: 改善使用 DPO 脚本的保存nathanl/rewardbench_v4
: 修复 FastChat 模型上的 EOS 令牌错误(GH #90)nathanl/rewardbench_v2
: 修复海狸成本模型nathanl/rewardbench_v1
: 版本发布
引用
请使用以下来引用我们的作品:
@misc{lambert2024rewardbench,
title={RewardBench: Evaluating Reward Models for Language Modeling},
author={Nathan Lambert and Valentina Pyatkin and Jacob Morrison and LJ Miranda and Bill Yuchen Lin and Khyathi Chandu and Nouha Dziri and Sachin Kumar and Tom Zick and Yejin Choi and Noah A. Smith and Hannaneh Hajishirzi},
year={2024},
eprint={2403.13787},
archivePrefix={arXiv},
primaryClass={cs.LG}
}