【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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章