news 2026/10/15 18:26:11

SDPO数据准备指南:从SciKnowEval到LiveCodeBench的获取、划分与Parquet预处理全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SDPO数据准备指南:从SciKnowEval到LiveCodeBench的获取、划分与Parquet预处理全流程

【免费下载链接】SDPO

Reinforcement Learning via Self-Distillation (SDPO)

项目地址:https://gitcode.com/gh_mirrors/sdp/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.pycode单元测试

三类数据最终都会变成同一个目录结构:一个文件夹里放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:$PYTHONPATH

2.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。

它会做两件新手容易忽略的事:

  1. 字段重塑:把prompt/answer/tests等重组为 verl 标准结构——data_source(决定奖励函数)、prompt(system + user 消息列表)、reward_model(含ground_truth)、extra_info(problem、elo、index等)。对 LiveCodeBench 还会自动把函数签名里的(self,清洗掉。
  2. 规避 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.jsonSciKnowEval 必须跑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)

项目地址:https://gitcode.com/gh_mirrors/sdp/SDPO
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 18:25:56

ARM编译器版本5(AC5)实践指南:选型、命令行编译与避坑

简介&#xff1a;面向ARM嵌入式开发者的编译器版本5安装包&#xff0c;适合在Cortex系列及ARM7~ARM11等处理器上从事裸机、RTOS或驱动开发的工程师。该版本支持C、C与汇编&#xff0c;提供O0~O3多级优化&#xff0c;并针对VFP浮点运算与循环指令进行专项改进&#xff0c;同时兼…

作者头像 李华
网站建设 2026/10/15 18:24:23

TUM、KITTI、EuRoC三大SLAM数据集选型与避坑指南

简介&#xff1a;这份文档面向SLAM、自动驾驶与微型无人机方向的研究者和学生&#xff0c;系统梳理了TUM RGB-D、KITTI与EuRoC三大主流数据集的采集平台、数据格式与评价准则&#xff0c;帮助读者快速建立对多传感器数据集的整体认知&#xff0c;解决入门选型与格式理解上的困惑…

作者头像 李华
网站建设 2026/10/15 18:21:53

为什么TechSpar题库不是固定题单?动态出题底座的核心设计深度揭秘

【免费下载链接】TechSpar 一个持续进化的面试训练系统。在线体验地址&#xff1a;https://techspar.cn 项目地址&#xff1a; https://gitcode.com/gh_mirrors/te/TechSpar 点击查看 免费下载 很多人第一次接触 TechSpar 这套面试训练系统&#xff0c;会下意识把它的「题库」…

作者头像 李华
网站建设 2026/10/15 18:21:25

NMS不是黑箱:目标检测后处理的原理、陷阱与工程优化

1. 为什么NMS不是“调个参数就完事”的黑箱&#xff1f;目标检测模型输出成百上千个边界框&#xff0c;但真实场景里一辆车只该有一个框。NMS&#xff08;Non-Maximum Suppression&#xff0c;非极大值抑制&#xff09;就是那个“裁缝”&#xff0c;负责把重叠的、冗余的、低置…

作者头像 李华
网站建设 2026/10/15 18:21:08

交流电路分析核心:相量图、RLC谐振与功率因数补偿

简介&#xff1a;本资源为《电工电子技术&#xff08;第2版&#xff09;》教材的课后习题答案PDF&#xff0c;主要面向电气工程、自动化及相关专业本专科学生&#xff0c;用于巩固交流电路、相量法、阻抗与电路分析等核心内容。资料内按习题顺序整理了解答步骤与关键知识点解析…

作者头像 李华