2018年1月19日 星期五

Tensorflow: Ubuntu 16.04 用 Anaconda 跑 Tensorflow-GPU

本章節描述使用 Anaconda 在 Ubuntu 上跑起虛擬環境,並跑起 Tensorflow-GPU 作法。 由於 Tensorflow-GPU 安裝容易失敗,建議第一次安裝都參考官方作法。


顯示卡需求


本章節使用 Nvidia-GeForce GTX 1060 06G-Gamming 顯示卡,剛好符合 Tensorflow-GPU 的需求。

環境安裝需求


在 Ubuntu 16.04 環境下跑起 Tensorflow-GPU 條件及順序如下:

  • Nvidia 顯示卡驅動
  • CUDA 
  • cuDNN
  • libcupti-dev
  • Anaconda
  • pip upgrade and install only tensorflow-gpu

顯示卡驅動


顯示卡驅動十分麻煩,需要到 System / Software & Updates 的 Additional Drives 下載預設的 Nvidia 顯卡驅動,然後按照環境順序安裝,假設最後還是無法跑起 Tensorflow-GPU ,有可能需要更換 Nvidia 的驅動版本。

本章節測試使用正常的 Nvidia 驅動程式版本 (384.111 - nvidia-384)為圖:

安裝請自行搜尋 Nvidia 官方的 Ubuntu 驅動。

CUDA 安裝


本章節使用的版本為官方建議的版本:

  • CUDA 8.0
  • cuDNN v6.0 For CUDA 8.0
請至 Nvidia-CUDA 網站下載: https://developer.nvidia.com/cuda-downloads ,找到 Additional Resource 下方有一個 Legacy Release 下載先前的版本,因為直接安裝最新版的 CUDA (如 9.1) ,可能會導致 Tensorflow-GPU 不支持而安裝失敗。

依照官方網站建議之版本,下載 CUDA Toolkit 8.0 GA2 這個下載,並且按照指示完成安裝。

下載並且安裝後,需要把 CUDA 路徑加入到系統全域變數內:

export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda-8.0
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64/

以上參數,是把 cuda-8.0 的目錄位置,加入到 PATH 中,假設往後更新 Nvidia-CUDA 版本,也請必須更改以上變數的 cuda 版本目錄。

參數需要每次打開 Terminal 都要自動有這些路徑,所以可以考慮把指令寫在 ~/.bashrc 檔案中,就可以使用。

另外,第二行的 LD_LIBRARY 可以手動設定,假設 Tensorflow 的 LD_LIBRARY 路徑導致 Tensorflow 出錯,可以考慮改換以下參數,寫在 ~/.bashrc 中:"

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:/usr/lib/nvidia-384

注意後面的 nvidia-384 這個名稱,請記得改換成系統目前安裝的 nvidia 驅動版本,並在目錄找尋看看是否有 nvidia-384 這個驅動程式目錄。

cuDNN 安裝


cuDNN 的系統全域變數已經在上一小節完成,由於 cuDNN 的驅動檔案會直接移動到 CUDA 的目錄裡面,所以 Tensorflow-GPU 會依照 CUDA 版本路徑去查找。

請至 cuDNN 的網站下載,並且下載時需要註冊帳號並同意,才可以看到 cuDNN 各版本的下載列表: https://developer.nvidia.com/cudnn

本文章使用的 CUDA 版本是 8.0 ,以及官方提到建議的 cuDNN 版本為 6.0 ,因此對應列表上的文字,下載 cuDNN 6.0 For CUDA 8.0:

cuDNN 請下載 cuDNN v6.0 Library for Linux 這個 tar.gz 壓縮檔,如圖示:



並且解壓縮後,使用以下指令分別把檔案加入 CUDA 目錄中:

sudo cp -P cuda/include/cudnn.h /usr/local/cuda/include
sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

若在跑起 Tensorflow-GPU 時出現以下錯誤,有關鍵字 libcudnn.so.6: connot open shared object file...etc ,其 libcudnn.so.6 的 6 指的就是你目前使用的 Tensorflow 是抓取 cuDNN 6.0 版,所以你可能是:

  1. cuDNN 下載錯版本,不是第 6 版,在 /usr/local/cuda/lib64 可以看看有沒有這個檔案
  2. 你的 cuDNN 可能安裝錯位置,沒有安裝在 /usr/local/cuda/lib64 裡面
  3. 你沒有設定好 CUDA 路徑,用 export 查看。
錯誤情況如圖:



安裝虛擬環境


本章節使用的 Tensorflow-GPU 運算環境是使用 Anaconda 2 的虛擬環境 (版本應該不限),安裝後,每次要做運算時才開啟虛擬環境,給 Anaconda 2 的環境跑 Tensorflow-GPU。

系統需安裝 libcupti-dev:

sudo apt-get install libcupti-dev

接著,到 Anaconda 網站下載並安裝 Anaconda 到 Ubuntu 16.04 系統環境上: https://www.anaconda.com/download/#linux

接著,測試 Terminal 是輸入 conda 指令是否存在,如果不存在,請手動加入路徑,參考官方文件,至輸入 conda 指令存在為止。

請注意, anaconda 的路徑建議加入至 ~/.bashrc 檔案中,以便每次打開 Terminal 都可以自動加入路徑。

完成後,就使用 anaconda 的指令建立一個虛擬環境目錄:
conda create -n [name] python=2.7 # or python=3.3, etc.
[name] 可以自己取一個名字,然後後面則是 conda 要建立的 python 版本,範例如下:
conda create -n tensorflow python=2.7
然後,就可以用以下指令開啟這個虛擬環境:
source activate [name]
本文這裡的 name 取的是 tensorflow ,所以指令範例如下:
source activate tensorflow
輸入後,可以看到 Terminal 路徑前面有一個括號,裡面是命名的 [name],就代表已啟動,當要結束環境時,輸入以下指令就可以離開:
source deactivate

conda 環境啟動後,就可以安裝 tensorflow-gpu 環境,透過 pip 來進行安裝,指令為:
pip install --ignore-installed --upgrade tensorflow-gpu
除了 pip 以外,可以再用 pip3 來安裝不同 python 版本的 tensorflow-gpu:
pip3 install --ignore-installed --upgrade tensorflow-gpu
接著,就可以透過 python 交互式命令,試試看:
import tensorflow as tf

如果這個指令沒問題,再測試 Tensorflow-GPU 是否有偵測到電腦的顯示卡:

from tensorflow.python.client import device_lib

device_lib.list_local_devices()



tf.test.gpu_device_name()

新版的 Tensorflow 在載入時好像都沒有再提示 GPU 顯示卡載入情形,所以可能需要手動測試。

Reference:
https://stackoverflow.com/questions/41402409/tensorflow-doesnt-seem-to-see-my-gpu
https://stackoverflow.com/questions/42326748/tensorflow-on-gpu-no-known-devices-despite-cudas-devicequery-returning-a-pas
https://www.tensorflow.org/tutorials/using_gpu
https://stackoverflow.com/questions/38559755/how-to-get-current-available-gpus-in-tensorflow
http://www.jarvus.dragonbeef.net/note/noteMLsetup.php
https://stackoverflow.com/questions/41991101/importerror-libcudnn-when-running-a-tensorflow-program
https://www.tensorflow.org/install/install_linux

沒有留言:

張貼留言

© ERIC RILEY , 自由無須告知轉貼
Background Japanese Sayagata by Olga Libby