栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(全网最详细)如何在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 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驱动正常:

 查看CUDA版本:nvcc -V

退出当前容器: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

报错如下:

原因定位: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 .

3.5 mmdet 安装

在mmdet源码根目录下执行:

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

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

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

2.5 测试

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

python run.py /input_path /output_path

 补充下:脚本里笔者用到了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 知乎

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/324387.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号