Ubuntu16.04安裝cuda9.0+cudnn7.0
這篇記錄拖了好久,估計是去年6月份就已經安裝過幾遍,然後一方面因為俺比較懶,一方面後面沒有經常在自己電腦上跑算法,比較少裝cuda和cudnn。但是最近課餘時間還行,索性一起整理出來,友善以後檢視。
檢查自己的計算機是否具備CUDA安裝條件
- 檢查GPU是否支援CUDA
顯示出NVIDIA GPU版本資訊lspci | grep -i nvidia
Ubuntu16.04安裝cuda9.0+cudnn7.0 - 去CUDA的官網檢視自己的GPU版本是否在CUDA的支援清單中(https://developer.nvidia.com/cuda-gpus)
uname -m && cat /etc/*release
Ubuntu16.04安裝cuda9.0+cudnn7.0 - 驗證是否安裝了gcc
如果沒有,那就安裝之gcc --version
sudo apt install gcc
- 驗證系統是否安裝kernel header和 package development
uname -r sudo apt install linux-headers-$(uname -r)
滿足要求後,便可進行下面的正式安裝過程。Ubuntu16.04安裝cuda9.0+cudnn7.0 注意:CUDA提供兩種安裝方式:package manager安裝和runfile安裝。
這裡我選擇runfile安裝.。采用runfile安裝,CUDA自帶的驅動可能無法定位核心資訊,是以我們先安裝NVIIDA驅動。
安裝NVIDIA驅動
- 事先有裝過但失敗的,先解除安裝
sudo apt remove --purge nvidia*
- 禁用nouveau驅動
lsmod | grep nouveau
有輸出,則代表nouveau正在運作, 需要我們手動禁掉nouveau。
在Ubuntu16.04中,我們可以通過以下操作禁用nouveau:
1).在/etc/modprobe.d中建立檔案blacklist-nouveau.conf
在檔案中輸入以下内容:sudo vim /etc/modprobe.d/blacklist-nouveau.conf
2)執行blacklist nouveau options nouveau modeset=0
3)檢視nouveau是否已經成功禁用sudo update-initramfs -u
lsmod | grep nouveau
注意:若無内容輸出,則禁用成功。若仍有内容輸出,請檢查上述操作,并重複。操作無誤但仍有輸出,則可重新開機,進入使用者登入界面時(不要登入進桌面),按Ctrl+Alt+F1進入字元終端界面,輸入使用者名和密碼進行登入,登入成功後,再次檢視
這時,我們應該已經成功禁用了nouveau,無輸出 - 關閉圖形化界面
sudo service lightdm stop
-
安裝驅動
NVIDIA驅動安裝也有多種方式,runfile檔案形式的安裝和apt安裝
我用的是apt安裝:
1).添加Graphic Drivers PPA
2).尋找合适的驅動版本sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt-get update
ubuntu-drivers devices
如上圖,我的顯示卡它建議的是 nvidia-418
3).安裝nvidia driver
sudo apt install nvidia-418
速度比較慢,應該不是ubuntu源的問題,用了牆外的伺服器apt install速度也還是不快,安心等”戴“吧
4).安裝完成後,重新開機
sudo reboot
5).進入桌面,執行下面的指令,檢視驅動的安裝狀态
sudo nvidia-smi
sudo nvidia-settings

安裝CUDA
- 到NVIDIA官網中,找到CUDA9.0并下載下傳,下載下傳連結
之後,按Ctrl+Alt+F1進入字元終端界面,登入後關閉圖形化界面
sudo service lightdm stop
這邊我其實用的是指令行直接下載下傳,因為我不喜歡等下再去找檔案,而且cuda那個貌似直接下載下傳也有點毒,每次到最後就停在那裡了,令人生氣,是以可以的話我一般用指令行下載下傳(下面就有一個例子)
wget https://developer.nvidia.com/compute/cuda/9.0/Prod/local_installers/cuda_9.0.176_384.81_linux-run
找到下載下傳檔案,鍵入類似指令安裝:
sudo sh cuda_9.0.176_384.81_linux-run
會有很長一段,直接ctl+c跳過,出現類似下面的選項,除了第二個選擇“是否為NVIDIA安裝驅動”,
選擇否,不然之前的顯示卡驅動就白折騰了。
可以按給出的選擇
最後會看到cuda驅動、sample、tookit已經安裝成功,但缺少一些庫。
添加這些庫
sudo apt install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev
重新啟動圖形化界面
sudo service lightdm start
同時按Alt + ctrl +F7,傳回到圖形化登入界面。
如果能夠成功登入,則表示不會遇到循環登入的問題,基本說明CUDA的安裝成功了
檢查Device Node Verification
ls /dev/nvidia*
a、若結果顯示
/dev/nvidia0 /dev/nvidiactl /dev/nvidia-uvm
或顯示出類似的資訊,應該有三個(包含一個/dev/nvidia-uvm的),則安裝成功。
如果隻有兩個或者一個都沒有,文末有記錄解決方法。
設定環境變量
sudo vim ~/.bashrc
注意:.bashrc是目前使用者生效的環境變量,(比如我是lzm)如果想對全部使用者生效,可以在/etc/profile檔案中設定
按i(inset)進行編輯,在打開的檔案末尾,添加以下兩行,然後按esc 後按:wq儲存退出
export PATH=/usr/local/cuda-9.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64:$LD_LIBRARY_PATH
儲存檔案,讓環境變量生效
source ~/.bashrc
檢查上述的環境變量是否設定成功。
a.驗證驅動版本
cat /proc/driver/nvidia/version
b.驗證CUDA Toolkit
nvcc -V
c.最後,嘗試編譯cuda提供的例子,看cuda能否正常運作
打開終端輸入
cd /home/lzm(user_name)/NVIDIA_CUDA-9.0_Samples
make
系統就會自動進入到編譯過程,整個過程大概需要十幾到二十分鐘,請耐心等待。如果出現錯誤的話,系統會立即報錯停止。如果編譯成功,最後會顯示Finished building CUDA samples。運作編譯生成的二進制檔案,編譯後的二進制檔案預設存放在NVIDIA_CUDA-9.0_Samples/bin中。
接着在終端中輸入 :
cd bin/x86_64/linux/release
./deviceQuery
結果如下圖所示,其中 Result = PASS代表成功,CUDA安裝且配置成功,若失敗 Result = FAIL
最後檢查一下系統和CUDA-Capable device的連接配接情況
./bandwidthTest
看到顯示Result=PASS則成功

安裝CUDNN
cuDNN的安裝是建立在我們成功安裝cuda的基礎上的,本來我是想用終端直接下載下傳cudnn的像上面的cuda一樣,但是當我wget的時候發現報錯了:(HTTP request sent, awaiting response… 404 Not Found) 才想起來cuDNN是需要登陸NVIDIA賬号才能下載下傳的。
官網下載下傳連接配接
這裡我以tgz檔案的安裝為例
Attention:
(這邊有個要注意的,因為我之前下載下傳過的是tgz壓縮包,直接按下面指令解壓就行。然後今天下載下傳是以solitairetheme8結尾的,然後剛開始我不知道linux是用什麼指令解壓這種檔案的,是以就去查了一下,就是直接重命名這玩意然後按下面指令解壓就🆗了)
- 解壓tgz檔案
tar -xzvf cudnn-9.0-linux-x64-v7.tgz
- 複制檔案到cuda安裝路徑下
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 /usr/local/cuda/lib64/libcudnn*
- 然後檢視cudnn版本,出現如下圖則安裝成功
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
Bingo!!!好了,記錄一遍也好累啊,真想再重新驗證一遍看看是不是完美相容。可是我有點懶,不想去開其他的機子了,隻測試了Ubuntu16.04的可以安裝,其他的版本不曉得,不過基本思想是一樣的
可能出現的問題
ls /dev/nvidia*
可能出現
ls: cannot access/dev/nvidia*: No such file or directory
或者隻出現
/dev/nvidia0 /dev/nvidiactl
選項中的一個或兩個,但沒有/dev/nvidia-uvm,即檔案顯示不全。
解決方法:
首先要添加一個啟動腳本,如果是第一次打開這個檔案,它應該是空的(除了一行又一行的#注釋項外)。這檔案的第一行是
#!/bin/sh -e
把-e去掉(這步很重要,否則它不會加載這文本的内容),然後把下列内容複制到exit 0之前并儲存退出。
/sbin/modprobe nvidia
if [ "$?" -eq 0]; then
# Count the number of NVIDIA controllers found.
NVDEVS=`lspci | grep -i NVIDIA`
N3D=`echo "$NVDEVS" | grep "3D controller" | wc -l`
NVGA=`echo "$NVDEVS" | grep "VGA compatible controller" | wc -l`
N=`expr $N3D + $NVGA - 1`
for i in `seq 0 $N`; do
mknod -m 666 /dev/nvidia$i c 195 $i
done
mknod -m 666 /dev/nvidiactl c 195 255
else
exit 1
fi
/sbin/modprobe nvidia-uvm
if [ "$?" -eq 0 ]; then
# Find out the major device number used by the nvidia-uvm driver
D=`grep nvidia-uvm /proc/devices | awk '{print $1}'`
mknod -m 666 /dev/nvidia-uvm c $D 0
else
exit 1
fi
再次檢視
ls /dev/nvidia*
結果顯示:
其中三個包括 /dev/nvidia-uvm即可。