ManiSkill 机器人仿真实战:3 步跑通 GPU 并行,把单张 4090 拉满
【免费下载链接】ManiSkillManipulation Skill Framework, an open source GPU parallelized robotics simulator and benchmark项目地址: https://gitcode.com/GitHub_Trending/ma/ManiSkill
ManiSkill 是一个 GPU 并行的机器人仿真平台,基于 SAPIEN 物理引擎,一行gym.make就能把上千个抓取任务同时跑起来,适合做强化学习、模仿学习算法评测和视觉数据生成。
⚡ 5 分钟跑起来:部署 + 第一个并行任务
部署很轻,装完就能跑,不用单独配物理引擎:
git clone https://gitcode.com/GitHub_Trending/ma/ManiSkill # 克隆仓库 cd ManiSkill && pip install -e . # 可编辑安装,自动带上 SAPIEN 依赖装好后用 64 个并行环境验证安装是否成功,所有返回都是 batched 的 torch 张量:
import gymnasium as gym import mani_skill.envs env = gym.make("PickCube-v1", num_envs=64, obs_mode="state") # 64 个 GPU 并行环境 obs, _ = env.reset(seed=0) obs, reward, *_ = env.step(env.action_space.sample()) # 随机动作走一步,看 reward.shape想知道这张卡到底能跑多快,直接跑官方基准脚本mani_skill/examples/benchmarking/gpu_sim.py,结束时会打印 FPS、PSPS 和显存占用:
python -m mani_skill.examples.benchmarking.gpu_sim --num-envs=1024 -e CartpoleBalanceBenchmark-v1 # 输出 FPS/PSPS/显存📊 看懂 FPS 和 PSPS:显存档位对照表
跑完基准脚本你会看到两个速度数字,别搞混:
- FPS:所有并行环境每秒走完的步数总和,数字好看但只是"总量"
- PSPS:每秒能完整跑多少"轮"(每轮 = 全部环境各走一步),训练吞吐量真正看它
- 显存:随并行数近似线性增长,和 FPS 无关——所以并行数定多少,先看显存档位
下表按显存档位给出"大概能开多少环境"(RTX 4090 上 Cartpole 任务实测,state 观测 + 640×480 单目 RGB 两组):
| 显存档位 | 状态观测能开多少并行环境 | 640×480 单目相机能开多少 | 满载时显存大概多少 |
|---|---|---|---|
| 8 GB 卡 | 约 500 | 约 256 | state ≈6.5 GB / RGB ≈5.5 GB |
| 12 GB 卡 | 约 1024 | 约 512 | state ≈10.9 GB / RGB ≈8.6 GB |
| 24 GB(4090 实测) | 2048+ | 1024+ | 三目 320×180 相机 @1024 ≈11.5 GB |
注意两点:观测越"重"(RGB+depth 比 state 慢、相机越多越费显存),能开的并行数就越少;任务网格越复杂(比如装配类),速度会比 Cartpole 低一截,下表是上限参考。
🔧 慢了就查这里
显存爆了:先砍并行数,再砍相机
现象:训练中途报 CUDA out of memory,进程直接挂掉。原因:num_envs开太大,或者相机数量和分辨率太高,显存随并行数线性上涨。动作:
- 先把
--num-envs砍到 1/4 --cam-width=128压低分辨率- 关掉同卡上其他吃显存的进程
步速越跑越慢:确认是不是没开推理模式
现象:实测速度明显低于基准脚本的数字。原因:训练循环没包torch.inference_mode(),autograd 在白白记录计算图,循环里还有同步操作。动作:
- 循环外套
torch.inference_mode() - 循环里别频繁
.item()或 print - 张量保持 torch 格式,不做 numpy 往返
刚启动特别卡:前几百步是预热
现象:头 100 步很慢,之后才稳定。原因:着色器编译、CUDA 上下文初始化和物理引擎预热都发生在启动阶段。动作:
- 预热 100~200 步再计时
- 计时前再
reset()一次 - 直接用基准脚本,它自带预热
物体穿透或乱飞:物理步长太粗
现象:高速碰撞时物体互相穿透,reward 出现 NaN。原因:sim_freq偏低,单步物理推进距离过大。动作:
sim_freq=120提到 240- 调低
control_freq拉长单步间隔 - 减小单步动作幅度
进阶玩法:并行数、换机器人、接 SB3
GPU 并行数怎么定:先看显存档位表定上限,再用num_envs=1024、sim_freq=120、control_freq=60这组默认值跑基准,FPS 和 PSPS 都满意就定下来。视觉任务把相机降到 128×128 往往比加并行数更划算。
同一个任务换机器人:很多任务支持robot_uids参数,比如gym.make("PickCube-v1", robot_uids="fetch")把 WidowX 换成 Fetch,多机器人任务可以传元组robot_uids=("panda", "fetch")。任务库从桌面抓取到 ManiSkill-HAB 厨房数字孪生都有,装好资产直接换 env_id 就能跑:
16 路并行同屏看:加parallel_in_single_scene=True再开render_mode="human",能把 16 个并行环境渲染进同一个 GUI 里,配shader_pack="rt-fast"还能上光追,适合录 demo 视频。
直接接主流 RL 框架:仓库里mani_skill/examples/baselines/stable_baselines3/有现成样例,把环境包成标准 VectorEnv 就能喂给 SB3 的 PPO/SAC;RL 和 IL 的完整接入步骤在docs/source/user_guide/reinforcement_learning/setup.md里。
避坑清单
- 并行环境数 ≤ 显存安全上限(对照上面档位表留 10% 余量)
num_envs大于 1 才真正进入 GPU 仿真- 无显示器的服务器上别用
render_mode="human" - 缺资产的任务先
python -m mani_skill.utils.download_asset <ENV_ID> - 开训前用
nvidia-smi确认显存占用
并行数、相机分辨率、推理模式这三处调完,单张 4090 跑 state 观测可以稳定过万 FPS,环境还能原样接进 SB3 和 SB3 之外的训练循环。完整任务列表、传感器和控制器参考在仓库docs/source/user_guide/下,社区入口和发布信息看顶层README.md。
【免费下载链接】ManiSkillManipulation Skill Framework, an open source GPU parallelized robotics simulator and benchmark项目地址: https://gitcode.com/GitHub_Trending/ma/ManiSkill
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考