在Docker内使用cuda+cudnn+insightface调用gpu计算

陈伦刚
陈伦刚
发布于 2025-01-08 / 32 阅读
0

在Docker内使用cuda+cudnn+insightface调用gpu计算

image-dhov.png

前言背景:

在开发人脸识别系统的过程中,由于数据量较大,作者选择了使用InsightFace框架并尝试调用GPU以加速处理。然而,在Ubuntu 22.04环境下,这一过程遇到了诸多挑战。尽管经过数天的努力,作者成功实现了GPU调用,但系统重启后环境配置失效的问题让我彻底红温。

最终决定放弃Ubuntu,转而采用Debian 12作为宿主机操作系统,并在此环境下一次性成功完成了环境配置。这一过程中的经验教训和成功案例,参考文献: https://juejin.cn/post/7320086948100784178,在这里对原作者的贡献表示感谢。

随着业务需求的扩展,我们进一步尝试在Docker或Kubernetes环境中运行该系统,这又带来了一系列新的挑战。为了记录这些经验并为未来可能遇到类似问题的开发者提供参考,我们决定将这些经历详细记录下来。

环境: Debian12.8

GPU: NVIDIA Telsa T4

1. 先在/etc/apt/sources.list末尾追加如下文本

#deb cdrom:[Debian GNU/Linux 12.5.0 _Bookworm_ - Official amd64 DVD Binary-1 with firmware 20240210-11:28]/ bookworm contrib main non-free-firmware

deb http://mirrors.huaweicloud.com/debian/ bookworm main contrib non-free non-free-firmware
deb-src http://mirrors.huaweicloud.com/debian/ bookworm main contrib non-free non-free-firmware

deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
deb-src http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware

# bookworm-updates, to get updates before a point release is made;
# see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports
deb http://mirrors.huaweicloud.com/debian/ bookworm-updates main contrib non-free non-free-firmware
deb-src http://mirrors.huaweicloud.com/debian/ bookworm-updates main contrib non-free non-free-firmware

然后再执行

apt update -y && \
sudo apt upgrade -y && \
apt install nvidia-detect -y && \
apt install linux-headers-amd64 linux-headers-$(uname -r) -y

可以看到已经正常输出了显卡型号

2.然后安装docker

参考我的另一篇文章 https://chenlungang.com/?p=bc50b235-7f68-4489-946c-bd59776f64f8

就不再赘述了

3.安装 NVIDIA Container Toolkit (直接复制粘贴下面的代码 然后回车运行)

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/stable/deb/nvidia-container-toolkit.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 && \
sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list && \
sudo apt-get update && \
sudo apt-get install -y nvidia-container-toolkit && \
sudo nvidia-ctk runtime configure --runtime=docker && \
systemctl restart docker

4.安装 CUDA Toolkit (直接复制粘贴下面的代码 然后回车运行, 中途还需要按一下回车)

wget https://developer.download.nvidia.com/compute/cuda/12.6.3/local_installers/cuda-repo-debian12-12-6-local_12.6.3-560.35.05-1_amd64.deb && \
sudo dpkg -i cuda-repo-debian12-12-6-local_12.6.3-560.35.05-1_amd64.deb && \
sudo cp /var/cuda-repo-debian12-12-6-local/cuda-*-keyring.gpg /usr/share/keyrings/ && \
sudo add-apt-repository contrib && \
sudo apt-get update && \
sudo apt-get -y install cuda-toolkit-12-6

5.可以在nvidia的官方docker hub里面查看版本

https://hub.docker.com/r/nvidia/cuda/tags

为了安装和使用python更方便一些, 这里我们选择Ubuntu20.04版本

然后把这个镜像拉下来, 方便后续使用

docker pull nvidia/cuda:12.6.3-cudnn-devel-ubuntu20.04

然后使用下面的代码看gpu是否能正常识别和调用

nvidia-smi

.生成一个容器 并且在里面使用python, 然后执行下面的python代码, 观察是否有CUDA字样的输出

import insightface;insightface.app.FaceAnalysis()

尝试一下在容器内安装Python并使用insightface, 很不幸, 报错了, Failed to load library libonnxruntime_providers_cuda.so with error: libcudnn.so.9: cannot open shared object file: No such file or directory, 大概意思是说缺失了libcudnn.so.9这个文件, 之前在Ubuntu安装环境的时候类似的so文件缺失其实更多, 只能通过去网上搜索解决了, 有的是cuda和cudnn版本匹配问题, 有的是onnxruntime-gpu库的问题, 千奇百怪的

只能再去搜一下看看怎么个事, 网上说是我没有安装cudnn, wmlgb的这不nm是nvidia官方的镜像吗

再次红温的博主决定根据网上搜索的结果换一个带cudnn环境的镜像

这次果然成功了, 我们可以看到已经出现CUDAExecutionProvider字样了, 就代表insightface可以成功的调用CUDA来进行GPU计算数据了

补充一点, 这个怎么看insightface是否能成功调用CUDA, 用下面的代码去容器内执行就可以了, 就一行代码

import insightface;insightface.app.FaceAnalysis()

容器内首次执行的话, insightface会去自动从github拉取onnx模型文件, 如果涉及到频繁更新的话, 建议把下载好模型后的文件打一个base镜像, 下次更新代码的时候再去构建就不会再去漫长的等待他下载了

或者或者在构建的阶段通过Dockerfile的COPY命令把模型的zip包解压进下面的目录即可

解压目录: /root/.insightface/models/buffalo_l (注意:如果是非root用户或者venv或者其它环境的话可能有细微差别, 请自行判断)

模型链接: https://github.com/deepinsight/insightface/releases/download/v0.7/buffalo_l.zip

文件结构大概长下面的样子, buffalo_l.zip这个文件在解压后应该是可以删掉的, 但是buffalo_l这个文件夹是必须要存在的, 不然这个insightface会反复的触发模型下载的动作, 导致容器启动的很慢