Linux系统CUDA安装及踩坑记录

我的Linux系统背景:

  • 系统和驱动都已安装。
  • 系统是centos 8。查看自己操作系统的版本信息: cat /etc/issue 或者是 cat /etc/lsb-release
  • nvidia-smi 可以看到显卡驱动和可支持的最高cuda版本,我的是11.4。驱动版本是470.57.02。

首先,检查是否安装了CUDA: ls -l /usr/local | grep cuda

如果已经安装了就不需要再次安装,当然有一种说法是不安装CUDA也可行,在虚拟环境中安装pytorch的时候会自动装一个不完整的CUDA,足够跑深度学习了。但是如果需要cuda编程等操作就需要安装完整版的CUDA,也就是后面我要介绍的安装过程。

其实我也试过不安装CUDA直接安装pytorch,确实是可用的,只不过用deepspeed的时候会报错找不到CUDA HOME,所以还是安装完整版CUDA吧~

1.安装cuda

根据机器的显卡驱动可以查看可安装的cuda版本

参考: docs.nvidia.com/cuda/cu


我选择安装的是CUDA 11.3.1, 不同版本下载安装链接 ,根据自己的系统选择下图的选项,installer type选择runfile(local),然后根据给出的命令安装CUDA:


比如我安装CUDA 11.3.1的命令是:

wget https://developer.download.nvidia.com/compute/cuda/11.3.1/local_installers/cuda_11.3.1_465.19.01_linux.run
sudo sh cuda_11.3.1_465.19.01_linux.run

傻瓜式操作输入yes,accept等即可。安装的时候注意选择不安装驱动,因为机器本身已经有驱动,所以这一步需要用空格取消对 Driver 的选中(事实上我遇到的情况是,如果不取消选中,安装会fail)。其他选项中除了 CUDA Toolkit 是必选,其他都是可选项目。我这里其他都选择了。最后选择 Install 。类似于下图


如果这个过程中出现提示 existing package manager installation of the driver found ,那么需要先退出安装, 删除cuda toolkit和driver

To remove CUDA Toolkit:
$ sudo dnf remove "cuda*" "*cublas*" "*cufft*" "*curand*" \
 "*cusolver*" "*cusparse*" "*npp*" "*nvjpeg*" "nsight*"
To remove NVIDIA Drivers:
$ sudo dnf remove nvidia-driver 
To reset the module stream:
$ sudo dnf module reset nvidia-driver

然后装CUDA,再装驱动: sudo dnf module install nvidia-driver

如果没有出现这个问题就不需要管驱动啦~

检查cuda是否安装成功: nvcc -V

如果没有这个命令的话,需要配置。

vim ~/.bashrc

在文件末尾添加(这里的 /usr/local/cuda-11.3 替换成你的cuda安装路径,一般都在 /usr/local 路径下)

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-11.3/lib64
export PATH=$PATH:/usr/local/cuda-11.3/bin
# export CUDA_HOME=$CUDA_HOME:/usr/local/cuda-11.3
export CUDA_HOME=/usr/local/cuda-11.3

然后 source ~/.bashrc

上述环境变量中,我看很多教程都是按照第三行配置的CUDA_HOME,但是后续我在使用deepspeed的时候会报错找不到 /usr/local/cuda-11.3:/usr/local/cuda-11.3/bin/nvcc ,按照第四行配置CUDA_HOME就不会有这个问题。

再执行 nvcc -V 就会显示出你刚刚安装的CUDA版本

2.安装cuDNN

cuDNN 是NVIDIA专门针对深度神经网络(Deep Neural Networks)中的基础操作而设计基于GPU的加速库 。不安装的话不会报错,但是训练的速度会慢很多。

英伟达官网 下载cuda 11.3对应的cuDNN安装包(需要注册),具体安装哪个版本呢,可以参考这个 链接 和你的CUDA版本选择。

我选择安装的是8.2.0版本,cuDNN Library for Linux(x86_64)这个版本(图中的第二个链接),下载后的文件是cudnn-11.3-linux-x64-v8.2.0.53.tgz


下载完成后解压得到 cuda 目录, cuda 目录下面有 include lib64 两个子目录。将cuda/include/cudnn.h文件复制到usr/local/cuda-11.3/include文件夹,将cuda/lib64/下所有以libcudnn开头的文件复制到/usr/local/cuda-11.3/lib64文件夹中,并添加读取权限

tar -xvf cudnn-11.3-linux-x64-v8.2.0.53.tgz #解压
sudo cp cuda/include/cudnn.h    /usr/local/cuda-xx.x/include # 填写对应的版本的cuda路径
sudo cp cuda/lib64/libcudnn*    /usr/local/cuda-xx.x/lib64   # 填写对应的版本的cuda路径
sudo chmod a+r /usr/local/cuda-xx.xx/include/cudnn.h   /usr/local/cuda-xx.xx/lib64/libcudnn*

3.测试是否成功

安装miniconda ,创建环境,安装pytorch。 conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch

进入环境,执行

import torch
torch.cuda.is_available()

返回True就说明没问题了。

然后此处我一直是False,报错信息是 Error 802: system not yet initialized 。

搜索这个报错信息,找到 教程 ,可以用来验证CUDA是否安装成功。

教程里用的是ubuntu系统。centos系统的操作过程如下( 注意下面的教程操作完成后,显卡驱动会更新

# 需要先安装git:sudo yum install -y git
# 其实安装cuda的时候如果选了samples也可以直接用那个
git clone https://github.com/NVIDIA/cuda-samples.git
# 这个路径如果不存在,就自己找找bandwidthTest在哪个路径,因为项目可能有更新
cd cuda-samples/Samples/1-Utilities/bandwidthTest
./bandwidthTest

注意如果 make 报错说没有g++,需要安装 **yum install gcc-c++**

执行 ./bandwidthTest 后报错:

> ./bandwidthTest
[CUDA Bandwidth Test] - Starting...
Running on...
cudaGetDeviceProperties returned 802
-> system not yet initialized
CUDA error at bandwidthTest.cu:256 code=802(cudaErrorSystemNotReady) "cudaSetDevice(currentDevice)" 

需要安装Data Center GPU manager。 安装教程

# Set up the CUDA network repository meta-data, GPG key
sudo dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo
# Install DCGM
sudo dnf clean expire-cache \
&& sudo dnf install -y datacenter-gpu-manager
# Set up the DCGM service
sudo systemctl --now enable nvidia-dcgm

然后

# terminate the host engine,这里可能会报错unable to terminate xxx,忽略
sudo nv-hostengine -t
# and start the fabricmanager
sudo service nvidia-fabricmanager start

如果报错了:

> sudo service nvidia-fabricmanager start
Failed to start nvidia-fabricmanager.service: Unit nvidia-fabricmanager.service not found.