最近在ubuntu-server18.04 系统上装了cuda,这里记录一下。以便以后好参照。
这里为了避免cuda driver跟cuda版本的问题,采用了runfile的方式进行安装。
下面给出cuda及cudnn 下载的分享链接,方便下载:
cuda-10.1
链接:https://pan.baidu.com/s/1bvVdvU58CEee7t4On0Sgnw
提取码:y2pi
aliyun
「cuda-10.1」等文件 https://www.aliyundrive.com/s/oNXiv2hLTAs
cuda-11.2
链接:https://pan.baidu.com/s/1ThH7iRp7O7_qO4GAw15tSA
提取码:ilte
aliyun
「cuda-11.2」等文件 https://www.aliyundrive.com/s/E9JzkKEcyvW
cudnn-sample
「cudnn8.1.1-cuda-11.2-sample」等文件 https://www.aliyundrive.com/s/9TXbLBuiB5D
内核更新可能会由于内核与驱动不匹配,导致系统无限重启
由于cuda安装后,会由于系统重启自动更新内核导致如下效果。
这里为了避免之后出现以上效果,提前设置系统禁止内核更新。
方法一(apt命令):
#查看已安装的内核
sudo dpkg --get-selections | grep linux
#查看正在使用的内核
uname -r
#使用apt命令禁止内核更新
sudo apt-mark hold linux-image-generic linux-headers-generic
sudo apt-mark hold linux-image-extra-generic
#重启内核更新
sudo apt-mark unhold linux-image-generic linux-headers-generic
sudo apt-mark unhold linux-image-extra-generic
效果大致如下:
方法二(修改配置文件):
# 修改以下文件
sudo vim /etc/apt/apt.conf.d/10periodic
sudo vim /etc/apt/apt.conf.d/20auto-upgrades
#关闭自动更新
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Download-Upgradeable-Packages "0";
APT::Periodic::AutocleanInterval "0";
APT::Periodic::Unattended-Upgrade "0";
#开启自动更新
APT::Periodic::Update-Package-Lists "2";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "0";
APT::Periodic::Unattended-Upgrade "1";
修改后的效果:
安装之前要确认系统里没有旧版本cuda残留。如果之前装过,则通过安装的cuda下面的清除命令执行卸载操作。可能不同的cuda版本二进制文件名略有差异,不过应该可以通过名字看出来哪个是卸载操作。这里cuda10.1是 ./cuda-uninstaller
确保系统里没有安装过cuda或者清除干净了。
清除系统之前可能装过的nvidia
sudo dpkg -l | grep nvidia
sudo apt-get --purge remove "*nvidia*"
sudo apt autoremove
删除以前的链接配置,一般链接搜索的配置会在/etc/ld.so.conf中配置或者/etc/ld.so.conf.d/文件夹下配置。如果有以前的cuda配置文件的话,可以删除掉,类似cuda-xxx.conf
添加cuda的执行权限,并用管理员权限运行
sudo chmod u+x cuda_10.1.105_418.39_linux.run
sudo ./cuda_10.1.105_418.39_linux.run
执行成功会看到如下效果:
然后可以在 $HOME/.bashrc中配置 PATH ,并且在 /etc/ld.so.conf中配置cuda的库搜索路径
这里贴出我的$HOME/.bashrc
export PATH=/usr/local/cuda-10.1/bin:$PATH
库文件搜索路径为
cuda-10.1.conf
usr/local/cuda-10.1/targets/x86_64-linux/lib
/usr/local/cuda-10.1/lib64
接下来生效上面添加的库搜索路径:
sudo ldconfig
在cuda-11.2的的版本下,会提示,如果没遇到则可以跳过,如果遇到需要手动添加软链。
这样就需要我们自己生成软链接,这里贴出我的操作,读者需要修改为自己对应的版本:
我这里的cudnn版本是8.1.1
手动生成软链接
sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8.1.1 /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_cnn_train.so
sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8.1.1 /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8
sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8.1.1 /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8
sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8.1.1 /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_cnn_infer.so
sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn.so.8.1.1 /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn.so
sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn.so.8.1.1 /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn.so.8
sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_ops_train.so.8.1.1 /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_ops_train.so.8
sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_ops_train.so.8.1.1 /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_ops_train.so
sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_adv_train.so.8.1.1 /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_adv_train.so.8
sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_adv_train.so.8.1.1 /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_adv_train.so
sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8.1.1 /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_adv_infer.so
sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8.1.1 /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8
sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8.1.1 /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8
sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8.1.1 /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_ops_infer.so
再次执行ldconfig,发现没有警告提示了。
至此cuda就安装完毕了。
可以检测一下。
安装完后可以去验证一下看cuda是否可以找到设备
默认会在家目录下有个测试用例文件夹:
进入NVIDIA_CUDA-10.1_Samples/1_Utilities/deviceQuery路径下,执编译代码,然后执行二进制文件。
make
./deviceQuery
如果出现以下效果,则说明cuda安装成功!
接下来就可以解压,安装 cudnn了。
#解压 cudnn压缩包,这里要注意后缀版本要与cuda版本一致
tar -zxvf cudnn-10.1-v7.tar.gz
#将解压后的头文件跟库文件拷贝到安装的cuda路径下
sudo cp cuda/include/cudnn* /usr/local/cuda-10.1/include/
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-10.1/lib64/
#添加权限
sudo chmod a+r /usr/local/cuda-10.1/include/cudnn.h
sudo chmod a+r /usr/local/cuda-10.1/lib64/libcudnn*
# 查看cudnn版本
cat /usr/local/cuda-10.1/include/cudnn.h | grep CUDNN_MAJOR -A 2
# 如果是cudnn8以上有所不同
cat /usr/local/cuda-11.2/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
可以看到我这里的cudnn版本为7.6.5
下面可以安装runtime library, developer library,code sample and cuDNN library documentation
# 注意要安装对应系统和版本的软件包
sudo dpkg -i libcudnn8_8.1.1.33-1+cuda11.2_amd64.deb
sudo dpkg -i libcudnn8-dev_8.1.1.33-1+cuda11.2_amd64.deb
sudo dpkg -i libcudnn8-samples_8.1.1.33-1+cuda11.2_amd64.deb
效果如下所示:
安装完后,就有了sample示例代码。然后我们可以进行测试
示例代码默认安装路径在 /usr/src/cudnn_samples_v8/
# Copy the cuDNN samples to a writable path.
$ cp -r /usr/src/cudnn_samples_v8/ $HOME
# Go to the writable path.
$ cd $HOME/cudnn_samples_v8/mnistCUDNN
# 安装依赖 freeimage 建议将软件源替换为阿里源
$ sudo apt-get update -y && sudo apt-get install libfreeimage3 libfreeimage-dev -y
# Compile the mnistCUDNN sample.
$ make clean && make
# Run the mnistCUDNN sample.
$ ./mnistCUDNN
# If cuDNN is properly installed and running on your Linux system, you will see a message similar to the following:
Test passed!
编译后的效果:
执行结果