配套代码合集(GRPO / OPD / ReTool / Search-R1)

1553 字
8 分钟
配套代码合集(GRPO / OPD / ReTool / Search-R1)

GRPO 配套代码#

代码来源: 本目录代码引用并整理自本章作者维护的 agentic-rl-lab 中的 01-grpo 实现,当前版本适配 Happy-LLM 第八章与 PyTRIO 0.2.6。

本目录对应正文 8.1 节,以 GSM8K 为例实现完整的 PyTRIO GRPO 训练链路。同步版与异步版使用相同的 prompt、规则奖励、组内相对优势、Datum 对齐和 loss。

文件说明#

文件作用正文定位
01-demo-sync.py按 prompt 顺序完成 rollout 和训练逐段讲解
02-demo-async.py使用 asyncio.gather() 并发执行 batch 内 rollout提供完整代码,只说明接口差异

运行前准备#

从 Happy-LLM 仓库根目录创建 Python 3.13 环境并安装第八章公共依赖:

Terminal window
uv venv --python 3.13
source .venv/bin/activate
uv pip install -r docs/chapter8/requirements.txt
trio login

需要在线记录实验时,再执行 swanlab login

运行同步版#

Terminal window
python docs/chapter8/grpo/01-demo-sync.py \
--steps 1 \
--batch-size 1 \
--group-size 4 \
--max-tokens 512 \
--loss-fn importance_sampling \
--swanlab-mode disabled

训练第一次启动时会下载 GSM8K。正式实验应增大 stepsbatch-sizegroup-size,并固定其余配置后再比较 importance_samplingppo

运行异步版#

Terminal window
python docs/chapter8/grpo/02-demo-async.py \
--steps 1 \
--batch-size 4 \
--group-size 4 \
--max-tokens 512 \
--loss-fn importance_sampling \
--swanlab-mode disabled

异步版会并发处理同一 batch 中不同 prompt 的 rollout。reward、advantage、Datum 和 loss 与同步版保持一致。

同步版代码阅读顺序#

  1. parse_args()RolloutSample:定义训练配置和一条 rollout 的数据。
  2. grade_answer():抽取 \boxed{} 并计算规则奖励。
  3. run_rollout_group():对同一道题采样一组回答并计算相对优势。
  4. build_grpo_datum():完成自回归右移和 prompt mask。
  5. main():选择内置 loss,并串联 sampler 刷新、rollout、策略更新、日志和权重保存。

异步版在对应函数中使用 sample_async()forward_backward_async()optim_step_async()asyncio.gather()


OPD 配套代码#

代码来源: 本目录代码引用并整理自本章作者维护的 agentic-rl-lab 中的 02-opd 实现,当前版本适配 Happy-LLM 第八章与 PyTRIO 0.2.6。

本目录对应正文 8.2 节,以 DeepMath-103K prompt 为例实现完整的 On-Policy Distillation。Student 生成回答,Teacher 对同一条 Student 轨迹计算逐 token logprob,再由 reverse KL 构造训练信号。

文件说明#

文件作用正文定位
01-demo-sync.py顺序执行 Student rollout、Teacher 打分和 Student 更新逐段讲解
02-demo-async.py并发执行 batch 内 rollout 与 Teacher logprob 请求提供完整代码,只说明接口差异

运行前准备#

Terminal window
uv venv --python 3.13
source .venv/bin/activate
uv pip install -r docs/chapter8/requirements.txt
trio login

需要在线记录实验时,再执行 swanlab login

运行同步版#

Terminal window
python docs/chapter8/opd/01-demo-sync.py \
--steps 1 \
--batch-size 1 \
--group-size 1 \
--max-tokens 512 \
--sample-size 20 \
--num-shards 1 \
--swanlab-mode disabled

脚本会从 ModelScope 下载 DeepMath-103K parquet。--num-shards 1 适合小成本试跑,--num-shards 10 会使用全部分片。

运行异步版#

Terminal window
python docs/chapter8/opd/02-demo-async.py \
--steps 1 \
--batch-size 4 \
--group-size 2 \
--max-tokens 512 \
--sample-size 20 \
--num-shards 1 \
--swanlab-mode disabled

异步版在 batch 内并发执行 Student rollout,并在同一 prompt 内并发提交 Teacher logprob 请求。token 对齐、reverse KL 与 importance_sampling Datum 保持不变。

