利用Docker封装环境

前言

最近需要将训练好的模型利用docker封装成镜像上传,之前曾经自学过一段时间docker(没接触过swam,compose,原因是没有那么多集群给我去部署),但是在封装的过程中还是遇到了许多问题,特此记录一下踩到坑。
注意:本次的系统为ubuntu18.04 LTS

正文

安装docker

对于docker的安装其实问题不算很大,只要遵循官网上的相关教程(前提需要一点英文储备),就能很轻松的安装上docker引擎。

安装nvidia-container-toolkit

一开始我以为安装完docker引擎之后就可以愉快的拉取镜像和使用镜像内的环境进行训练测试了。但是,实则并不是这样的,当我们运行

sudo docker run -it --gpus=all dockerID /bin/bash

输完上述命令后往往会报如下错误:

docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].

经过查询相关资料,原来docker一开始是不支持使用显卡的,但是经过一段时间的发展,出现了nvidia-docker进行显卡的调用。随着技术不断发展,在docker 19.03版本开始,docker可以通过安装相关工具能够直接原生支持显卡调用。只需要在命令行中分别输入以下代码即可:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

撰写dockerfile

说到撰写dockerfile,在这里作者踩到的坑就很多了。一开始拉取的是dockerhub上nvidia官方发布的只配置了cuda-11.0.3-cudnn-8.0-ubuntu-18.04的基础镜像,即:

FROM nvidia/cuda:11.0.3-cudnn8-devel-ubuntu18.04

注意!!!!:涉及到cuda的镜像,镜像名往往会有带有base/runtime/devel,如果你的docker后续需要利用nvcc进行编译操作的话一定下载devel版本,该版本内会包含cuda的编译工具。英伟达官方的解释如下:

base: Includes the CUDA runtime (cudart)
runtime: Builds on the base and includes the CUDA math libraries, and NCCL. A runtime image that also includes cuDNN is available.
devel: Builds on the runtime and includes headers, development tools for building CUDA images. These images are particularly useful for multi-stage builds.

之后就是相关软件包的安装,在这里不得不吐槽一句,镜像内的python默认安装版本总是3.6版本。如果只是在安装python的时候指定了相关的版本,那么你会发现当其余的安装包安装完毕时,容器内会出现多个python版本共存的情况,所以如果不是大佬的话,建议不要拉取特别基础的镜像。
在dockerfile内撰写安装相关依赖包语句:

RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential cmake curl ca-certificates \
libjpeg-dev libpng-dev ffmpeg libsm6 libxext6 ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 \
python3 python3-dev python3-pip && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*

也正因为我拉取的镜像太小,导致在安装自己魔改的mmdetection时各种报错,很多安装包都需要自己下载也因此报了很多的错误。
比如:

ImportError: No module named setuptools
pip install scikit-build

对应的只需要在dockerfile里添加

RUN pip3 install setuptools
RUN pip3 install scikit-build

安装mmcv不成功,之前在镜像外,直接利用命令行

pip install mmcv-full

但是在容器内,想要mmcv能够编译成功且支持cuda加速的话,应当在dockerfile内使用如下命令(花括号内需要自己改版本):

RUN pip3 install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu{version}/torch{version}/index.html

编译mmdet的时候遇到过

nvcc fatal : Unsupported gpu architecture ‘compute_86‘

该错误的主要是显卡的算力已经超出了当前cuda版本的上限,所以需要限制算力:

ENV TORCH_CUDA_ARCH_LIST="3.5 3.7 5.0 5.2 6.0 6.1 7.0 7.5+PTX"

各版本cuda所支持的算力如下所示,该列表参考自知乎文章

#cuda9
export TORCH_CUDA_ARCH_LIST="3.5;5.0;5.2;6.0;6.1;7.0;7.0+PTX"

#cuda10
export TORCH_CUDA_ARCH_LIST="3.5;5.0;5.2;6.0;6.1;7.0;7.5;7.5+PTX"

#cuda11
export TORCH_CUDA_ARCH_LIST="3.5;5.0;5.2;6.0;6.1;7.0;7.5;8.0;8.0+PTX"

#cuda11.1
export TORCH_CUDA_ARCH_LIST="5.0;7.0;8.0;8.6;8.6+PTX"

当然在编译过程中最令我头疼的是遇到了如下所示的问题:

No CUDA runtime is found, using CUDA_HOME='/usr/local/cuda'

编写好dockerfile文件之后,有些需要cuda进行编译的文件没法正常进行编译只能使用CPU,但是此时显卡调用的安装工具已经全部安装,搜索了好久资料无果的情况下,我翻看到了mmdetection官方提供的dockerfile文件,至此我才恍然大悟,原来在环境变量那里也要进行必要的设置。除此之外,我觉得当初如果学着示例的写法,直接拉取pytorch的基础镜像可能就没有太多前面的事情了。

ENV TORCH_NVCC_FLAGS="-Xfatbin -compress-all" # 使用nvcc去编译pytorch
ENV FORCE_CUDA="1"

构建好镜像,运行容器中具体的程序时候,还遇到过docker的编码问题:

UnicodeEncodeError: 'ascii' codec can't encode characters in position...

python默认使用的是utf-8的编码方式,但是在docker内却并不是这样,容器内默认使用的是POSIX,在命令行内输入locale就可以观察到具体的编码方式,locale -a就能看到系统支持的全部编码方式,本次的镜像中支持的编码方式为:

C
C.UTF-8
POSIX

所以需要在dockerfile内加上

ENV LANG=C.UTF-8

利用基础镜像去一点一点搭建环境,目前便遇到了这么多坑
我发现还是去拉pytorch官方提供的镜像更为简单很多,虽然基础镜像略大,但是不得不说很多必要的安装包都已经提前安装完毕,构建符合要求的镜像更为简单。

结束

本以为封装环境能够在一两个效时之内结束,没想到调bug,查资料,差点就通宵了。不过最后总归能够顺利完成,对于上述问题如有异议欢迎指正!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值