创建ML-Agents的Docker镜像
前言
如果需要在镜像中使用GPU训练,可以将Nvidia的官方镜像作为基础镜像,Dockerfile
如下:
1 | FROM nvidia/cuda:9.0-base-ubuntu16.04 |
ML-Agents v0.6.0
环境
本机环境
- ML-Agents 0.6.0
- Windows 10 专业版
- docker client version 18.09.0
- docker server version 18.09.0
平台
创建镜像
- 打开
~/ml-agents-0.6.0/
目录,看到有一个官方给定的Dockerfile
- 直接
Build
,在该目录下运行docker build -t [name]:[tag] .
,一定要注意最后的.
,很重要 - 新建一个
sources.list
文件,为镜像内换源,因为将来有可能需要在容器内安装某些包,有一些国外的资源往往会下载失败,所以需要换源
- 新建一个
sources.list
-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (20160420.1)]/ xenial main restricted
deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse 保存退出
- 新建一个
DockerfilePlus
,在官方生成的基础镜像上安装一些可以在平台上运行的包,openssh-server
,联网工具net-tools
,心爱的apt-file
等等
- 新建一个
DockerfilePlus
- 用文本编辑器打开,输入以下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22FROM hub.hoc.ccshu.net/wjs/mlunityv060:v0.1
RUN cp /etc/apt/sources.list /etc/apt/sources.list.bak
COPY sources.list /etc/apt/sources.list
ENV PYTHONPATH /ml-agents:$PYTHONPATH
RUN apt-get update && apt-get install -y \
apt-file \
nano \
net-tools \
iputils-ping \
openssh-server \
apt-utils \
&& rm -rf /var/lib/apt/lists/* \
&& mkdir /var/run/sshd \
&& echo "root:1234" | chpasswd \
&& sed -i 's/prohibit-password/yes/g' /etc/ssh/sshd_config
EXPOSE 22
ENTRYPOINT ["/usr/sbin/sshd","-D"]
- 在
DockerfilePlus
所在文件夹下,执行build -t [name]:[tag] -f DockerfilePlus .
为了使用GPU.改写完的Dockerfile如下(不需要看):
1 | FROM nvidia/cuda:9.0-base-ubuntu16.04 |
PUSH镜像
测试镜像
- 登录机器学习平台,没有使用平台的可以在本地使用
docker run
直接开启容器 - 先测试使用容器的方式
安装Miniconda
确保你的安装包放在了data文件夹下apt-get update && apt-get install bzip2 -y && cd /data && bash Miniconda3-latest-Linux-x86_64.sh
一路按回车、yes等等就成功了.如果需要安装到指定目录,在安装过程中会有提示告诉你让你指定安装路径
注意
在学校机器学习平台上使用时,如果是使用容器的方式,那么新开的容器就可以使用conda
命令,不存在conda:command not found
的错误信息.
但是,如果在平台上以提交任务的形式来使用带conda的镜像所产生的容器时,就算是在镜像中配置了echo 'export PATH="~/anaconda3/bin:$PATH"' >> ~/.bashrc
,当提交任务时环境变量中仍然没有~/anaconda3/bin
,这个问题目前没有找到比较方便的解决办法,目前所采用的方式是:
在提交任务时, 首先加上命令export PATH="~/anaconda3/bin:$PATH" &&
接着又实验了一下echo 'export PATH="~/anaconda3/bin:$PATH"' >> /etc/profile
, 正常来说, 如果在容器中这样设置环境变量, 等待下次从镜像创建容器时, 这个环境变量一般并不会生效, 但是不知道这样设置对于提交任务方式来说有没有效, 索性试了一下
根据输出日志来看, 这种方式也并没有奏效
当然, 如果觉得上述配置比较麻烦的话,可以使用Dockerfile
的ENV
命令来设置环境变量, 这样设置99%是不会有问题的
1 | FROM hub.hoc.ccshu.net/wjs/mlunityv060:v1.4.5 |
实验了一下,
结果如下:
表示可以使用conda
命令, 但是不能使用conda activate
命令激活环境
根据错误信息, 在Dockerfile
中写入以下代码也不可行:
RUN ln -s /usr/miniconda3/etc/profile.d/conda.sh /etc/profile.d/conda.sh
查了一下相关资料,发现在4.5版本的conda是无解的
https://github.com/ContinuumIO/docker-images/issues/89
希望4.6版本可以解决吧
更新2019年1月14日14:26:01
已解决
4.6版本的确可以解决以提交任务模式运行时的问题, 需要使用命令conda run -n [环境名字] [要执行的命令]
, 而不是使用conda activate [环境名字]
先激活一个环境.
不过, 更新至4.6版本需要相关配置
1 | conda config --add channels conda-canary |
我使用Dockerfile来生成镜像, 代码如下:
1 | FROM hub.hoc.ccshu.net/wjs/mlunityv060:v1.4.6 |
原因是, 使用Dockerfile比较容易设置环境变量, 减少出错