同步版代码阅读顺序#

  1. parse_args()load_deepmath():准备训练参数和 prompt-only 数据。
  2. build_prompt():把问题渲染成 Student 输入。
  3. completion_teacher_logprobs():让 Teacher 对 Student completion 打分。
  4. build_opd_datum():把逐 token reverse KL 写入 advantage。
  5. main():刷新 Student sampler,更新 Student,记录指标并保存权重。

Teacher 默认使用 Qwen/Qwen3.6-27B。实际可用模型以 PyTRIO 服务返回结果为准,也可以通过 --teacher-base-model--teacher-model-path 指定其他 Teacher。Teacher 与 Student 的 token id 必须兼容。


ReTool 配套代码#

代码来源: 本目录代码引用并整理自本章作者维护的 agentic-rl-lab 中的 05-retool 实现,当前版本适配 Happy-LLM 第八章与 PyTRIO 0.2.6。

本目录对应正文 8.4 节。代码实现数学题上的多轮代码解释器 rollout、结果奖励、observation mask、PPO 更新和统一评测。

安全提示:sandbox.py 通过独立 subprocess、超时和资源限制控制意外消耗,但不能提供可信安全隔离。模型生成的代码仍可能访问本机文件、网络和继承的环境变量。处理不可信代码时,请使用一次性容器、低权限虚拟机或专用沙箱服务,并移除所有凭证。

运行前准备#

Terminal window
uv venv --python 3.13
source .venv/bin/activate
uv pip install -r docs/chapter8/requirements.txt
trio login

需要在线记录实验时,再执行 swanlab login

准备数据#

Terminal window
python docs/chapter8/retool/prepare_data.py

最小试跑#

请先在隔离环境中确认执行器权限,再运行:

Terminal window
python docs/chapter8/retool/train.py \
--max-steps 1 \
--questions-per-batch 1 \
--group-size 4 \
--max-code-calls 2 \
--sandbox-workers 2 \
--swanlab-mode disabled

文件说明#

文件作用
protocol.py定义 code_interpreter 工具和消息拼接规则
sandbox.py执行 Python 代码并限制时间、进程和输出大小
rollout.py执行多轮“生成—运行代码—观察—继续生成”状态机
reward.py抽取最后一个 \boxed{} 并判断数学等价性
train.py构造 observation mask、PyTRIO Datum 并执行 PPO 更新
eval.py统一评测 text-only 与 ReTool 模式
analysis.py汇总不同 checkpoint 的指标

Search-R1 配套代码#

代码来源: 本目录代码引用并整理自本章作者维护的 agentic-rl-lab 中的 03-search-r1 实现,当前版本适配 Happy-LLM 第八章与 PyTRIO 0.2.6。

本目录对应正文 8.3 节。代码保留数据、工具协议、搜索环境、多轮 rollout、reward、训练和评测的边界,便于观察 Agentic RL 如何在普通 GRPO 训练循环上增加环境交互。

运行前准备#

Terminal window
uv venv --python 3.13
source .venv/bin/activate
uv pip install -r docs/chapter8/requirements.txt
trio login

需要在线记录实验时,再执行 swanlab login

准备数据#

Terminal window
python docs/chapter8/search-r1/prepare_data.py

该命令会准备 NQ 与 HotpotQA 训练、开发和测试数据。Wikipedia 后端免费且不需要 API Key,适合先验证流程。

最小试跑#

Terminal window
python docs/chapter8/search-r1/train.py \
--max-steps 1 \
--questions-per-batch 1 \
--group-size 4 \
--max-search-calls 2 \
--search-backend wikipedia \
--search-concurrency 3 \
--swanlab-mode disabled

在线搜索结果会随时间变化。比较 Base Model 与 checkpoint 时,必须保持题集、搜索后端、最大搜索次数和 sampling 参数一致。

文件说明#

文件作用
protocol.py定义工具协议,解析搜索动作和最终答案
search.py封装 DeepSeek Search、Wikipedia 和知乎搜索后端
rollout.py执行多轮“生成—搜索—观察—继续生成”状态机
reward.py计算格式奖励和答案精确匹配奖励
train.py构造 observation mask、PyTRIO Datum 并更新策略
eval.py使用相同环境评测 Base Model 或 checkpoint
analyse.py汇总评测结果

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
配套代码合集(GRPO / OPD / ReTool / Search-R1)
https://datawhalechina.github.io/happy-llm/
作者
小熊
发布于
2026-08-13
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
小熊
Hello, I'm xiaoxiong.
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
27
分类
2
标签
27
总字数
374,571
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录