- 一、安装基本操作
- 1.1 查看基础信息
- 1.2 国内换源
- 1.3 安装nvidia-docker
- 二、docker基本操作
- 三、例子:强化学习库的docker环境搭建
- 四、亲手制作专属的强化学习镜像
- 4.1 整体思路
- 4.2 具体的操作
- 4.3 全部写进DockerFile
- 五、强化环境的坑
- 总结
目的: 学会制作自己的强化学习环境镜像 一、安装基本操作 1.1 查看基础信息
# 查看系统版本号 cat /etc/issue # Ubuntu 18.04 # 查看系统ip地址 ifconfig # 查看系统当前状态 htop // 强烈建议安装使用htop # 安装Nvidia驱动后查看显卡信息(驱动版本、最高支持的cuda版本) nvidia-smi // 显卡驱动安装见https://www.nvidia.cn/geforce/drivers/ # 驱动495.441.2 国内换源
- 给apt换源sudo vim /etc/apt/sources.list,然后更新sudo apt-get update。具体源参见https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
- 给conda换源,修改~/.condarc文件,具体源见https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/
- 给pip换源,指令参见https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
- 用conda安装pytorch时需要添加pytorch源,conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
1.3 安装nvidia-docker如果大家会科学上网挂代理,就不需要换源处理了,之前偷懒踩过的坑。
- 首先在ubuntu安装正常的docker engine,参见Docker安装教程
# 如果已有docker,安装前卸载旧版本 sudo apt-get purge docker-ce docker-ce-cli containerd.io sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd # 以shell脚本方式安装 curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh
- 然后配置能让docker容器使用GPU加速的工具包nvidia-docker,参见Nvidia-docker安装教程
# 获取系统对应的版本以及GPG密钥 distribution=$(. /etc/os-release;echo $ID$VERSION_ID) && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list # 安装nvidia-docker工具包 sudo apt-get update sudo apt-get install -y nvidia-docker2 sudo systemctl restart docker # 检查安装是否成功 sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi # 稍微解释下这条命令 --rm 表示如果container ID存在,则自动删除该容器,--gpus all表示给容器所有GPU的支持,nvidia/cuda:11.0-base是容器ID,nvidia-smi是启动容器后执行的命令
- 我们来区别一下nvidia-docker与docker的用法
- docker run -it nvidia/cuda:11.0-base bash:在该镜像的容器中开一个bash,输入nvidia-smi
- nvidia-docker run -it nvidia/cuda:11.0-base bash:操作同上
关于Docker更为详细的介绍可以参见Docker Tutorial For Beginners和知乎Docker简单的命令大全
# 拉取镜像 docker pull nvidia/cuda:11.0-base # 查看镜像 docker images # 删除镜像 docker rmi三、例子:强化学习库的docker环境搭建# 容器相关操作 docker container # 以交互方式创建容器 docker run -it nvidia/cuda:11.0-base bash # 查看所有状态(运行、停止、退出)的容器 docker ps -a # 删除所有停止状态的container #docker container prune也能起到相同作用 docker rm $(docker ps -a -q -f status=exited)
先来一个例子,看看如何搭建起18年开源的一个强化学习代码库环境源:https://github.com/ShangtongZhang/DeepRL
- 用github镜像网站github.com.cnpmjs.org的方式来clone仓库
# 没权限就sudo git clone https://github.com.cnpmjs.org/ShangtongZhang/DeepRL.git
- 在运行DockerFile之前需要在https://roboti.us/license.html网站上获取activation key,复制粘贴到一个新建文件mjkey.txt中
- 本来pip install .来使用仓库中的setup.py就可以了,但因为作者限制python3.6版本,而dm_control更新到只维护3.7及其上版本导致了不兼容,因此要稍微魔改一下DockerFile如下:
FROM nvidia/cuda:10.0-base
RUN apt update && DEBIAN_FRonTEND=noninteractive apt install -y --allow-unauthenticated --no-install-recommends
build-essential apt-utils cmake git curl vim ca-certificates
libjpeg-dev libpng-dev
libgtk3.0 libsm6 cmake ffmpeg pkg-config
qtbase5-dev libqt5opengl5-dev libassimp-dev
libboost-python-dev libtinyxml-dev bash
wget unzip libosmesa6-dev software-properties-common
libopenmpi-dev libglew-dev openssh-server
libosmesa6-dev libgl1-mesa-glx libgl1-mesa-dev patchelf libglfw3
RUN rm -rf /var/lib/apt/lists/*
ARG UID
RUN useradd -u $UID --create-home user
USER user
WORKDIR /home/user
RUN wget -q https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh &&
bash Miniconda3-latest-Linux-x86_64.sh -b -p miniconda3 &&
rm Miniconda3-latest-Linux-x86_64.sh
ENV PATH /home/user/miniconda3/bin:$PATH
RUN mkdir -p .mujoco
&& wget https://www.roboti.us/download/mjpro150_linux.zip -O mujoco.zip
&& unzip mujoco.zip -d .mujoco
&& rm mujoco.zip
RUN wget https://www.roboti.us/download/mujoco200_linux.zip -O mujoco.zip
&& unzip mujoco.zip -d .mujoco
&& rm mujoco.zip
COPY ./mjkey.txt .mujoco/mjkey.txt
ENV LD_LIBRARY_PATH /home/user/.mujoco/mjpro150/bin:${LD_LIBRARY_PATH}
ENV LD_LIBRARY_PATH /home/user/.mujoco/mjpro200_linux/bin:${LD_LIBRARY_PATH}
# 改动一:python换成3.7
RUN conda install -y python=3.7
RUN conda install mpi4py
COPY requirements.txt requirements.txt
# 改动二:给pip和conda换了清华源
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
RUN conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
RUN pip install -r requirements.txt
RUN pip install glfw Cython imageio lockfile
RUN pip install mujoco-py==1.50.1.68
# 改动三:现在直接pip install dm_control就好了
RUN pip install dm_control
RUN pip install git+https://github.com.cnpmjs.org/ShangtongZhang/dm_control2gym.git@scalar_fix
RUN pip install git+git://github.com/openai/baselines.git@8e56dd#egg=baselines
# 改动四:因为不能用setup.py,因此我们直接用源码跑呗
RUN git clone https://github.com.cnpmjs.org/ShangtongZhang/DeepRL.git deep_rl
WORKDIR /home/user/deep_rl
- 运行docker build --build-arg UID=11 -t deep_rl:v1.5 .制作镜像
- 利用nvidia-docker run -it deep_rl:v1.5 bash创建一个容器,并进入
- 运行python examples.py,修正一下由于我们使用了py3.7导致的一些代码错误:
- 错误一:
- 错误二:
- 修正错误,把async变量名改成async_replay就好了:
- 修改examples.py,比如用ddpg跑一个HalfCheetah-v2,然后python exapmles.py就可以在容器中跑起来了
- 最后可从大佬代码库中相关的sh文件以及template_jobs.py中学习并行跑实验的经验!
四、亲手制作专属的强化学习镜像 4.1 整体思路关于Docker容器的启动方式、数据保存、网络设置、删除退出等相关知识,请自行进一步查阅
- 底层依赖包/动态库、个性化配置请在root权限下操作(tmux, zsh, apt install各种自己喜欢在容器中用的命令)
- mujoco安装!配置!
- miniconda安装!配置!
- conda内要确定好安装的python版本!
- dm_control安装!配置!
- gym安装!配置!
- 各种你需要的python包
- 各种你要用到开源库
- 最后是自己的代码请记得ADD/COPY进来= =
4.2 具体的操作遵循的一个原则:越频繁改动的放到最后添加,比如包可能会经常更新、开源库又有一个新功能的commit、代码经常需要修改等
- 选择cuda10.0的基础镜像,然后创建一个在后台运行的容器,命名为myrl10
# 网络选择与host一样,可自行设置,-d表示后台运行 sudo nvidia-docker run --network host --name myrl10 -itd nvidia/cuda:10.0-base bash
- docker exec -it myrl10 bash:进入容器中,查看相关信息,然后开始从零配置环境
- cat /etc/issus:Ubuntu 18.04.1 LTS
- nvidia-smi:看显卡驱动版本、最高支持的cuda版本
- 查看/usr/local/cuda:cuda确实是10.0,安心!
- 一开始默认是root权限哦!我是root!我是root!yes!
- 安装相应系统依赖,缺啥命令装啥,比较喜欢tmux,装!
# 给apt换源
修改/etc/apt/sources.list如下:
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
################
apt update && DEBIAN_FRONTEND=noninteractive apt install -y --allow-unauthenticated --no-install-recommends
build-essential apt-utils cmake git curl vim ca-certificates sudo tmux
libjpeg-dev libpng-dev
libgtk3.0 libsm6 cmake ffmpeg pkg-config
qtbase5-dev libqt5opengl5-dev libassimp-dev
libboost-python-dev libtinyxml-dev bash
wget unzip libosmesa6-dev software-properties-common
libopenmpi-dev libglew-dev openssh-server
libosmesa6-dev libgl1-mesa-glx libgl1-mesa-dev patchelf libglfw3
&& rm -rf /var/lib/apt/lists/*
- 装完系统依赖,尽量放弃root身份(顺便给个root权限),新建用户pamirl和密码qwerty,尽量在用户目录下进行
useradd --create-home --shell /bin/bash pamirl adduser pamirl sudo echo 'pamirl:qwerty' | chpasswd cd /home/pamirl
- 安装最新的Miniconda,并设置环境变量
# 采用了从清华源下载 wget -q https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86.sh bash Miniconda3-latest-Linux-x86_64.sh -b -p miniconda3 echo "export PATH=/home/pamirl/miniconda3/bin:$PATH" >> .bashrc && source.bashrc
- 安装DeepMind最新开源的mujoco210物理引擎,不再需要activation key,并设置环境变量
wget https://github.com.cnpmjs.org/deepmind/mujoco/releases/download/2.1.0/mujoco210-linux-x86_64.tar.gz
mkdir -p .mujoco
tar -zxf mujoco210-linux-x86_64.tar.gz -C "$HOME/.mujoco"
echo "export LD_LIBRARY_PATH=/home/pamirl/.mujoco/mujoco210/bin:${LD_LIBRARY_PATH}" >> .bashrc && source .bashrc
- 创建一个名为deep_rl的conda环境,选择python版本3.8,然后并激活该环境
conda config --describe # 给conda换源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 conda create -y -n deep_rl python=3.8 conda init bash source .bashrc && conda activate deep_rl
- 安装mujoco-py来调用mujoco,详情见mujoco-py
#pip换源,也选择修改文件~/.config/pip/pip.conf为具体源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple # 查看有多少个pip find ~ -iname pip # 查看自己具体用的哪个pip,一般是deep_rl环境内python包对应的pip pip -V pip install -U 'mujoco-py<2.2,>=2.1'
- 安装符合版本信息的pytorch,详情见pytorch官网
conda install pytorch=1.10.1 torchvision torchaudio cudatoolkit=10.2
- 这里只介绍安装最新版的dm_control suite、最基础的gym环境以及dm_control2gym(注:gym[mujoco]需要mujoco物理引擎版本低于2.0)remember to fix scalar bug in dm_control2gym
pip install -q dm_control gym pip install -U git+https://github.com.cnpmjs.org/martinseilair/dm_control2gym.git
- 检查当前的环境是否为自己想要的,退出容器后,保存当前myrl10容器为新的镜像dm_control:py38_mujoco210
docker commit -m "dm_control built from cuda10.0" -a "Nemo" myrl10 dm_control:py38_mujoco2104.3 全部写进DockerFile
这里给出一个配置最新基于mujoco物理引擎210的dm_control强化环境。cuda版本10.2 python版本3.8 pytorch版本1.10.1 cudnn版本7.6.5
FROM nvidia/cuda:10.0-base
COPY ./change_apt.txt /
RUN cp /etc/apt/sources.list /etc/apt/sources_init.list
&& cat /change_apt.txt > /etc/apt/sources.list
&& rm /change_apt.txt
&& apt update
RUN apt update && DEBIAN_FRonTEND=noninteractive apt install -y --allow-unauthenticated --no-install-recommends
build-essential apt-utils cmake git curl vim ca-certificates sudo tmux
libjpeg-dev libpng-dev
libgtk3.0 libsm6 cmake ffmpeg pkg-config
qtbase5-dev libqt5opengl5-dev libassimp-dev
libboost-python-dev libtinyxml-dev bash
wget unzip libosmesa6-dev software-properties-common
libopenmpi-dev libglew-dev openssh-server
libosmesa6-dev libgl1-mesa-glx libgl1-mesa-dev patchelf libglfw3
&& rm -rf /var/lib/apt/lists/*
RUN useradd --create-home --shell /bin/bash pamirl
&& adduser pamirl sudo
&& echo 'pamirl:qwerty' | chpasswd
&& su pamirl
USER pamirl
WORKDIR /home/pamirl
RUN wget -q https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh &&
bash Miniconda3-latest-Linux-x86_64.sh -b -p miniconda3 &&
rm Miniconda3-latest-Linux-x86_64.sh
ENV PATH /home/pamirl/miniconda3/bin:$PATH
RUN wget https://github.com.cnpmjs.org/deepmind/mujoco/releases/download/2.1.0/mujoco210-linux-x86_64.tar.gz
&& mkdir -p .mujoco
&& whoami
&& pwd
&& tar -zxf mujoco210-linux-x86_64.tar.gz -C "$HOME/.mujoco"
&& rm mujoco210-linux-x86_64.tar.gz
ENV LD_LIBRARY_PATH /home/pamirl/.mujoco/mujoco210/bin:${LD_LIBRARY_PATH}
COPY ./change_conda.txt ./
RUN conda config --describe
&& cat ./change_conda.txt > .condarc
&& rm change_conda.txt
&& conda create -y -n dm_control python=3.8
RUN echo "conda activate dm_control" >> ~/.bashrc
SHELL ["/bin/bash", "--login", "-c"]
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
&& source activate dm_control
&& cat .condarc
&& pip install -q dm_control gym
&& pip install -U 'mujoco-py<2.2,>=2.1'
&& conda install -y pytorch=1.10.1 torchvision torchaudio cudatoolkit=10.2
&& pip install glfw Cython imageio lockfile
&& pip install git+https://github.com.cnpmjs.org/martinseilair/dm_control2gym.git
# Add Your Code Below
在如下文件中,运行:docker build -t dm_control:py38_torch1.10_mujoco210 .
其中change_apt.txt为:
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
change_conda.txt为:
channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ - defaults show_channel_urls: true custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud五、强化环境的坑
- 因为各个环境版本、python版本、底层支持的物理引擎版本并不全兼容,所以有不少坑。
- 首先是OpenAI Gym、DeepMind Control Suite和PyBullet是三大用来benchmark强化算法性能的基础环境,其次Gym主要有Atari、 roboschool、Mujoco、Classic Control等四个基准环境,然后dm_control则有更为多样化基于mujoco的基准环境,而Bullet是物理引擎,因此催生了dm_control2gym wrapper,PyBullet来以gym的方式让rl算法统一地调用环境接口
- 因此,可以创建三个完全不同的conda环境,来安装gym atari/ dm_control mujoco/ gym bullet三个基准环境,统一以gym的方式作为环境接口,给RL算法进行调用
- 如果mujoco版本是2.0及以上,用gym来调用mujoco的话,会存在严重的问题,详情见gym github#1541 issue,因此benchmark 算法性能要在低于2.0的mujoco引擎驱动的gym上。所以gym本身自带环境中最推荐的是使用atari环境
- 如果想benchmark基于Mujoco物理引擎的环境,则推荐使用最新开源基于mujoco的dm_control
- 如果想换物理引擎,那么PyBullet以gym的接口实现了许多环境,推荐使用pybullet
总结这仅仅是强化环境!!!如果想使用强化的算法库,那么版本兼容的任务则更为艰巨了。
最终我们以两种方式创建了两个镜像:
- 选择强化环境前,先选定benchmark的环境,如果是Atari推荐用gym本身1,如果是mujoco推荐用dm_control2,如果是bullet推荐用pybullet3。若想用gym中的mujoco则需要mujoco物理引擎版本低于2.0,如果必须要在gym中用mujoco物理引擎2.0版本,则需指定gym版本为0.15.3
- 创建强化相关环境的镜像,有两种方式,一种是如4.2节从一个基础镜像出发一步步配置,完成后docker commit,缺点是分享镜像时太大,别人也不懂你怎么构建的;另一种是如4.3节通过Dockerfile,方便分享,但要非常熟悉Dockerfile生成镜像的机制
- conda install与pip install的使用准则:如果希望conda环境尽可能共用一个package A,比如pytorch就用conda install,如果package B在某个conda 环境中专属,则使用pip install
下一步计划介绍通用的强化算法库,然后把它们接入到这些配好的环境镜像中运行
https://github.com/openai/gym ↩︎
https://github.com/deepmind/dm_control ↩︎
https://github.com/bulletphysics/bullet3 ↩︎



