使用基於 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 libglewCentOS:
sudo yum install glew glew-develConda:
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 mesalibImportError: /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 patchelfImportError: /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_64RuntimeError: Failed to initialize OpenGL
解決方案:安裝 libEGL
Ubuntu:
sudo apt install libegl-dev libeglCentOS:
sudo yum install mesa-libEGL mesa-libEGL-develConda:
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-devCentOS:
sudo yum install libX11Conda:
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-devCentOS:
sudo yum install mesa-libOSMesa-develConda:
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