在Docker下配置深度学习环境

ubuntu+docker+cuda+anaconda+pytorch配置

1.安装nvidia-docker

ubuntu下的docker安装比较简单,通过apt-get工具就可以完成,可以参考https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
   "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
sudo apt-get update
sudo apt-get install docker-ce

安装nvidia-docker:https://github.com/NVIDIA/nvidia-docker

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update

sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd

最后注册nvidia-docker:https://github.com/NVIDIA/nvidia-docker/issues/838


sudo systemctl daemon-reload
sudo systemctl restart docker

2.配置镜像

首先,查看本机已有的镜像:

root@user:/home# docker images

一般新的docker中只有这一个镜像,这时候就需要我们配置新的镜像。配置新镜像的方法有两种:

  1. 自己通过镜像新建容器,并配置对应的环境,最后保存为新镜像

  2. 网上下载合适的镜像,然后适当的修改

考虑到我们需要配置的环境比较复杂(cuda、cudnn、anaconda、pytorch),很明显选择第二种方法:

这里我推荐https://hub.docker.com/

在Docker下配置深度学习环境_第1张图片

点图中的链接进入搜索页面,搜索“pytorch”相关,选一个下载量比较高的就可以了,这里我选择的是“pytorch/conda-cuda”。

用给出的代码下载之后查看镜像列表:

root@user:/home# docker pull pytorch/conda-cuda
root@user:/home# docker images

这样我们就有了一个已经配置好cuda、cudnn和anaconda的环境了!

 

3.建立容器

镜像配置好以后就可以正式开始了,首先建立容器:

root@user:/home#  NV_GPU=0,1,2,3 nvidia-docker run --rm -it -v /home/document1/document2:/mnt/ pytorch/conda-cuda bash

这一步的几个参数的作用如下:

NV_GPU:指定 GPU 卡
run:启动容器
rm:退出删除容器
it:交互模式
v:目录
/home/document1/document2:/mnt: 系统目录:容器目录
pytorch/conda-cuda :镜像名字

注意到原来的同户名变成了955e10c43ecd,这个也就是容器(container)的ID。

 

4.配置深度学习环境

1.首先查看本机的cuda和cudnn版本:

[root@container_id /]# cat /usr/local/cuda/version.txt
[root@container_id /]# cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

在Docker下配置深度学习环境_第2张图片

在pytorch官网上找到合适的版本,这里选择pytorch1.2

2.由于我们的镜像中已经有了anaconda,为了避免之后的环境冲突,我们使用anaconda 配置我们需要的pytorch运行环

[root@container_id /]# ​​​conda create -n xxx python=3.6   //创建python3.6的名为xxx的虚拟环境
[root@container_id /]#conda activate xxx                //开启环境
[root@container_id /]#conda deactivate                  //关闭环境

 

在Docker下配置深度学习环境_第3张图片

如上图所示,一个名叫“py36”的conda虚拟环境已经成功建立,然后输入之前在pytorch官网找到的安装代码:

  • (env_name)[root@container_id /] conda install pytorch==1.2.0 torchvision==0.4.0 cudatoolkit=10.0 -c pytorch

安装通常需要十几分钟(取决于你的网速),如果下不动或者想加速下载的话可以考虑添加国内的源https://blog.csdn.net/xd_wjc/article/details/80588343

安装完成之后再根据需求下载其他的库就可以了,这里就不赘述了。

 

5.训练你的代码

当pytorch和其他的依赖库都下载好了之后,就可以开始代码的训练了。这里有几点需要注意:

1.从本地上传文件到容器中:

首先重新打开一个终端,然后用以下代码上传:

root@user:/home# docker cp 本地文件路径 containerID全称:容器路径

2.训练大数据集时报错:

无论是:RuntimeError: unable to write to file 还是RuntimeError: DataLoader worker (pid 7199) is killed by signal: Bus error,报错的核心问题是共享内存不足,因为docker默认的分配内存为64M,可以通过

[root@container_id /] df -h

在Docker下配置深度学习环境_第4张图片

解决方式有两个:1.关闭容器,在重新开启容器时加入参数:--shm-size="1g"

                             2.修改docker的port: https://blog.csdn.net/shmily_lsl/article/details/81166951

在这里我选择第一种方法。在这之前,首先保存你的镜像!!!!!

还是在容器外打开终端,然后:

root@user:/home# docker commit container_ID new_name

如图,我新建了一个叫做pytorch1.2_cuda10的镜像

下次再新建容器时用这个镜像就可以保留之前的所有改动啦!

 

6.补充记录一些docker常用命令

6.1 从Docker容器内拷贝文件到主机上

docker cp :/file/path/within/container /host/path/target

6.2 从主机内拷贝文件到Docker容器上

docker run -v /path/to/hostdir:/mnt $container    #用-v命令在创建容器时将主机文件挂载到容器上
sudo cp path-file-host /var/lib/docker/aufs/mnt/FULL_CONTAINER_ID/PATH-NEW-FILE #直接将主机的数据拷贝到容器的物理存储中
#用输入输出符
docker run -i Ubuntu /bin/bash -c 'cat > /path/to/container/file' < /path/to/host/file/
docker exec -it  bash -c 'cat > /path/to/container/file' < /path/to/host/file/

参考自:http://stackoverflow.com/questions/22907231/copying-files-from-host-to-docker-container

6.3删除和保存容器、镜像

首先用 docker ps -a 查看所有的容器ID,然后关掉正在运行中的容器:

docker stop containerId 
docker stop 'docker ps -a -q' #关闭所有容器

然后可以删除容器

docker rm containerId 
docker rm -f containerId    #-f 强制关闭
docker rm 'docker ps -a -q' #关闭所有容器

最后是镜像的删除

docker rmi containerId
docker rmi 'docker images -q' #批量删除所有镜像

 

你可能感兴趣的:(docker,pytorch,环境配置)