ARTICLE DETAIL

资讯详情

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

ManiSkill 强化学习指南:环境 API、公平评估与在线 RL 基线实战

ManiSkill 强化学习指南:环境 API、公平评估与在线 RL 基线实战 ManiSkill 强化学习指南环境 API、公平评估与在线 RL 基线实战【免费下载链接】ManiSkillManipulation Skill Framework, an open source GPU parallelized robotics simulator and benchmark项目地址: https://gitcode.com/GitHub_Trending/ma/ManiSkill导读ManiSkill 是一个面向机器人操控的 GPU 并行仿真与基准测试框架通过统一的 gymnasium 兼容 API 支持各类强化学习RL算法并内置了多套经过测试的在线 RL 基线。本文以官方 RL 文档为骨架系统讲解三部分核心内容如何把 ManiSkill 环境包装成标准 gymnasium 环境与向量化环境、如何公平地评估 RL 策略并记录标准化指标、以及如何使用仓库自带的 PPO/SAC 基线与标准基准任务Standard Benchmark复现与对比实验。读完本文你将能够独立搭建 ManiSkill 的 RL 训练与评估管线并正确解读success_once、success_at_end、return等关键指标。ManiSkill 环境与统一 RL APIManiSkill 环境通过 gymnasium 的make函数创建但默认返回的是一个批量化batched环境——所有输入输出都带有批次维度这与标准 gymnasium API 并不一致import 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, )批量化设计的核心动机是 GPU 并行仿真num_envsN会在同一张 GPU 上并行运行 N 个子环境数据以 torch tensor 形式批量返回从而支撑上千环境并行的训练吞吐。在 setup.md 中明确说明标准 RL 场景下有两条包装路径单环境用CPUGymWrapper多环境并行用ManiSkillVectorEnv分别对应 gymnasium 的Env与VectorEnv即AsyncVectorEnv接口。三种环境 API 的包装方式标准 gymnasium 单环境 APICPU 后端如果需要使用 CPU 仿真器或单个环境可以应用CPUGymWrapper。从源码看该包装器位于 mani_skill/utils/wrappers/gymnasium.py其作用是把所有reset/step/render的返回值去批量化并转换为 numpy 数组使环境完全符合标准 gymnasium APIimport mani_skill.envs import gymnasium as gym from mani_skill.utils.wrappers.gymnasium import CPUGymWrapper N 1 env gym.make(PickCube-v1, num_envsN) env CPUGymWrapper(env) env.action_space # shape (D, ) env.observation_space # shape (...) env.reset() obs, rew, terminated, truncated, info env.step(env.action_space.sample()) # obs (...), rew (float), terminated (bool), truncated (bool)实现细节上CPUGymWrapper在__init__中会断言num_envs 1且未启用 GPU 仿真gpu_sim_enabled为假并把observation_space/action_space替换为single_observation_space/single_action_space。它还内置了ignore_terminations与record_metrics两个可选参数用于评测场景见下文公平评估一节。gymnasium 向量化环境 APIGPU 并行ManiSkill 采用了 gymnasium 的VectorEnv即AsyncVectorEnv接口通过一个包装器即可让假设VectorEnv接口的算法无缝工作。该实现位于 mani_skill/vector/wrappers/gymnasium.pyimport mani_skill.envs import gymnasium as gym from mani_skill.vector.wrappers.gymnasium import ManiSkillVectorEnv N 4 env gym.make(PickCube-v1, num_envsN) env ManiSkillVectorEnv(env, auto_resetTrue, ignore_terminationsFalse) env.action_space # shape (N, D) env.single_action_space # shape (D, ) env.observation_space # shape (N, ...) env.single_observation_space # shape (...) env.reset() obs, rew, terminated, truncated, info env.step(env.action_space.sample()) # obs (N, ...), rew (N, ), terminated (N, ), truncated (N, )构造时有两个关键选项auto_reset控制当某个并行子环境 terminated 或 truncated 时是否自动重置。多数 ML/RL 库依赖自动重置默认推荐为True。ignore_terminations控制环境是否在terminatedTrue时重置。与 gymnasium 向量环境一致可能发生部分重置partial reset——即部分并行环境重置而其余环境继续运行。从ManiSkillVectorEnv.step的源码可以看到其与 gymnasiumVectorEnv对齐的自动重置协议当dones.any()且开启auto_reset时会把终止前的观测与 info 放入infos[final_observation]和infos[final_info]并携带_final_info、_final_observation等掩码键。⚠️唯一需要注意的差异出于效率考虑ManiSkill 向量环境返回的所有数据都是 GPU 上的批量化 torch tensor而不是 CPU 上的 numpy 数组。这一点在编写依赖 numpy 类型判断的算法代码时需要特别留意。另外ManiSkillVectorEnv也支持直接传入环境名字符串内部调用gym.make此时num_envs与env_kwargs生效。如何公平地评估 RL 策略评估配置三要素面对数量众多的环境、算法与评估方式官方文档在 setup.md 中给出了一套标准化评估配置用以保证所有策略都能被公平比较关闭部分重置环境不在成功/失败/终止时重置ignore_terminationsTrue改为记录多种成功/失败指标所有并行环境在重置时重新配置场景reconfiguration_freq1如果任务带有物体几何随机化这会随机化物体几何避免评估陷入固定初始条件仅统计完整 episode 的指标——由于关闭了部分重置truncated会在同一时刻对所有环境同时为真此时从info[final_info][episode]中汇总指标。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) # 在这里修改你的 env_kwargs eval_envs gym.make(env_id, num_envsnum_eval_envs, reconfiguration_freq1, **env_kwargs) # 在这里可以添加其他 wrappers eval_envs ManiSkillVectorEnv(eval_envs, ignore_terminationsTrue, record_metricsTrue) # 评估循环只记录完整 episode 的指标 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) # 注意由于没有部分重置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()})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) # 在这里修改你的 env_kwargs def cpu_make_env(env_id, env_kwargsdict()): 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)]) # 评估循环只记录完整 episode 的指标 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])})标准化指标的含义无论 GPU 还是 CPU 路径record_metricsTrue都会在info[episode]中记录以下指标实现见 CPUGymWrapper 与 ManiSkillVectorEnvsuccess_onceepisode 中任意时刻是否成功过success_at_endepisode 最后一步是否成功仅在ignore_terminationsTrue时记录fail_once/fail_at_end同上但针对失败。注意并非所有任务都定义了成功/失败判据return整个 episode 累计的总奖励此外还会附带episode_lenepisode 长度与reward平均每步奖励。从源码看GPU 路径使用torch.bool张量维护success_once/fail_once并在 reset 时清零CPU 路径则在reset时重置为False与空列表。常用 Wrapper 与常见误区常用 Wrapper完整的 wrapper 清单见 wrappers 文档RL 实践中最常用的包括RecordEpisode录制 rollout 的视频与轨迹。PPO 基线代码中用RecordEpisode(env, output_dir..., save_trajectory..., video_fps30)同时支持训练视频与评估视频FlattenRGBDObservations把obs_modergbd或obs_modergbdepth的观测压平为只含合并后的rgbd张量与state张量的简单字典。源码位于 mani_skill/utils/wrappers/flatten.py支持rgb/depth/state开关与sep_depth选项默认 True 时 RGB 与深度分开为rgb与depth两个键另外PPO 基线的环境创建代码中还使用了FlattenActionSpaceWrapper同文件把spaces.Dict动作空间压平为连续向量以适配标准策略网络。常见误区Gotchas不要用env.render()获取图像观测在旧式环境/基准中人们常用env.render(modergb_array)或env.render()获取 RL 的视觉输入这在 ManiSkill 中是不正确的。图像观测由env.reset()与env.step()直接返回env.render仅用于可视化与视频录制。非state观测会剔除特权信息机器人任务的观测通常由状态信息如关节角与图像信息组成。当obs_mode不是state/state_dict时ManiSkill 会从观测中剔除部分特权状态例如物体真实位姿 ground truth。相机位姿是任务可解性的前提reset/step返回的图像观测来自被安放在特定位置的相机以保证从视觉上可以观察并解决任务。在线 RL 基线与标准基准已实现的在线 RL 基线仓库在 examples/baselines 目录下提供了多套经过实现的在线 RL 基线从奖励出发进行学习它们均基于统一环境 API 编写代码为单文件、易于阅读与二次开发基线代码说明Proximal Policy Optimization (PPO)examples/baselines/ppo支持 state-based 与 visual-basedRGB训练另有基于 LeanRL 的ppo_fast.py需pip install torchrl tensordict支持编译与 CUDA GraphsSoft Actor Critic (SAC)examples/baselines/sac支持 state-based 与视觉RGB/RGBD/Depth训练TD-MPC2开发中基于 TD-MPC2 的模型预测控制式 RLPPO 代码改编自 CleanRL 与 LeanRLPPO READMESAC 代码改编自 CleanRL 与早期 ManiSkill BaselinesSAC README。PPO 基线中Args数据类定义的命令行参数覆盖了训练全链路num_envs并行环境数state-based 可达 2048、num_steps每轮 rollout 步数、update_epochs、num_minibatches、gamma、gae_lambda、clip_coef、ent_coef、vf_coef、max_grad_norm、anneal_lr、reward_scale等并额外提供partial_reset/eval_partial_reset与reconfiguration_freq/eval_reconfiguration_freq用于区分训练与评估的配置。标准基准Standard Benchmark标准 RL 基准由两组任务构成小集合Small Set8 个任务同时提供 state-based 与 visual-based 设置适合算力有限的团队进行合理对比大集合Large Set50 个任务仍在开发与测试中。所有标准基准任务都配备归一化稠密奖励normalized dense rewards覆盖了极广的机器人/RL 问题类型高维观测与动作、大初始状态分布、铰接物体操控、可泛化操控、移动操控、运动控制locomotion等。小集合环境 ID当前仓库文档列出 7 个PushCube-v1, PickCube-v1, PegInsertionSide-v1, PushT-v1, HumanoidPlaceAppleInBowl-v1, AnymalC-Reach-v1, OpenCabinetDrawer-v1这些任务可从 tabletop、humanoid、quadruped、mobile_manipulation 等任务分类页进一步了解。实战用 PPO 训练与评估策略安装依赖并运行训练以下命令在仓库根目录的examples/baselines/ppo下执行PPO 基线完整参数与示例见 examples.sh。先看 state-based 训练最快的 PushCube-v1 在 GPU 上可在一分钟内完成PickCube-v1 约需 2–5 分钟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 仿真中保存轨迹.h5/.json。为保证带几何随机化的任务如 PickSingleYCB能用maniskill.trajectory.replay_trajectory正确重放评估环境数必须固定为 1对没有几何随机化的任务如 PushCube则无此限制。视觉RGB版 PPO视觉训练内存占用较大需根据 GPU 显存调整--num_envs。下方示例均控制在 15GB 显存以内python ppo_rgb.py --env_idPushCube-v1 \ --num_envs256 --update_epochs8 --num_minibatches8 \ --total_timesteps1_000_000 --eval_freq10 --num-steps20 python ppo_rgb.py --env_idPickCube-v1 \ --num_envs256 --update_epochs8 --num_minibatches8 \ --total_timesteps10_000_000 python ppo_rgb.py --env_idAnymalC-Reach-v1 \ --num_envs256 --update_epochs8 --num_minibatches32 \ --total_timesteps10_000_000 --num-steps200 --num-eval-steps200 \ --gamma0.99 --gae_lambda0.95SAC 基线示例SAC 基线位于 examples/baselines/sacstate-based 训练示例python sac.py --env_idPushCube-v1 \ --num_envs32 --utd0.5 --buffer_size500_000 \ --total_timesteps500_000 --eval_freq50_000 --control-modepd_ee_delta_posSAC README 特别提示控制模式--control-mode可以显著影响样本效率视觉版sac_rgbd.py默认支持 128×128 与 64×64 分辨率其他分辨率需自行修改网络结构并且用--no-include-state可剔除观测中的状态信息慎用许多环境的 goal 信息包含在 state 中。重放评估轨迹获得高质量视频评估后会生成以日期时间命名的 .h5/.json 文件可以用下述命令以光线追踪渲染重放python -m mani_skill.trajectory.replay_trajectory \ --traj-pathpath/to/trajectory.h5 --use-env-states --shaderrt-fast \ --save-video --allow-failure -o nonert-fast是速度优先的光线追踪器rt画质更高但更慢--allow-failure会连同失败轨迹一起保存视频。评估的公平性约定基线文档明确说明所有已报告结果均遵循 RL setup 页的评估配置——即ignore_terminationsTrue、reconfiguration_freq1、只统计完整 episode 指标。在复现或对比时请保持同样的评估设置否则结果不具备可比性。此外PPO 基线并不保证对所有任务有效——部分任务尚未配置稠密奖励或奖励尚未调优或对标准 PPO 来说过于困难。与从演示学习LfD路径的关系本文介绍的在线 RL 基线从奖励出发进行学习除此之外仓库还提供了利用演示数据demonstrations的强化学习离线 RL、在线模仿学习基线详见 learning_from_demos 文档。两者共享相同的环境 API、wrapper 与评估约定可依据你的数据条件与任务性质选择合适的学习范式。关键源码索引RL 总览文档、环境设置文档、基线文档CPUGymWrapper 实现CPU 单环境去批量化 评估指标记录ManiSkillVectorEnv 实现GPU 向量化环境、自动重置与final_info协议Flatten 系列 wrapper观测/动作空间压平PPO 基线代码 与 全部已验证命令SAC 基线代码 与 SAC README【免费下载链接】ManiSkillManipulation Skill Framework, an open source GPU parallelized robotics simulator and benchmark项目地址: https://gitcode.com/GitHub_Trending/ma/ManiSkill创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表