RD-Agent AutoRL-Bench GSM8K 任务指南:数据、评测指标与 GRPO/PPO 强化学习训练全流程
【免费下载链接】RD-AgentResearch and development (R&D) is crucial for the enhancement of industrial productivity, especially in the AI era, where the core aspects of R&D are mainly focused on data and models. We are committed to automating these high-value generic R&D processes through R&D-Agent, which lets AI drive>项目地址: https://gitcode.com/GitHub_Trending/rd/RD-Agent
导读
本文以 RD-Agent 仓库中 AutoRL-Bench 的 GSM8K 任务描述 为核心骨架,结合 AutoRL-Bench README 与相关源码,完整讲解如何在 RD-Agent 的 AutoRL-Bench 框架下以 GSM8K 为基准任务,用 GRPO/PPO 等强化学习方法对小型模型(如 Qwen2.5-1.5B)进行后训练并持续提升数学推理准确率。读完本文,你将掌握 GSM8K 任务的数据格式与评测口径、从环境安装到提交评测的完整命令链路,以及答案解析、奖励函数与 OpenCompass 评测器背后的实现原理。
一、任务总览:目标、数据格式与评测指标
GSM8K(Grade School Math 8K)是一个包含约 8,000 道小学数学文字题的推理基准,在 RD-Agent 的 AutoRL-Bench 中作为静态数据集型 Benchmark使用:训练数据对 Agent 可见,评测数据由评测器自行加载,Agent 不接触测试集。
原任务描述(description.md)给出的核心定义如下:
目标:训练模型在 GSM8K 数学问题上获得更高准确率。
数据格式:每一行为一个 JSON 对象,含question与answer两个字段:
{"question": "...", "answer": "... #### 42"}评测指标:答案准确率(exact match)。
提示:
- 答案格式为
#### 数字; - 使用 GRPO/PPO 等 RL 方法训练。
在此基础上,本仓库对其中的每一环都有对应的工程实现,下文逐一展开。
二、数据管道:Agent 只见训练集,评测集由 OpenCompass 自管
2.1 训练数据的下载与落盘
benchmarks/gsm8k/data.py 负责下载训练数据,其核心约定在文件头注释中写明:
Agent 只能看到 train split;评估(OpenCompass)用 test split,由 OpenCompass 自己内部加载。
download_train_data(target_dir)的具体行为:
- 若
target_dir / "train.jsonl"已存在,直接跳过(幂等设计,避免重复下载); - 否则调用
datasets.load_dataset("openai/gsm8k", "main", split="train")从 HuggingFace 拉取 train split; - 逐条以
json.dumps(item, ensure_ascii=False)写入train.jsonl,保留原文格式,即每行一个{"question": "...", "answer": "... #### 42"}对象。
根据 AutoRL-Bench README,GSM8K 训练数据体积约 5MB,且无额外依赖(与 ALFWorld 需下载约 2GB 游戏数据、HumanEval 约 164 条样本形成对比)。首次运行某个 benchmark 时,run.py会自动调用对应data.py下载,无需手动操作。
2.2 在注册表中的位置
benchmarks/init.py 维护了全局注册表BENCHMARKS,gsm8k 的登记项为:
"gsm8k": BenchmarkConfig( id="gsm8k", evaluator_class="rdagent.scenarios.rl.autorl_bench.core.opencompass.OpenCompassEvaluator", data_module="rdagent.scenarios.rl.autorl_bench.benchmarks.gsm8k.data", description="Grade School Math 8K - 小学数学推理", eval_config={ "dataset": "opencompass.configs.datasets.gsm8k.gsm8k_gen_1d7fe4", }, ),从中可以看到三个关键点:
- 评测器:gsm8k 使用通用
OpenCompassEvaluator,评测配置指向 OpenCompass 的 GSM8K 生成式评测数据集配置opencompass.configs.datasets.gsm8k.gsm8k_gen_1d7fe4; - 数据模块:
data_module指向gsm8k/data.py,即上文的数据下载逻辑,各 benchmark 的数据逻辑独立于各自目录,新增 benchmark 无需改动注册表主体; - 注意 gsm8k 目录下没有独立的 eval.py,评测完全由通用评测器承担;而 ALFWorld、WebShop 等交互式 benchmark 则通过
expose_files=["eval.py"]把评测文件暴露给 Agent 参考。
三、评测原理:OpenCompass 通用评测器如何算 exact match
3.1 评测执行链路
get_evaluator(benchmark_id)会通过importlib动态导入evaluator_class并实例化(见 benchmarks/init.py)。对于 gsm8k,实例化的是 core/opencompass.py 中的OpenCompassEvaluator,其run_eval流程为:
- 校验模型路径存在,拒绝 LoRA adapter(若发现
adapter_config.json则报错并提示合并后再提交); - 根据
eval_config["dataset"]生成 OpenCompass 配置脚本opencompass_config.py,写入 workspace 的benchmark_results目录; - 从 components/benchmark/configs/models.yaml 读取模型推理配置(vLLM 相关参数),并处理
tensor_parallel_size="auto"的自动换算(取不超过 GPU 数的最大 2 的幂); - 以
opencompass <config> --work-dir <work_dir>运行评测,单次评测超时上限 7200 秒,并设置VLLM_ENFORCE_EAGER=1、VLLM_WORKER_MULTIPROC_METHOD=spawn等环境变量保证稳定性; - 解析
summary/*.csv:优先取metric列为accuracy或score的行计算均值作为最终score,否则取首个可解析为数字的值;若 OpenCompass 返回非数字分数(如 vLLM 加载失败、显存不足),则返回带error字段的失败结果。
3.2 评测结果的统一 Schema
core/evaluator.py 定义了所有 benchmark 共用的EvalResult结构:
| 字段 | 类型 | 说明 |
|---|---|---|
benchmark | str | benchmark 名称(必填) |
model_path | str | 被评测的模型路径(必填) |
score | float | 评测分数,0-100(必填) |
accuracy_summary | dict | 详细指标字典(必填) |
eval_type | str | 评测类型,如"opencompass"(可选) |
error | str | 评测失败时的错误信息(可选) |
raw_output | str | 原始输出日志(可选) |
对于 GSM8K,score即为精确匹配准确率(exact match)乘以 100 后的百分比分数,accuracy_summary形如{"accuracy": <score>, "num_subdatasets": 1}。
四、RL 训练实战:以 example_agent 的 GRPO 脚本为例
任务描述提示使用 GRPO/PPO 等 RL 方法训练。仓库自带的 agents/example_agent/train.py 给出了一个可直接运行的 GRPO 参考实现,其中包含了与任务描述一一对应的工程细节。
4.1 答案解析:与#### 数字格式对齐
描述要求模型输出形如#### 42的答案。参考脚本中的extract_answer分两级提取:
match = re.search(r"####\s*([-+]?\d[\d,]*\.?\d*)", text) # 优先找 #### 后的数字 # 找不到再回退:取文本中最后一个数字 numbers = re.findall(r"[-+]?\d[\d,]*\.?\d*", text)即先严格匹配#### 数字,失败则回退取最后一个数字。这与描述中的"答案格式:#### 数字"提示一致,也说明评测本质上是数字级精确匹配(abs(pred - gold) < 1e-6),而非逐字符比对,允许42.0与42视为相等。
4.2 奖励函数:RL 训练的目标信号
def gsm8k_reward_func(completions, answer, **kwargs): # 预测答案与标准答案数值一致 → +1.0,否则 → -1.0GRPOTrainer 在每个训练步会对num_generations=4条采样输出打分,用该稠密二值奖励引导模型学会"先逐步推理、再把最终答案写在####之后"的输出格式。
4.3 训练配置要点
脚本使用trl.GRPOTrainer与GRPOConfig,关键超参数如下:
| 参数 | 默认值 | 说明 |
|---|---|---|
max_steps | 20 | 固定步数,避免小数据集报错 |
per_device_train_batch_size | 2 | 小 batch 避免 OOM |
gradient_accumulation_steps | 4 | 梯度累积,等效扩大 batch |
learning_rate | 1e-5 | 训练学习率 |
max_completion_length | 256 | 生成上限,容纳逐步推理 |
num_generations | 4 | GRPO 每组采样数 |
bf16 | True | 混合精度训练 |
脚本还体现了两条来自 core/instructions.md 的硬性约束:
- 提交完整模型而非 LoRA adapter:评测器会拒绝带
adapter_config.json的目录,因此 LoRA 训练后必须model.merge_and_unload()再save_pretrained; - 每 epoch 保存 checkpoint 后立即
/submit:在时间预算内多次提交、根据分数迭代,这是 AutoRL-Bench 的核心玩法——最终取本次实验内所有提交的最高分。
五、从运行到查看结果:GSM8K 的完整命令链
5.1 环境安装
git clone git@github.com:microsoft/RD-Agent.git ~/RD-Agent cd ~/RD-Agent conda create -n autorl python=3.10 -y conda activate autorl pip install -e . # 全局依赖(trl, vllm, torch, opencompass 等) pip install -r rdagent/scenarios/rl/autorl_bench/requirements.txt # GSM8K:无额外依赖随后配置.env(复制.env.example或手动创建),OpenHands Agent 需要OPENAI_API_KEY、OPENAI_API_BASE、CHAT_MODEL等项。
5.2 运行 GSM8K 任务
# Example Agent(简单 GRPO 训练,验证流程) python -m rdagent.scenarios.rl.autorl_bench.run \ --agent example_agent --task gsm8k --model Qwen/Qwen2.5-1.5B --timeout 7200 # OpenHands Agent + GSM8K python -m rdagent.scenarios.rl.autorl_bench.run \ --agent openhands --task gsm8k --model Qwen/Qwen2.5-1.5B --timeout 41600命令行参数说明:
| 参数 | 说明 | 示例 |
|---|---|---|
--agent | Agent 类型 | example_agent、rdagent、openhands |
--task | Benchmark 任务名(内置或smith-*) | gsm8k |
--model | HuggingFace 模型 repo_id,首次自动下载 | Qwen/Qwen2.5-1.5B |
--timeout | Agent 最大运行时长(秒) | 7200或41600(约 11.5h) |
--port | Grading Server 端口(默认 5000) | 5000 |
5.3 查看结果
# 实时查看运行日志 tail -f workspace/gsm8k/<run_id>/agent.log # 查看评分记录 cat workspace/gsm8k/<run_id>/scores.json # 查看全局实验汇总 cat rdagent/scenarios/rl/autorl_bench/results.csv # Web UI(Streamlit 面板) streamlit run rdagent/scenarios/rl/autorl_bench/core/ui.py --server.port 8511六、工作区结构、时间预算与评测服务
6.1 隔离工作区与软链接
每次run.py调用产生独立工作区,gsm8k 的典型布局为:
workspace/gsm8k/ ├── <run_id>_<agent>/ # 一次独立实验 │ ├── code/ # Agent 代码区 │ ├── output/ # 模型输出(可保留 output/v1、output/v2 多版本) │ ├── models/Qwen/Qwen2.5-1.5B → rl_files/models/...(只读软链接) │ ├── data → rl_files/datasets/gsm8k/(只读软链接) │ ├── description.md → benchmarks/gsm8k/description.md │ ├── instructions.md → core/instructions.md │ ├── run_meta.json # 时间预算信号(唯一时间来源) │ ├── scores.json # 本次实验所有提交的评分 │ └── grading_server.log模型与数据统一缓存在git_ignore_folder/rl_files/(可用环境变量AUTORL_FILE_PATH覆盖,见 conf.py),其中datasets/gsm8k/train.jsonl即上文下载的训练数据,baseline_workspace/缓存各模型的 baseline 分数。
6.2 时间预算与迭代循环
core/instructions.md 约定默认时间预算为 12 小时(43200 秒),唯一时间来源是run_meta.json(字段:start_time、timeout_s、last_submit_time、end_time),也可通过GET $GRADING_SERVER_URL/time查询剩余时间。推荐的任务循环为:
- 先
ls查看工作区文件,阅读description.md与instructions.md; - 在
code/下编写训练脚本(SFT、GRPO、PPO 均可); - 将模型保存到
$OUTPUT_DIR(如output/v1); - 通过
POST $GRADING_SERVER_URL/submit提交评测; - 根据返回分数在剩余时间内持续迭代。
/submit响应示例:
{ "submission_id": 3, "score": 65.0, "baseline_score": 45.0, "improvement": 20.0, "best": {"submission_id": 2, "score": 68.0}, "total_submissions": 3 }6.3 Baseline 与增益衡量
AutoRL-Bench 的核心问题是:大模型(如 GPT-5.2)通过 Workflow 对小模型进行 RL 训练后,分数能否超过 baseline。run.py在启动 Agent 前会用原始模型评测一次 baseline(有缓存),随后 Agent 的所有提交都以improvement(当前分 - baseline)衡量增益,最终取本次实验内最高分写入results.csv供论文实验汇总。
七、为你的 GSM8K 实验做对的关键点
结合 core/instructions.md 与 OpenCompassEvaluator 的实现,实践中有四个高频坑值得注意:
- 禁止直接提交未训练的基座模型:未经训练的模型只会拿到 baseline 分(
improvement = 0),浪费一次提交额度; - 必须提交完整模型:评测系统不支持单独提交 LoRA adapter 目录,PEFT 训练后需
model.merge_and_unload()合并再保存 tokenizer; - tokenizer 兼容性:用 trl 保存模型后,
tokenizer_config.json中的extra_special_tokens可能被存成 list,而 vLLM/transformers 加载时要求 dict,需删除该字段后再提交,否则评测失败; - 答案格式严格遵守:训练提示词应引导模型以
#### 数字结尾,因为评测按数字精确匹配(exact match)计算准确率,extract_answer会优先提取####后的数字。
八、小结与延伸
GSM8K 在 AutoRL-Bench 中扮演了"静态数据集 + OpenCompass 评测"的标准范式:训练数据由 data.py 下载并软链接进工作区,评测由 OpenCompassEvaluator 以 exact match 准确率统一打分,Agent 则基于 description.md 与 instructions.md 在时间预算内用 GRPO/PPO 等 RL 方法迭代训练。如果你希望新增类似基准任务,可以参照 benchmarks/init.py 中的注册方式与 README 的扩展指南 实现自己的data.py+description.md,并通过discover_smith_benchmarks()自动发现 rl-smith 基准,将其纳入同一套训练-评测闭环。
【免费下载链接】RD-AgentResearch and development (R&D) is crucial for the enhancement of industrial productivity, especially in the AI era, where the core aspects of R&D are mainly focused on data and models. We are committed to automating these high-value generic R&D processes through R&D-Agent, which lets AI drive>项目地址: https://gitcode.com/GitHub_Trending/rd/RD-Agent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考