ManiSkill 在线强化学习 Baselines 与标准 Benchmark 完全指南:从 PPO 训练到公平评估
ManiSkill 在线强化学习 Baselines 与标准 Benchmark 完全指南从 PPO 训练到公平评估【免费下载链接】ManiSkillManipulation Skill Framework, an open source GPU parallelized robotics simulator and benchmark项目地址: https://gitcode.com/GitHub_Trending/ma/ManiSkill本文基于 ManiSkill 官方文档《Baselines》系统讲解该 GPU 并行化机器人模拟器中在线强化学习基线的使用方法、标准 Benchmark 任务集合的构成以及如何对策略进行公平、可复现的评估。读完本文你将掌握 PPO 等基线代码的目录结构、核心命令行参数、标准任务的环境 ID 与源码注册信息并能按照官方评估协议ignore_terminations、reconfiguration_freq1写出正确评测任意 RL 策略的代码。一、概述ManiSkill 提供的在线 RL 基线ManiSkill 通过统一的 Gymnasium API 支持各类强化学习方法并在仓库中提供多种已实现、已验证的在线强化学习基线供研究者直接使用与横向对比。这些基线仅从奖励中学习online RL不依赖专家演示需要利用演示数据的离线 RL、在线模仿学习基线则在 learning_from_demos 文档 中另行说明。所有基线结果统一发布到项目公开的 WandB 工作区可在其中按算法、环境类型、观测模式state / RGB 等进行筛选。需要说明的是实验仍在分批运行中并非所有结果都已上传。基线代码位置仓库内结果状态原始论文Proximal Policy OptimizationPPOexamples/baselines/ppo已发布结果WandBPPO 论文arXiv 1707.06347Soft Actor CriticSACexamples/baselines/sacWIP进行中SAC 论文arXiv 1801.01290TD-MPC2基于模型预测控制的时序差分学习WIPWIPTD-MPC2 论文arXiv 2310.16828从仓库目录结构看examples/baselines 下还包含act、bc、diffusion_policy、rfcl、rlpd、stable_baselines3、tdmpc2等目录其中部分属于利用演示的模仿学习/离线 RL 基线与本文讨论的在线 RL 基线共同构成完整的基线体系。二、PPO 基线代码结构与使用方式PPO 是当前仓库中完成度最高、结果最完整的在线 RL 基线。examples/baselines/ppo 目录下的代码参考了 CleanRL 与 LeanRL 的设计以单文件、易读易改为目标同时支持基于状态state和基于视觉RGB的 RL。2.1 文件组成ppo.py标准 PPO 训练/评估脚本state 观测ppo_rgb.py基于 RGB 图像观测的 PPO配合obs_modergbppo_rgbd.py基于 RGBDepth 观测的 PPOppo_fast.py基于 LeanRL 思路的实验性加速版启用 PyTorch 编译与 CUDA Graphs需额外安装torchrl与tensordictbaselines.sh官方基线实验脚本含全部小集合任务的 state / RGB 训练命令examples.sh一批已验证过、可直接复现的状态/RGB PPO 命令。2.2 快速上手训练一个 PushCube 策略以最简单的任务PushCube-v1为例GPU 上通常只需几分钟即可完成训练验证python ppo.py --env_idPushCube-v1 \ --num_envs2048 --update_epochs8 --num_minibatches32 \ --total_timesteps2_000_000 --eval_freq10 --num-steps20评估已训练好的模型会生成评估视频与轨迹文件python ppo.py --env_idPushCube-v1 \ --evaluate --checkpointpath/to/model.pt \ --num_eval_envs1 --num-eval-steps1000需要注意--evaluate模式下轨迹从 GPU 模拟中保存为保证使用maniskill.trajectory.replay_trajectory工具回放时对存在几何随机化的任务如PickSingleYCB-v1可复现评估环境数应固定为1没有几何随机化的任务如PushCube-v1则可以加大评估环境数。RGB 版本示例视觉策略GPU 显存占用较高需根据显存调整--num_envspython ppo_rgb.py --env_idPushCube-v1 \ --num_envs256 --update_epochs8 --num_minibatches8 \ --total_timesteps1_000_000 --eval_freq10 --num-steps202.3 核心命令行参数解读以 ppo.py 中的Argsdataclass 为准关键参数含义与默认值如下参数默认值说明--env_idPickCube-v1环境 ID即 gym.make 使用的注册名--seed1随机种子配合torch_deterministic保证可复现--total_timesteps10000000实验总步数--learning_rate3e-4优化器学习率--num_envs512并行环境数GPU 模拟下通常数千--num_eval_envs8并行评估环境数--num_steps50每轮 rollout 每个环境收集的步数--partial_resetTrue训练时并行环境终止后是否立即复位而非等截断--eval_partial_resetFalse评估时是否启用 partial reset公平评估要求关闭--reconfiguration_freqNone训练时环境重配置频率影响目标几何随机化--eval_reconfiguration_freq1评估时每次 reset 都重配置保证随机化任务的公平评测--control_modepd_joint_delta_pos机器人控制模式--gamma0.8折扣因子各任务在 baselines.sh 中有针对性调整--gae_lambda0.9GAE 参数--num_minibatches32小批量数量--update_epochs4每轮更新策略的 K epochs--clip_coef0.2PPO 截断系数--ent_coef0.0熵正则系数--vf_coef0.5值函数损失权重--max_grad_norm0.5梯度裁剪范数--target_kl0.1提前停止更新的 KL 阈值--reward_scale1.0奖励缩放系数--eval_freq25每隔多少轮迭代做一次评估--evaluate/--checkpoint-评估模式及其模型检查点路径从 ppo.py 的源码可以看出训练/评估环境的关键构建方式默认env_kwargs为obs_modestate、render_modergb_array、sim_backendphysx_cuda若动作空间是gym.spaces.Dict多机械臂任务会先套上FlattenActionSpaceWrapper随后在RecordEpisode录制视频/轨迹外层包ManiSkillVectorEnv(..., record_metricsTrue)。这一调用链正是文档中统一 API 标准化评估的具体实现。2.4 官方基准实验脚本baselines.sh 中按seeds(9351 4796 1788)三组种子运行全部官方 PPO 基线典型命令模式state 版使用ppo_fast.py CUDA Graphs如下python ppo_fast.py --env_idPushCube-v1 --seed${seed} \ --num_envs4096 --num-steps4 --update_epochs8 --num_minibatches32 \ --total_timesteps50_000_000 --num_eval_envs16 \ --cudagraphs --exp-nameppo-PushCube-v1-state-${seed}-walltime_efficient --track该脚本覆盖的任务包括PushCube、PickCube、PickCubeSO100、PickCubeWidowXAI、PushT、StackCube、RollBall、PullCube、PokeCube、LiftPegUpright、AnymalC-Reach、PegInsertionSide、TwoRobotPickCube、UnitreeG1PlaceAppleInBowl、UnitreeG1TransportBox、OpenCabinetDrawer、PickSingleYCB 等且为不同任务针对性调整了--num_envs、--num-steps、--gamma、--gae_lambda等超参例如PegInsertionSide-v1使用--gamma0.97 --gae_lambda0.95 --num_envs2048RollBall-v1使用--gamma0.95。RGB 版本则使用ppo_rgb.py并将--num_envs降到 2561024 以控制显存。值得注意PPO 基线不保证在所有任务上都能成功。正如 examples/baselines/ppo/README.md 所述部分任务尚未配备稠密奖励或奖励调优不充分标准 PPO 可能无法解决。三、标准 Benchmark小集合与大集合ManiSkill 为 RL 建立了一套标准 Benchmark用于覆盖广泛难度与任务类型便于研究者之间公平比较。3.1 集合构成Benchmark 分为两组小集合Small Set推荐给算力有限的研究者官方建议作为常规对比基准大集合Large Set约 50 个任务同时包含 state 与视觉visual两类设置仍在开发与测试中。文档当前列出的Small Set 环境 ID为PushCube-v1、PickCube-v1、PegInsertionSide-v1、PushT-v1、HumanoidPlaceAppleInBowl-v1、AnymalC-Reach-v1、OpenCabinetDrawer-v1文档在别处同时提及 StackCube-v1、PickSingleYCB-v1、PlugCharger-v1 等也属候选集合实际以各版本文档与官方脚本为准。需要留意当前仓库源码中人形机器人放置苹果任务实际注册名为UnitreeG1PlaceAppleInBowl-v1见 humanoid_pick_place.pymax_episode_steps100baselines.sh 中 PPO 官方脚本使用的也是该 ID文档正文写为HumanoidPlaceAppleInBowl-v1使用时请以所安装版本实际可用的注册名为准。3.2 任务注册信息源码佐证从 mani_skill/envs/tasks 的注册装饰器可确认各任务的官方 ID 与每回合最大步数环境 ID源码文件每回合最大步数PushCube-v1push_cube.py50PickCube-v1pick_cube.py50PegInsertionSide-v1peg_insertion_side.py100PushT-v1push_t.py100PickSingleYCB-v1pick_single_ycb.py50需下载 YCB 资产PlugCharger-v1plug_charger.py200StackCube-v1stack_cube.py50RollBall-v1roll_ball.py80OpenCabinetDrawer-v1open_cabinet_drawer.py见该类注册柜门抽屉关节物体AnymalC-Reach-v1quadruped_reach.py2003.3 任务多样性这些任务覆盖了机器人/RL 领域的极宽问题面包括但不限于高维观测/动作灵巧操作、人形/四足机器人全身控制大初始状态分布随机化的物体位姿与几何关节物体操作articulated object manipulation如开柜门抽屉可泛化操作generalizable manipulation移动操作mobile manipulation运动控制locomotion等。3.4 标准化稠密奖励文档强调所有标准 Benchmark 任务均提供归一化稠密奖励函数normalized dense reward。这在源码层面得到了印证sapien_env.py 定义SUPPORTED_REWARD_MODES (normalized_dense, dense, sparse, none)其中none模式奖励恒为 0当选择normalized_dense时环境会调用每个任务自行实现的compute_normalized_dense_reward见 minimal_template.py 与 base_env.py 的接口定义。因此可通过gym.make(env_id, reward_modenormalized_dense)明确启用该模式。四、Evaluation如何公平评估 RL 策略评估是 RL 研究中最容易不公平的环节。ManiSkill 文档规定了两条必须满足的公平评估条件关闭 partial reset环境在成功/失败/终止时不得自动复位ignore_terminationsTrue改为记录多种成功/失败指标每次 reset 都重配置环境reconfiguration_freq1这样存在几何随机化的任务会在每次评估重置时重新随机目标物体几何避免策略在固定配置上过拟合。4.1 GPU 向量化环境评估代码推荐import gymnasium as gym import torch from collections import defaultdict from mani_skill.vector.wrappers.gymnasium import ManiSkillVectorEnv env_id PushCube-v1 num_eval_envs 64 env_kwargs dict(obs_modestate) # 按需修改 eval_envs gym.make(env_id, num_envsnum_eval_envs, reconfiguration_freq1, **env_kwargs) # 可在此添加其他 wrappers eval_envs ManiSkillVectorEnv(eval_envs, ignore_terminationsTrue, record_metricsTrue) # 评估循环只统计完整回合的指标 obs, _ eval_envs.reset(seed0) eval_metrics defaultdict(list) for _ in range(400): action eval_envs.action_space.sample() # 替换为你的策略输出 obs, rew, terminated, truncated, info eval_envs.step(action) # 由于关闭了 partial reset所有环境会同时截断truncated 全为 True if truncated.any(): for k, v in info[final_info][episode].items(): eval_metrics[k].append(v.float()) for k in eval_metrics.keys(): print(f{k}_mean: {torch.mean(torch.stack(eval_metrics[k])).item()})4.2 CPU 向量化环境评估代码import gymnasium as gym import numpy as np from collections import defaultdict from mani_skill.utils.wrappers import CPUGymWrapper env_id PickCube-v1 num_eval_envs 8 env_kwargs dict(obs_modestate) # 按需修改 def cpu_make_env(env_id, env_kwargs dict()): def thunk(): env gym.make(env_id, reconfiguration_freq1, **env_kwargs) env CPUGymWrapper(env, ignore_terminationsTrue, record_metricsTrue) # 可在此添加其他 wrappers return env return thunk if __name__ __main__: vector_cls gym.vector.SyncVectorEnv if num_eval_envs 1 else lambda x : gym.vector.AsyncVectorEnv(x, contextforkserver) eval_envs vector_cls([cpu_make_env(env_id, env_kwargs) for _ in range(num_eval_envs)]) # 评估循环只统计完整回合的指标 obs, _ eval_envs.reset(seed0) eval_metrics defaultdict(list) for _ in range(400): action eval_envs.action_space.sample() # 替换为你的策略输出 obs, rew, terminated, truncated, info eval_envs.step(action) if truncated.any(): for final_info in info[final_info]: for k, v in final_info[episode].items(): eval_metrics[k].append(v) for k in eval_metrics.keys(): print(f{k}_mean: {np.mean(eval_metrics[k])})4.3 记录的标准指标以上两种评估都会从info[final_info][episode]中收集并汇总以下指标success_once回合内任意时刻是否成功过success_at_end回合最终步是否成功fail_once/fail_at_end同上但针对失败注意并非所有任务都定义了成功/失败判据return整个回合累计的奖励总和。这套评估协议也正是 ppo.py 中评估逻辑的原型评估阶段使用agent.get_action(eval_obs, deterministicTrue)确定性动作ManiSkillVectorEnv(..., ignore_terminationsnot args.eval_partial_reset, record_metricsTrue)并在eval_freq指定的迭代间隔打印各eval_*_mean指标。官方在 WandB 上发布的所有结果均遵循同一评估设置因此可以直接横向对比。五、环境 API 基础RL 训练的前提在运行任何基线前需要理解 ManiSkill 环境与标准 Gymnasium API 的关系。核心事实ManiSkill 环境默认是批量化batched的——gym.make(PickCube-v1, num_envsN)返回的每个输入输出都带批次维度并非标准 Gymnasium APIimport mani_skill.envs import gymnasium as gym N 4 env gym.make(PickCube-v1, num_envsN) env.action_space # shape (N, D) env.observation_space # shape (N, ...) env.reset() obs, rew, terminated, truncated, info env.step(env.action_space.sample()) # obs (N, ...), rew (N, ), terminated (N, ), truncated (N, )若需要标准 API有两种途径单环境CPU 模拟套用 CPUGymWrapperfrom mani_skill.utils.wrappers.gymnasium import CPUGymWrapper它会去批量化并转为 numpy行为与普通 gym 环境一致向量化环境GPU 模拟套用 ManiSkillVectorEnvfrom mani_skill.vector.wrappers.gymnasium import ManiSkillVectorEnv对齐 gymnasium 的VectorEnv接口提供single_action_space/single_observation_space。与标准 gymnasium 向量环境唯一的差异是所有返回值是 GPU 上的批量 torch 张量而非 CPU numpy 数组。ManiSkillVectorEnv的两个关键选项auto_reset某个并行环境 terminated/truncated 后是否自动复位ignore_terminations环境在 terminatedTrue 时是否复位与部分复位partial reset相关。两者都支持部分复位部分并行环境复位、其余继续运行。六、常用 Wrappers 与常见误区6.1 常用 WrappersRL 实践中常通过 wrapper 修改环境详见 wrappers 文档。两个高频使用项RecordEpisode录制 rollout 的视频/轨迹PPO 基线在--capture_video开启时会自动套用视频输出到runs/{run_name}/videosFlattenRGBDObservations将obs_modergbd或obs_modergbdepth的观测压平成只含rgbd张量与state张量的字典便于直接输入网络PPO 的ppo_rgbd.py即使用FlattenRGBDObservationWrapper。6.2 常见误区Gotchas不要用env.render()获取图像观测。旧环境/旧 Benchmark 常通过env.render(modergb_array)拿图像但在 ManiSkill 中图像观测直接由env.reset()与env.step()返回env.render仅用于可视化与视频录制。观测模式会影响信息保真度。机器人任务观测通常由状态信息如关节角与图像信息组成。当obs_mode不是state/state_dict时ManiSkill 会特意移除地面真值目标位姿等特权状态信息而env.reset()/env.step()返回的图像观测来自为任务精心布置的相机位姿以保证任务在视觉上可解。七、总结与延伸阅读ManiSkill 的在线 RL 基线体系可以归纳为三条主线开箱即用的基线代码PPO 最完整SAC 与 TD-MPC2 尚在开发中、标准化 Benchmark推荐小集合 开发中的大集合全部配备归一化稠密奖励、统一的公平评估协议关闭 partial reset reconfiguration_freq1 标准指标记录。三者配合即可在 GPU 并行模拟下完成从训练、对比到论文级评估的完整闭环。想进一步深入建议阅读RL Setup 完整文档环境 API 转换、评估协议细节、常用 wrappersPPO 基线 READMEstate / RGB 训练示例、轨迹回放命令python -m mani_skill.trajectory.replay_trajectory --traj-path... --use-env-states --shaderrt-fast --save-video --allow-failure -o noneRL 文档首页所有基线结果统一发布页面的入口wrappers 文档action_repeat、cached_reset、flatten、record、frame_stack等扩展能力。【免费下载链接】ManiSkillManipulation Skill Framework, an open source GPU parallelized robotics simulator and benchmark项目地址: https://gitcode.com/GitHub_Trending/ma/ManiSkill创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →