ARTICLE DETAIL

资讯详情

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

ManiSkill Docker 部署全指南:基于 NVIDIA GPU 加速的容器化仿真环境搭建、验证与无头运行

ManiSkill Docker 部署全指南:基于 NVIDIA GPU 加速的容器化仿真环境搭建、验证与无头运行 ManiSkill Docker 部署全指南基于 NVIDIA GPU 加速的容器化仿真环境搭建、验证与无头运行【免费下载链接】ManiSkillManipulation Skill Framework, an open source GPU parallelized robotics simulator and benchmark项目地址: https://gitcode.com/GitHub_Trending/ma/ManiSkill导读ManiSkill 是一个基于 SAPIEN 构建的开源 GPU 并行化机器人仿真器与基准测试框架而 Docker 容器化是其官方推荐的快速部署方式之一。本文以 docs/source/user_guide/getting_started/docker.md 为骨架结合仓库内 docker/Dockerfile 及 Vulkan 配置文件系统讲解如何安装 NVIDIA Container Toolkit、拉取官方maniskill/base镜像、验证 CPU/GPU 仿真以及在没有显示器的容器环境中录制视频结果并深入剖析镜像内部的构建细节与常见故障排查。为什么用 Docker 运行 ManiSkillDocker 将软件及其依赖打包为标准化单元便于开发、交付与部署。ManiSkill 的依赖链较长物理引擎SAPIEN、PyTorch、Vulkan 渲染驱动、PhysX GPU 二进制库等手工安装容易因版本不一致而失败。官方提供构建好的镜像maniskill/base只需docker pull即可获得一套完整的仿真环境。结合 安装文档 中的系统支持矩阵可知ManiSkill 目前对 Linux NVIDIA GPU 的支持最完整CPU 仿真、GPU 仿真、渲染均支持Windows 与 WSL 均无法使用 GPU 仿真MacOS 不支持渲染。因此官方 Docker 镜像选择基于 NVIDIA 的 Linux 基础镜像确保容器内三种能力全部可用系统 / GPUCPU 仿真GPU 仿真渲染Linux / NVIDIA GPU✅✅✅Windows / NVIDIA GPU✅❌✅Windows / AMD GPU✅❌✅WSL / Anything✅❌❌MacOS / Anything✅❌✅前置准备安装 NVIDIA Container Toolkit要在容器内使用 GPU需要先安装NVIDIA Container Toolkit即曾经的 nvidia-docker v2。官方文档建议按 NVIDIA 的安装指南完成安装并完成 Linux 的 post-install 步骤如配置 repository、执行sudo nvidia-ctk runtime configure --runtimedocker等使得 Docker 支持--gpus参数。安装完成后先用一条命令验证 Docker 本身是否正常# 无需 sudo 即可运行 docker run hello-world如果能正常打印 hello-world 输出说明 Docker 守护进程与用户权限配置正确。若需要 sudo 才能运行请回到 post-install 步骤排查。拉取并运行官方镜像maniskill/baseManiSkill 官方在 Docker Hub 上发布了名为maniskill/base的镜像。拉取并执行两个代表性测试脚本即可验证 CPU 与 GPU 仿真是否都能工作docker pull maniskill/base # 测试 1运行一个随机动作 demo验证基础仿真与任务创建流程 docker run --rm -it --gpus all --pid host maniskill/base python -m mani_skill.examples.demo_random_action # 测试 2运行 GPU 并行仿真基准验证 GPU 物理仿真与并行渲染 docker run --rm -it --gpus all --pid host maniskill/base python -m mani_skill.examples.benchmarking.gpu_sim逐项解释这几个参数与命令--rm容器退出后自动删除容器文件系统保持宿主机干净适合一次性测试-it以交互模式运行便于查看脚本的实时输出与中断运行--gpus all将宿主机全部 NVIDIA GPU 暴露给容器这是 GPU 仿真的前提--pid host让容器与宿主机共享 PID 命名空间便于nvidia-smi等工具在容器内正确观测 GPU 上的进程信息python -m mani_skill.examples.demo_random_action运行随机策略 demo。从 demo_random_action.py 的源码可以看到其默认环境为PushCube-v1创建环境后会循环采样随机动作并打印 reward、terminated、truncated、infopython -m mani_skill.examples.benchmarking.gpu_sim运行 gpu_sim.py 基准脚本默认以 1024 个并行环境num_envs1024压测 GPU 仿真的env.step吞吐。两个脚本均基于tyro做命令行参数解析在容器内也可直接追加参数例如指定任务、环境数量、观测模式等详见下文。镜像内部结构解析 docker/Dockerfile官方镜像的构建定义保存在仓库根目录的 docker/Dockerfile 中理解它有助于定位容器内的问题。其关键构建步骤依次为1. 基础镜像与驱动能力FROM nvidia/cudagl:11.3.1-devel-ubuntu20.04 ENV NVIDIA_DRIVER_CAPABILITIESall ARG PYTHON_VERSION3.9基础镜像为nvidia/cudagl:11.3.1-devel-ubuntu20.04自带 CUDA 11.3 与 OpenGL 支持NVIDIA_DRIVER_CAPABILITIESall让容器内挂载全部 NVIDIA 驱动能力compute、graphics、utility 等这是容器内能同时做 GPU 物理仿真与 GPU 渲染的关键Python 版本固定为 3.9。2. 系统级依赖安装了cmake、build-essential、git、vim、tmux、htop等开发与调试工具以及渲染相关的libvulkan1、vulkan-utils、libegl1、libxext6和xvfbX virtual framebuffer用于无显示器场景下的离屏渲染。构建完成后清理 apt 缓存。3. 安装 Miniconda 与 Python 环境RUN curl -o ~/miniconda.sh https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh ... ENV PATH/opt/conda/bin:$PATH镜像内置 Miniconda安装在/opt/conda并写入PATH容器内可直接使用conda/pip管理环境。4. 写入 Vulkan 配置文件COPY nvidia_icd.json /usr/share/vulkan/icd.d/nvidia_icd.json COPY nvidia_layers.json /etc/vulkan/implicit_layer.d/nvidia_layers.json这一步直接对应 安装文档 故障排查一节中提到的三个 Vulkan/EGL 关键文件。镜像构建时显式拷贝其中两个到容器内第三个10_nvidia.json也以 docker/10_nvidia.json 的形式随仓库分发。三个文件的作用分别是docker/nvidia_icd.jsonVulkan 的 ICDInstallable Client Driver描述文件指向libGLX_nvidia.so.0让 Vulkan 运行时能发现 NVIDIA 驱动实现安装到/usr/share/vulkan/icd.d/nvidia_icd.jsondocker/nvidia_layers.json定义VK_LAYER_NV_optimus隐式层通过__NV_PRIME_RENDER_OFFLOAD1环境变量启用安装到/etc/vulkan/implicit_layer.d/nvidia_layers.json。官方安装文档指出该文件对部分 GPU如 A100是必需的docker/10_nvidia.jsonEGL 的 glvnd 厂商配置指向libEGL_nvidia.so.0用于 EGL 离屏渲染路径对应宿主机的/usr/share/glvnd/egl_vendor.d/10_nvidia.json。这三份文件正是 ManiSkill 在容器内能够进行 Vulkan/EGL 渲染的关键——若缺失会出现渲染初始化失败或只能使用 CPU 资源的问题。5. 安装 ManiSkill 与 PyTorchRUN pip install --upgrade mani-skill3.0.1 pip cache purge RUN pip install torch镜像固定安装mani-skill3.0.1即当前仓库对应的 3.x 系列版本随后安装 PyTorch。注意这里安装的是 PyPI 上的发布版而非仓库源码若需要最新开发特性可在容器内自行git clone本仓库后以源码方式安装。6. 预下载 PhysX GPU 二进制RUN python -c exec(import sapien.physx as physx;\ntry:\n physx.enable_gpu()\nexcept:\n pass;)ManiSkill 的 GPU 物理仿真由 SAPIEN 驱动的 PhysX 支撑。镜像构建阶段提前调用sapien.physx.enable_gpu()触发 GPU 二进制库的下载与缓存从而避免首次运行容器时再下载造成的不便构建机需具备网络条件。在容器内验证仿真与基准测试随机动作 demodemo_random_action脚本创建环境后不断执行随机策略直到 episode 结束是验证环境能否正常创建、步进的最快方式。结合 demo_random_action.py 源码常用参数包括# 指定任务环境 docker run --rm -it --gpus all --pid host maniskill/base \ python -m mani_skill.examples.demo_random_action -e PickCube-v1 # 指定并行环境数量num_envs 1 时自动启用 GPU 仿真模式 docker run --rm -it --gpus all --pid host maniskill/base \ python -m mani_skill.examples.demo_random_action -e PickCube-v1 -n 16 # 指定观测模式与控制模式 docker run --rm -it --gpus all --pid host maniskill/base \ python -m mani_skill.examples.demo_random_action -e PickCube-v1 -o state -c pd_ee_delta_pose # 指定渲染着色器如光线追踪 rt-fast docker run --rm -it --gpus all --pid host maniskill/base \ python -m mani_skill.examples.demo_random_action -e PickCube-v1 --shader rt-fast脚本默认render_modergb_array离屏渲染为 RGB 数组obs_mode默认为nonenum_envs默认为 1。参数别名与含义在源码Args数据类中有完整注释包括-e/--env-id、-o/--obs-mode、-c/--control-mode、-n/--num-envs、-b/--sim-backend、--render-mode、--shader、--record-dir等。GPU 并行仿真基准gpu_sim.py 用于压测 GPU 并行仿真的吞吐默认以 1024 个环境跑 1000 步env.step并通过内置Profiler输出 FPS 等统计。常用参数# 指定并行环境数与观测模式rgbd 会同时渲染 RGB 深度 docker run --rm -it --gpus all --pid host maniskill/base \ python -m mani_skill.examples.benchmarking.gpu_sim --num-envs1024 docker run --rm -it --gpus all --pid host maniskill/base \ python -m mani_skill.examples.benchmarking.gpu_sim --num-envs64 --obs-modergbd # 将结果写入 CSV保存到容器内 ./benchmark_results/ 目录 docker run --rm -it --gpus all --pid host maniskill/base \ python -m mani_skill.examples.benchmarking.gpu_sim --num-envs1024 --save-results/tmp/results.csv需要提醒的是容器是临时且隔离的。由于命令使用了--rm容器内下载的资产、录制的视频、生成的 CSV 在容器退出后都会丢失。若需要持久化数据例如 ManiSkill 的资产目录、基准结果建议挂载宿主机目录例如-v $(pwd)/ms_data:/root/.maniskill/data。ManiSkill 支持用环境变量MS_ASSET_DIR指定资产存放目录默认~/.maniskill/data容器内也可按需设置。无显示环境的结果观测录制视频而非 GUI文档明确指出容器内通常无法弹出 GUI 窗口来实时查看仿真结果。这是容器隔离显示环境X11/Wayland所致。替代方案是让 demo 脚本直接把渲染结果录制为视频文件# 以 rgb_array 离屏渲染并录制视频到指定目录 docker run --rm -it --gpus all --pid host maniskill/base \ python -m mani_skill.examples.demo_random_action -e PickCube-v1 --record-dir /tmp/videos从源码看--record-dir会触发RecordEpisodewrappermani_skill/utils/wrappers在环境上自动收集每步渲染帧并合成为视频info_on_videoFalse, save_trajectoryFalse脚本结束时输出保存路径。gpu_sim基准脚本同样支持--save-video会将多个并行环境的渲染帧拼接tile_images成一个大视频保存到容器内./videos/ms3_benchmark/目录docker run --rm -it --gpus all --pid host maniskill/base \ python -m mani_skill.examples.benchmarking.gpu_sim --num-envs64 --save-video之后通过docker cp或挂载卷把视频取回宿主机即可查看。进阶容器内运行 GUI 的历史方案谨慎使用在当前 docker.md 中以注释形式保留了两种在容器内运行 GUI 的方案属于旧镜像mani-skill/mani-skill、任务PickCube-v0时期的做法仅作参考方案一宿主机带显示器透传 X11# 允许本地 root 的 X11 连接 xhost local:root # 将宿主机的 X11 socket 与 DISPLAY 环境变量传入容器 docker run --rm -it --gpus all \ -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY \ mani-skill/mani-skill \ python -m mani_skill.examples.demo_manual_control -e PickCube-v0 --enable-sapien-viewer方案二无头服务器通过 VNC 访问基于x11vnc与fluxbox在容器内虚拟出桌面再将 VNC 端口默认 5900映射到宿主机docker run --rm --gpus all -p 5900:5900 \ mani-skill/mani-skill \ apt update bash -c apt install -yqq x11vnc fluxbox x11vnc -create -env FD_PROG/usr/bin/fluxbox \ -env X11VNC_FINDDISPLAY_ALWAYS_FAILS1 -env X11VNC_CREATE_GEOM${1:-1920x1080x16} \ -gone pkill Xvfb -nopw随后在宿主机转发 5900 端口本地使用 VNC 客户端连接localhost:5900即可看到容器内桌面。需要说明的是这两段命令针对旧版镜像与旧任务 ID且依赖容器内能访问 apt 源在线安装软件当前官方镜像maniskill/base已内置xvfb离屏渲染录制视频是更受支持的路径。常见问题与故障排查Vulkan / 渲染初始化失败如果容器内渲染报错如RuntimeError: vk::Instance::enumeratePhysicalDevices: ErrorInitializationFailed、Some required Vulkan extension is not present或直接段错误大概率是 Vulkan 驱动配置损坏或缺失。请依次确认镜像内以下文件存在/usr/share/vulkan/icd.d/nvidia_icd.json/usr/share/glvnd/egl_vendor.d/10_nvidia.json/etc/vulkan/implicit_layer.d/nvidia_layers.json可选但对 A100 等 GPU 必要对照 安装文档 的 Troubleshooting 一节缺失时可按其给出的 JSON 内容手动创建。容器内若缺少这些文件可将仓库 docker 目录下的对应 JSON 文件拷贝进去或基于该 Dockerfile 重新构建。NVIDIA 驱动未正确挂载ldconfig -p | grep libGLX_nvidia若找不到libGLX_nvidia.so说明宿主机 NVIDIA 驱动安装不正确。官方建议安装nvidia-driver-xxx系驱动不要选包名带 server 的版本并避免使用 runfile 等方式安装。容器内也可用nvidia-smi确认 GPU 是否可见。资产与数据下载容器内首次运行某些任务需要下载资产默认存于~/.maniskill/data。可通过环境变量调整export MS_ASSET_DIR/path/to/where/to/save/all/mani_skill_data # 修改资产目录 export MS_SKIP_ASSET_DOWNLOAD_PROMPT1 # 跳过缺失资产的下载询问在 Docker 场景下建议将MS_ASSET_DIR指向挂载的宿主机卷避免每次--rm后重复下载。总结ManiSkill 的 Docker 方案将「Linux NVIDIA GPU SAPIEN PhysX Vulkan」这一套复杂依赖封装进maniskill/base镜像基于nvidia/cudagl基础镜像、内置 Vulkan ICD/隐式层配置、固定安装mani-skill3.0.1并预取 PhysX GPU 二进制。使用者只需安装 NVIDIA Container Toolkit即可通过docker pull maniskill/base与--gpus all一行命令跑起 GPU 并行仿真与基准测试对于无显示器的容器环境--record-dir与--save-video提供了成熟的视频录制观测路径。理解 docker/Dockerfile 与三份 JSON 配置文件的职责也能在遇到 Vulkan 渲染、驱动挂载等问题时快速定位根因。【免费下载链接】ManiSkillManipulation Skill Framework, an open source GPU parallelized robotics simulator and benchmark项目地址: https://gitcode.com/GitHub_Trending/ma/ManiSkill创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表