之前已经专门写过一个博客,用来记录之前在 Windows 系统下安装 MuJoCo 的经历:Win 10、Win 11 安装 MuJoCo 及 mujoco-py 教程_lan 606的博客-CSDN博客_windows安装mujoco
但其实在 Windows 系统下进行一些专业的开发还是会存在非常多的问题,加上我最近也是要频繁使用到 Linux 系统进行一些工作,索性在 Ubuntu 16.04 下重新安装。
至于我在 2022年 这个时间节点仍然选择 Ubuntu 16.04 这样一个即将被官方放弃维护的系统,主要还是因为我使用的一些工具在 Ubuntu 16.04 上的兼容性最好,但文中所述的方法理论上在所有的 Linux 发行版上都能得到一个不错的安装体验。
Gym 全称是 OpenAI Gym,是 OpenAI 开发的一个工具包,有强化学习基础或者正在学习强化学习的同学应该知道,强化学习是智能体不断地与环境进行交互,并逐步从环境中获取奖励以指导智能体探索行为的一种方法。而开发 Gym 的目标就是使得在整个开发强化学习算法过程中,不需要额外考虑复杂的环境搭建过程,只专注于算法本身性能的提升。
具体的关于 Gym 的说明可参考官方文档:Basic Usage - Gym Documentation (gymlibrary.dev)
具体的官方 GitHub 链接如下:GitHub - openai/gym: A toolkit for developing and comparing reinforcement learning algorithms.
Gym 的环境总共有五大类环境,分别是 Atari
、MuJoCo
、Toy Text
、Classic Control
和 Box2D
,其中 Toy Text
和 Classic Control
都是基础版 gym 就已经包括的环境大类,而其他三项都是需要额外进行安装的环境。
有一篇博客对 OpenAI Gym 的环境进行了完整的汇总,具体参见:强化学习基础篇(十)OpenAI Gym环境汇总 - 简书 (jianshu.com)
Anaconda 是一个开源的 Python 发行版本,其最大的优势是可以建立多个虚拟环境,且虚拟环境之间互不干扰。这样可以在多个环境间切换,应用在不同的 Python 工程中。
具体的 Anaconda 安装包可以在清华大学开源软件镜像站中下载,镜像站的网址为:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
具体我下载的是 Anaconda3-2020.07-Linux-x86_64.sh 版本。
Terminal 中先 cd
到具体的下载地址,然后输入下面的命令行:
bash Anaconda3-2021.11-Linux-x86_64.sh
具体的安装细节可参考下述链接:Ubuntu安装Anaconda详细步骤(Ubuntu21.10,Anaconda3)_萝北村的枫子的博客-CSDN博客_ubuntu安装anaconda
安装完成之后建议重启一下系统,然后再次 Ctrl + Alt + T
打开 Terminal 之后,就会出现下述界面:
由于每次自动打开 base 环境,但实际使用并不频繁,所以可使用下述命令关闭每次自动打开的虚拟环境:
conda config --set auto_activate_base false
可使用下述命令查看本机中已经创建的 Anacoda 虚拟环境:
conda info -e
上图中的 py37
虚拟环境就是本次安装完整版 Gym 所使用的虚拟环境。
若只存在一个 base
环境,可采用下述命令创建一个自己的虚拟环境:
conda create -n py37 python==3.7.0
在创建完虚拟环境之后,需采用下述命令激活,这样会在命令行开头多一个环境名:
conda activate py37
如果想让当前的虚拟环境处于失效状态,需在 Terminla 中运行下述命令:
conda deactivate
同时也可以注意到命令行开头的环境名消失不见了。
进入到虚拟环境之后,与正常的 Python 环境一样,都可以使用 pip
命令进行库的安装。
time.clock()
方法,这会导致 env.render()
方法失效,所以建议安装 Python 3.7。如果在上述虚拟环境中直接进行 pip install gym
命令,会直接给你安装最新的精简版 Gym,该版本的 Gym 不包含任何扩展环境,所以在该版本的 Gym 中无法使用Atari
、MuJoCo
和 Box2D
,只能使用基本的 Toy Text
和 Classic Control
。
而在 Gym 官方文档首页展示的 'LunarLander-v2'
这一经典环境都是需要 Box2D
的。
首先是安装精简版的 Gym:
pip install gym
然后,官方文档给出的方案是采用如下命令进行安装:
pip install gym[box2d]
实测通过该指令安装的 Box2D
无法正常调用 Gym 的渲染环境,会出现如下报错信息:
AttributeError: module ‘gym.envs.box2d’ has no attribute ‘LunarLander’
网上提供的教程基本都是让先安装 swig
模块,然后再安装 box2d
模块,但我多次创建虚拟环境并按这个方式完成安装之后依旧没法正常启动 LunarLander-v2
环境(只有其中一次是可以正常启动环境的,所以看脸)。
具体的一个参考博客如下(Windows端的处理教程):AttributeError: module ‘gym.envs.box2d‘ has no attribute ‘LunarLander‘_Faith_xzc的博客-CSDN博客
主要是受到这篇帖子的一个启发:尽管存在以下错误,我如何安装gym(box2d)? - 我爱学习网 (5axxw.com),通过 conda 命令进行安装。
需要注意的一点是,采用下述命令前是不需要运行精简版 gym 的 pip 安装指令的,直接运行下述命令就会匹配最佳的 0.21.0 的 gym 版本:
conda install -c conda-forge gym-box2d
在执行完上述指令后,就会在 py37
的虚拟环境下安装基础版的 gym
和运行 Box2D 类 gym 环境的 gym[box2d]
。
前文中已经介绍过,LunarLander-v2 是 gym Box2D 类中非常重要的一个环境,通过该环境可以检测我们在 3.2.2 步骤中安装的环境是否有问题。
首先新建一个 Python 脚本,输入如下代码:
import gym
import time
env = gym.make("LunarLander-v2")
env.reset()
done = False
while not done:
env.render()
action = env.action_space.sample()
observation, reward, done, info = env.step(action)
time.sleep(0.04)
# print(observation)
env.close()
如果前文是正确安装的话,应该能看到以下动画:
这里顺便给出将 gym 运行的图像保存为 gif 的代码:
from matplotlib import animation
import matplotlib.pyplot as plt
import gym
def save_frames_as_gif(frames, path='./', filename='gym_animation.gif'):
# Mess with this to change frame size
plt.figure(figsize=(frames[0].shape[1] / 72.0, frames[0].shape[0] / 72.0), dpi=72)
patch = plt.imshow(frames[0])
plt.axis('off')
def animate(i):
patch.set_data(frames[i])
anim = animation.FuncAnimation(plt.gcf(), animate, frames=len(frames), interval=50)
anim.save(path + filename, writer='imagemagick', fps=60)
# Make gym env
env = gym.make('LunarLander-v2')
# Run the env
observation = env.reset()
my_frames = []
done = False
while not done:
my_frames.append(env.render(mode="rgb_array"))
action = env.action_space.sample()
observation, reward, done, info = env.step(action)
env.close()
save_frames_as_gif(my_frames, path='./', filename='LunarLander-v2.gif')
这个经本人实际测试,直接在虚拟环境中采用 pip 安装即可,安装的 pip 命令如下:
pip install gym[atari]
pip install autorom[accept-rom-license]
因为 Atari 的环境真的非常丰富,总共可查的有62个环境,具体可以看 Gym 的官方文档说明:Complete List - Atari - Gym Documentation (gymlibrary.dev)
我在这里就用非常经典的 Breakout 游戏作为演示,来测试是否已经成功安装 gym[atari],测试的代码如下:
import gym
env = gym.make("ALE/Breakout-v5", render_mode="human")
env.reset()
done = False
while not done:
action = env.action_space.sample()
observation, reward, done, info = env.step(action)
env.close()
需要注意的是,Atari 环境的渲染需要在创建环境时就指出渲染的模式,否则会渲染失败。
如果已经成功安装,应该能看到如下界面:
官方 GitHub 指导中很明确的指出,从 “_v4” 版本开始,MuJoCo 环境不再依赖 mujoco-py
,而是改为依赖 mujoco
。且建议采用 pip install gym[mujoco]
来安装新版本的 MuJoCo 环境,采用 pip install gym[mujoco_py]
来安装旧版本的 MuJoCo 环境。
我因为有之前在 Windows 系统上安装 MuJoCo 环境的经历,并没有直接采用官方建议的这种 pip 安装方式进行安装,而是综合网上其他博客中的方法进行安装的。
参考的博客链接:
Mujoco210和Mujoco-py的安装 - 知乎 (zhihu.com)
Ubuntu20.04安装mujoco_小帅吖的博客-CSDN博客_ubuntu安装mujoco
并且由于上述安装的 gym 版本是 0.21.0,为了确保环境的适用性,我选择安装 mujoco 2.1.0,与之对应的就需要安装旧版本的 mujoco-py
,具体安装流程如下。
首先前往 DeepMind/MuJoCo 官方 GitHub 链接:Release 2.1.0 · deepmind/mujoco (github.com)
由于是在 Ubuntu 系统下进行安装,所以选择并下载 mujoco210-linux-x86_64.tar.gz
。
之后把下载的压缩包放在 Home 文件夹下,然后输入如下命令:
mkdir ~/.mujoco
tar -zxvf mujoco210-linux-x86_64.tar.gz -C ~/.mujoco
然后需要添加环境变量,先输入以下命令打开环境变量的文本:
gedit ~/.bashrc
在文档最后一行输入如下内容:
export LD_LIBRARY_PATH=~/.mujoco/mujoco210/bin
保存并退出文本编辑器,然后更新环境变量:
source ~/.bashrc
在安装完成后,需测试是否成功安装。输入如下指令进行测试:
cd ~/.mujoco/mujoco210/bin
./simulate ../model/humanoid.xml
如果出现如下界面,证明 mujoco 2.1.0 安装成功:
首先前往 OpenAI/mujoco-py 官方 GitHub 链接:openai/mujoco-py: MuJoCo is a physics engine for detailed, efficient rigid body simulations with contacts. mujoco-py allows using MuJoCo from Python 3. (github.com)
下载并解压至 ~/mujoco-py
文件夹下,随后激活之前创建的 conda
环境并进行安装:
conda activate py37
cd ~/mujoco-py
pip3 install -U 'mujoco-py<2.2,>=2.1'
pip install -r requirements.txt
pip install -r requirements.dev.txt
python3 setup.py install
然后需要添加环境变量,先输入以下命令打开环境变量的文本:
gedit ~/.bashrc
在文档最后一行输入如下内容:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/nvidia
保存并退出文本编辑器,然后更新环境变量:
source ~/.bashrc
在安装完成后,需测试是否成功安装。建一个 Python 脚本并使用前面刚刚创建的环境,输入如下代码进行运行:
import mujoco_py
import os
mj_path = mujoco_py.utils.discover_mujoco()
xml_path = os.path.join(mj_path, 'model', 'humanoid.xml')
model = mujoco_py.load_model_from_path(xml_path)
sim = mujoco_py.MjSim(model)
print(sim.data.qpos)
# [0. 0. 1.41. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
sim.step()
print(sim.data.qpos)
#[-1.12164337e-05 7.29847036e-22 1.39975300e+00 9.99999999e-01
# 1.80085466e-21 4.45933954e-05 -2.70143345e-20 1.30126513e-19
# -4.63561234e-05 -1.88020744e-20 -2.24492958e-06 4.79357124e-05
# -6.38208396e-04 -1.61130312e-03 -1.37554006e-03 5.54173825e-05
# -2.24492958e-06 4.79357124e-05 -6.38208396e-04 -1.61130312e-03
# -1.37554006e-03 -5.54173825e-05 -5.73572648e-05 7.63833991e-05
# -2.12765194e-05 5.73572648e-05 -7.63833991e-05 -2.12765194e-05]
需要注意的是,如果刚刚创建的脚本是在 Pycharm 中运行的,则还需要进行额外的设置。并且后续在 Pycharm 中每一个新的 Python 脚本都需要进行如下设置:
点击 Pycharm 菜单栏 Run->Edit Configurations->Environment variables,添加的环境变量的 Name 为 LD_LIBRARY_PATH
,Value 为 $LD_LIBRARY_PATH:/home/XXX/.mujoco/mujoco210/bin:/usr/lib/nvidia
。
在 Pycharm 中运行上述脚本,会报如下错误:
fatal error: GL/osmesa.h: 没有那个文件或目录
看其他博客的说法,这里主要是缺少了一个关键的包,采用下述命令安装即可:
sudo apt install libosmesa6-dev
我再次运行脚本文件的过程中,报了新的错误:
FileNotFoundError: [Errno 2] No such file or directory: ‘patchelf’: ‘patchelf’
这里是缺少另一个关键包,采用下述命令安装:
sudo apt-get update -y
sudo apt-get install -y patchelf
到这里,我的脚本就可以正常运行了。上文提到的解决方法都是我在这篇博客中看到的:安装mujoco_py遇到的一些问题与解决方法,如command ‘gcc‘ failed with exit status 1_陈三章的博客-CSDN博客
如果还有其他的一些报错,可以尝试去这篇博客中解决一下。
运行下述代码进行测试:
import gym
env = gym.make("Ant-v2")
env.reset()
done = False
for _ in range(1000):
env.render()
action = env.action_space.sample()
observation, reward, done, info = env.step(action)
env.close()
如果前文安装顺利的话,应该会出现如下界面:
至此,完整版的 Gym 环境安装完毕。