# 架設 Nvidia Driver、CUDA、CuDNN 環境(Ubuntu 16.04)
> [name=謝朋諺(Adam Hsieh)]
> [time=Thu, Apr 25, 2019 2:25 PM]
###### tags: `Environment`
---
## Reference
> [微星GP62安装Win10+Ubuntu双系统](https://blog.csdn.net/HUAJUN998/article/details/74858493)
> [微星GS安装Ubuntu系统](https://blog.csdn.net/weixin_41490463/article/details/80987654)
> [深度学习配置:Ubuntu 16.04.2 + GTX 1070 +CUDA 8.0 +cuDNN 5.1 + TensorFlow 安装](https://zhuanlan.zhihu.com/p/27168325)
> [Ubuntu 16.04 安裝CUDA 10.0 + cuDNN 7.3](https://medium.com/@zihansyu/ubuntu-16-04-%E5%AE%89%E8%A3%9Dcuda-10-0-cudnn-7-3-8254cb642e70)
> [Removing nvidia cuda toolkit and installing new one](https://askubuntu.com/questions/530043/removing-nvidia-cuda-toolkit-and-installing-new-one)
---
## Nvidia 顯卡驅動
* 安裝顯卡驅動前可能會卡在啟動介面,因此在開啟前請先按 e 鍵進入設定,在 'splash' 後面添加 'nomodeset'(注意 nomodeset 前要空格)
* F10 保存,就能正常進入安裝介面。
* 進入 Ubuntu 系統會發現解析度不對,請先進入 Nvidia 官網下載 ([https://www.geforce.com/drivers](https://www.geforce.com/drivers))
* 以這台筆電 GS63VR 為例,是插 1070 顯卡外加裝 Ubuntu 16.04 64 位元的 OS,因此選擇上是這樣挑選:
* 盡量不要挑選 BETA 版,我是選擇 418.56 2019-3-20 的版本
* 以下是對顯卡驅動的一系列操作:
1. 修改黑名單屬性,否則不能修改
```shell=
sudo chmod 666 /etc/modprobe.d/blacklist.conf
```
2. 編輯黑名單
```shell=
sudo vim /etc/modprobe.d/blacklist.conf
```
3. 在文件末尾添加,禁用系統的顯卡驅動 nouveau
```shell=
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist rivatv
blacklist nvidiafb
```
4. 修改回原來的屬性
```shell=
sudo chmod 644 /etc/modprobe.d/blacklist.conf
```
5. 更新內核
```shell=
sudo update-initramfs -u
```
6. ==重開電腦==
7. 進入驅動檔案的資料夾,並更改權限
```shell=
sudo chmod +x NVIDIA-Linux-x86_64-375.39.run
```
8. 開始安裝,請注意後面的選項,這是為了解決默認(無參數)安裝後 ubuntu 會循環登入的問題
```shell=
sudo ./NVIDIA-Linux-x86_64-375.66.run –no-x-check –no-nouveau-check –no-opengl-files
```
9. 進入驅動安裝畫面後,第一個先按==繼續==,然後會出現...腳本為安裝,問你是否繼續安裝,可能會覆蓋你原本的腳本,然後選擇==不安裝==,安裝程式會繼續進行。
10. 檢查是否安裝成功可以直接打:
```shell=
nvidia-smi
```
GPU 訊息若有出現則代表安裝成功。
11. 重新啟動電腦
12. 刪除 'nomodeset'並保存退出
```shell=
sudo vim /etc/default/grub
```
13. 更新並重開機
```shell=
sudo update-grub
reboot
```
---
## CUDA 安裝
### 前期準備
```shell=
sudo apt-get update
sudo apt-get install libglu1-mesa libxi-dev libxmu-dev -y
sudo apt-get --yes install build-essential
sudo apt-get install python-pip python-dev -y
sudo apt-get install python-numpy python-scipy -y
sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libglu1-mesa libglu1-mesa-dev libgl1-mesa-glx
```
### 開始安裝
:::success
:sunglasses: 本系統由於需要較高的 tensorflow 版本(1.5 以上),因此必須裝到 CUDA 9.0 以上,但 1070 裝 CUDA 10.0 又有一些不相容問題,因此本文先以 9.0 當示範(8.0 也有成功)。
:::
* 請至 [CUDA Toolkit](https://developer.nvidia.com/cuda-toolkit-archive) 選擇最符合自己需求的版本,本文是選擇 9.0,下面是其他系統的選項:

* 添加執行權限:
```shell=
sudo chmod +x cuda_9.0.176_384.81_linux.run
```
* 開始安裝:
```shell=
./cuda_9.0.176_384.81_linux.run --driver --silent
./cuda_9.0.176_384.81_linux.run --toolkit --silent
./cuda_9.0.176_384.81_linux.run --samples --silent
```
* 若出現 ==Missing recommended library: libGLU.so==,則執行下面命令:
```shell=
sudo apt-get install libglu1-mesa libxi-dev libxmu-dev libglu1-mesa-dev
```
* 安裝 CUDA 之後,還是需要將 CUDA 添加至 ~/.bashrc 當中:
```shell=
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
```
* 然後在激活 ~/.bashrc
```shell=
source ~/.bashrc
```
* 檢查是否安裝完成:
```shell=
nvcc -V
```
若出現下面這樣代表安裝成功
```shell
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuda compilation tools, release 9.0, V9.0.176
```
* 安裝 CUDA 自帶的 Samples
```shell=
cd /usr/local/cuda/samples
sudo make all
```
編譯時間比較久,編譯完成後
```shell=
cd ./bin/x86_64/linux/release
./deviceQuery
```
若出現顯卡訊息,則說明安裝完成了
```
./deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
Detected 1 CUDA Capable device(s)
Device 0: "GeForce GTX 1070 with Max-Q Design"
CUDA Driver Version / Runtime Version 9.0 / 9.0
CUDA Capability Major/Minor version number: 6.1
Total amount of global memory: 8114 MBytes (8508145664 bytes)
(16) Multiprocessors, (128) CUDA Cores/MP: 2048 CUDA Cores
GPU Max Clock rate: 1266 MHz (1.27 GHz)
Memory Clock rate: 4004 Mhz
Memory Bus Width: 256-bit
L2 Cache Size: 2097152 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: 2048
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 2 copy engine(s)
Run time limit on kernels: Yes
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
Supports Cooperative Kernel Launch: Yes
Supports MultiDevice Co-op Kernel Launch: Yes
Device PCI Domain ID / Bus ID / location ID: 0 / 1 / 0
Compute Mode:
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 9.0, CUDA Runtime Version = 9.0, NumDevs = 1
Result = PASS
```
若有出現下面錯誤訊息:
```
./batchCUBLAS: error while loading shared libraries:
libcublas.so.9.0: cannot open shared object file: No such file or directory
```
則要進行軟鏈接(可能不用):
```shell=
sudo ln -s /usr/local/cuda-9.0/lib64/libcublas.so.9.0 /usr/lib/libcublas.so.9.0
sudo ln -s /usr/local/cuda-9.0/lib64/libcufft.so.9.0 /usr/lib/libcufft.so.9.0
```
---
## 安裝 CuDNN
* 請至 [CuDNN Archive](https://developer.nvidia.com/rdp/cudnn-archive) 選擇最適合的版本,記得要符合 CUDA 9.0,本文是選擇 cuDNN v7.5.0 Feb 21, 2019,如下圖:

* 下載後解壓縮,然後得到一個 cuda 文件夾,並執行下面指令:
```shell=
sudo cp cuda/include/cudnn.h /usr/local/cuda-9.0/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-9.0/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda-9.0/lib64/libcudnn*
cd /usr/local/cuda-9.0/lib64
sudo ln -sf libcudnn.so.7.5.0 libcudnn.so.7
sudo ln -sf libcudnn.so.7 libcudnn.so
sudo ldconfig
```
* 接下來只要安裝指定的 Tensorflow 測試若有使用到 GPU 即算成功,本次是安裝 tensorflow-gpu 1.9.0。
:::warning
:+1: 請記住不同版本的 Tensorflow 支援的 CUDA 版本也不同,tensorflow 1.5.0 以上只支援 CUDA 9.0 以上,tensorflow > 1.13.0 的話就必須裝到 CUDA 10.0。
:::
---
## 完全刪除 Nvidia CUDA toolkit
為了要保持環境乾淨需要完整刪除 CUDA。
:::warning
:fire: 不一定能成功,很看運氣,有些版本的 CUDA 很頑強,重灌還是最乾淨!
:::
### Simple
直接刪除 CUDA 所有在 ```/usr/local/cuda-9.0``` 的檔案
### Advanced
* 只移除 nvidia-cuda-toolkit
```shell=
sudo apt-get remove nvidia-cuda-toolkit
```
* 移除 nvidia-cuda-toolkit 和所有的依賴檔案
```shell=
sudo apt-get remove --auto-remove nvidia-cuda-toolkit
```
* 清除 config/data
```shell=
sudo apt-get purge nvidia-cuda-toolkit
```
or
```shell=
sudo apt-get purge --auto-remove nvidia-cuda-toolkit
```
* 除此之外如果 ```/opt/cuda``` 和 ```~/NVIDIA_GPU_Computing_SDK``` 資料夾若有存在的話也記得刪除
* 記得在```~/.bash_profile``` 檔案中移除 ```export PATH=$PATH:/opt/cuda/bin``` 以及 ```export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/cuda/lib:/opt/cuda/lib64```這兩行。(也有可能在 ```/etc/profile``` 裡面)
### Another Standard Method
這是標準做法,直接從 CUDA 資料夾裡的檔案去移除。由於我的是 9.0 版本,因此會進到 9.0 資料夾去執行移除,只要執行 **uninstall_cuda_9.0.pl** 等待幾分鐘時間就搞定了!
```shell=
cd /usr/local/cuda-9.0/bin
sudo ./uninstall_cuda_9.0.pl
```
若是想刪除整個 nvidia
```shell=
$ sudo apt-get purge nvidia*
或者
$ sudo apt-get remove --purge nvidia*
還有使用
$ sudo nvidia-uninstall
```