Docker实操3——配置强化学习环境镜像

手动配置一遍docker中的强化环境

  • 一、安装基本操作
    • 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.44

1.2 国内换源

  1. 给apt换源sudo vim /etc/apt/sources.list,然后更新sudo apt-get update。具体源参见https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
  2. 给conda换源,修改~/.condarc文件,具体源见https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/
  3. 给pip换源,指令参见https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
  4. 用conda安装pytorch时需要添加pytorch源,conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/

如果大家会科学上网挂代理,就不需要换源处理了,之前偷懒踩过的坑。

1.3 安装nvidia-docker

  1. 首先在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
  1. 然后配置能让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是启动容器后执行的命令
  1. 我们来区别一下nvidia-docker与docker的用法
  • docker run -it nvidia/cuda:11.0-base bash:在该镜像的容器中开一个bash,输入nvidia-smi1
  • nvidia-docker run -it nvidia/cuda:11.0-base bash:操作同上
    Docker实操3——配置强化学习环境镜像_第1张图片

二、docker基本操作

关于Docker更为详细的介绍可以参见Docker Tutorial For Beginners和知乎Docker简单的命令大全

# 拉取镜像
docker pull nvidia/cuda:11.0-base
# 查看镜像
docker images
# 删除镜像
docker rmi <image_id>
# 容器相关操作
docker container <command>
# 以交互方式创建容器
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)

三、例子:强化学习库的docker环境搭建

先来一个例子,看看如何搭建起18年开源的一个强化学习代码库环境源:https://github.com/ShangtongZhang/DeepRL

  1. 用github镜像网站github.com.cnpmjs.org的方式来clone仓库
# 没权限就sudo
git clone https://github.com.cnpmjs.org/ShangtongZhang/DeepRL.git
  1. 在运行DockerFile之前需要在https://roboti.us/license.html网站上获取activation key,复制粘贴到一个新建文件mjkey.txt中
    1
  2. 本来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
  1. 运行docker build --build-arg UID=11 -t deep_rl:v1.5 .制作镜像
    2
  2. 利用nvidia-docker run -it deep_rl:v1.5 bash创建一个容器,并进入
    2
  3. 运行python examples.py,修正一下由于我们使用了py3.7导致的一些代码错误:
  • 错误一:
    2
  • 错误二:
    在这里插入图片描述
  • 修正错误,把async变量名改成async_replay就好了:
    Docker实操3——配置强化学习环境镜像_第2张图片
  1. 修改examples.py,比如用ddpg跑一个HalfCheetah-v2,然后python exapmles.py就可以在容器中跑起来了Docker实操3——配置强化学习环境镜像_第3张图片
    Docker实操3——配置强化学习环境镜像_第4张图片
  2. 最后可从大佬代码库中相关的sh文件以及template_jobs.py中学习并行跑实验的经验!

关于Docker容器的启动方式、数据保存、网络设置、删除退出等相关知识,请自行进一步查阅

四、亲手制作专属的强化学习镜像

4.1 整体思路

  • 底层依赖包/动态库、个性化配置请在root权限下操作(tmux, zsh, apt install各种自己喜欢在容器中用的命令)
  • mujoco安装!配置!
  • miniconda安装!配置!
  • conda内要确定好安装的python版本!
  • dm_control安装!配置!
  • gym安装!配置!
  • 各种你需要的python包
  • 各种你要用到开源库
  • 最后是自己的代码请记得ADD/COPY进来= =

遵循的一个原则:越频繁改动的放到最后添加,比如包可能会经常更新、开源库又有一个新功能的commit、代码经常需要修改等

4.2 具体的操作

  1. 选择cuda10.0的基础镜像,然后创建一个在后台运行的容器,命名为myrl10
# 网络选择与host一样,可自行设置,-d表示后台运行
sudo nvidia-docker run --network host --name myrl10 -itd nvidia/cuda:10.0-base bash
  1. 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!
  2. 安装相应系统依赖,缺啥命令装啥,比较喜欢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/*
  1. 装完系统依赖,尽量放弃root身份(顺便给个root权限),新建用户pamirl和密码qwerty,尽量在用户目录下进行
useradd --create-home --shell /bin/bash pamirl
adduser pamirl sudo
echo 'pamirl:qwerty' | chpasswd 
cd /home/pamirl
  1. 安装最新的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
  1. 安装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
  1. 创建一个名为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
  1. 安装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'
  1. 安装符合版本信息的pytorch,详情见pytorch官网
conda install pytorch=1.10.1 torchvision torchaudio cudatoolkit=10.2
  1. 这里只介绍安装最新版的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 
  1. 检查当前的环境是否为自己想要的,退出容器后,保存当前myrl10容器为新的镜像dm_control:py38_mujoco210
docker commit -m "dm_control built from cuda10.0" -a "Nemo" myrl10 dm_control:py38_mujoco210

4.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 .
2

其中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

五、强化环境的坑

  1. 因为各个环境版本、python版本、底层支持的物理引擎版本并不全兼容,所以有不少坑。
  2. 首先是OpenAI Gym、DeepMind Control Suite和PyBullet是三大用来benchmark强化算法性能的基础环境,其次Gym主要有Atari、 roboschool、Mujoco、Classic Control等四个基准环境,然后dm_control则有更为多样化基于mujoco的基准环境,而Bullet是物理引擎,因此催生了dm_control2gym wrapper,PyBullet来以gym的方式让rl算法统一地调用环境接口
  3. 因此,可以创建三个完全不同的conda环境,来安装gym atari/ dm_control mujoco/ gym bullet三个基准环境,统一以gym的方式作为环境接口,给RL算法进行调用
  4. 如果mujoco版本是2.0及以上,用gym来调用mujoco的话,会存在严重的问题,详情见gym github#1541 issue,因此benchmark 算法性能要在低于2.0的mujoco引擎驱动的gym上。所以gym本身自带环境中最推荐的是使用atari环境
  5. 如果想benchmark基于Mujoco物理引擎的环境,则推荐使用最新开源基于mujoco的dm_control
  6. 如果想换物理引擎,那么PyBullet以gym的接口实现了许多环境,推荐使用pybullet

这仅仅是强化环境!!!如果想使用强化的算法库,那么版本兼容的任务则更为艰巨了。

总结

最终我们以两种方式创建了两个镜像:
3

  1. 选择强化环境前,先选定benchmark的环境,如果是Atari推荐用gym本身1,如果是mujoco推荐用dm_control2,如果是bullet推荐用pybullet3。若想用gym中的mujoco则需要mujoco物理引擎版本低于2.0,如果必须要在gym中用mujoco物理引擎2.0版本,则需指定gym版本为0.15.3
  2. 创建强化相关环境的镜像,有两种方式,一种是如4.2节从一个基础镜像出发一步步配置,完成后docker commit,缺点是分享镜像时太大,别人也不懂你怎么构建的;另一种是如4.3节通过Dockerfile,方便分享,但要非常熟悉Dockerfile生成镜像的机制
  3. conda install与pip install的使用准则:如果希望conda环境尽可能共用一个package A,比如pytorch就用conda install,如果package B在某个conda 环境中专属,则使用pip install

下一步计划介绍通用的强化算法库,然后把它们接入到这些配好的环境镜像中运行


  1. https://github.com/openai/gym ↩︎

  2. https://github.com/deepmind/dm_control ↩︎

  3. https://github.com/bulletphysics/bullet3 ↩︎

你可能感兴趣的:(环境配置,docker,强化学习环境搭建)