(全网最详细)如何在docker里搭建mmdetection环境并封装成镜像

目录

前言

1. 理解docker

2.搭建过程

2.1 创建基础镜像

2.2 构建容器

2.3 进入容器

2.4 搭建环境

2.5 测试

2.6 提交

3. 小结


前言

目的:由于一个AI比赛需要提交算法Docker,捣鼓好几天终于有点眉目,特此记录!

适用对象:已熟练搭建mmdet环境,需要进行docker部署

资料参考:

1.特定版本docker安装(必读)

2.nvidia-docker安装  (选读 docker-19.03及以上版本已经内部集成,本文还需要安装)

3.docker基本使用(选读)

4.docker如何使用GPU (选读)

5. 官方Docker仓库 (选读)

1. 理解docker

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

两个关键概念:

镜像:静态  一旦构建即固化,无法直接修改
容器:动态  启动一个镜像即会构建一个容器,即一个镜像可以有无数个容器,但不要构建太多,以免浪费内存,注意构建一个容器后,里面环境、文件均可自由修改,提交后可以生成一个新镜像(即镜像的间接修改方法)

2.搭建过程

前提:请读者自行完成docker、nvidia-docker的安装,以及基本使用方法的了解。

这里没有采用Dockerflie 文件(有点像Makefile)一键构建,而是采用传统安装方式一步步来,目的为了让读者能对docker构建过程理解更深入,其实docker也可以看做一个虚拟环境,进入虚拟环境后(和anaconda很像),操作和正常方式几乎一样,特殊的是这个容器可以固化成镜像,并无限复制,只要硬件支持,就能实现随下随用,再也不用为搭环境而苦恼的,后面我也会出一篇Dockerfile构建镜像的教程。

本文采用以下要求进行镜像配置:

系统:Ubuntu18.04  CPU架构X86_64
CUDA:10.0      CUDNN: 7
Docker版本:18.*

MMDetection: 2.14


2.1 创建基础镜像

可以通过 docker pull 镜像名 来构建

docker pull nvidia/cuda:10.0-cudnn7-devel-ubuntu18.04

注意:只有选devel采支持cuda编译的,nvcc作为cuda的编译器,在runtime的镜像中是不提供的。读者需要根据自己需求选择,笔者需要用到部分cuda编译,所以选择devel版本的。

(全网最详细)如何在docker里搭建mmdetection环境并封装成镜像_第1张图片

 查看已构建镜像

docker images

到此,基础镜像构建成功!

2.2 构建容器

运行镜像即可构建一个容器,之后就只对这个容器镜像进行操作,最好不要再执行镜像,以免生成过多的容器,造成内存的浪费呀。

构建并进入容器终端 执行命令如下:

nvidia-docker run -it --privileged=true nvidia/cuda:10.0-cudnn7-devel-ubuntu18.04 /bin/bash

如果复制执行不成功,则自己手动敲,nvidia-docker还不支持自动补全,有点辛苦哈。

nvidia-docker 执行,容器内能够调用GPU,非常关键!以下说明GPU驱动正常:

(全网最详细)如何在docker里搭建mmdetection环境并封装成镜像_第2张图片

 查看CUDA版本:nvcc -V

(全网最详细)如何在docker里搭建mmdetection环境并封装成镜像_第3张图片

退出当前容器:exit

查看所有容器,不加 -a 只能看正在运行的容器

docker ps -a

这个CONTAINER ID: efc9f720a254  比较重要,是容器唯一标识号,后面会用到

2.3 进入容器

1. 唤醒容器 (efc9 为容器ID简写)

docker start efc9

 2. 进入容器


docker attach efc9(离开容器停止)
docker exec -it efc9    /bin/bash   (离开容器不停止)

到此,容器也搭建好了!

2.4 搭建环境

和在自己电脑安装过程一样,步骤可以按照mmdet官方说明,由于笔者采用的是mmdet2.14 , pytorch1.40_cu10_cudnn7(比赛要求没办法),所以安装mmdet方式比较特别,并不和官方文档完全一样,所以读者可以自行参考。

值得关注的是,这个版本的pytorch在官方安装主页上是找不到的(提供的版本并不全),说明我们可以根据自己实际需求去安装对应版本的pytorch,笔者也是第一次值得这种方式。

1. 下载 torch1.4.0  torchvision0.5  mmdet2.14源码

 torch下载地址:https://download.pytorch.org/whl/

