Miles数据准备指南:JSONL数据源、采样策略与自定义数据源完整教程
【免费下载链接】milesMiles is an enterprise-facing reinforcement learning framework for LLM and VLM post-training, forked from and co-evolving with slime.项目地址: https://gitcode.com/GitHub_Trending/miles1/miles
Miles是面向 LLM/VLM 强化学习后训练的开源框架(与 slime 共同演进),本文讲清楚 Miles 数据准备的三件事:如何组织JSONL 数据源、如何用采样策略控制训练轨迹的抽取,以及如何通过钩子接入自定义数据源。掌握这三步,你即可把任意提示词数据集接进 Miles 的 RL 训练流程。
一、Miles 数据源基础:JSONL 与 Parquet 双格式
Miles 默认把--prompt-data指向的文件加载为一个全局数据集,训练中每个 rollout 都从中抽取样本。加载逻辑在 miles/utils/data.py 的read_file中实现,支持两种格式:
| 格式 | 说明 | 依赖 |
|---|---|---|
.jsonl | 每行一个 JSON 对象,解析失败的行会跳过并打印行号 | 无 |
.parquet | 按 batch 迭代读取 | 需要pyarrow |
JSONL 数据的字段约定
每一行至少包含提示词字段,可选标签和元数据字段,通过参数指定列名:
--prompt-data /path/to/train.jsonl:数据文件路径--input-key prompt:提示词所在字段(字符串或对话列表均可)--label-key label:标准答案字段,供奖励函数判分--metadata-key metadata:元数据字段,默认读取metadata列
官方脚本 scripts/run_qwen3_4b.py 中的标准用法:
--prompt-data ${DATA_DIR}/dapo-math-17k/dapo-math-17k.jsonl \ --input-key prompt \ --label-key label💡实用技巧:路径支持 Python 切片语法file.jsonl@[start:end],例如train.jsonl@[0:1000]可只读前 1000 行,方便小规模调试。
两条常被忽略的细节
- 长提示词过滤:设置
--rollout-max-prompt-len后,Miles 会在初始化时过滤掉超长的 prompt,避免撑爆推理引擎的上下文窗口(详见 miles/utils/arguments.py 参数说明)。 - 对话模板:若
input_key字段是对话列表或需要套用模型 chat template,加--apply-chat-template;配合--apply-chat-template-kwargs可传额外参数。
二、采样策略:从数据集中抽出训练轨迹
数据加载完成后,Miles 的数据源实现 miles/rollout/data_source.py 负责"怎么抽、抽多少"。核心机制有四个:
1. 按组抽样的 GRPO 结构
每次调用get_samples时,Miles 为每条 prompt 深拷贝--n-samples-per-prompt份,形成一个组(group)。这是 GRPO 等组相对优势算法的基础——同一提示词的多条轨迹互相比较。
2. 可控的随机打乱
--rollout-shuffle:启用每个 epoch 的随机打乱--rollout-seed:随机种子(默认 42),保证打乱可复现
打乱策略在 miles/utils/data.py 的Dataset.shuffle中实现:以seed + epoch_id作为随机种子,每个 epoch 顺序不同但完全可复现。
3. 自动 epoch 滚动
当当前 epoch 剩余样本不够一个 batch 时,Miles 会自动取完剩余部分、epoch_id + 1、重新打乱后从头部补齐——训练无需手动循环数据集。
4. 动态采样过滤(DAPO 风格)
--dynamic-sampling-filter-path可在打分后按组过滤"全对/全错"等无信息量的样本,内置参考实现为miles.rollout.filter_hub.dynamic_sampling_filters.check_reward_nonzero_std;配合--partial-rollout还会把未完成样本回收进数据缓冲区。缓冲区出队顺序可用--buffer-filter-path自定义,默认是 FIFO(pop_first)。
三、自定义数据源最佳实践
当全局数据集不够用(在线数据生成、多任务混采、外部数据管道)时,Miles 提供--data-source-path钩子,让你替换整个数据加载逻辑,完整钩子清单见 docs/user-guide/customization.md。
接入步骤
- 继承
DataSource抽象类,实现四个方法:get_samples(num_samples):返回num_samples个样本组add_samples(samples):把样本写回数据源save(rollout_id)/load(rollout_id):状态持久化,支持断点续训
- 在启动参数中传入
--data-source-path my_pkg.my_data_source.MyDataSource - 继承默认实现
RolloutDataSourceWithBuffer可保留缓冲区行为,只覆盖get_samples
⚠️注意事项:
- 默认数据源是只读的,直接调用
add_samples会抛出RuntimeError,需要覆写 - 每个样本组长度必须等于
--n-samples-per-prompt,否则断言失败 - 若需要按 epoch 控制数据量,务必同时设置
--rollout-global-dataset
VLM 场景实战
多模态数据同样走 JSONL/Parquet 流程,只需额外用--multimodal-keys声明图片列,例如官方 geo3k 视觉数学示例 examples/geo3k_vlm/run_geo3k_vlm.sh:
--prompt-data /root/datasets/geo3k/train.parquet \ --input-key problem \ --label-key answer \ --multimodal-keys '{"image": "images"}' \ --apply-chat-template其中{"image": "images"}表示images列的内容会替换提示词中的占位符,多模态键的映射规则在 miles/utils/data.py 的_build_messages中处理。
四、快速上手清单
| 目标 | 关键参数 |
|---|---|
| 最小可用 JSONL 数据源 | --prompt-data+--input-key+--label-key |
| 复现打乱顺序 | --rollout-shuffle+--rollout-seed |
| GRPO 组训练 | --n-samples-per-prompt 8 |
| 过滤无效样本组 | --dynamic-sampling-filter-path |
| 长上下文保护 | --rollout-max-prompt-len |
| 完全自定义数据流 | --data-source-path |
📦 更多数据与采样细节可参考 docs/user-guide/fully-async.md(异步模式下的数据缓冲区)以及各模型启动脚本目录 scripts/ 中的现成示例。
【免费下载链接】milesMiles is an enterprise-facing reinforcement learning framework for LLM and VLM post-training, forked from and co-evolving with slime.项目地址: https://gitcode.com/GitHub_Trending/miles1/miles
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考