最近比赛要提交打包好的CNN模型给主办方去测试,使用Docker镜像。这可难倒了我这个小白,搞了好几天才打包好。在这里记录一下Docker使用过程,希望能给广大同学们提供点帮助。
文章内容包含以下3个部分:
- Docker安装
- 打包镜像 Docker Build Image
- 测试镜像 Docker Run
Docker 安装
不同平台的Docker安装方式可以参考官方文档(Docker Install) ,我这里就用Ubuntu系统作为例子。
# Docker
安装完docker后,我的机器还不能用docker调用GPU,所以还需要安装NVIDIA Docker。
NVIDIA Docker
详细安装步骤见NVIDIA Docker Installation Guide. 安装完记得重启Docker,并用nvidia/cuda:11.0-base这个默认容器测试一下是否安装成功。
# Restart the Docker daemon to complete the installation after setting the default runtime:
sudo systemctl restart docker
sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi
# 出现显卡信息界面即为安装成功
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.51.06 Driver Version: 450.51.06 CUDA Version: 11.0 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Tesla T4 On | 00000000:00:1E.0 Off | 0 |
| N/A 34C P8 9W / 70W | 0MiB / 15109MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
打包镜像
- 整理代码
将需要打包的模型代码整理到同一个目录下。举例来说,目录应该包含模型代码、数据文件夹、输出文件夹:
Model
如果用的是python语言的,可以准备一个requirement.txt,列出需要安装的包。后面就可以一步安装到位。
# 到代码目录下新建requirement.txt文件
touch requirment.txt
我的只需要再安装一个opencv包,所以我的requirment文件只要加上:
opencv-python==3.4.2.17
大家看自己需要什么额外的包直接写上名称和对应版本就可以了。用pip生成的requirement文件包含太多重复无用的包,建议还是自己简单写几个。
- 创建Dockfile
同样,新建一个Dockfile文件,每一步的详细说明可以查看Dockerfile说明 。
因为我用到了opencv库,这个包是依赖于许多个包的,简单安装一个opencv库会导致后续无法运行,会提示找不到库:libSM.so.6、libXrender.so.1、libXexr.so.6
为了opencv能在容器中运行,我们需要在Dockerfile里加上:
RUN apt-get update
RUN apt-get -y install libglin2.0-0
RUN apt-get -install libsm6
RUN apt-get -y install libxrender-dev
RUN apt-get -y install libxext6
因此,整个Dockerfile的内容就是下面所示:(假设model文件夹保存了我们的模型)
From
最后打包镜像:
# 打包镜像
docker build -t image-name .
# 保存文件
docker save -o output-filename image-name
测试镜像
- 导入Docker镜像
docker load -i output-filename
- 运行Docker镜像
每个Docker镜像只被分配了几百M的共享内存,对于很多CNN模型是远远不够的,因此需要加上 --shm-size 8G 来增大Docker镜像的共享内存大小(Shared Memories Size)。我的任务8G就够用了。
docker run --shm-size 8G --gpus all -v -it --rm image-name
由于Docker镜像执行后只会预测在文件夹/model/val/images下的图像,然后输出到文件夹/model/output/images下。为了能让Docker镜像预测新的测试集,并输出到宿主机的硬盘上,可以使用-v命令映射文件夹。
添加-v Path:/model/val 就可以将宿主机上的Path文件夹映射到Docker镜像里的val文件夹下,那么Docker镜像运行时就会从Path这个文件夹下取数据,记得Path一定要是绝对路径。Ubuntu中可以通过Ctrl+L得到文件的绝对路径。
对于我这个任务来说,我需要将新测试集和输出文件夹位置映射给Docker镜像,所以运行命令就是:
sudo docker run --shm-size 8G --gpus all -v PATH_TO_VAL:/model/val
-v PATH_TO_PUT:/model/output -it --rm image_name
测试成功就可以提交打包的镜像啦!希望这篇文章能够帮助到有需要的xdm,祝大家都能取得好成绩。