前言
最近实验室的师兄布置了一个任务,让我将 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
, 可以得到以下的结果:
从输出目录 eval_result 下,可以看到一些结果的样图,如下:
证明我们的测试数据集运行成功。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。