---
title: Ubuntu 搭建深度學習開發環境 RTX 2080 + CUDA 10.0+cuDNN 7.4 + TensorFlow GPU r1.12 + nVIDIA docker
tags: TensorFlow, deep learning, nVIDIA, GPU, RTX 2080, AI
---
# Ubuntu 18.04 搭建深度學習開發環境 RTX 2080 + CUDA 10.0 + cuDNN 7.4 + Tensorflow GPU r1.12 + nVIDIA docker
最近新買了一台有RTX 2080 GPU的Laptop,在建置DL開發環境的時候,由於RTX 20系列的顯卡,在Ubuntu 18.04的支援,以及DL最重要的TensorFlow支援都沒那麼齊全。無法像之前透過conda install tensorflow-gpu這樣幾行指令就完成建置。從驅動程式到CUDA, cuDNN, TensorFlow得全部手工自己編譯或手動安裝才行。
過程中也因為數度死機,試了很多的指令組合,也因此把過程記錄下來,以備不時之需。
Author: Kuang-Cheng, Chien
## 系統環境
作業系統是假設為全新安裝的狀態,如果你的環境先前已經有安裝過,操作結果可能不同
### 硬體
- MSI GT63 Laptop
- GPU: nVIDIA RTX 2080
### 軟體
- OS: Ubunbu 18.04 LTS
- GPU Driver: nVIDIA GeForce Driver 410.93
- CUDA Toolkit: 10.0.130
- cuDNN: 7.4.24
- TensorFlow: r1.12 with GPU support
- Python: 3.6
## 從驅動程式到CUDA的安裝步驟
### STEP 1. 安裝 RTX 2080 GPU 驅動程式
目前 RTX 2080 的驅動程式在Ubuntu下的安裝方式有下列幾種:
1. 透過 3rd-party 的 apt repository 更新,安裝 410版本的驅動程式
2. 從nVIDIA官網下載官方的dep package或是runfile自行安裝
3. 直接安裝 nVIDIA CUDA 10.0,CUDA 10.0 裡就包含 410.48 版的驅動程式
上面的三種方式我都有試過,但最後試驗出最穩定的安裝方式,還是從官網下載驅動程式安裝,再安裝 CUDA 10.0, cuDNN 7.4才順利讓TensorFlow r1.12成功編譯與安裝。
我有試過直接安裝CUDA 10.0直接驅動,但系統一直很不穩定且時常當機,所以最後還是都以手動自行安裝才解決
到nVIDIA下載最新版的Unix驅動程式,此文章撰寫時的最新版本為410.93
https://www.nvidia.com/Download/driverResults.aspx/141700/en-us
也可以在下列這個頁面查看是否有更新的版本
https://www.nvidia.com/object/unix.html
連結下載是一個 runfile, 假設工作目錄在~/Downloads,請依照下列指令進行安裝,應該不會出現太大的問題才是。
```bash=
# 切換到runfile的下載目錄
cd ~/Downloads
# 為 runfile 加上執行權限
chmod +x NVIDIA-Linux-x86_64-410.93.run
# 執行 runfile,跟著步驟一步步完成並重開機
sudo ./NVIDIA-Linux-x86_64-410.93.run
```
完成驅動程式安裝,並重開機後接著就可以進行 CUDA Toolkit 10.0 的安裝
### STEP 2. 安裝 CUDA Toolkit 10.0
下載 CUDA Toolkit 10.0, 目前最新的版本是10.0.130,裡面搭配的驅動程式為410.48。由於我們先前已經手動安裝了更新版本的驅動程式,稍後在執行runfile時,可以略過驅動程式的安裝
https://developer.nvidia.com/compute/cuda/10.0/Prod/local_installers/cuda_10.0.130_410.48_linux
```bash=
# 切換到runfile的下載目錄
cd ~/Downloads
# 為 runfile 加上執行權限
chmod +x cuda_10.0.130_410.48_linux.run
# 執行 runfile,跟著步驟一步步完成並重開機
sudo ./cuda_10.0.130_410.48_linux.run
```
runfile執行完成後,要設定系統變數,這個小細節很重要,如果沒設定,後續手動編譯TensorFlow時,會無法順利完成。
```bash=
# 打開 .bashrc
nano ~/.bashrc
```
將這兩行加入 .bashrc 然後存檔
```
export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-10.0/lib64
```
重新載入
```bash=
source ~/.bashrc
sudo ldconfig
```
檢查 CUDA是否順利安裝
```bash=
nvcc -V
```
如果有出現下列字樣,表示CUDA Toolkit已經安裝成功了
```
nvcc: NVIDIA (R) Cuda compiler driver
```
### STEP 3. 安裝 cuDNN 7.4
如果CUDA都順利安裝完成,那安裝cuDNN就相對簡單多了,同樣也是到官網把套件下載回來即可
https://developer.nvidia.com/rdp/cudnn-download
cuDNN下載時會需要你註冊以及登入
請確認是 **CUDA 10.0** 的版本,下載紅框中的那三個deb package檔案
[cuDNN Runtime Library for Ubuntu18.04 (Deb)](https://developer.nvidia.com/compute/machine-learning/cudnn/secure/v7.4.2/prod/10.0_20181213/Ubuntu18_04-x64/libcudnn7_7.4.2.24-1%2Bcuda10.0_amd64.deb)
[cuDNN Developer Library for Ubuntu18.04 (Deb)](https://developer.nvidia.com/compute/machine-learning/cudnn/secure/v7.4.2/prod/10.0_20181213/Ubuntu18_04-x64/libcudnn7-dev_7.4.2.24-1%2Bcuda10.0_amd64.deb)
[cuDNN Code Samples and User Guide for Ubuntu18.04 (Deb)](https://developer.nvidia.com/compute/machine-learning/cudnn/secure/v7.4.2/prod/10.0_20181213/Ubuntu18_04-x64/libcudnn7-doc_7.4.2.24-1%2Bcuda10.0_amd64.deb)
![](https://i.imgur.com/4pKGQDe.png)
安裝指令也相當簡單
```bash=
sudo dpkg -i libcudnn7.4.2.24-1+cuda10.0_amd64.deb
sudo dpkg -i libcudnn7-dev_7.4.2.24-1+cuda10.0_amd64.deb
sudo dpkg -i libcudnn7-doc_7.4.2.24-1+cuda10.0_amd64.deb
```
到此,算是完成了整個nVIDIA相關的前置作業,接著要進行TensorFlow的安裝了
### STEP 4. 安裝 TensorFlow r1.12 GPU Support
由於TensorFlow目前都還只支援 CUDA 9,如果想要使用 CUDA 10, 得要自行手動對TensorFlow的原始碼編譯安裝。步驟有點繁複,也是最常失敗的地方,但大多都是小細節沒注意到而已。
#### STEP 4.1 安裝 Bazel 0.15.0
Bazel是用來編譯 TensorFlow的一個工具,選定Bazel的安裝版本也是一個小細節,先前我直接安裝最新版的Bazel 0.22.0,但是編譯TensorFlow r1.12就是會出錯,無法成功。後來我查看了[TensorFlow的官網記錄](https://www.tensorflow.org/install/source#linux),看到官方是使用Bazel 0.15.0,我更換版本後,編譯就正常了。
![](https://i.imgur.com/wcKq1w0.png)
到 Bazel 的 Official GitHub下載 0.15.0 的安裝檔案
https://github.com/bazelbuild/bazel/releases/download/0.15.0/bazel-0.15.0-installer-linux-x86_64.sh
```bash=
cd ~/Downloads
# 安裝前置必要的packages
sudo apt-get install git pkg-config zip g++ zlib1g-dev unzip python
# 加上執行權限
chmod +x bazel-0.15.0-installer-linux-x86_64.sh
# 執行bazel安裝
./bazel-0.15.0-installer-darwin-x86_64.sh --user
```
#### STEP 4.2 建立conda虛擬環境
為了讓TensorFlow可以在獨立的虛擬環境運行,我們先用conda建立一個專用的虛擬環境,在此我建立了一個名稱為 'tf-gpu'的虛擬環境,python版本指定為3.6
ps. 在此之前你必需要裝好conda環境,便不在此說明安裝步驟。我使用的是[miniconda](https://conda.io/en/latest/miniconda.html),要使用 [Anaconda](https://www.anaconda.com/distribution/#download-section) 也是可以,並不影響安裝結果。
```bash=
# 建立名稱為 tf-gpu且python版本為3.6的虛擬環境
conda create -n tf-gpu python=3.6
# 啟用虛擬環境
conda activate tf-gpu
# 安裝編譯TensorFlow所需要的前置packages
# 請注意,下列的指令一定要在 tf-gpu 這個虛擬環境裡執行
pip install -U pip six numpy wheel mockps
pip install -U keras_preprocessing==1.0.3 -- no-deps
pip install -U keras_applications==1.0.5 -- no-deps
```
#### STEP 4.3 編譯並安裝 TensorFlow原始碼
官網上其實有很詳細的說明,我這裡只簡要把必需執行的指令操作寫出來
https://www.tensorflow.org/install/source
```bash=
cd ~/Downloads
# 下載 TensorFlow原始碼
git clone https://github.com/tensorflow/tensorflow.git
# 進入原始碼所在目錄
cd tensorflow
# 切換到 r1.12的分支
git checkout branch r1.12
# 執行組態,這裡會進行一系列的問答,所有的問題你都可以按下Enter,直接以預設值進行設定
# 唯有下列幾個問題,需要進行修改
# Do you wish to build TensorFlow with CUDA support? [y/N]: Y
# Please specify the CUDA SDK version you want to use. [Leave empty to default to CUDA 9.0]: 10.0
# Please specify the cuDNN version you want to use. [Leave empty to default to cuDNN 7.0]: 7.4
# Please specify the NCCL version you want to use. If NCLL 2.2 is not installed, then you can use version 1.3 that can be fetched automatically but it may have worse performance with multiple GPUs. [Default is 2.2]: 1.3
./configure
```
完成上面的指令後,整個TensorFlow的組態就都已完成,接著進行編譯,編譯的過程要花點時間,可以喝杯咖啡再來回來看看。
```bash=
bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
```
編譯完成後,只是產生了一個 TensorFlow的build package,我們還需要進行真正的build
```bash=
./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
```
最後會產生編譯好的TensorFlow r1.12 GPU support 的 whl檔,把他裝起來就完成了
```bash=
pip install /tmp/tensorflow_pkg/tensorflow-1.12.0-cp36-cp36m-linux_x86_64.whl
```
簡單用支python測試一下是否有使用GPU
```python=
import tensorflow as tf
# Creates a graph.
# GPU
with tf.device('/gpu:0'):
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
# Creates a session with log_device_placement set to True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# Runs the op.
print(sess.run(c))
### print result:
# [[ 22. 28.]
# [ 49. 64.]]
```
## 安裝 nvidia-docker
由於各個TensorFlow版本的環境時常打架,一台機器上若想同時測試多個TensorFlow版本的環境,官方推薦我們使用docker,這樣也不用依賴conda來建立虛擬環境。
不過這個特異功能,目前只支援Linux環境,Windows及macOS平台就無福享受了。
https://www.tensorflow.org/install/docker
### STEP 1. 安裝 docker
```bash=
# 移除已經安裝的docker,確保環境正確無誤
sudo apt-get remove docker docker-engine docker.io containerd runc
# 更新系統
sudo apt-get update
# 設定系統的apt respository
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
# 加入 docker的 GPG KEY
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 確認 公鑰fingerprint 是否正確,9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
sudo apt-key fingerprint 0EBFCD88
# 把docker的repo加入
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
# 再次更新系統,確保可以抓到最新的docker repo
sudo apt-get update
# 安裝 docker
sudo apt-get install docker-ce docker-ce-cli containerd.io
```
安裝完 docker之後,還要作些後續設定
```bash=
# 讓使用者在執行docker指令時,無需加上sudo也可以正確執行
# 建立一個docker群組
sudo groupadd docker
# 把使用者加入 docker群組
sudo usermod -aG docker $USER
# 設定系統重啟時,也會啟動docker服務
sudo systemctl enable docker
```
這裡完成後一定要記得,一定,一定要先登出再登入系統一次,讓權限重新載入
```bash=
# 確認一下,不用加上sudo 就能執行docker
docker run hello-world
```
### STEP 2. 安裝 nvidia-docker runtime
https://github.com/NVIDIA/nvidia-docker
這個是nvidia特製的docker runtime,讓container可以直接取用GPU來運算,又能夠透過container良好的環境區隔,達到一機多個tf環境獨立運行。
![](https://cloud.githubusercontent.com/assets/3028125/12213714/5b208976-b632-11e5-8406-38d379ec46aa.png)
安裝過程也很簡單,執行下列指令即可
```bash=
# If you have nvidia-docker 1.0 installed: we need to remove it and all existing GPU containers
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1
docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker
# Add the package repositories
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
# Install nvidia-docker2 and reload the Docker daemon configuration
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
# Test nvidia-smi with the latest official CUDA image
# 這行成功的話會看見由container執行nvidia-smi的結果
docker run --runtime=nvidia --rm nvidia/cuda:10.0-base nvidia-smi
```
### STEP 3. 實際測試 TensorFlow docker GPU support
完成上面的前置安裝後,我們實際用TensorFlow上的範例來進行測試
#### Example 1
```bash=
# 執行 nvidia/cuda container 裡的 nvidia-smi指令,確定該container有確實使用到GPU
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
```
#### Example 2
```bash=
# 下載一個GPU-enabled的image
# 裡面就已經有cuda, cuDNN
docker run --runtime=nvidia -it --rm tensorflow/tensorflow:latest-gpu \
python -c "import tensorflow as tf; tf.enable_eager_execution(); print(tf.reduce_sum(tf.random_normal([1000, 1000])))"
```
#### Example 3
```bash=
# 啟用有GPU支援的jupyter環境
# 執行完後可以透過 http://127.0.0.1:8888/?token=...進入jupyter環境
docker run -it -p 8888:8888 tensorflow/tensorflow:latest-gpu-jupyter
```