RD-Agent AutoRL-Bench GSM8K 任务指南:数据、评测指标与 GRPO/PPO 强化学习训练全流程
2026/9/14 22:40:37 网站建设 项目流程

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 对象,含questionanswer两个字段:

{"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)的具体行为:

  1. target_dir / "train.jsonl"已存在,直接跳过(幂等设计,避免重复下载);
  2. 否则调用datasets.load_dataset("openai/gsm8k", "main", split="train")从 HuggingFace 拉取 train split;
  3. 逐条以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流程为:

  1. 校验模型路径存在,拒绝 LoRA adapter(若发现adapter_config.json则报错并提示合并后再提交);
  2. 根据eval_config["dataset"]生成 OpenCompass 配置脚本opencompass_config.py,写入 workspace 的benchmark_results目录;
  3. 从 components/benchmark/configs/models.yaml 读取模型推理配置(vLLM 相关参数),并处理tensor_parallel_size="auto"的自动换算(取不超过 GPU 数的最大 2 的幂);
  4. opencompass <config> --work-dir <work_dir>运行评测,单次评测超时上限 7200 秒,并设置VLLM_ENFORCE_EAGER=1VLLM_WORKER_MULTIPROC_METHOD=spawn等环境变量保证稳定性;
  5. 解析summary/*.csv:优先取metric列为accuracyscore的行计算均值作为最终score,否则取首个可解析为数字的值;若 OpenCompass 返回非数字分数(如 vLLM 加载失败、显存不足),则返回带error字段的失败结果。

3.2 评测结果的统一 Schema

core/evaluator.py 定义了所有 benchmark 共用的EvalResult结构:

字段类型说明
benchmarkstrbenchmark 名称(必填)
model_pathstr被评测的模型路径(必填)
scorefloat评测分数,0-100(必填)
accuracy_summarydict详细指标字典(必填)
eval_typestr评测类型,如"opencompass"(可选)
errorstr评测失败时的错误信息(可选)
raw_outputstr原始输出日志(可选)

对于 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.042视为相等。

4.2 奖励函数:RL 训练的目标信号

def gsm8k_reward_func(completions, answer, **kwargs): # 预测答案与标准答案数值一致 → +1.0,否则 → -1.0

GRPOTrainer 在每个训练步会对num_generations=4条采样输出打分,用该稠密二值奖励引导模型学会"先逐步推理、再把最终答案写在####之后"的输出格式。

4.3 训练配置要点

脚本使用trl.GRPOTrainerGRPOConfig,关键超参数如下:

参数默认值说明
max_steps20固定步数,避免小数据集报错
per_device_train_batch_size2小 batch 避免 OOM
gradient_accumulation_steps4梯度累积,等效扩大 batch
learning_rate1e-5训练学习率
max_completion_length256生成上限,容纳逐步推理
num_generations4GRPO 每组采样数
bf16True混合精度训练

脚本还体现了两条来自 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_KEYOPENAI_API_BASECHAT_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

命令行参数说明:

参数说明示例
--agentAgent 类型example_agentrdagentopenhands
--taskBenchmark 任务名(内置或smith-*gsm8k
--modelHuggingFace 模型 repo_id,首次自动下载Qwen/Qwen2.5-1.5B
--timeoutAgent 最大运行时长(秒)720041600(约 11.5h)
--portGrading 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_timetimeout_slast_submit_timeend_time),也可通过GET $GRADING_SERVER_URL/time查询剩余时间。推荐的任务循环为:

  1. ls查看工作区文件,阅读description.mdinstructions.md
  2. code/下编写训练脚本(SFT、GRPO、PPO 均可);
  3. 将模型保存到$OUTPUT_DIR(如output/v1);
  4. 通过POST $GRADING_SERVER_URL/submit提交评测;
  5. 根据返回分数在剩余时间内持续迭代。

/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 的实现,实践中有四个高频坑值得注意:

  1. 禁止直接提交未训练的基座模型:未经训练的模型只会拿到 baseline 分(improvement = 0),浪费一次提交额度;
  2. 必须提交完整模型:评测系统不支持单独提交 LoRA adapter 目录,PEFT 训练后需model.merge_and_unload()合并再保存 tokenizer;
  3. tokenizer 兼容性:用 trl 保存模型后,tokenizer_config.json中的extra_special_tokens可能被存成 list,而 vLLM/transformers 加载时要求 dict,需删除该字段后再提交,否则评测失败;
  4. 答案格式严格遵守:训练提示词应引导模型以#### 数字结尾,因为评测按数字精确匹配(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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询