Install TensorFlow on Ubuntu 16.04.2 LTS with NVIDIA GPUs

Mar 28, 2017   #Python  #Machine Learning  #CUDA 

はじめに

 Ubuntu上で、TensorFlowでGPUを使う環境を構築したのでメモ。
 インストールしたソフトウェアと環境は以下の通りで、CUDAの基本的な話は、解説しない1

ソフトウェア バージョン
Ubuntu 16.04.2
Python 3.5.x
TensorFlow 1.0.x
nvidia driver 375
CUDA Toolkit 8.0
cuDNN 6.0

 NVIDIAのサイトにあったTensorFlowのインストールガイドでは、TensorFlowのバージョンが0.9.0だったので、適当にいくつかのサイトを見ながらインストールした2

NVIDIAドライバのインストール

 使用するNVIDIAのGPU(GeForce、Quadro、Teslaなど)に対応したドライバは、公式サイトで確認できる。僕の端末のGPUドライバは、aptでインストールできた。

$ sudo apt-cache search nvidia-\d+
$ sudo apt-get install nvidia-YOUR-VERSION

CUDA Toolkitのインストール

 NVIDIAサイトからダウンロードできるCUDA Toolkitには、nvcc(NVIDIA CUDA Compile)やGPU対応版のBLAS(Basic Linear Algebra Subprograms)、FFT(Fast Fourier Transform)、疎行列、擬似乱数生成ライブラリ、その他にnvidia-smi等のツールも含まれている。
 一度、CUDA Toolkitもaptでインストールしたが(7.x)、TensorFlowのバージョンをあげたら(0.9.xから1.0.xに)うまく起動しなかったので、公式サイトからダウンロードしたrunファイルでインストールした。

$ sudo apt install nvidia-cuda-toolkit

 python3でtensorflowをimportしたタイミングで、以下のエラーに遭遇。

> import tensorflow as tf
...
ImportError: libcudart.so.8.0: cannot open shared object file: No such file or directory
...

 なので最新版の8.0をrunfileからインストールした。runfileは後述のcuDNNと同様に、登録後にアクセスできるNVIDIAのWebページからダウンロードできる。

$ sudo sh cuda_8.0.61_375.26_linux.run --override

 Toolkitのインストールが終了したら、以下のコマンドでGPUが認識されているかを確認できる。

$ nvidia-smi

 いくつかオプションがあり、lオプションでGPUメモリの監視できる3

$ nvidia-smi -l

cuDNNのインストール

 cuDNN(Deep Neural Network)ライブラリは、GPU向けにチューニングした畳み込み処理、pooling、正規化、活性化層の実装が含まれているらしい。CUDA Toolkitと同様に、NVIDIAのWebサイトから圧縮ファイルをダウンロードし、展開、配置し、環境変数を設定する。

$ tar -xzvf cudnn-8.0-linux-x64-v6.0.tgz
$ sudo cp cuda/include/cudnn.h /usr/local/cuda-8.0/include
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda-8.0/lib64
$ sudo chmod a+r /usr/local/cuda-8.0/include/cudnn.h /usr/local/cuda-8.0/lib64/libcudnn*

 環境変数の設定

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda-8.0/lib64:/usr/local/cuda-8.0/extras/CUPTI/lib64"
export CUDA_HOME=/usr/local/cuda

TensorFlowのインストール

 さて、最後にTensorFlowを公式サイト通り、インストールする4

$ pip3 install --upgrade tensorflow-gpu

 pythonからTensorFlowからGPUが使えるかを確認する。

$ python3
>>> import tensorflow as tf
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcublas.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:126] Couldn't open CUDA library libcudnn.so.5. LD_LIBRARY_PATH: :/usr/local/cuda-8.0/lib64
I tensorflow/stream_executor/cuda/cuda_dnn.cc:3517] Unable to load cuDNN DSO
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcufft.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcurand.so.8.0 locally

 今回は、Bidirectional-LSTM(Long short-term memory)のTensorFlow実装を使って、ざっくり計算してみた5。うまくいってれば、実行中にnvidia-smiコマンドを使うことで、GPU使用率を確認できる。

おわりに

 適当にやってたら結構ハマって時間がかかったので、一通りメモした。bi-LSTMの例だと、シングルGPU使用率45%くらいで、2.5倍くらいはやくなったが、これから色々試してみる。

参考

関連記事