天天看点

docker ubuntu安装python_Docker打包深度学习项目(解决:Opencv依赖库、共享内存)...

docker ubuntu安装python_Docker打包深度学习项目(解决:Opencv依赖库、共享内存)...

最近比赛要提交打包好的CNN模型给主办方去测试,使用Docker镜像。这可难倒了我这个小白,搞了好几天才打包好。在这里记录一下Docker使用过程,希望能给广大同学们提供点帮助。

文章内容包含以下3个部分:

  • Docker安装
  • 打包镜像 Docker Build Image
  • 测试镜像 Docker Run

Docker 安装

不同平台的Docker安装方式可以参考官方文档(Docker Install) ,我这里就用Ubuntu系统作为例子。

# Docker
           

安装完docker后,我的机器还不能用docker调用GPU,所以还需要安装NVIDIA Docker。

docker ubuntu安装python_Docker打包深度学习项目(解决:Opencv依赖库、共享内存)...

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,祝大家都能取得好成绩。