【免费下载链接】Minari
A standard format for offline reinforcement learning datasets, with popular reference datasets and related utilities
Minari 是离线强化学习(Offline RL)数据集的标准格式库,其DataCollector环境包装器在长时间收集数据时存在一个经典风险:数据先存在临时目录,只有调用保存函数才真正落盘。本文分享如何用「每 N 个 episode 打一次 checkpoint」的套路,让 Minari 数据集收集任务支持断点续传,彻底告别跑了一夜数据全丢的噩梦。
为什么 DataCollector 收集的数据会丢失?
先搞清楚数据丢在哪里。DataCollector初始化时会创建一个临时目录作为缓存区,所有env.step()记录下来的观察、动作、奖励都先写入这个临时存储:
self._tmp_dir = tempfile.TemporaryDirectory(dir=self.datasets_path)只有两个动作会把数据永久写盘:
create_dataset()—— 首次创建数据集,把临时文件整体搬移到~/.minari/datasets/下的正式目录;add_to_dataset()—— 把缓冲区的增量数据追加到已存在的数据集。
而DataCollector.close()会直接删除临时目录。也就是说,如果你跑了 8 小时数据、最后一步才create_dataset,中途任何一次断电、OOM 或手动 Ctrl+C,临时目录里的所有 episode 全部蒸发。
Minari 数据集中每个 episode 的观察帧(比如下面这种灵巧手环境的单步观测)都是真金白银的算力换来的,必须用 checkpoint 机制保护起来:
断点续传核心套路:每 N 个 episode 存一次
💡 小提示:Minari 并没有名为
checkpoint的方法,它的断点续传由两个 API 组合实现:create_dataset()建锚点,add_to_dataset()做增量追加。
add_to_dataset内部会先把缓冲区刷入存储,然后自动从dataset.storage.total_episodes接着编号,最后重置临时存储——这正是「断点」的由来:
def add_to_dataset(self, dataset: MinariDataset): self._flush_to_storage() first_id = dataset.storage.total_episodes dataset.storage.update_from_storage(self._storage) ... self._reset_storage()完整套路只有 4 行关键逻辑,官方文档中也有对应章节 Checkpoint Minari Dataset:
import minari import gymnasium as gym from minari import DataCollector env = DataCollector(gym.make("CartPole-v1")) dataset_id = "cartpole/test-v0" # 恢复已有数据集;没有则为 None dataset = minari.load_dataset(dataset_id) if dataset_id in minari.list_local_datasets() else None for episode_id in range(100): env.reset() while True: obs, rew, terminated, truncated, info = env.step(env.action_space.sample()) if terminated or truncated: break if (episode_id + 1) % 10 == 0: # 每 10 个 episode 打一次 checkpoint if dataset is None: dataset = env.create_dataset(dataset_id=dataset_id) else: env.add_to_dataset(dataset) # 增量追加,落盘要点拆解:
| 步骤 | 作用 | 源码位置 |
|---|---|---|
list_local_datasets()检查 | 判断是否已有上次中断留下的数据集 | minari/dataset/minari_storage.py |
create_dataset()只调一次 | 建立数据集锚点并落盘 | data_collector.py |
add_to_dataset()周期调用 | 增量追加 + 重置临时缓冲 | data_collector.py |
load_dataset()恢复现场 | 从磁盘重新挂载数据集继续追加 | minari_functions.md |
中断后如何恢复继续收集?
恢复流程零成本——直接重跑同一段收集脚本即可:
- 脚本开头用
minari.list_local_datasets()检查dataset_id是否存在; - 存在则
minari.load_dataset(dataset_id)拿回上次的对象; - 继续跑 episode 循环,
add_to_dataset()会自动从已有 episode 数继续编号,不会重复、不会错乱。
也就是说,跑了 70/100 个 episode 时中断,重启脚本后只损失最后一个未 checkpoint 的 episode 窗口(本例最多 10 个),其余 70 个完整保留。想进一步缩小损失,把 checkpoint 频率从每 10 个调成每 5 个即可——频率越高,最坏情况丢得越少。
防丢数据最佳实践清单 📋
- 版本号管理:数据集命名遵循
(namespace/)(env_name/)dataset_name-v版本规范,见 dataset_standards.md。中断后想推倒重来时,把dataset_id从-v0升到-v1,避免新旧数据混杂。 - 自定义存储根目录:通过环境变量
MINARI_DATASETS_PATH把数据集指到大容量磁盘,临时缓存目录也会建在同样的位置(data_collector.py)。 - 落盘后立刻验证:
minari list local会列出每个本地数据集的 episode 数、step 数与占用体积,checkpoint 后顺手核对一下,心里才有底。 - 优雅退出:
env.close()会清理临时目录,建议在try/finally中调用,避免残留垃圾文件(data_collector.py)。 - 单步缓冲机制:每个 episode 的数据以 EpisodeBuffer 为单元累积,
reset()时若上一局未正常结束会自动标记为 truncated,恢复重跑也无需担心脏数据污染。
checkpoint 落盘后,数据集立刻可用于离线训练,Loss 与累计奖励曲线可以实时跟进:
相关源码与文档
- 数据收集器主类:minari/data_collector/data_collector.py
- episode 缓冲区:minari/data_collector/episode_buffer.py
- 存储层实现:minari/dataset/minari_storage.py
- 数据集创建教程(含 checkpoint 官方示例):docs/content/basic_usage.md
- 数据集标准目录结构:docs/content/dataset_standards.md
掌握「create 一次 + add 多次 + 重启自动续传」这个模式,你的 Minari 数据集收集任务就再也不怕中断了。
【免费下载链接】Minari
A standard format for offline reinforcement learning datasets, with popular reference datasets and related utilities
相关推荐
从架构设计到工程实践:Bingsu/adetailer YOLOv8专业检测模型深度解析
从架构设计到工程实践:Bingsu/adetailer YOLOv8专业检测模型深度解析 在计算机视觉应用从实验室走向生产环境的关键转折点上,选择合适的检测模型
Kaneo任务管理深度解析:从创建到完成的完整工作流
Kaneo任务管理深度解析:从创建到完成的完整工作流 Kaneo是一款开源项目管理工具,它专注于提供简洁高效的任务管理体验,让你能够专注于真正重要的工作。本文将
项目管理后端前端企业应用Minari数据集采样终极指南:sample_episodes、iterate_episodes实用技巧
Minari数据集采样终极指南:sample_episodes、iterate_episodes实用技巧 Minari 是离线强化学习(Offline RL)领
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考