Ubuntu 21.04 使用Docker部署深度学习项目(cuda11.2+cudnn8.8+deepface)

  • Post author:
  • Post category:其他




1.安装Docker

docker官网:

http://docs.docker.com/



https://docs.docker.com/engine/install/ubuntu/



1.1 确定系统版本

$ lsb_release -a



1.2 卸载旧版本

$ for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done



1.3 设置stable镜像仓库

#Update the apt package index and install packages to allow apt to use a repository over HTTPS:
$ sudo apt-get update
$ sudo apt-get install ca-certificates curl gnupg

# Add Docker’s official GPG key:
$ sudo install -m 0755 -d /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ sudo chmod a+r /etc/apt/keyrings/docker.gpg

#Use the following command to set up the repository: 
$ echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null



1.4 安装Docker ce

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin



1.5 测试

$ sudo docker version
$ sudo docker run hello-world



1.6 阿里云镜像加速

登录阿里云开发者平台,点击控制台,选择容器镜像服务,获取加速器地址,粘贴脚本直接执行

$ mkdir -p /etc/docker
$ vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://{自已的阿里云编码}.mirror.aliyuncs.com"]
}



1.7 重启服务器

$ systemctl daemon-reload
$ systemctl restart docker
#测试运行hello-word
$ sudo docker run hello-word



2.安装nvidia-docker

nvidia官网:

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html

1.Setup the package repository and the GPG key:

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
            sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
            sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

因为目前还没有nvidia-docker版本支持ubuntu21.04,所以这里的distribution手动设置为20.04,即执行如下命令:

$ distribution=ubuntu20.04 \
      ...

2.Install the nvidia-container-toolkit package (and dependencies) after updating the package listing:

$ sudo apt-get update
$ sudo apt-get install -y nvidia-container-toolkit

3.Configure the Docker daemon to recognize the NVIDIA Container Runtime:

$ sudo nvidia-ctk runtime configure --runtime=docker

4.Restart the Docker daemon

$ sudo systemctl restart docker

5.测试

$ sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi

在这里插入图片描述



3.cuda11.2+cudnn8.8环境配置



3.1 拉取cuda镜像

根据使用环境,选择对应链接:

cuda

镜像。注意cuda镜像版本需要跟驱动版本一致,否则使用时会报错。

通过命令nvidia-smi查看宿主机CUDA版本为11.2

$ sudo docker pull nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04



3.2 运行容器

# 1.运行容器
$ sudo docker run -d --name mllab --gpus all nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04 /bin/bash
# 2.进入容器
$ sudo docker exec -it mllab bash
# 查看cuda信息
$ nvidia-smi
$ nvcc -V
# 查看cudnn信息,镜像内cudnn版本是8.1
$ sudo find / -name cudnn_version.h
$ cat cudnn_version.h



3.3 apt配置国内源

安装vim

$ apt-get update && apt-get install -y --no-install-recommends vim wget 

配置国内源

$ cp /etc/apt/sources.list /etc/apt/sources.list.bak 
$ vim /etc/apt/sources.list
$ sudo apt-get update

替换为阿里云

deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse



3.4 更换cudnn

由于deepface要求cudnn版本8.6以上,所以需要替换掉8.1

1.下载cudnn-linux-x86_64-8.8.0.121_cuda11-archive.tar.xz

官网:

https://developer.nvidia.com/rdp/cudnn-archive

  1. 将压缩文件拷贝到容器内
$ sudo docker cp cudnn-linux-x86_64-8.8.0.121_cuda11-archive.tar.xz 容器ID:容器内路径

3.在容器内解压


$ tar -xvf cudnn-linux-x86_64-8.8.0.121_cuda11-archive.tar.xz

