深度学习paddle框架bug记录
**
报错解决记录:Compiled with WITH_GPU, but no GPU found in runtime. 或者 (External) CUDA error(100), no CUDA-capable device is detected.
**
前言
在将paddleocr项目布置到centos服务器上训练时,出现报错。查询相关博客后,怀疑可能是内核更新,导致原来的驱动版本不适用。记录以下过程。
一、报错如下
在linux系统centos下运行paddlepaddle。出现以下报错:
nvcc -V
能够查询到cuda版本为11.6。
根据官网下载paddlepaddle-gpu.post116。
Compiled with WITH_GPU, but no GPU found in runtime.
/app/ocrapp/env/ocr_env/lib/python3.10/site-packages/paddle/fluid/framework.py:549: UserWarning: You are using GPU version Paddle, but your CUDA device is not set properly. CPU device will be used by default.
warnings.warn(
当前设备为:gpu:0
Traceback (most recent call last):
File "/app/ocrapp/PaddleOCR/tools/train.py", line 225, in <module>
config, device, logger, vdl_writer = program.preprocess(is_train=True)
File "/app/ocrapp/PaddleOCR/tools/program.py", line 683, in preprocess
device = paddle.set_device(device)
File "/app/ocrapp/env/ocr_env/lib/python3.10/site-packages/paddle/device/__init__.py", line 266, in set_device
place = _convert_to_place(device)
File "/app/ocrapp/env/ocr_env/lib/python3.10/site-packages/paddle/device/__init__.py", line 213, in _convert_to_place
place = core.CUDAPlace(device_id)
OSError: (External) CUDA error(100), no CUDA-capable device is detected.
[Hint: 'cudaErrorNoDevice'. This indicates that no CUDA-capable devices were detected by the installed CUDA driver. ] (at ../paddle/phi/backends/gpu/cuda/cuda_info.cc:67)
同时使用nvidia-smi查询,驱动情况出现报错。
二、解决方法
1.可能是驱动没有更新
linux内核更新后,驱动版本不适配。
参考链接:Centos7下遇到Unable to load the ‘nvidia-drm‘ kernel module
1.1下载RTX3060对应的驱动
官网Official Drivers | NVIDIA
复制链接,使用wget下载.run文件。
1.2、centos命令行下使用以下命令,删除错误的devel
yum remove kernel-devel
yum remove $(rpm -qa | grep kernel | grep -v $(uname -r))
1.3、安装匹配的kernel-devel
yum install -y "kernel-devel-uname-r == $(uname -r)"
yum install gcc g++ -y
ls /usr/src/kernels/
1.4、查询kernels的路径和版本信息
1.5.赋予权限并运行
查看下载的驱动
赋予权限
chmod +x NVIDIA-Linux-x86_64-535.113.01.run
安装驱动
./NVIDIA-Linux-x86_64-535.113.01.run -no-x-check -no-nouveau-check --kernel-source-path=/usr/src/kernels/3.10.0-1160.88.1.el7.x86_64
根据自己的驱动修改为对应的版本。
三、结果
安装成功之后,使用nvidia-smi,查看驱动信息如下:
使用单卡运行,将设备改为
import os
os.environ[“CUDA_VISIBLE_DEVICES”]=‘1’
再次运行训练程序。
标题报错消失,出现新的报错:
(PreconditionNotMet) Cannot load cudnn shared library. Cannot invoke method cudnnGetVersion.
[Hint: cudnn_dso_handle should not be null.] (at …/paddle/phi/backends/dynload/cudnn.cc:64)
是cudnn找不到导致。
四、cudnn安装
1.检查cudnn
ls /usr/local/cuda-11.6/lib64/libcudnn*
没有相关文件夹,说明没有安装cudnn.
2.下载cudnn
cudnn下载地址
选择cudnn8.5.0适配cuda11系列。
下载tar包
下载总是失败,所以下载到windows上,再通过rz上传到服务器上。
3.安装
安装可以参考:官网文档
cudnn-linux-x86_64-8.5.0.96_cuda11-archive.tar.xz
如何解压:
tar.xz结尾的压缩文件,需要解压的话,有两种方式:
// 可以看到这个压缩包也是打包后再压缩,外面是xz压缩方式,里层是tar打包方式。
$ xz -d ***.tar.xz
$ tar -xvf ***.tar
或者直接使用如下命令来解压
$ tar -xvf cudnn-linux-$arch-8.x.x.x_cudaX.Y-archive.tar.xz
将cudnn中的文件复制到cuda所在的文件里面:
$ sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-11.6/include
$ sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-11.6/lib64
$ sudo chmod a+r /usr/local/cuda-11.6/include/cudnn*.h /usr/local/cuda-11.6/lib64/libcudnn*
重新载入配置:
source ~/.bash_profile
验证:
cat /usr/local/cuda-11.6/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
出现以下,说明cudnn安装完毕。
#define CUDNN_MAJOR 8
#define CUDNN_MINOR 5
#define CUDNN_PATCHLEVEL 0
–
#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)
#endif /* CUDNN_VERSION_H */
测试下:
使用 python3 进入 python 解释器,输入
import paddle
,再输入
paddle.utils.run_check()
如果出现
PaddlePaddle is installed successfully!
,说明您已成功安装。
五、参考文章
1.Centos7下遇到Unable to load the ‘nvidia-drm‘ kernel module
2.运行paddle-gpu相关项目报错
3.Cannot load cudnn shared library. Cannot invoke method cudnnGetVersion
4.【记录】在WSL2上安装cuDNN和TensorRT
5.Ubuntu 22.04+cuda11.3+cudnn8.5配置 保姆级教程
总结
本文主要解决驱动版本与内核不匹配导致问题,通过重新安装内核与Nvidia驱动。由于系统内装有多个cuda版本,该项目使用的cuda-11.6检测过程中发现cudnn未安装,补充对应的版本。