快捷方式

使用 MuJoCo 环境

在其官方存储库中,

MuJoCo 代表“多关节动力学与接触”。它是一个通用物理引擎,旨在促进机器人技术、生物力学、图形与动画、机器学习以及其他需要快速准确地模拟关节结构与其环境交互的领域的研究和开发。

最近,MuJoCo 被 DeepMind收购并开源。此后,该库对任何人都可以免费访问,无需许可。Python 绑定已被集成到库中,使得对 mujoco-py 的依赖性过时。然而,一系列库仍在使用旧的 mujoco 绑定。

在本文档中,我们详细介绍了新旧库绑定的问题和最佳实践。

安装 MuJoCo

渲染的前提条件(所有 mujoco 版本)

MuJoCo 提供了一些出色的渲染功能。为此,MuJoCo 将使用以下后端之一:glfw、osmesa 或 egl。其中,glfw 在无头环境中将无法工作。另一方面,osmesa 将无法在 GPU 上运行。因此,我们的建议是使用 egl 后端。

如果您在机器上有 sudo 权限,则可以安装以下依赖项以实现快速渲染

$ sudo apt-get install libglfw3 libglew2.0 libgl1-mesa-glx libosmesa6

如果您没有,可以通过 conda 安装这些库,但请注意,这不是预期的工作流程,事情可能不会按预期进行

$ conda activate mujoco_env
$ conda install -c conda-forge glew
$ conda install -c conda-forge mesalib
$ conda install -c anaconda mesa-libgl-cos6-x86_64
$ conda install -c menpo glfw3

在以上两种情况下,运行代码时,您需要告诉 mujoco 使用哪个后端。这可以通过设置适当的环境变量来完成。

$ conda env config vars set MUJOCO_GL=egl PYOPENGL_PLATFORM=egl
$ conda deactivate && conda activate mujoco_env

新绑定 (≥ 2.1.2)

您可以从mujoco 发行页面安装预编译的二进制文件。但是,在大多数情况下,您只需要 Python 绑定。这些可以通过 pip 安装。

$ conda create -n mujoco_env python=3.9
$ conda activate mujoco_env
$ pip install mujoco

旧绑定 (≤ 2.1.1): mujoco-py

在某些情况下,您可能需要使用旧的 mujoco 绑定。例如,当使用一些使用 mujoco-py 而非新绑定的遗留代码,或由于集群需求等原因时,可能会出现这种情况。请参考mujoco-py README.md。使用 conda,您的设置应如下所示

$ conda create -n mujoco_env python=3.9
$ conda activate mujoco_env
$ mkdir ~/.mujoco
$ cd ~/.mujoco
$ # check here for 2.1.0 versions https://github.com/deepmind/mujoco/releases/tag/2.1.0
$ # check here for earlier versions http://roboti.us/download.html
$ wget https://github.com/deepmind/mujoco/releases/download/2.1.0/mujoco210-linux-x86_64.tar.gz
$ tar -xf mujoco210-linux-x86_64.tar.gz
$ # for versions < 2.1.0, we need a licence file. Since mujoco is now free of
$ # of charge, this can obtained easily
$ wget http://roboti.us/file/mjkey.txt
$ # let's tell conda about our mujoco repo
$ conda env config vars set MJLIB_PATH=/path/to/home/.mujoco/mujoco210/bin/libmujoco210.so \
$ > LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/home/.mujoco/mujoco210/bin \
$ > MUJOCO_PY_MUJOCO_PATH=/path/to/home/.mujoco/mujoco210
$ # For versions < 2.1.0, we must link the key too
$ conda env config vars set MUJOCO_PY_MJKEY_PATH=/path/to/home/.mujoco/mjkey.txt
$ # reload the env
$ conda deactivate && conda activate mujoco_env

选项 1:使用 pip 安装 mujoco-py

我们推荐这样做,因为它以后可能难以更改代码,因为在使用原生 mujoco-py 代码为渲染使用 GPU 时存在已知问题。如果这是预期的用法,请参考下面的选项 2。

$ conda activate mujoco_env
$ pip install mujoco-py

选项 2:从克隆的仓库安装 mujoco-py

我们建议通过克隆仓库并本地安装 mujoco-py。如果您必须强制 mujoco-py 安装到 cuda 或修改 NVIDIA 驱动程序的路径(尤其是对于 mujoco-py 的旧版本),克隆仓库将有助于进行这些修改。

$ conda activate mujoco_env
$ cd path/to/where/mujoco-py/must/be/cloned
$ git clone https://github.com/openai/mujoco-py
$ cd mujoco-py
$ python setup.py develop
$ # the following line of code needs to be adatped, depending on where nvidia drivers are located
$ conda env config vars set LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/nvidia

mujoco-py 将在第一次在 Python 脚本中导入时执行一些构建操作。这意味着兼容性问题可能会在您第一次实际运行脚本之前未被注意到。要完成安装,请运行以下命令

$ python
>>> import mujoco_py

这应该会触发构建流程。

功能检查

要检查您的 mujoco-py 是否已针对 GPU 构建,请运行

>>> import mujoco_py
>>> print(mujoco_py.cymj) # check it has the tag: linuxgpuextensionbuilder

结果应包含一个带有标签 linuxgpuextensionbuilder 的文件名。

导入或渲染 Mujoco 环境时的常见问题

