【免费下载链接】SDPO
Reinforcement Learning via Self-Distillation (SDPO)
SDPO(Reinforcement Learning via Self-Distillation,基于自蒸馏的强化学习)的数据准备是许多新手上手时的第一道门槛。本文面向新手,用一条清晰的流水线讲透 SDPO 数据准备指南:如何获取 SciKnowEval 与 LiveCodeBench 数据集、如何划分训练集/测试集,以及最后一步如何把 JSON 数据转成训练所需的 Parquet 格式,全程只需 3 类命令、不到 10 分钟。
上图:SDPO 的训练循环。SDPO 会把环境返回的富反馈(如代码报错、测试失败信息)与高分轨迹一起喂回模型做自蒸馏,因此它对数据的格式要求比普通 RL 更严格——这正是本文预处理流程存在的原因。
一、先搞懂 SDPO 需要什么样的数据
在动手之前,先明确仓库里涉及哪三类数据,避免后面找错文件:
| 数据集 | 用途 | 仓库位置 | 奖励类型 |
|---|---|---|---|
| SciKnowEval(Biology / Chemistry / Material / Physics) | 泛化能力实验 | datasets/sciknoweval/ | mcq选择题 |
| tooluse(工具调用) | 泛化能力实验 | datasets/tooluse/train.json | 已自带,直接用 |
| LiveCodeBench v6 | 富反馈代码实验 | data/utils/livecodebench.py | code单元测试 |
三类数据最终都会变成同一个目录结构:一个文件夹里放train.json和test.json,再被转换成train.parquet和test.parquet。训练脚本(如 experiments/generalization/run_sdpo_all.sh 中的DATA_PATHS)只认这种 Parquet 目录,所以"获取 → 划分 → 预处理"三步缺一不可。
完整的数据说明写在 data/README.md,建议配合本文对照阅读。
二、第一步:获取数据集(统一为 JSON)
2.1 前置准备:设置 PYTHONPATH
所有数据脚本都依赖仓库根目录作为模块路径,先执行:
export PYTHONPATH=/path/to/your/SDPO:$PYTHONPATH2.2 一条命令下载并格式化数据集
核心工具是 data/load_dataset.py。它从 Hugging Face 拉取原始数据,并统一成 SDPO 需要的 JSON 字段:
# SciKnowEval 化学(四个领域只需换 dataset_name) python data/load_dataset.py --dataset_name Chemistry --output_path datasets/sciknoweval/chemistry.json # LiveCodeBench v6 python data/load_dataset.py --dataset_name livecodebench/code_generation_lite-v6 --output_path datasets/lcb_v6.json常用参数速查:
--dataset_name:支持Biology、Chemistry、Material、Physics、livecodebench/code_generation_lite-v6、open-r1/codeforces、Qwen/CodeElo、evalplus/humanevalplus等--output_path:输出 JSON 路径--start_idx/--num_el:截取数据片段,适合先小规模试跑--category:可选的类别过滤
各数据集的格式转换逻辑分别实现在 data/format/sciknoweval.py 和 data/format/code.py 中。以 SciKnowEval 为例,加载时会只保留 L3 难度的 4 选 1 / 2 选 1 题目,并注入一个规范输出格式的 system prompt(要求模型用<reasoning>...</reasoning><answer>A</answer>结构作答)。
2.3 统一 JSON 长什么样?
转换后的每条记录都包含以下字段,理解它们是读懂后续步骤的关键:
| 字段 | 含义 |
|---|---|
prompt | 完整题目(已含题目模板) |
system | 系统提示词(可选) |
answer | 参考答案(代码题中存放测试用例) |
tests | 单元测试 JSON 字符串,非代码题为"-" |
kind | 奖励类型:mcq/code等 |
dataset | 数据来源名,决定后续用哪个 reward 函数 |
description | 题目描述,末尾自动拼接评测环境说明 |
elo | 难度评分 |
idx | 全局唯一编号 |
💡 提示:仓库已经预置了 SciKnowEval 四个领域和 tooluse 的划分好的 JSON(datasets/sciknoweval/、datasets/tooluse/),如果你直接复现实验,可以跳过本节直接进入第四节的预处理。
上图:使用本文流程准备好的 SciKnowEval Chemistry 数据,SDPO 相比 GRPO 基线的训练准确率对比(Olmo3-7B-Instruct,16 次采样均值)。
三、第二步:划分训练集与测试集
划分有两种截然不同的思路,这是 SDPO 数据准备中最容易混淆的地方:
3.1 SciKnowEval:按"题目"划分
用 data/split_tasks.py 把题目本身按比例切开,默认 9:1:
python data/split_tasks.py \ --json_path datasets/sciknoweval/chemistry.json \ --output_dir datasets/sciknoweval/chemistry \ --test_ratio 0.1 \ --seed 42四个领域只需替换路径依次执行,输出即为datasets/sciknoweval/{biology,chemistry,material,physics}/train.json + test.json。
3.2 LiveCodeBench:按"单元测试"划分
代码题的思路完全不同——题目全部保留,切的是测试用例(见 data/split_tests.py):
python data/split_tests.py \ --json_path datasets/lcb_v6.json \ --output_dir datasets/lcb_v6规则是:
test.json:保留全部单元测试(用于评测上限)train.json:随机保留约50%的测试(PERCENTAGE_TO_KEEP = 0.5,随机种子固定为 0)
这样训练时模型看不到一半测试,既降低了"过拟合测试用例"的风险,也节省了运行单测的开销。
3.3 多轮基线的一键准备脚本
如果你要做第 5 章的多轮交互基线(Test-Time Training),仓库提供了 data/prepare_data_splits.sh 一键完成"划分 + 预处理 + 逐题拆包":
export MY_DATA_SPLITS_DIR=lcb_v6 export MY_DATA_SINGLES_DIR=lcb_v6_singles bash data/prepare_data_splits.sh datasets/lcb_v6.json它会自动生成my_data_singles/q_00、q_01…… 等每道题一个独立目录的结构,供 baseline_multiturn/multiturn.py 按题号调用。
四、第三步:Parquet 预处理(通往训练的最后一站)
SDPO 基于 verl 框架,训练只读取Parquet 格式。这一步由 data/preprocess.py 完成:
python data/preprocess.py --data_source datasets/sciknoweval/chemistry--data_source指向的目录必须同时包含train.json和test.json,脚本会在同目录下生成train.parquet和test.parquet。
它会做两件新手容易忽略的事:
- 字段重塑:把
prompt/answer/tests等重组为 verl 标准结构——data_source(决定奖励函数)、prompt(system + user 消息列表)、reward_model(含ground_truth)、extra_info(problem、elo、index等)。对 LiveCodeBench 还会自动把函数签名里的(self,清洗掉。 - 规避 32 位溢出:代码文本动辄超长,脚本会把字符串统一转为
LargeString类型并按每 32 行一个 row group 写入 Parquet(配合 zstd 压缩),避免 Arrow 的 32 位偏移溢出报错——这是大文本数据集转 Parquet 的经典坑,SDPO 已经帮你处理好了。
五、完整流程与验证
把三步串起来,就是 SDPO 数据准备的完整闭环:
load_dataset.py split_tasks.py / split_tests.py preprocess.py (HF 原始数据) ────────▶ (JSON: train/test) ────────▶ (Parquet: train/test) 获取 划分 预处理以 LiveCodeBench v6 为例的完整命令链:
python data/load_dataset.py --dataset_name livecodebench/code_generation_lite-v6 --output_path datasets/lcb_v6.json python data/split_tests.py --json_path datasets/lcb_v6.json --output_dir datasets/lcb_v6 python data/preprocess.py --data_source datasets/lcb_v6完成后,只需把目录路径填进训练脚本的DATA_PATHS:富反馈实验见 experiments/rich_feedback/run_sdpo.sh,泛化实验见 experiments/generalization/run_sdpo_all.sh,最终由 training/verl_training.sh 拉起训练。
上图:用上述流程准备好的 LiveCodeBench v6 数据上,SDPO 借助富反馈实现更快收敛、准确率持续领先 GRPO。
六、常见问题速查(FAQ)
| 问题 | 原因与解决 |
|---|---|
ModuleNotFoundError: data | 未设置PYTHONPATH,回到 2.1 节 |
dataset not supported | --dataset_name不在支持列表内,参考 2.2 节支持清单 |
| 预处理报 Arrow 溢出相关错误 | 确认使用的是仓库自带preprocess.py,它已内置 LargeString 转换 |
目录里只有train.json没有test.json | SciKnowEval 必须跑split_tasks.py两个文件才会同时生成 |
| 想先小规模验证 | 用load_dataset.py的--num_el 100截断数据,走通全流程再放开 |
小结
SDPO 数据准备只有三步:load_dataset.py获取并统一格式 →split_tasks.py/split_tests.py按题目或单测划分 →preprocess.py转 Parquet。记住 SciKnowEval 切题目、LiveCodeBench 切测试这条主线,你就能轻松为任何新数据集复刻这套流程。准备好 Parquet 后,剩下的就是修改DATA_PATHS,跑起来看模型在富反馈下自我进化的训练曲线了 🚀
【免费下载链接】SDPO
Reinforcement Learning via Self-Distillation (SDPO)
相关推荐
PaddleNLP 预训练数据准备指南:CLUECorpus2020 中文 200GB 语料的申请获取与全流程处理
PaddleNLP 预训练数据准备指南:CLUECorpus2020 中文 200GB 语料的申请获取与全流程处理 CLUECorpus2020 是由 CLUE
人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPLogic-RL项目数据准备指南:Parquet格式训练数据预处理
Logic RL项目数据准备指南:Parquet格式训练数据预处理 前言 在强化学习模型训练过程中,数据预处理是至关重要的一环。Logic RL项目采用Parq
人工智能大模型强化学习微调MuseTalk训练数据准备指南:HDTF数据集预处理全流程
MuseTalk训练数据准备指南:HDTF数据集预处理全流程 想要训练出高质量的MuseTalk唇形同步模型,数据准备是至关重要的第一步。本文将为你详细解析HD
人工智能大模型计算机视觉语音媒体生成数字人预训练
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考