【免费下载链接】BenchMARL
BenchMARL is a library for benchmarking Multi-Agent Reinforcement Learning (MARL). BenchMARL allows to quickly compare different MARL algorithms, tasks, and models while being systematically grounded in its two core tenets: reproducibility and standardization.
BenchMARL 是一个多智能体强化学习(MARL)基准测试库,让你能基于统一、可复现的平台快速对比各种 MARL 算法、任务与模型。MARL 实验动辄训练数小时甚至数天,一旦实验中断,如何完整记录结果、如何保存检查点(checkpoint)、如何无缝从断点恢复,是每个研究者都会遇到的难题。本文带你深入剖析 BenchMARL 的日志记录(logging)、检查点保存(checkpointing)与断点恢复(resume from checkpoint)三大核心机制,让你的实验中断后一行命令即可恢复,再也不怕白跑。
一、为什么"中断"是 MARL 实验的常态?
强化学习实验对资源要求高、周期长,以下场景几乎必然发生:
- 资源不足:GPU 显存溢出(OOM)、磁盘写满;
- 人为操作:发现超参配错,需要
Ctrl+C手动停止; - 集群调度:抢占式任务被抢占、节点维护重启。
BenchMARL 针对这一痛点做了系统化的设计:实验启动时自动持久化完整配置,训练中按帧数定期保存.pt检查点文件,恢复时自动重建原始实验并接着跑。整个闭环由三个模块协作完成:
| 模块 | 职责 | 核心文件 |
|---|---|---|
| Logger | 记录训练指标、评估结果、视频 | benchmarl/experiment/logger.py |
| Checkpoint | 保存/加载实验完整状态 | benchmarl/experiment/experiment.py |
| Reload | 从检查点一键恢复实验 | benchmarl/hydra_config.py |
二、日志机制:多 Logger 与标准 JSON 报告
1. 支持 4 种 Logger 后端
BenchMARL 的实验配置中有一个loggers参数(默认[csv, wandb]),可选值包括csv、wandb、tensorboard、mflow,实现位于 benchmarl/experiment/logger.py。它会记录三类核心数据:
- 采集指标(collection):各组(group)智能体的 episode 回报、单步奖励的 min/mean/max,见 log_collection;
- 训练指标(train):每步训练的损失、梯度范数等,见 log_training;
- 评估指标(eval):按评估间隔(
evaluation_interval)运行的确定性策略 rollout 回报,还支持把评估过程渲染成视频写入日志,见 log_evaluation。
此外每步还会记录timers/(采集、训练、单轮耗时)和counters/(总帧数、迭代数)等运维指标,方便你监控训练进度。
2. marl-eval 标准 JSON 报告
若create_json: True(默认开启),每次评估都会向实验输出目录写入一份{experiment_name}.json文件,格式兼容 marl-eval 规范。JsonWriter不仅记录每个评估步的step_count与各指标,还会在absolute_metrics中累积历史最优值,实现见 benchmarl/experiment/logger.py。
这些 JSON 文件事后可用 benchmarl/eval_results.py 加载合并,配合绘图示例 examples/plotting/plot_benchmark.py 直接生成聚合得分曲线、样本效率曲线与 performance profile 图,无需手动折腾 matplotlib。
3. 日志保存到哪里?
由save_folder参数控制(benchmarl/conf/experiment/base_experiment.yaml):
- 留空时:使用 Hydra 的输出目录(
outputs/日期/时间/实验名/),非 Hydra 脚本则保存在运行目录; - 从断点恢复时:默认保存回原实验目录,保证日志与检查点聚在一起。
三、检查点机制:实验状态的完整"快照"
1. 检查点里到底存了什么?
BenchMARL 的state_dict()把实验状态分成四块,见 benchmarl/experiment/experiment.py:
state = OrderedDict( total_time=..., # 累计耗时 total_frames=..., # 已采集总帧数 n_iters_performed=..., # 已完成迭代数 mean_return=..., # 最近一次评估回报 ) state_dict = OrderedDict( state=state, **{f"loss_{k}": item.state_dict() for ...}, # 各组的模型 + 优化器状态 **{f"buffer_{k}": ...}, # 各组的经验回放缓冲区(off-policy) ) state_dict.update({"collector": self.collector.state_dict()}) # 数据收集器也就是说检查点包含模型参数、优化器状态、回放缓冲区、训练计数器——恢复后训练可以精确地"从哪儿断了就从哪儿继续"。
2. 关键检查点配置参数
全部位于 benchmarl/conf/experiment/base_experiment.yaml:
| 参数 | 默认值 | 说明 |
|---|---|---|
checkpoint_interval | 0 | 每采集多少帧保存一次检查点(必须是collected_frames_per_batch的整数倍),设为0表示禁用 |
checkpoint_at_end | False | 实验正常跑完时是否额外保存一个检查点 |
keep_checkpoints_num | 3 | 最多保留几个检查点,超出后自动删除最旧的(null表示全保留) |
exclude_buffer_from_checkpoint | False | 是否把回放缓冲区排除出检查点(缓冲很大时可省磁盘) |
restore_map_location | null | torch.load的 map location,GPU 实验换到 CPU 机器恢复时用 |
检查点文件统一存放在实验目录的checkpoints/子目录下,命名为checkpoint_{total_frames}.pt,保存逻辑见 _save_experiment;触发时机则在训练主循环中,每轮迭代结束时判断total_frames % checkpoint_interval == 0,见 benchmarl/experiment/experiment.py。
四、断点恢复机制:三步找回你的实验
1. 命令行一行恢复(推荐)
官方示例 examples/checkpointing/resume_experiment.sh 只有两行命令:
# 第 1 步:跑一个每 100 帧存一次检查点的实验(3 次迭代后中断) python benchmarl/run.py task=vmas/balance algorithm=mappo experiment.max_n_iters=3 experiment.on_policy_collected_frames_per_batch=100 experiment.checkpoint_interval=100 # 第 2 步:中断后,用断点恢复工具指向任意检查点继续 python benchmarl/resume.py /hydra_experiment_folder/checkpoints/checkpoint_200.ptresume.py(benchmarl/resume.py)的逻辑非常简单:调用reload_experiment_from_file(checkpoint_file)重建实验,再执行experiment.run()。它会自动从检查点向上最多 3 层查找 Hydra 生成的.hydra元数据目录(benchmarl/hydra_config.py),从而还原当时的完整配置、算法、任务、模型、随机种子。
💡 另一种等价方式:直接在运行命令里传
experiment.restore_file="/path/to/checkpoint_300.pt",见 examples/checkpointing/reload_experiment.sh。
2. 两种自动恢复路径
reload_experiment_from_file(benchmarl/hydra_config.py)根据环境自动选择策略:
- Hydra 路径:找到
.hydra目录后,用其中的overrides.yaml重新 compose 配置,并与当时保存的配置合并,确保恢复出的实验与中断前 100% 一致,还会在终端打印恢复到的算法、任务与完整配置; - 脚本路径:若不是用 Hydra 启动(比如自己写 Python 脚本),则回退到 Experiment.reload_from_file,它读取实验目录里的
config.pkl——该文件在实验初始化时就把任务、算法配置、模型配置、种子等全部 pickle 了进去,见 benchmarl/experiment/experiment.py。
3. Python 脚本中恢复并接着训练
完整流程见 examples/checkpointing/resume_experiment.py:
restored_experiment = reload_experiment_from_file( experiment.folder_name / "checkpoints" / "checkpoint_100.pt" ) restored_experiment.run() # 从断点继续训练 restored_experiment.evaluate() # 也可以只做一次评估恢复后实验会沿用原来的实验名,并把新检查点、日志写回原实验目录;进度条(n_iters_performed)也从断点继续,不会重复训练。
4. GPU 实验换到 CPU 机器恢复?
设置restore_map_location即可把张量映射回 CPU:
python benchmarl/resume.py checkpoint_300.pt # 配合配置# base_experiment.yaml 中的示例 restore_map_location: {"cuda:0": "cpu"}见 benchmarl/conf/experiment/base_experiment.yaml。
五、实验中断后的实用最佳实践
- 一定开启定期检查点:
checkpoint_interval建议设为collected_frames_per_batch的整数倍,否则配置校验会直接报错(validate); - 注意默认只保留 3 个检查点:
keep_checkpoints_num: 3会滚动删除旧检查点,想回退更远就调大该值或设为null; - Ctrl+C 是"优雅退出":
run()捕获KeyboardInterrupt后会关闭 collector、测试环境与日志器,见 benchmarl/experiment/experiment.py——但它不会额外保存检查点,你的恢复点始终是最后一个定期检查点,所以间隔别设太大; - 显存/磁盘紧张时:用
exclude_buffer_from_checkpoint: True把回放缓冲区排除出检查点,恢复后缓冲区会重新随机填充(off-policy 算法代价较小); - 中断前先看日志:实验目录下的 CSV / JSON 文件实时记录了回报曲线,帮你判断"是策略没学到东西"还是"只是资源不够",再决定恢复还是改配置重跑。
六、总结
BenchMARL 把"实验可恢复性"做进了框架底层:
- 日志侧:
loggers多后端 +create_json标准报告,训练全程有据可查,随时能画曲线、出图; - 检查点侧:模型、优化器、回放缓冲、训练计数器四位一体的
.pt快照,按帧数自动滚动保存; - 恢复侧:
python benchmarl/resume.py <checkpoint>一行命令,自动还原原始配置并精确续训。
理解了这套机制,你的 MARL 基准实验就可以放心地挂在集群上长跑——中断不可怕,可怕的是没有检查点。
📚 延伸阅读:docs/source/concepts/reporting.rst(报告与绘图)、docs/source/usage/running.rst(实验启动方式)、examples/checkpointing/(断点恢复示例)。
【免费下载链接】BenchMARL
BenchMARL is a library for benchmarking Multi-Agent Reinforcement Learning (MARL). BenchMARL allows to quickly compare different MARL algorithms, tasks, and models while being systematically grounded in its two core tenets: reproducibility and standardization.
相关推荐
实验中断了怎么办?NanoResearch断点续跑机制详解:manifest.json检查点原理与实操
实验中断了怎么办?NanoResearch断点续跑机制详解:manifest.json检查点原理与实操 做科研自动化的朋友都遇到过这种糟心场景:NanoRese
白板视频任务中断了怎么办:CS Board检查点设计与任务复用机制全解读
白板视频任务中断了怎么办:CS Board检查点设计与任务复用机制全解读 CS Board 是一个本地运行的 AI 白板视频制作工具:上传参考声音、粘贴中文文案
focalnet_base_srf.ms_in1k与timm库集成:高效计算机视觉开发的最佳实践
focalnet_base_srf.ms_in1k与timm库集成:高效计算机视觉开发的最佳实践 想要在计算机视觉项目中快速集成先进的视觉Transformer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考