MuJoCo是什么
MuJoCo是一个著名的多关节动力学和接触(Multi-Joint dynamics with Contact)模拟器, 在强化学习领域得到广泛应用. 2021年10月, DeepMind公司宣布将其收购并开源1, 进一步扩大了这一模拟器的影响力. MuJoCo 也就顺利成章地免费开放了.
开发者可以从github.com/deepmind/mujoco上下载到 MuJoCo 2.1及后续版本. 而更早的版本仍可以在roboti.us上下载到, 并且可以获得免费的授权文件mjkey.txt.
我自己安装MuJoCo的起因, 主要是想跟着 UC Berkeley 的深度强化学习课程CS285 Fall 2021 上手搭一个实验框架. 课程里用到的还是MuJoCo开源之前的版本mujoco200
, 因此这里写的一些经验可能不适合想要用新版本的朋友, 也可能会随着2022课程更新而过时, 仅供大家参考. 值得一提的是, 这门课程还开放了Google Colab在线编程资源, 不过在编译mujoco_py
的时候好像也会报错.
话说回来, 为什么要在WSL(Windows Subsystem for Linux)上安装MuJoCo呢?
首先, 我用了大概3个小时, 试图在Windows上编译这一套环境, 最后还是卡在了building 'mujoco_py.cymj' extension
这一步. 提示系统找不到指定的路径
但是具体哪里出了问题还是找不到头绪. 后来看到mujoco-py
的仓库中介绍:
Windows support has been DEPRECATED and removed in 2.0.2.0. One known good past version is 1.50.1.68.
大概就是说不推荐从2.0.2.0开始就放弃支持Windows平台了, 所以干脆就放弃在Windows上安装了.
那么下面就面临一个问题: 去哪里找一个Linux系统? 其实我个人是不喜欢双系统和虚拟机的. 双系统的话要为平行系统划出去很大硬盘空间, 在存储空间的分配上很不灵活. 而虚拟机的话有会占用很多运行资源, 大屏套小屏的样子也谈不上优雅. WSL就是一个十分优秀的解决方案. Windows在二进制层面上实现了对Linux子系统的支持, 使得两套操作系统不仅共用一套文件管理系统, 而且Linux下编译的程序可以在Windows下直接运行. 这就给熟悉Windows的朋友提供了更多可能性, 比如一边跑着Windows独占专业软件, 一边运行Linux环境下的Python脚本. 不过一个遗憾是WSL在设计之初主要面向通过命令行运行Linux指令的程序员, 因此并不原生地支持显示图形窗口. 好在这一问题已经有了解决方案, 后面会介绍.
WSL可以在Microsoft Store中下载到, 一些基础的配置与正常的Ubuntu系统一致. 网上有很多资料, 这里就不展开介绍了. 下面主要说说安装和配置MuJoCo的过程和我遇到的坑.
安装MuJoCo
一开始跟着课程助教写的教程装软件, 信心满满. 不过很快就碰到了挫折, 好在最终还是解决了.
MuJoCo200
MuJoCo本身很好安装.
mkdir ~/.mujoco
cd ~/.mujoco
wget https://www.roboti.us/download/mujoco200_linux.zip
unzip mujoco200_linux.zip
mv mujoco200_linux mujoco200
rm mujoco200_linux.zip
cp <location_of_mjkey.txt> .
一开始是跟着这个流程走的. 过程中可能网速会不稳定, 不过好在软件本身不大, 所以下载的时候不算焦躁. 当然, 急性子又比较会上网的朋友可以直接从这个链接https://www.roboti.us/download/mujoco200_linux.zip下载压缩包, 然后拷贝到相应地位置就行了. 因为现在软件已经完全开源了, 所以mjkey.txt
直接开放下载了, 不需要申请什么东西.
接下来就是把一些链接库添加到环境变量里.
export LD_LIBRARY_PATH=~/.mujoco/mujoco200/bin/
然后停一停, 测试一下是不是安装成功了. 在~/.mujoco
目录下运行:
cd ./mujoco200/bin
./simulate ../model/humanoid.xml
这个时候不出意外报错了. 具体错误提示已经找不到了, 不过大致就是说没有GLFW
这个库. 没有这个库的原因主要是WSL里没有图形界面, 自然也就没有安装相应的OpenGL图形库. 下面就见招拆招安装和配置一下图形库.
后面会提到, 在写代码的过程中其实没有用到
VcXsrv
等功能. 因为示例代码中将gym
运行过程的视频保存在tensorboard
中, 而tensorboard
可以在浏览器中显示, 也可以嵌入到VS Code
和Jupyter Notebook
中. 所以也就避免了直接跳出图形界面展示. 不过还是要安装下面这些OpenGL有关的库的.
WSL2中已经可以运行图形界面了, 不过因为我已经安装了WSL, 并且WSL2似乎在文件系统的共享上面不如WSL方便, 所以就没有考虑升级. 不过刚刚入门的朋友可以考虑一下WSL2.
配置OpenGL图形界面
参考在WSL上配置OpenGL3.3开发环境2的博客配置了一下图形界面. 基本上就是安装各种库.
sudo apt install libgl1-mesa-dev freeglut3-dev libglu1-mesa-dev
sudo apt install libsoil-dev libglm-dev libassimp-dev libglew-dev libglfw3-dev libxinerama-dev libxcursor-dev libxi-dev
然后在Windows端下载安装VcXsrv. 安装过程一路Next就好了. 安装完成之后记得运行一下VcXsrv. 注意取消勾选Native opengl
选项.
然后,在WSL终端中运行:
export DISPLAY=:0.0
一些测试
sudo apt install x11-apps mesa-utils
glxgears
详细参考原博客2.
接下来可能会碰到一点问题:
MuJoCo Pro version 2.00
ERROR: OpenGL version 1.5 or higher required
Press Enter to exit ...
办法是在~/.bashrc
的末尾写下面两行:
export MESA_GL_VERSION_OVERRIDE=3.3
unset LIBGL_ALWAYS_INDIRECT
然后运行
source ~/.bashrc
让配置生效.
找不到mjkey.txt
虽然在新的MuJoCo版本中已经不再需要mjkey.txt
了, 但是更早的版本中还有必要. 各种官方文档中都提示要把mjkey,txt
放在~/.mujoco/
目录下, 但是我这里会提示:
ERROR: Could not open activation key file mjkey.txt
这个Issue提到了同样的问题. 解决办法是将mjkey,txt
拷贝放在mujoco200
的bin
目录下, 也就是~/.mujoco/mujoco200/bin/mjkey.txt
. 强调要拷贝一份的原因是在python中调用mujoco_py
的时候可能还是会在~/.mujoco/
目录下寻找mjkey.txt
.
试一下
下面试一下MuJoCo是不是装好了:
cd ~/.mujoco/mujoco200/bin/
./simulate ../model/humanoid.xml
注意这里不进入~/.mujoco/mujoco200/bin/
这个目录下面好像还会提示找不到mjkey.txt
.
如果可以弹出下面的界面, 那就是安装好了.
👆如果能看到这个倒地小人, 那就配置好啦
安装Python环境
上面已经安装好了MuJoCo, 接下来安装一下mujoco_py
和gym
, 这样就可以在python的环境下训练强化学习模型了.
然后按照教程里的方式安装相应的python的依赖库. 这里最好先创建虚拟环境. 比如, 取名叫做rl
conda create -n rl python==3.6
conda activate rl
pip install numpy \
gym==0.17.2 \
mujoco-py==2.0.2.2 \
tensorboard==2.3.0 \
tensorboardX==1.8 \
matplotlib==2.2.2 \
ipython==6.4.0 \
moviepy==1.0.0 \
pyvirtualdisplay==1.3.2 \
torch==1.6.0 \
opencv-python==4.4.0.42 \
ipdb==0.13.3 \
box2d-py \
在安装过程中, 可能会提示没有安装numpy
, 这个重新执行pip
那一行命令就可以了. 还会碰到一些例如command ‘gcc‘ failed with exit status 1
等问题, 可以参考一些其他的博客3 4.
如果网速比较慢的话建议换源. 在学校的朋友们,
https://mirrors.bfsu.edu.cn/ubuntu
是一个不错的源.
接下来, 如果要在Jupyter Notebook运行的话, 还需要一下一点额外的配置. 首先, 为了运行mujoco_py
, 应该需要在sudo
模式下运行Jupyter Notebook. 但是sudo
模式下的环境变量与普通用户的有区别. 所以需要将
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/tiantian/.mujoco/mujoco200/bin
添加到文件/etc/environment
中. 然后
source /etc/environment
来更新环境变量.
然后, 安装一个依赖库:
pip install pyvirtualdisplay ipykernel
python -m ipykernel install --user --name rl --display-name rl_py36
接下来, 运行Jupyter Notebook:
sudo jupyter notebook --allow-root
将下面根据例程代码写到一个Cell里:
import mujoco_py
import gym
from gym.wrappers import Monitor
import glob
import io
import base64
from IPython.display import HTML
from IPython import display as ipythondisplay
## modified from https://colab.research.google.com/drive/1flu31ulJlgiRL1dnN2ir8wGh9p7Zij2t#scrollTo=TCelFzWY9MBI
def show_video():
mp4list = glob.glob('./content/video/*.mp4')
if len(mp4list) > 0:
mp4 = mp4list[0]
video = io.open(mp4, 'r+b').read()
encoded = base64.b64encode(video)
ipythondisplay.display(HTML(data='''<video alt="test" autoplay
loop controls style="height: 400px;">
<source src="data:video/mp4;base64,{0}" type="video/mp4" />
</video>'''.format(encoded.decode('ascii'))))
else:
print("Could not find video")
def wrap_env(env):
env = Monitor(env, './content/video', force=True)
return env
import os
from pyvirtualdisplay import Display
display = Display(visible=0, size=(1400, 900))
display.start()
env = wrap_env(gym.make("Ant-v2"))
observation = env.reset()
for i in range(20):
env.render(mode='rgb_array')
obs, rew, term, _ = env.step(env.action_space.sample() )
if term:
break;
env.close()
print('Loading video...')
show_video()
如果可以看到下面的样子, 那么就算是大功告成了.
👆这个小蚂蚁(?)是会动的
https://mujoco.readthedocs.io/en/latest/overview.html ↩︎
在WSL上配置OpenGL3.3开发环境: https://www.bilibili.com/read/cv8285780/ ↩︎ ↩︎
安装mujoco_py遇到的一些问题与解决方法,如command ‘gcc‘ failed with exit status 1: https://blog.csdn.net/weixin_44420419/article/details/116231500 ↩︎
Mujoco&Mujoco-py安装教程以及常见报错解决方法: https://zhuanlan.zhihu.com/p/352304615 ↩︎