【Python学习】Ubuntu18.04从零开始安装CUDA与cuDNN

1 版本查看

通常来说,当我们新买了一部服务器主机,假设已经安装好Linux操作系统,这里,以我自己为例,已经安装好Ubuntu18.04,查看系统版本的命令如下:

cat /proc/version

返回如下信息:

Linux version 4.15.0-70-generic (buildd@lgw01-amd64-055) (gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)) #79-Ubuntu SMP Tue Nov 12 10:36:11 UTC 2019

以此为前提,本文是在Ubuntu18.04系统下安装CUDA与cuDNN的。

2 准备工作

在正式开始安装之前,需要做好以下几步工作:

  • 检测服务器能否正常联网:
ping www.baidu.com

如果返回以下信息,则说明能正常联网:

PING www.a.shifen.com (182.61.200.7) 56(84) bytes of data.
64 bytes from 182.61.200.7 (182.61.200.7): icmp_seq=1 ttl=50 time=46.9 ms
64 bytes from 182.61.200.7 (182.61.200.7): icmp_seq=2 ttl=50 time=46.8 ms
64 bytes from 182.61.200.7 (182.61.200.7): icmp_seq=3 ttl=50 time=46.9 ms
64 bytes from 182.61.200.7 (182.61.200.7): icmp_seq=4 ttl=50 time=47.1 ms
...

使用Ctrl+C中断连接,进入下一步。

  • 检查更新并安装ubuntu-drivers与nvidia-smi(假设未安装,如果已经安装,则可以跳过该步骤)

更新源:

sudo apt update

安装ubuntu-drivers,我们可以通过ubuntu-drivers检测你的NVIDIA显卡型号和推荐的驱动程序的模型。

sudo apt install ubuntu-drivers-common

获得NVIDIA显卡型号和推荐的驱动程序:

ubuntu-drivers devices

我的服务器返回以下结果:

== /sys/devices/pci0000:3a/0000:3a:00.0/0000:3b:00.0/0000:3c:10.0/0000:3e:00.0 ==
modalias : pci:v000010DEd00001E07sv000010DEsd000012A4bc03sc00i00
vendor   : NVIDIA Corporation
driver   : nvidia-driver-435 - distro non-free recommended
driver   : nvidia-driver-430 - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin

可以看到,推荐的驱动型号为nvidia-driver-435,这里需要根据你的系统的实际情况进行安装,因此,安装该驱动:

sudo apt install nvidia-driver-435

备注:Nvidia驱动默认安装OpenGL桌面,然而这又与GNOME桌面冲突,为了系统不宕机,需禁用nvidia的OpenGL。
Linux系统一般默认安装的是开源的nouvea显卡驱动,它与nvidia显卡驱动产生冲突,欲装nvidia必禁nouvea!禁用nouveau驱动:

sudo vim /etc/modprobe.d/blacklist.conf

在文件最后插入

blacklist nouveau

保存文件并退出vim,然后输入以下命令并运行:

sudo update-initramfs -u

安装完成后,需要重启主机:

sudo reboot

重启完成后,执行以下命令,若无输出代表禁用nouveau生效:

lsmod | grep nouveau

测试安装是否成功,这会返回你的所有显卡的信息:

nvidia-smi

我的主机返回信息如下:

