前言

最近实验室的师兄布置了一个任务,让我将 CSPN 算法部署在docker环境下。我之前经常接触 docker, 但主要的用途是在搭建本地开发环境(比如一个前后端项目我只需要在本地创建一个mysql容器就可以测试数据库连接,而不需要大动干戈配置数据库)以及服务端的微服务开发上, 这是我第一次在docker容器中运行深度学习算法,中间经历了很多坑,故在此记录。

环境

  • 操作系统: macOS 10.15.4
  • docker版本: 19.03.12

部署过程

这次我要部署的项目是需要python和pytorch环境,以及cuda等。因此,在师兄的推荐下,我选择的基础镜像为 nvidia/cuda:9.0-cudnn7-devel. 可以直接输入命令:

docker pull nvidia/cuda:9.0-cudnn7-devel

来拉取。
第一次基于这个镜像运行容器之后,发现容器内并没有 python, pytorch等环境,需要自己配置。除了按照 cspn_pytorch readme 中的环境要求在容器中一条条敲入并commit容器为镜像之外,Dockerfile 是更好的选择。
关于 Dockerfile 的使用在官方文档中有着比较详细的叙述. 简而言之,就是 构建自定义镜像 的一种最佳方式,写在 Dockerfile 中的命令会为镜像赋予不同的特性,这样使得我们搭建的环境有复用性(如果要使用类似的环境再次基于这个镜像创建即可)和良好的可维护性(如果需要调整环境,只需要修改 Dockerfile 再build即可)。

Dockerfile 的实现如下:

FROM nvidia/cuda:9.0-cudnn7-devel // 基础镜像我在上文中已经提到

RUN rm /etc/apt/sources.list // 因为我们的环境搭建都是在国内,因此首先删除原本镜像中的apt sources.list文件

COPY sources.list /etc/apt/ // 然后放入我们自己定义的sources.list,这个文件的内容会在下文列出

RUN apt-get update; exit 0  // 加exit 0 预防失败
RUN apt-get install -y --no-install-recommends apt-utils
RUN apt-get install -y apt-transport-https && \  
  echo 'deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64 /' > /etc/apt/sources.list.d/cuda.list && \
  apt-get install -y libhdf5-serial-dev hdf5-tools
  
RUN apt-get install -y python3-pip && mkdir ~/.pip

COPY pip.conf ~/.pip/

RUN pip3 install --index-url   // 将douban的pip源作为pip源 https://pypi.douban.com/simple --upgrade pip && \
    pip3 install --index-url https://pypi.douban.com/simple h5py pandas matplotlib imageio scikit-image opencv-python

RUN pip install torch==1.2.0+cu92 torchvision==0.4.0+cu92 -f https://download.pytorch.org/whl/torch_stable.html     // 安装pytorch

CMD [ "/bin/bash" ]

sources.list的内容如下:

deb http://mirrors.aliyun.com/ubuntu/ xenial main

deb-src http://mirrors.aliyun.com/ubuntu/ xenial main

deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main

deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main

deb http://mirrors.aliyun.com/ubuntu/ xenial universe

deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe

deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe

deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe

deb http://mirrors.aliyun.com/ubuntu/ xenial-security main

deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main

deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe

deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe

要注意的是, sources.lists 要和dockerfile放在相同的目录下. 最后在这个目录的终端输入:

docker build -t cspn_deploy .

安静等待即可

创建容器

创建容器时,由于我们的测试数据集有50多个G,如果全部放进镜像中并不现实,所以我们要设置目录挂载,要挂载的目录结构大致如下:

├── Dockerfile

├── cspn_pytorch

│   ├── README.md

│   ├── __pycache__

│   ├── best_model          // 存放已经训练好的模型和输出的目录

│   ├── data_transform.py

│   ├── datalist

│   ├── eval.py

│   ├── eval_kitti_dataset_loader.py

│   ├── eval_nyu_dataset_loader.py

│   ├── eval_nyudepth_cspn.sh

│   ├── kitti_dataset_loader.py

│   ├── loss.py

│   ├── lr_scheduler.py

│   ├── models

│   ├── nyu_dataset_loader.py

│   ├── pretrained

│   ├── train.py

│   ├── train_cspn_nyu.sh

│   └── utils.py

├── pip.conf

└── sources.list

随后我们输入命令:

docker run --name 自定义容器名 -it --gpus=all -v ~/宿主机上要挂载的目录的名字:/docker_input cspn_deploy:test

随后我们进入容器,通过命令:

docker exec -it 自定义容器名 /bin/bash

进入/docker_input/cspn_pytorch目录,输入 bash eval_cspn_nyu.sh, 可以得到以下的结果:
截屏2020-09-24 上午10.38.53.png

从输出目录 eval_result 下,可以看到一些结果的样图,如下:
00003_input.png
00002_pred.png
00003_gt.png

证明我们的测试数据集运行成功。


BOBBAIcl
12 声望2 粉丝

bobbai