mmdet2.14下载地址:https://github.com/open-mmlab/mmdetection.git

2. 将下载的文件放入容器内

#/home/z/code/input_pa
docker cp /home/z/code/docker_v1_cuda10.0/torch-1.4.0+cu100-cp37-cp37m-linux_x86_64.whl efc9f720a254:/workspace
docker cp /home/z/code/docker_v1_cuda10.0/torchvision-0.5.0+cu100-cp37-cp37m-linux_x86_64.whl  efc9f720a254:/workspace
docker cp /home/z/code/docker_v1_cuda10.0/mmdetection_2.14/.  efc9f720a254:/workspace

3. 进入容器安装环境

3.1 python3.7 安装

apt-get update
apt-get install python3.7

创建软链接 

ln -s /usr/bin/python3.7 /usr/bin/python

 3.2 pip 安装

apt-get install python3-pip
# 创建软链接(如果找不到的话)
ln -sf /usr/local/bin/pip3.7  /usr/bin/pip

3.3 torch torchvision 安装

pip install torch-1.4.0+cu100-cp37-cp37m-linux_x86_64.whl

pip install torchvision-0.5.0+cu100-cp37-cp37m-linux_x86_64.whl

3.4 mmcv1.3.8 安装
这里用release版安装会报错。

pip install mmcv-full==1.3.8 -f https://download.openmmlab.com/mmcv/dist/cu100/torch1.4.0/index.html

报错如下:
(全网最详细)如何在docker里搭建mmdetection环境并封装成镜像_第4张图片

原因定位:fatal error: Python.h: No such file or directory 是报错的核心原因,而不是最下面的 command 'x86_64-linux-gnu-gcc' failed with exit status 

具体原因:python3.7 的Python.h的缺少,而ubuntu18.4默认自带只有python2.7和python3.6的,故需要安装Python.h.

解决:安装python3.7 的 Python.h:  参考

sudo apt-get install python3.7-dev

这里读者继续选择release版安装(比较推荐,不需要本地编译,比较快)

我选择源码编译,考验CPU性能的时候到了(费时费力):参考

git clone -b v1.3.8 https://github.com/open-mmlab/mmcv.git
cd mmcv
MMCV_WITH_OPS=1 pip install -e .

(全网最详细)如何在docker里搭建mmdetection环境并封装成镜像_第5张图片

3.5 mmdet 安装

在mmdet源码根目录下执行:

cd mmdetection_2.14
pip install -r requirements/build.txt
pip install -v -e .  # or "python setup.py develop"

(全网最详细)如何在docker里搭建mmdetection环境并封装成镜像_第6张图片

到此所有环境搭建已完成!

感谢能各位能看到这,接下来就是没啥大问题了。

2.5 测试

这里笔者自己写的大赛提交脚本进行测试,大家可以找个简单程序测试。

python run.py /input_path /output_path

(全网最详细)如何在docker里搭建mmdetection环境并封装成镜像_第7张图片

 补充下:脚本里笔者用到了os.system() 执行一个中间脚本就报错

 os.system('python  test_for_submission.py  --eval-options "jsonfile_prefix=output"')

 后来改为才正常执行,说明了软链接修改默认解释器对os.system()无效,果然自己重头搭环境深似海,差点感觉自己都整不完这个教程了,还好找到问题点。

os.system('/usr/bin/python3.7  test_for_submission.py  --eval-options "jsonfile_prefix=output"')

2.6 提交

再次退出容器,使用commit 命令容器会生成一个新镜像

docker commit -a "for sar competition" -m "kongyan"  efc9f720a254   detection:v1

使用 docker images 查看

 到此,全部完结,恭喜各位!

3. 小结

整个环境搭建可以说自己也是第一次,之前一直用anaconda 搭建深度学习环境,其实装了很多无用的包,造成了一定资源浪费,而从来没有在最简的unbuntu系统上完整搭建,尽可能只装必须的包,而且还加入了docker这个新知识,感谢Klawens一直的帮助与解答,非常优秀的AI竞赛选手,历经了四天终于完成此篇教程,限于笔者能力,或多或少还有些纰漏,希望大家积极留言指正。

友情链接:

1.Klawens的 GitHub (干货多多)

2. 笔者的 GitHub(没啥干货) and 知乎

你可能感兴趣的:(软件安装问题,docker,深度学习,神经网络)