目录
前言
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仓库 (选读)
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
两个关键概念:
镜像:静态 一旦构建即固化,无法直接修改
容器:动态 启动一个镜像即会构建一个容器,即一个镜像可以有无数个容器,但不要构建太多,以免浪费内存,注意构建一个容器后,里面环境、文件均可自由修改,提交后可以生成一个新镜像(即镜像的间接修改方法)
前提:请读者自行完成docker、nvidia-docker的安装,以及基本使用方法的了解。
这里没有采用Dockerflie 文件(有点像Makefile)一键构建,而是采用传统安装方式一步步来,目的为了让读者能对docker构建过程理解更深入,其实docker也可以看做一个虚拟环境,进入虚拟环境后(和anaconda很像),操作和正常方式几乎一样,特殊的是这个容器可以固化成镜像,并无限复制,只要硬件支持,就能实现随下随用,再也不用为搭环境而苦恼的,后面我也会出一篇Dockerfile构建镜像的教程。
本文采用以下要求进行镜像配置:
系统:Ubuntu18.04 CPU架构X86_64
CUDA:10.0 CUDNN: 7
Docker版本:18.*MMDetection: 2.14
可以通过 docker pull 镜像名 来构建
docker pull nvidia/cuda:10.0-cudnn7-devel-ubuntu18.04
注意:只有选devel采支持cuda编译的,nvcc作为cuda的编译器,在runtime的镜像中是不提供的。读者需要根据自己需求选择,笔者需要用到部分cuda编译,所以选择devel版本的。
查看已构建镜像
docker images
到此,基础镜像构建成功!
运行镜像即可构建一个容器,之后就只对这个容器镜像进行操作,最好不要再执行镜像,以免生成过多的容器,造成内存的浪费呀。
构建并进入容器终端 执行命令如下:
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 比较重要,是容器唯一标识号,后面会用到
1. 唤醒容器 (efc9 为容器ID简写)
docker start efc9
2. 进入容器
docker attach efc9(离开容器停止)
docker exec -it efc9 /bin/bash (离开容器不停止)
到此,容器也搭建好了!
和在自己电脑安装过程一样,步骤可以按照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"
到此所有环境搭建已完成!
感谢能各位能看到这,接下来就是没啥大问题了。
这里笔者自己写的大赛提交脚本进行测试,大家可以找个简单程序测试。
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"')
再次退出容器,使用commit 命令容器会生成一个新镜像
docker commit -a "for sar competition" -m "kongyan" efc9f720a254 detection:v1
使用 docker images 查看
到此,全部完结,恭喜各位!
整个环境搭建可以说自己也是第一次,之前一直用anaconda 搭建深度学习环境,其实装了很多无用的包,造成了一定资源浪费,而从来没有在最简的unbuntu系统上完整搭建,尽可能只装必须的包,而且还加入了docker这个新知识,感谢Klawens一直的帮助与解答,非常优秀的AI竞赛选手,历经了四天终于完成此篇教程,限于笔者能力,或多或少还有些纰漏,希望大家积极留言指正。
友情链接:
1.Klawens的 GitHub (干货多多)
2. 笔者的 GitHub(没啥干货) and 知乎