Sat Dec  7 13:25:00 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.48                 Driver Version: 410.48                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce RTX 208...  Off  | 00000000:1A:00.0 Off |                  N/A |
| 41%   45C    P0    62W / 260W |      0MiB / 10989MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce RTX 208...  Off  | 00000000:1B:00.0 Off |                  N/A |
| 40%   44C    P0    54W / 260W |      0MiB / 10989MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   2  GeForce RTX 208...  Off  | 00000000:3D:00.0 Off |                  N/A |
| 41%   38C    P0    59W / 260W |      0MiB / 10989MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   3  GeForce RTX 208...  Off  | 00000000:3E:00.0 Off |                  N/A |
| 41%   43C    P0    50W / 260W |      0MiB / 10989MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   4  GeForce RTX 208...  Off  | 00000000:88:00.0 Off |                  N/A |
| 41%   40C    P0    66W / 260W |      0MiB / 10989MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   5  GeForce RTX 208...  Off  | 00000000:89:00.0 Off |                  N/A |
| 41%   43C    P0    60W / 260W |      0MiB / 10989MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   6  GeForce RTX 208...  Off  | 00000000:B1:00.0 Off |                  N/A |
| 41%   43C    P0    65W / 260W |      0MiB / 10989MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+
|   7  GeForce RTX 208...  Off  | 00000000:B2:00.0 Off |                  N/A |
| 38%   40C    P0    70W / 260W |      0MiB / 10989MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

3 安装CUDA

3.1 结合系统型号选择合适版本的CUDA安装文件

在这一步,一方面,需要注意系统的型号,另一方面,需要注意选择CUDA的型号,这里首先给出CUDA的型号选择建议:
通常来说,我们会使用Tensorflow或者Pytorch作为深度学习框架,这里简单列举一下它们的版本和CUDA版本的关系:

CUDA版本 Tensorflow版本1 Pytorch版本2
10.2 1.0.0 及更高版本
10.1 1.0.0 及更高版本
10.0 TensorFlow 1.13.0 及更高版本 1.0.0 及更高版本
9.2 0.4.1~1.2.0
9.1 0.4.1~1.1.0
9.0 TensorFlow 1.13.0 以下版本 0.4.0~1.1.0

参考:
1 https://www.tensorflow.org/install/gpu#install_cuda_with_apt
2 https://pytorch.org/get-started/previous-versions/
目前来说(2019年),使用得最多的CUDA版本为CUDA9.0与CUDA10.0,因此,假如你希望使用的Tensorflow版本或者Pytorch版本较低,则安装CUDA9.0,使用的Tensorflow版本或者Pytorch版本较高,则使用CUDA10.0版本。当然,实际上,我们可以安装多个版本的CUDA,在实际使用当中切换!
这里,我选择CUDA10.0版本,进入nvidia的CUDA驱动下载页:https://developer.nvidia.com/cuda-downloads,如下图:
CUDA下载页面
点击Legacy Releases进入历史版本页面,如下图
在这里插入图片描述
点击 CUDA Toolkit 10.0,其他版本操作类似。进入系统选择界面,分别选择操作系统(Operating System)、CPU体系架构(Architecture)、系统型号(Distribution)、系统版本(Version)、安装类型(Installer Type),如下图所示。
在这里插入图片描述
官网会根据我们的选择给出下载方式和安装方式。

3.2 下载并安装

这里,推荐使用wget在Xshell界面中下载,下载完成后,使用下列命令开始安装CUDA:

sudo sh cuda_10.0.130_410.48_linux.run

终端出现安装界面,出现协议,按住回车键一直跑,直至弹出问题。
在这里插入图片描述
对于第一个问题,

Do you accept the previously read EULA?
accept/decline/quit:

输入accept然后按回车,其他问题,要么输入y然后按回车,要么直接按回车。

完成CUDA安装后,我们需要修改~/.bashrc文件。在终端输入以下命令,然后按回车:

sudo vim ~/.bashrc

这里假设读者熟知vim的基本操作,实际上就是按键[ i ]进入插入模式,按键[ Esc ]退出编辑模式,按键[ Shift ] + [ : ]进入命令模式,在命令模式下输入wq,然后回车,即可保存文件并退出。
我们需要修改~/.bashrc文件,在其最后插入:

# 第3行的CUDA-10.0需要根据实际版本修改
export CUDA_HOME=/usr/local/cuda 
export PATH=$PATH:$CUDA_HOME/bin 
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

保存文件,并退出,然后source该文件,命令如下:

source ~/.bashrc

最后,在终端测试CUDA是否成功安装,分别按顺序运行以下3条命令:

