使用基于 MuJoCo 的环境¶
来自其官方仓库,
MuJoCo 代表 Multi-Joint dynamics with Contact (多关节动力学与接触)。它是一个通用的物理引擎,旨在促进机器人学、生物力学、图形与动画、机器学习以及其他需要快速准确模拟与环境交互的关节结构的领域的研究和开发。
最近,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
时的一些已知问题以及每个问题的解决方案
未找到 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
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
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
FileNotFoundError: [Errno 2] No such file or directory: 'patchelf'
解决方案:
pip install patchelf
ImportError: /usr/lib/x86_64-linux-gnu/libOpenGL.so.0: undefined symbol: _glapi_tls_Current
解决方案:将 conda 链接到正确的
libOpenGL.so
文件(将/path/to/conda
和mujoco_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
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
使用 slurm 等调度器运行作业时出现类似以下错误堆栈的 RuntimeError
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
环境变量获取它。
渲染的图像完全是黑色的。
解决方案:确保在读取像素之前调用
env.render()
。缺少
patchelf
依赖项。解决方案:使用
conda install patchelf
或pip install patchelf
进行安装诸如“Onscreen rendering needs 101 device”之类的错误
解决方案:确保正确设置
DISPLAY
环境变量。ImportError: 无法初始化无头 EGL 显示。
解决方案:确保您已安装 MuJoCo 及其所有依赖项(参见上面的说明)。确保您已设置
MUJOCO_GL=egl
。确保您的机器上有可用的 GPU。找不到 -lGL: 没有那个文件或目录
解决方案:调用
conda install -c anaconda mesa-libgl-devel-cos6-x86_64
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
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
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
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