上述设置很可能导致一些问题。我们列出了运行 import mujoco_py 时的一些已知问题以及相应的故障排除方法

  1. 找不到 GL/glew.h

    /path/to/mujoco-py/mujoco_py/gl/eglshim.c:4:10: fatal error: GL/glew.h: No such file or directory
    4 | #include <GL/glew.h>
      |          ^~~~~~~~~~~
    

    解决方案:安装 glew 和 glew-devel

    • Ubuntu:sudo apt-get install libglew-dev libglew

    • CentOS:sudo yum install glew glew-devel

    • Conda:conda install -c conda-forge glew

  2. include/GL/glu.h:38:10: fatal error: GL/gl.h: No such file or directory
      #include <GL/gl.h>
               ^~~~~~~~~
    

    解决方案:一旦安装了 mesalib,这个问题应该会消失:conda install -y -c conda-forge mesalib

  3. ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /path/to/conda/envs/compile/bin/../lib/libOSMesa.so.8)
    

    解决方案:安装 libgcc,例如:conda install libgcc -y。然后确保它在执行过程中被加载

    export LD_PRELOAD=$LD_PRELOAD:/path/to/conda/envs/compile/lib/libstdc++.so.6
    
  4. FileNotFoundError: [Errno 2] No such file or directory: 'patchelf'
    

    解决方案pip install patchelf

  5. ImportError: /usr/lib/x86_64-linux-gnu/libOpenGL.so.0: undefined symbol: _glapi_tls_Current
    

    解决方案:将 conda 链接到正确的 libOpenGL.so 文件(将 /path/to/condamujoco_env 替换为正确的路径和名称)

    conda install -y -c conda-forge libglvnd-glx-cos7-x86_64 --force-reinstall
    conda install -y -c conda-forge xvfbwrapper --force-reinstall
    conda env config vars set LD_PRELOAD=/path/to/conda/envs/mujoco_env/x86_64-conda-linux-gnu/sysroot/usr/lib64/libGLdispatch.so.0
    
  6. mujoco.FatalError: gladLoadGL error
    
    /path/to/conda/envs/mj_envs/lib/python3.8/site-packages/glfw/__init__.py:912: GLFWError: (65537) b'The GLFW library is not initialized'
    

    解决方案:通常可以通过将 EGL 设置为 mujoco_gl 后端来解决此问题:MUJOCO_GL=egl python myscript.py

  7. 使用 slurm 等调度程序运行作业时出现类似 RuntimeErrror 的错误堆栈

    File "mjrendercontext.pyx", line 46, in mujoco_py.cymj.MjRenderContext.__init__

    File "mjrendercontext.pyx", line 114, in mujoco_py.cymj.    MjRenderContext._setup_opengl_context

    File "opengl_context.pyx", line 130, in mujoco_py.cymj.OffscreenOpenGLContext.__init__

RuntimeError: Failed to initialize OpenGL

Mujoco 的 EGL 代码全局索引设备,而 CUDA_VISIBLE_DEVICES(与作业调度程序如 slurm 一起使用时)返回本地设备 ID。这可以通过将 GPUS 环境变量设置为全局设备 ID 来解决。对于 slurm,可以通过 SLURM_STEP_GPUS 环境变量获取。

  1. 渲染的图像完全是黑色的。

    解决方案:在读取像素之前,请确保调用 env.render()

  2. 缺少 patchelf 依赖项。

    解决方案:使用 conda install patchelfpip install patchelf 进行安装

  3. 出现类似“Onscreen rendering needs 101 device”的错误

    解决方案:确保正确设置 DISPLAY 环境变量。

  4. ImportError: Cannot initialize a headless EGL display.

    解决方案:确保您已安装 mujoco 及其所有依赖项(请参阅上面的说明)。确保您已设置 MUJOCO_GL=egl。确保您的计算机上有可用的 GPU。

  5. cannot find -lGL: No such file or directory

    解决方案:调用 conda install -c anaconda mesa-libgl-devel-cos6-x86_64

  6. RuntimeError: Failed to initialize OpenGL
    

    解决方案:安装 libEGL

    • Ubuntu:sudo apt install libegl-dev libegl

    • CentOS:sudo yum install mesa-libEGL mesa-libEGL-devel

    • Conda:conda install -c anaconda mesa-libegl-cos6-x86_64

  7. fatal error: X11/Xlib.h: No such file or directory
       | #include <X11/Xlib.h>
       |          ^~~~~~~~~~~~
    

    解决方案:安装 X11

    • Ubuntu:sudo apt install libx11-dev

    • CentOS:sudo yum install libX11

    • Conda:conda install -c conda-forge xorg-libx11

  8. fatal error: GL/osmesa.h: No such file or directory
        1 | #include <GL/osmesa.h>
          |          ^~~~~~~~~~~~~
    compilation terminated.
    

    解决方案:安装 Osmesa

    • Ubuntu:sudo apt-get install libosmesa6-dev

    • CentOS:sudo yum install mesa-libOSMesa-devel

    • Conda:conda install -c menpo osmesa

  9. AttributeError: 'NoneType' object has no attribute 'glGetError'
    

    解决方案: :

    • Ubuntu:this_dir=$(pwd) && cd /usr/lib/x86_64-linux-gnu && sudo ln -s libglut.so.3.12 libglut.so.3 && cd $this_dir

文档

访问全面的 PyTorch 开发者文档

查看文档

教程

为初学者和高级开发者提供深入的教程

查看教程

资源

查找开发资源并让您的问题得到解答

查看资源