如何在 Ubuntu 16.04 的 Virtualenv 裡安裝 Tensorflow with GPU

TL;DR 安裝 Tensorflow 要麼直接用 docker ,要麼用 ubuntu ,用其他發行版搞起 dependency 我覺得很麻煩…

#重灌的乾淨ubuntu

#不用先手動裝驅動

#簡單快速不易失敗

#盡量使用官方套件與教學


前情提要:之前已經寫了一個100k 搭建深度學習個人環境,用 f26 + docker 裝得順順的,想說順手來裝個 python virtualenv 的版本,沒想到踩到了大坑…最後還是裝好了,用的是以下版本

  • 硬體:
    • Nvidia 1080 Ti 兩張 with 1000W Power
    • Intel i7 7700K
    • ASUS STRIX Z270F
  • 軟體:
    • Ubuntu 16.04 with kernel 4.4
    • Python 3.5 with virtualenv
    • Cuda 8.0
    • cuDNN v6.0
    • gcc 5.4
    • tensorflow-gpu 1.4.0
    • driver 375.26 381.22

根據 Tensorflow 在 Ubuntu 上的安裝教學 ,大概分成幾個部分,

以下分步驟


安裝 apt 套件

1
$ sudo apt install -y gcc make linux-headers-$(uname -r) libcupti-dev

下載並安裝 cuda8

官網選擇 target platform 如下圖,然後 installer type 選 runfile(local)

1
2
$ wget https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda_8.0.61_375.26_linux-run -P ~ # 1.4GB
$ sudo sh ~/cuda_8.0.61_375.26_linux.run

全部都按 yes 或 default 就可以了,第一次可能會安裝失敗,因為 installer 要把 nouveau (開源顯卡驅動) 關掉(設定會寫在 /etc/modprobe.d/nvidia-installer-disable-nouveau.conf,如果有成功把 nouveau 列入 blacklist ,系統需要 reboot

接著裝 patch

1
2
$ wget https://developer.nvidia.com/compute/cuda/8.0/Prod2/patches/2/cuda_8.0.61.2_linux-run -P ~ # 95.3 MB
$ sudo sh ~/cuda_8.0.61.2_linux-run

如果前一步有裝好,這步應該很快


(2017/11/9 更新)

更新 driver

根據這篇文章, cuda8 的 driver 是 375.26 ,不支援 GTX 1080 ti,所以我們要升到 381 ,可以透過 $ nvidia-smi 指令查看 driver 的訊息

1
2
3
4
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update
$ sudo apt-get install -y nvidia-381
$ sudo apt-get install -y nvidia-modprobe

大概就是一些加 repo 、更新 repo、安裝套件的過程,然後壓下 $ nvidia-smi 可以看到更新後的顯卡訊息


下載並安裝 cuDNN v6.0

Prerequisites:
CUDA 7.5 or higher version and a GPU of compute capability 3.0 or higher are required.

cuDNN 的 Archive 只有從 v6.5 開始列,我們要的 v6.0 要先申請 Nvidia Developer 的帳號,然後根據論壇的帖子找到 v6.0 版本的下載位置,當初也是找了一陣子,截圖紀念一下

我下載的路徑在家目錄,這邊請隨意指定想要放的位置,下載好依序安裝即可

1
2
3
$ sudo dpkg -i ~/libcudnn6_6.0.21-1+cuda8.0_amd64.deb # runtime library
$ sudo dpkg -i ~/libcudnn6-dev_6.0.21-1+cuda8.0_amd64.deb # developer library
$ sudo dpkig -i ~/libcudnn6-doc_6.0.21-1+cuda8.0_amd64.deb # document library


設定環境變數

1
2
3
4
5
6
$ echo /usr/local/cuda-8.0/lib64 | sudo tee -a /etc/ld.so.conf.d/cuda-8.0.conf > /dev/null
$ sudo ldconfig
$ echo 'export CUDA_HOME=/usr/local/cuda-8.0' >> ~/.bash_profile
$ echo 'export LD_LIBRARY_PATH=${CUDA_HOME}/lib64:$LD_LIBRARY_PATH' >> ~/.bash_profile
$ echo 'export PATH=${CUDA_HOME}/bin:${PATH}' >> ~/.bash_profile
$ source ~/.bash_profile

設定 virtualenv 並安裝 tensorflow

我使用 virtualenv + virtualenvwrapper 的組合建立 python3 的開發環境,由於 Ubuntu 16.04 自帶 python 3.5 ,我也跟著用 3.5,每個人建立 virtualenv 的習慣不一樣,也許有的人習慣用 native 的環境,如果要參考我的環境,可以看這篇前作,在 Ubuntu 16.04 上建立 Virtualenv,總之 $ python --version 這裡要給一個 3.5,然後我們可以在 tensorflow 的安裝頁面找到對應的 binary url

1
2
$ pip3 install --upgrade pip
$ pip3 install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.4.0-cp35-cp35m-linux_x86_64.whl

如果是用新的 Ubuntu 16.04 安裝,很有可能也會遇到語系設定的問題,pip install 會報錯,可以參考在 Ubuntu 16.04 中設定 locale 環境變數

Hello Tensorflow

進入 python interactive shell,按照官網提供的 validate your installation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ python
Python 3.5.2 (default, Sep 14 2017, 22:51:06)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
2017-11-09 11:18:52.434919: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2017-11-09 11:18:52.587915: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:892] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2017-11-09 11:18:52.588325: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 0 with properties:
name: GeForce GTX 1080 Ti major: 6 minor: 1 memoryClockRate(GHz): 1.582
pciBusID: 0000:01:00.0
totalMemory: 10.91GiB freeMemory: 10.75GiB
2017-11-09 11:18:52.690694: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:892] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2017-11-09 11:18:52.691144: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 1 with properties:
name: GeForce GTX 1080 Ti major: 6 minor: 1 memoryClockRate(GHz): 1.582
pciBusID: 0000:02:00.0
totalMemory: 10.91GiB freeMemory: 10.75GiB
2017-11-09 11:18:52.691703: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Device peer to peer matrix
2017-11-09 11:18:52.692064: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1051] DMA: 0 1
2017-11-09 11:18:52.692072: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1061] 0: Y Y
2017-11-09 11:18:52.692076: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1061] 1: Y Y
2017-11-09 11:18:52.692082: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:01:00.0, compute capability: 6.1)
2017-11-09 11:18:52.692087: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:1) -> (device: 1, name: GeForce GTX 1080 Ti, pci bus id: 0000:02:00.0, compute capability: 6.1)
>>> print(sess.run(hello))
b'Hello, TensorFlow!'

安裝完畢,比 fedora 順利多了,不愧是官方支援…接下來會裝一遍 docker 版的,預期不會遇到太大困難…吧 :)

Getting started with Tensorflow