目录
背景介绍
新手小白,尝试搭建百度飞桨为平台的语音识别深度学习框架,DeepSpeech2,使用的是Docker容器安装,尽管在我检索到的资料中都表示实用docker镜像不会因为环境或版本问题导致配置失败,但是在部署的过程中依然遇到诸多问题,在此对问题的解决方案与步骤做一个记录。
环境与配置
硬件环境:
硬件主机:4GPU的超算服务器
GPU : RTX 2080 Ti
软件环境 :
宿主机操作系统:CentOS 7
docker版本 : 19
NVIDIA GPU的驱动已经安装完成,这里不再赘述。
报错信息
//此处仅是部分报错信息,完整的报错信息栈太长
----------------------
Error Message Summary:
----------------------
ExternalError: Cudnn error, CUDNN_STATUS_EXECUTION_FAILED at (/paddle/paddle/fluid/operators/conv_cudnn_op.cu:300)
[operator < conv2d > error]
Failed in evaluation!
报错说明
经过大量的检索和相关专业人士的咨询,猜测可能是因为CUDA和cuDNN版本和paddle的版本不匹配导致的,经过好几天的排查与尝试,最终划定了大致范围,是CUDA和cuDNN的版本需要更换。
CUDA的卸载与升级
1.首先是CUDA安装文件的下载
在NVIDIA的官方网站下载对应的CUDA版本,根据当前使用的不同的环境,下载不同版本,在本例中,由于docker镜像使用的是ubuntu 16.0 (前文提到的CentOS是宿主机操作系统,此时由于环境安装在docker虚拟环境中,所以,下载的安装包以docker镜像的版本为准),所以选择如下图所示。
如果您所要下载的CUDA版本刚好是最新版,那么,皆大欢喜,知道按照图示执行下载指令即可。
本实例所需要的的版本是CUDA 10.0版本,所以,需要执行点击最右侧的绿色方块选项“Legacy Release”,选择历史版本。
选择对应版本号后,再根据内核版本下载不同的安装包。 本例中,下载的文件名是 cuda_10.0.130_410.48_linux.run ,此时安装包下载完成。
2.原版本的CUDA的卸载
卸载CUDA的方法CSDN上有很多,介绍的都是执行脚本 uninstall_cuda_9.0.pl 来进行卸载,这里做一个简单的说明,并不是所有的环境中都可以找到卸载脚本,这个取决于当时安装这个CUDA的方式,使用apt-get install 进行安装的就没有卸载脚本(本例CUDA安装目录中就没有)。请注意,不需要卸载驱动,不需要卸载驱动,不需要卸载驱动,不要先制造困难,再克服困难,跟自己过不去。
所以这里介绍两种卸载方法,
第一就是使用脚本卸载,本方法适用于使用本地安装包安装的CUDA
##进入CUDA的安装目录,本例是 /usr/local/cuda-9.0
#进入bin目录
cd /usr/local/cuda-9.0/bin
#执行uninstall脚本
./uninstall_cuda_9.0.pl
#删除安装文件夹 本例中,即删除 /usr/local/cuda-9.0
#此时回退到目录 /usr/local 请您删除前一定要再三确认
#删除安装目录
rm -rf cuda-9.0
#此时,CUDA 9.0版本删除完成
第二种方法就是先前是使用在线安装的方式,例如 apt-get install 或者 yum install 等方式。此时,安装目录中是没有uninstall脚本的,那么这种情况的卸载方式是:
#以下是NVIDIA官方文档介绍的卸载方法
##$ sudo dnf remove <package_name> # RHEL8/CentOS8
##$ sudo yum remove <package_name> # RHEL7/CentOS7
##$ sudo dnf remove <package_name> # Fedora
##$ sudo zypper remove <package_name> # OpenSUSE/SLES
##$ sudo apt-get --purge remove <package_name> # Ubuntu
#在本例中,由于是ubuntu系统,所以执行如下指令
sudo apt-get --purge remove cuda*
最后,卸载旧版本的安装目录
# 本实例中旧版本的 CUDA 版本是 9.0,请您在执行删除语句时注意您本地的版本号所对应的安装文件夹名称
rm -rf /usr/local/cuda-9.0
更多详情,你可以查询官方文档。到此,卸载结束
3.新版本的安装
安装上文提到已下载的安装包文件 cuda_10.0.130_410.48_linux.run ,请注意,将安装文件放置在需要安装的环境中,本例中,需要在docker的容器中,所以需要将文件复制到虚拟环境中,复制的指令是
##复制宿主机文件到docker容器,其中699f65f42bab是容器ID
docker cp /data/cuda_10.0.130_410.48_linux.run 699f65f42bab:/home/
进入docker容器后,执行
sh cuda_9.0.176_384.81_linux.run
接下来会有一连串的交互与安装确认,
第一步是询问是否接受,毫无疑问你没得选,输入 accept。
第二步是选择安装选项,此时可以不选驱动,因为上面没有卸载
接下来就是一路yes下去,直到安装成功。
配置环境变量,在用户主目录底下有一个隐藏文件 .bashrc ,文件修改如下:
#进入用户主目录
cd ~
#编辑 .bashrc文件
vim .bashrc
#在文件末尾添加一下配置,保存退出
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-10.0/lib64
export PATH=$PATH:/usr/local/cuda-10.0/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda-10.0
#在终端运行
source ~/.bashrc
验证CUDA
[root@localhost home]# nvcc --version
# 以下是 CUDA 的版本信息
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:01_CDT_2018
Cuda compilation tools, release 10.0, V10.0.130
至此,CUDA版本更新完成。
cuDNN的版本升级
旧版本的cuDNN的卸载
# 使用以下指令移除旧版本的cudnn
# 如果您不放心,您可移除前选择备份
# 部分读者的环境中可能没有以下两个文件,执行指令不影响环境
sudo rm -rf /usr/local/cuda/include/cudnn.h
sudo rm -rf /usr/local/cuda/lib64/libcudnn
新版本的cuDNN的安装包下载
请注意,cuDNN的版本是和CUDA有对应关系的,同一版本的cuDNN可能有多个对应不同CUDA版本的安装包,下载时需要多注意,如下图所示:
选择合适的版本后,下载后的文件名 : cudnn-10.0-linux-x64-v7.6.0.64.solitairetheme8 本实例下载的是匹配CUDA 10.0 版本的cuDNN 7.6 版本。
cuDNN的安装
上一章节中的下载文件名cudnn-10.0-linux-x64-v7.6.0.64.solitairetheme8 有一个陌生的扩展名,此文件可直接重命名为压缩文件,不过安全起见,可一次执行如下指令:
# 将cudnn-10.0-linux-x64-v7.6.0.64.solitairetheme8 文件复制到需要安装的环境
# 保险起见,执行复制而不是重命名
cp cudnn-10.0-linux-x64-v7.6.0.64.solitairetheme8 cudnn-10.0-linux-x64-v7.6.0.64.tar.gz
# 然后解压文件
tar xzvf cudnn-10.0-linux-x64-v7.6.0.64.tar.gz
# 进入解压后的文件夹,复制文件到对应的文件目录
cp include/cudnn.h /usr/local/cuda/include/
cp lib64/lib* /usr/local/cuda/lib64/
建立软连接
#此时,进入 /usr/local/cuda/lib64 目录
cd /usr/local/cuda/lib64
# 建立软连接
# 具体的版本号,请您根据您的实际环境进行配置,本实例是7.6.0版本
sudo chmod +r libcudnn.so.7.6.0
sudo ln -sf libcudnn.so.7.6.0 libcudnn.so.7
sudo ln -sf libcudnn.so.7 libcudnn.so
sudo ldconfig
查看与验证
# 查看 软连接
[root@localhost /usr/local/cuda/lib64]# ls -al | grep cudnn
lrwxrwxrwx 1 root root 13 Jul 3 03:12 libcudnn.so -> libcudnn.so.7
lrwxrwxrwx 1 root root 17 Jul 3 03:12 libcudnn.so.7 -> libcudnn.so.7.6.0
-rwxr-xr-x 1 root root 359M Jul 3 03:10 libcudnn.so.7.6.0
-rw-r--r-- 1 root root 358M Jul 3 03:10 libcudnn_static.a
# 查看cuDNN的版本
[root@localhost /usr/local/cuda/lib64]# cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
#define CUDNN_MAJOR 7
#define CUDNN_MINOR 6
#define CUDNN_PATCHLEVEL 0
--
#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)
#include "driver_types.h"
由上图可知,cuDNN的版本已更新为 7.6.0 ,至此,版本更新终于完成。