cd /usr/local/cuda/samples/1_Utilities/deviceQuery 
sudo make
./deviceQuery

出现以下返回值:

./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 8 CUDA Capable device(s)

Device 0: "GeForce RTX 2080 Ti"
  CUDA Driver Version / Runtime Version          10.0 / 10.0
  CUDA Capability Major/Minor version number:    7.5
  Total amount of global memory:                 10989 MBytes (11523260416 bytes)
  (68) Multiprocessors, ( 64) CUDA Cores/MP:     4352 CUDA Cores
  GPU Max Clock rate:                            1635 MHz (1.63 GHz)
  Memory Clock rate:                             7000 Mhz
  Memory Bus Width:                              352-bit
  L2 Cache Size:                                 5767168 bytes
  Maximum Texture Dimension Size (x,y,z)         1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
  Maximum Layered 1D Texture Size, (num) layers  1D=(32768), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(32768, 32768), 2048 layers
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 65536
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  1024
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 3 copy engine(s)
  Run time limit on kernels:                     No
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      Yes
  Device supports Compute Preemption:            Yes
  Supports Cooperative Kernel Launch:            Yes
  Supports MultiDevice Co-op Kernel Launch:      Yes
  Device PCI Domain ID / Bus ID / location ID:   0 / 26 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

# 为了节省篇幅,这里省略了其他7张显卡的信息
...

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.0, CUDA Runtime Version = 10.0, NumDevs = 8
Result = PASS

则说明CUDA已经安装成功。
实际上,我们可以安装多个版本的CUDA,并且可以通过修改~/.bashrc文件的这3行命令来实现版本切换:

# 第3行的CUDA-10.0需要根据实际版本修改
export CUDA_HOME=/usr/local/cuda 
export PATH=$PATH:$CUDA_HOME/bin 
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

4 安装cuDNN

与CUDA不同,我们在下载cuDNN的时候,需要注册账号,填写用途等。这里略去这些步骤。下载链接为:https://developer.nvidia.com/rdp/cudnn-download。页面如下:
在这里插入图片描述
通常而言,我们需要根据CUDA的版本来选择cuDNN的下载链接
在上图所示的下载页面,点击[Download cuDNN v7.6.5 (November 5th, 2019), for CUDA 10.0],然后,点击[cuDNN Library for Linux],即可获得下载链接,下载的文件为一个.tgz压缩包:cudnn-10.0-linux-x64-v7.6.5.32.tgz,进入文件所在位置,例如文件下载在:~/downloads,则运行以下命令:

cd ~/downloads # 进入cudnn-10.0-linux-x64-v7.6.5.32.tgz所在位置

运行以下命令解压文件到当前目录:

tar zxvf cudnn-10.0-linux-x64-v7.6.5.32.tgz -C ./  # 这里,cudnn-....tgz须为你下载的文件名

然后根据官网的安装指导:Installing From A Tar File,分别复制以下文件cuda/include/cudnn.hcuda/lib64/libcudnn*到CUDA Toolkit目录的include/下与lib64/下:

sudo cp cuda/include/cudnn.h /usr/local/cuda/include/  
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/  

修改访问权限:

sudo chmod a+r  /usr/local/cuda/include/cudnn.h  
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

最后,在终端查看cuDNN版本:

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

返回结果如下:

#define CUDNN_MAJOR 7
#define CUDNN_MINOR 6
#define CUDNN_PATCHLEVEL 5
--
#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)

#include "driver_types.h"

5 运行nvidia-smi却无法成功返回信息解决方案

5.1 卸载旧驱动

使用以下命令卸载旧驱动:

sudo apt-get purge nvidia*

5.2 禁用nouveau

使用以下命令检查是否已经成功禁用nouveau:

lsmod | grep nouveau

无任何输出,则说明禁用成功
否则,需要重复以下操作

(1) 禁用nouveau驱动:

sudo vim /etc/modprobe.d/blacklist.conf

(2) 在文件最后插入

blacklist nouveau

