前言背景:
在开发人脸识别系统的过程中,由于数据量较大,作者选择了使用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会反复的触发模型下载的动作, 导致容器启动的很慢