十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

robomimic 模仿学习全流程复现:环境配置、数据集与训练视频生成

robomimic 模仿学习全流程复现:环境配置、数据集与训练视频生成 robomimic 这个框架在模仿学习圈子里算是绕不开的一个工具尤其是做机器人操作策略研究的朋友基本都会拿它来跑 baseline。但说实话第一次接触这个项目的时候光是搞清楚数据集从哪下、怎么组织目录、训练配置怎么改、最后怎么把训练过程导出成视频就够折腾大半天的。官方文档虽然全但信息散落在好几个页面里有些细节还得翻源码才能确认。我前后在几台机器上完整复现过 robomimic 的训练流程踩过的坑包括但不限于数据集下载脚本卡住不动、hdf5 文件路径对不上、渲染后端报错、视频导出来是黑屏。这篇文章就把整个链路从头到尾捋一遍从环境准备、数据集获取、配置文件调整到启动训练、监控日志、生成 rollout 视频每一步都给出可复现的操作和背后的逻辑解释。不管你是刚入门模仿学习的学生还是需要快速搭实验环境的工程师照着走一遍应该能省下不少查文档的时间。1. 环境搭建与依赖版本的那些坑1.1 为什么 robomimic 的环境配置容易出问题robomimic 本身是一个 Python 包但它依赖的东西不少PyTorch、h5py、numpy、以及可选的 MuJoCo 物理引擎和渲染后端。问题在于这些依赖之间的版本兼容性比较敏感尤其是 MuJoCo 从 2.x 升级到 3.x 之后API 有变化robomimic 的不同版本对 MuJoCo 的要求也不一样。我试过在同一个 conda 环境里先装了最新版 mujoco结果 robomimic 的 env_robosuite 模块直接 import 失败报的是mujoco.MjModel相关属性找不到。后来查了 robomimic 的 setup.py 和 requirements才发现它锁定的 mujoco 版本范围比较窄。另一个容易忽略的点是渲染后端。robomimic 生成训练视频依赖渲染而渲染在无显示器的服务器上需要配置 EGL 或 OSMesa。很多人第一次跑render相关代码时遇到GLFW error或者cannot open display就是因为没有设置MUJOCO_GL环境变量。这个变量有三个常见取值egl、osmesa、glfw。在服务器上通常用egl但需要系统装了对应的驱动库如果没有 GPU 或者驱动不支持就得退到osmesa但 osmesa 渲染出来的画质会差一些而且速度慢。1.2 我实际使用的环境配置步骤下面这套流程是我在 Ubuntu 20.04 和 22.04 上都验证过的Python 用 3.9 或 3.10 都行太新的版本有些依赖轮子还没跟上。conda create -n robomimic python3.9 -y conda activate robomimic # 先装 PyTorch根据你的 CUDA 版本选对应命令 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 装 robomimic 核心依赖 pip install robomimic # 如果需要跑 robosuite 环境大部分实验都需要 pip install robosuite # 渲染相关 pip install imageio imageio-ffmpeg装完之后先跑一个最小验证import robomimic import robosuite import mujoco print(robomimic.__version__) print(robosuite.__version__) print(mujoco.__version__)如果这一步没报错说明基础环境 OK。接下来设置渲染后端export MUJOCO_GLegl export PYOPENGL_PLATFORMegl注意PYOPENGL_PLATFORM这个变量很多人会漏掉但它对 PyOpenGL 的上下文创建有影响。只设MUJOCO_GL有时候还不够两个都设上比较稳。如果你在服务器上没有 sudo 权限装 EGL 相关系统库可能比较麻烦。这种情况下可以试试osmesaexport MUJOCO_GLosmesa export PYOPENGL_PLATFORMosmesa但 osmesa 需要系统有libosmesa6-dev没有的话同样跑不起来。我的经验是优先用 egl实在不行再考虑 osmesa最后才考虑在本地有显示器的机器上跑。1.3 版本兼容性对照表我整理了一份自己验证过的版本组合供参考组件推荐版本备注Python3.9 / 3.103.11 部分依赖轮子缺失PyTorch2.0.x / 2.1.x与 CUDA 11.8 搭配稳定robomimic0.3.0当前较稳定的 releaserobosuite1.4.1与 robomimic 0.3.0 匹配mujoco3.1.x不要用 3.2有 API 变动h5py3.9.x读写 hdf5 数据集imageio2.31.x视频导出这张表不是绝对的但如果你不想在版本问题上浪费时间照着装基本不会出大问题。我遇到过最诡异的一个 bug 是 h5py 版本太新导致读取 robomimic 数据集时dataset.attrs解析异常降回 3.9 就好了。2. 数据集下载与目录组织的正确姿势2.1 robomimic 数据集有哪些、怎么选robomimic 官方提供的数据集主要分几大类Proficient Human (PH)、Multi-Human (MH)、Machine-Generated (MG)以及Mixed等。每一类下面又按任务分比如lift、can、square、transport、tool_hang等。不同数据集的区别在于演示数据的来源和质量PH由熟练操作者通过遥操作采集数据质量高适合做 baseline。MH多个操作者采集多样性更好但噪声也更大。MG由脚本化策略生成数量大但风格单一。选择哪个数据集取决于你的实验目的。如果只是想跑通流程建议从lift任务的 PH 数据集开始文件最小训练也最快。transport和tool_hang的数据集体积大很多训练时间也长不适合初次复现。数据集文件是.hdf5格式每个文件包含多个 demonstration每个 demonstration 里有obs、actions、rewards、dones等字段。文件大小从几十 MB 到几个 GB 不等。2.2 下载方式与常见卡住的原因官方推荐用脚本下载python -m robomimic.scripts.download_datasets --dataset_path /path/to/datasets但这个脚本在国内网络环境下经常卡住因为它默认从国外服务器拉取。我试过几次有时候能下有时候进度条半天不动。如果你也遇到这种情况可以考虑手动下载。官方数据集在 robomimic 的文档页面有直接链接用浏览器或者下载工具拉下来然后放到指定目录即可。手动下载后目录结构需要组织成这样datasets/ ├── lift/ │ └── ph/ │ └── low_dim/ │ └── image.hdf5 ├── can/ │ └── ph/ │ └── low_dim/ │ └── image.hdf5 ...注意low_dim和image的区别low_dim数据集只包含低维观测如关节角度、末端位姿image数据集包含图像观测。如果你要训练基于图像的策略必须用image版本。很多人第一次跑的时候没注意用了low_dim数据集去训练图像策略结果报错说找不到obs里的agentview_image字段。2.3 数据集校验与快速加载测试下载完之后建议先做个校验确认文件完整且能被正确读取import h5py path /path/to/datasets/lift/ph/low_dim/image.hdf5 with h5py.File(path, r) as f: print(Keys:, list(f.keys())) data f[data] print(Num demos:, len(data.keys())) demo data[list(data.keys())[0]] print(Demo keys:, list(demo.keys())) print(Obs keys:, list(demo[obs].keys())) print(Action shape:, demo[actions].shape)如果这一步能正常打印出结构说明数据集没问题。我遇到过下载不完整导致 hdf5 文件损坏的情况h5py.File打开时直接报OSError: Unable to open file这种就只能重新下载。另外robomimic 提供了一个dataset_states_to_obs.py脚本可以把低维数据集转成图像数据集但这个过程需要跑仿真渲染速度很慢一般不推荐。直接下载官方的 image 数据集更省事。3. 训练配置文件的拆解与修改3.1 robomimic 的配置体系长什么样robomimic 用 JSON 或 Python dict 来组织配置核心配置项包括experiment、train、algo、observation、dataset等几个大块。官方在robomimic/exps/templates/下提供了几个模板比如bc.json、bc_rnn.json、diffusion_policy.json等。这些模板可以直接拿来改也可以自己从头写。配置的结构大致是这样的{ algo_name: bc, experiment: { name: my_experiment, output_dir: /path/to/output }, train: { num_epochs: 100, batch_size: 64, lr: 1e-4 }, algo: { actor_hidden_dims: [512, 512], actor_activation: relu }, observation: { modalities: { obs: { low_dim: [object, robot0_eef_pos, robot0_eef_quat, robot0_gripper_qpos], rgb: [agentview_image, robot0_eye_in_hand_image] } } }, dataset: { path: /path/to/datasets/lift/ph/low_dim/image.hdf5, obs_keys: [object, robot0_eef_pos, robot0_eef_quat, robot0_gripper_qpos, agentview_image, robot0_eye_in_hand_image] } }这里有几个关键点容易搞错第一observation.modalities里的low_dim和rgb列表必须和数据集里的 obs key 对应。如果你写了一个数据集里没有的 key训练启动时会报KeyError。我建议先用上面那段 h5py 代码把数据集里的 obs key 打印出来然后照着填。第二dataset.obs_keys要和observation.modalities里用到的 key 一致。这个字段告诉 dataloader 需要加载哪些观测。如果这里漏了某个 key训练时策略网络拿不到对应的输入会直接报维度不匹配。第三algo_name要和algo配置块匹配。比如你用bc那algo里就配 BC 相关的参数如果用diffusion_policy配置项完全不同。3.2 从模板到可运行配置的修改流程我的习惯是先把官方模板复制一份然后逐项改。以bc.json为例cp robomimic/exps/templates/bc.json my_bc_lift.json然后修改以下几个字段experiment.name改成你自己的实验名比如bc_lift_ph。experiment.output_dir改成你希望保存模型和日志的目录。train.num_epochs初次跑可以设小一点比如 50确认流程通了再加大。train.batch_size根据显存调整图像输入的话 64 可能就占不少显存了显存小就降到 32 或 16。dataset.path指向你下载好的 hdf5 文件。observation.modalities和dataset.obs_keys按数据集实际 key 填写。改完之后可以用 robomimic 提供的配置校验工具检查一下python -m robomimic.scripts.train --config my_bc_lift.json --dry_run--dry_run会加载配置和数据集但不实际训练适合快速验证配置是否正确。如果这一步过了基本就没大问题了。3.3 图像策略训练时的显存与数据加载优化图像策略训练比低维策略吃资源得多。以lift任务的 image 数据集为例每个 observation 包含两张 84x84 的 RGB 图像batch size 64 的时候光图像数据就占不少显存。如果你的 GPU 显存小于 12GB建议把batch_size降到 16 或 32。在algo里把actor_hidden_dims从[512, 512]降到[256, 256]。开启train.hdf5_cache_mode为low_dim这样低维观测会缓存在内存里减少 IO 压力。另外robomimic 的 dataloader 默认用num_workers0在图像数据集上会明显拖慢训练速度。可以在配置里加train: { num_data_workers: 4 }但注意num_workers大于 0 时h5py 文件句柄在多进程间共享可能出问题。robomimic 内部做了处理但如果你遇到h5py相关的 pickling 错误就把它调回 0。4. 启动训练与日志监控4.1 训练命令与后台运行配置准备好之后启动训练python -m robomimic.scripts.train --config my_bc_lift.json如果是在服务器上跑建议用nohup或tmux挂后台nohup python -m robomimic.scripts.train --config my_bc_lift.json train.log 21 训练过程中robomimic 会在output_dir下生成几个东西logs/TensorBoard 日志。models/模型 checkpoint按 epoch 保存。config.json实际使用的配置快照方便复现。4.2 用 TensorBoard 看训练曲线tensorboard --logdir /path/to/output/logs --port 6006然后在浏览器打开对应地址。重点看几个指标train/loss训练损失BC 的话通常是 MSE loss。train/l2_lossL2 损失和 MSE 类似但计算方式略有不同。valid/loss验证集损失如果验证集损失开始上升而训练损失还在降说明过拟合了。我一般会等到train/loss降到某个平台期或者验证损失连续几个 epoch 不降就停掉训练。BC 在lift任务上通常几十个 epoch 就能到不错的效果。4.3 训练中断后如何恢复robomimic 支持从 checkpoint 恢复训练。在配置里加train: { resume: true, ckpt_path: /path/to/output/models/model_epoch_50.pth }或者用命令行参数python -m robomimic.scripts.train --config my_bc_lift.json --resume --ckpt_path /path/to/model.pth注意恢复训练时num_epochs要设成总 epoch 数而不是剩余 epoch 数。比如你之前跑了 50 个 epoch想再跑 50 个num_epochs要设成 100。5. 训练视频生成从 rollout 到 mp45.1 视频生成的两种方式robomimic 生成视频主要有两种途径第一种在训练过程中定期生成 rollout 视频。在配置里加experiment: { rollout: { enabled: true, n: 3, horizon: 400, rate: 50, video: { enabled: true, video_skip: 2 } } }这样每训练 50 个 epoch就会跑 3 条 rollout并保存视频。video_skip控制抽帧设成 2 表示每两帧取一帧视频会更流畅但文件更大。第二种用训练好的 checkpoint 单独跑 rollout 并导出视频。这种方式更灵活可以指定用哪个 checkpoint、跑多少条、用什么策略。python -m robomimic.scripts.run_trained_agent \ --agent /path/to/model.pth \ --n_rollouts 5 \ --horizon 400 \ --video_path /path/to/videos \ --video_skip 25.2 渲染黑屏和视频导出失败的排查这是最容易出问题的一步。常见现象是训练正常但 rollout 视频全是黑屏或者直接报渲染错误。原因通常有这几个原因一MUJOCO_GL没设或设错。确认环境变量echo $MUJOCO_GL如果是空的设成egl或osmesa。原因二EGL 驱动库缺失。在服务器上跑egl需要libegl1、libgles2等库。可以用ldconfig -p | grep EGL检查。如果没有需要找管理员装或者退到osmesa。原因三相机名称不对。robomimic 的 rollout 视频默认用agentview相机但有些任务或配置里相机名可能不同。如果视频黑屏但 rollout 本身能跑检查一下render_camera参数。原因四视频编码器问题。imageio-ffmpeg没装或者版本不对会导致视频写不出来。确认pip install imageio-ffmpeg然后测试import imageio writer imageio.get_writer(/tmp/test.mp4, fps20) import numpy as np for _ in range(10): writer.append_data(np.zeros((84, 84, 3), dtypenp.uint8)) writer.close()如果这个能生成一个 10 帧的黑屏视频说明编码器没问题。5.3 视频参数调优与批量导出生成视频时几个参数值得注意参数作用推荐值video_skip抽帧间隔2-4render_camera渲染相机agentviewrender_image_size图像分辨率84 或 128fps视频帧率20horizonrollout 步数400如果要做批量导出比如对多个 checkpoint 都生成视频可以写个简单脚本import subprocess import os ckpt_dir /path/to/models video_dir /path/to/videos os.makedirs(video_dir, exist_okTrue) for ckpt in sorted(os.listdir(ckpt_dir)): if not ckpt.endswith(.pth): continue ckpt_path os.path.join(ckpt_dir, ckpt) video_path os.path.join(video_dir, ckpt.replace(.pth, )) subprocess.run([ python, -m, robomimic.scripts.run_trained_agent, --agent, ckpt_path, --n_rollouts, 3, --horizon, 400, --video_path, video_path, --video_skip, 2 ])这样每个 checkpoint 会生成一个单独的视频目录方便对比不同训练阶段的效果。6. 复现过程中几个值得注意的细节6.1 数据集路径的绝对路径与相对路径robomimic 的配置里dataset.path最好用绝对路径。我试过用相对路径在某些启动方式下会找不到文件因为工作目录可能不是你想象的那个。绝对路径虽然不够优雅但省心。6.2 随机种子的设置如果你要做可复现的实验记得在配置里设随机种子train: { seed: 42 }但要注意即使设了种子GPU 上的某些操作仍然有非确定性完全复现同一组数字比较难。不过对于训练趋势和最终性能的大致复现设种子还是有帮助的。6.3 输出目录的管理每次实验最好用不同的output_dir否则 robomimic 可能会覆盖之前的日志和模型。我习惯用实验名_日期_时间的格式experiment: { output_dir: /path/to/outputs/bc_lift_ph_20240101_120000 }这样回头找结果的时候不会搞混。6.4 训练视频的存储空间视频文件比模型大得多。一个 400 步、84x84 分辨率、20fps 的视频大概几 MB 到十几 MB。如果每 50 个 epoch 生成一次跑几百个 epoch视频目录很快就上 GB 了。建议定期清理不需要的视频或者把video_skip调大一点来减小文件。6.5 关于 rollout 评估的指标robomimic 的 rollout 会输出成功率等指标。在run_trained_agent的输出里会打印每条 rollout 的 return 和 success。如果成功率一直是 0先别急着怀疑模型检查一下环境初始化是否正确比如env_meta是否匹配。观测是否和训练时一致比如图像归一化方式。动作是否被正确反归一化。我遇到过一次成功率始终为 0最后发现是 rollout 时用的观测 key 和训练时不一致导致策略网络拿到的输入全是零。这种问题只能靠仔细核对配置来解决。7. 一些实操心得整个流程跑下来最耗时的其实不是训练本身而是环境配置和数据准备。我的建议是先把lift任务的low_dim数据集跑通确认训练、日志、rollout 视频生成这条链路没问题再换image数据集和更复杂的任务。这样出问题的时候排查范围小很多。另外robomimic 的源码可读性不错遇到配置项不清楚的地方直接去robomimic/config/下面找对应的 config class比翻文档快。比如algo_config.py里定义了所有算法相关的参数train_config.py里是训练相关的。看一遍这些文件基本就明白哪些参数能调、默认值是什么。最后说一个我踩过的坑robomimic 的某些版本在保存 checkpoint 时会把整个配置也存进去。如果你后来改了配置但用旧 checkpoint 恢复训练实际生效的是 checkpoint 里的旧配置而不是你新写的 JSON。这个行为有时候会让人困惑解决方法是恢复训练时显式指定新的配置文件或者手动检查 checkpoint 里的配置是否符合预期。
返回列表