4.cuda配置cudnn

 $ mv cudnn-linux-x86_64-8.8.0.121_cuda11-archive/include/*  /usr/local/cuda-11.2/include
 $ mv cudnn-linux-x86_64-8.8.0.121_cuda11-archive/lib/*  /usr/local/cuda-11.2/lib64
$ sudo chmod a+r /usr/local/cuda-11.2/include/cudnn*.h /usr/local/cuda-11.2/lib64/libcudnn*
# 查看cuDNN版本
$ cat /usr/local/cuda-11.2/include/cudnn_version.h | grep CUDNN_MAJOR -A 2



3.5 安装python3.8

$ apt-get install -y --no-install-recommends \
  python3 \
  python3-pip \
  python3-dev \
  python3-wheel &&\
cd /usr/local/bin &&\
ln -s /usr/bin/python3 python &&\
ln -s /usr/bin/pip3 pip;
# 更新pip源
# pip升级到最新的版本
$ python -m pip install --upgrade pip
# 修改pip源为清华源
$ pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

# 或者修改为阿里云的源
# 查看当前 pip 的配置
$ pip config list 
# 接着修改配置文件
$ pip config set global.index-url http://mirrors.aliyun.com/pypi/simple/
$ pip config set install.trusted-host mirrors.aliyun.com



3.6 cuda容器生成新镜像

docker commit [-m=“描述信息”] [-a=“作者”] 容器ID 新镜像名:[标签名]

$ docker commit 容器ID waf/image_mllab



4.创建deepface镜像



4.1修改Dockerfile

  1. 修改基础镜像为新生成的cuda镜像。
  2. 在Dockerfile文件中添加以下命令来设置时区,这样在构建镜像时就会自动设置时区,解决 Docker build 构建镜像时卡住问题。
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&  echo "Asia/Shanghai" > /etc/timezone
  1. 配置模型文件路径

    在这里插入图片描述



4.2使用GPU环境构建镜像

1.在docker 配置文件/etc/docker/daemon.json 中指定默认的runtime:

{
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
         } 
    },
    "default-runtime": "nvidia"  ## 这一步需要添加
}

将默认runtime设定为nvidia后,docker build阶段会默认开启gpu,dockerfile中可以运行需要GPU环境的代码了。构建好的镜像启动容器时,也不需要再指定–gpu。

感觉这个方法不太灵活,毕竟大部分情况下并不需要nvidia的runtime,镜像也不一定要默认使用GPU。如果docker build能像docker run 指定 –gpu参数 那样灵活设置就好了,不知道是不是有这种方法。

2.构建deepface镜像

#进入Dockerfile所在目录执行命令,注意命令最后有个点
$ docker build -t my_deepface  .



4.3运行容器

$ sudo docker run -it --name container_deepface -p 192.168.3.56:80:5000 --gpus all my_deepface

测试deepface接口

postman发请求测试

注意:可以通过

docker port 容器ID

查看容器的端口映射

$ sudo docker port 5bde28306e71
5000/tcp -> 192.168.3.56:80

在这里插入图片描述



4.4镜像导出成tar包

# docker save -o image.tar 命令用于将 Docker镜像保存到指定文件
$ sudo docker save -o my_deepface.tar my_deepface



4.5导入tar包

# docker load -i imageName.tar 用于从文件载入镜像
$ sudo docker load -i my_deepface.tar

# 运行容器
# 注意在DockerFile中写入的CMD后面的命令不执行主要是因为启动的时候指定了shell,命令末尾不要指定/bin/bash
sudo docker run -it --name container_my_deepface -p 192.168.3.56:80:5000 --gpus all f71edb39a3b1(镜像ID)

在这里插入图片描述

注意:

使用docker load -i 命令之后,镜像的名字和标签都是none,这个问题的根本在于这个镜像压缩包在打包的时候操作不当所导致。

例如,使用镜像ID打包的话导致解压的出来的镜像没有名字。因此,推荐使用镜像的名字进行打包,例如:

docker save -o redis.tar redis:5.0.2

常用命令

#导出镜像到本地
#把镜像名为test,版本为4.0的docker镜像,保存到/data/export目录下,保存名字和格式为test.tar
docker save -o /data/export/test.tar test:4.0

#导入之前导出的镜像
#其中 -i 表示从文件输入。会成功导入镜像及相关元数据,包括tag信息
docker load -i xxx.tar
 
#重命名
docker tag [镜像id] [新镜像名称]:[新镜像标签]



4.6查看容器日志

(1)docker logs –tail=1000 容器名称 (查看容器前多少行的日志)(推荐)

(2)docker 容器启动后,可以进入以下位置查看日志(/var/lib/docker/containers/容器ID/容器ID-json.log)(进入容器内部查看日志)



4.7error排查

醒目部署后,运行其他AI项目时报错:

cudnn.hpp:74: error: (-217:Gpu API call) CUDNN_STATUS_NOT_INITIALIZED in function 'UniqueHandle'

是因为tensorflow-gpu运行程序默认是把GPU的内存全部占满的,可以设置参数来修改显存使用情况。

解决代码:

import tensorflow as tf 
import os

os.environ['CUDA_VISIBLE_DEVICES']="0" # 指定哪块GPU训练
config=tf.compat.v1.ConfigProto() 
#设置使用显存比例,设置最大占有GPU不超过显存的80%(可选)
config.gpu_options.per_process_gpu_memory_fraction=0.8
config.gpu_options.allow_growth = True  # 设置动态分配GPU内存
sess=tf.compat.v1.Session(config=config)


TensorFlow使用显存的设置



解决tensorflow2.2把GPU显存占满的问题



版权声明:本文为u014377655原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。