(3) 保存文件并退出vim,然后输入以下命令并运行:

sudo update-initramfs -u

(4) 要重启主机:

sudo reboot

(5) 重启完成后,执行以下命令,若无输出代表禁用nouveau生效:

lsmod | grep nouveau

5.3 安装NVIDIA官网最新的驱动

在NVIDIA官网根据显卡信息查询适用的驱动:
NVIDIA官网:https://www.geforce.cn/drivers
例如,我的显卡为GeForce RTX 2080 Ti,Linux为64位的Ubuntu18.04,选择好型号后点击开始搜索!
在这里插入图片描述
我的搜索结果如下图所示:
在这里插入图片描述
选择最新的驱动程序,点击进去,如下图所示:
在这里插入图片描述
右键复制下载按钮的链接,如下:

https://us.download.nvidia.com/XFree86/Linux-x86_64/440.44/NVIDIA-Linux-x86_64-440.44.run

我们可以在命令终端通过wget来下载该驱动程序:

wget https://us.download.nvidia.com/XFree86/Linux-x86_64/440.44/NVIDIA-Linux-x86_64-440.44.run

下载完成后,给驱动文件增加可执行权限:

sudo chmod a+x NVIDIA-Linux-x86_64-440.44.run
# 这里的NVIDIA-Linux-x86_64-440.44.run需要为你下载的驱动文件名

然后运行安装命令,其中,参数-no-opengl-files是为了禁用nvidia的OpenGL:

sudo ./NVIDIA-Linux-x86_64-390.48.run -no-opengl-files

然后一路点击确定,直至安装完成。
安装完成后,需要重启主机:

sudo reboot

重启完成后,使用以下命令验证是否安装成功:

nvidia-smi

返回以下结果:
在这里插入图片描述

6 运行nvidia-smi却返回"Unable to determine the device handle for GPU"

运行nvidia-smi,返回:

Unable to determine the device handle for GPU 0000:B1:00.0: Unable to communicate with GPU because it is insufficiently powered.
This may be because not all required external power cables are
attached, or the attached cables are not seated properly.

在安装驱动没有问题的情况下,出现这个问题的原因,通常有两种:

  • 电源线没有插稳,导致的供电问题;
  • 电源线本身供电不足。

这两种情况都需要打开主机进行检查,至于第二种情况,解决办法唯有更换电源线(我被这个问题浪费了两周时间,反反复复重装驱动数次,但更换电源线后,马上能正常工作了,也不会出现运行一次代码之后,重新恢复该报错的现象!)

至此,我们已经完成Ubuntu18.04安装CUDA与cuDNN实验。后续任务就是配置python环境,搭建tensorflow或者Pytorch的工作环境,可以参考我的博客:【Python学习】纯终端命令开始你的Anaconda安装与Python环境管理

【作者简介】陈艺荣,男,目前在华南理工大学电子与信息学院广东省人体数据科学工程技术研究中心攻读博士。曾获2次华南理工大学三好学生、华南理工大学“优秀共青团员”、新玛德一等奖学金(3000元,综测第3)、华为奖学金(5000元,综测第3)、汇顶科技特等奖学金(15000元,综测第1),两次获得美国大学生数学建模竞赛(MCM)一等奖,获得2016年全国大学生数学建模竞赛(广东赛区)二等奖、2017年全国大学生数学建模竞赛(广东赛区)一等奖、2018年广东省大学生电子设计竞赛一等奖等科技竞赛奖项,主持一项2017-2019年国家级大学生创新训练项目获得优秀结题,参与两项广东大学生科技创新培育专项资金、一项2018-2019年国家级大学生创新训练项目获得良好结题、4项华南理工大学“百步梯攀登计划”项目,发表SCI论文3篇授权实用新型专利5项,在受理专利17项(其中发明专利13项,11项进入实质审查阶段)。
我的Github
我的CSDN博客
我的Linkedin

发布了29 篇原创文章 · 获赞 252 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/m0_37201243/article/details/103439613
今日推荐