Ubuntu 16.04にTensorFlow(GPU)をインストール

追記:
ややアップデートしたエントリを作成した
yyasui.hatenablog.com


Ubuntu 16.04にTensorFlowを入れた。基本的に公式(Installing TensorFlow  |  TensorFlow)をそのままやれば入ると思われるが、いくつか変更する必要があった。場当たり的な対応なので取り敢えず動いただけとしていおく。

変更点は2つあり、それぞれCUDAとcuDNNである。まずCUDAは現在NVIDIAからUbuntu向けに公開されているのは15.04/14.04用であり、一部の仕様が変更された16.04ではCUDAのインストールは変更する必要があった。cuDNNはTensorFlowのサポートはv4まででv5は未サポートとしているが、探すのも面倒だったのでv5を使用している。

また、基本的には公式のvirtualenvに従っているが、virtualenvwrapperのユーザなのでいくつか公式と手順が違う。

環境とインストールしたもの

CPU Intel(R) Core(TM) i5-6600T CPU @ 2.70GHz
Mem 12GB
GPU GeForce GTX 750 Ti
OS Lubuntu 16.04 LTS
Python python 2.7
NVIDIA driver 361.42
CUDA 7.5.18-0ubuntu1
cuDNN v5

TensorFlowのインストール

TensorFlow本体のインストールは通常のパッケージと同様にpipで引っ張ってくればよい。

インストールの事前準備

$ sudo apt-get install python-pip python-dev
$ sudo pip install virtualenvwrapper

TensorFlow本体のインストール

$ mkvirtualenv tensorflow
(tensorflow)$ pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.8.0-cp27-none-linux_x86_64.whl

GPUを使う準備

ドライバをNVIDIAにする

GPUを使いたいのでドライバをnouveauからNVIDIAに変える。以前は自分で調べて入れる必要があった気がするが、[Preference]-[Additional Drivers]という項目ができており、既に候補がリストアップされていた。取り敢えず新しい方を試してみる。
f:id:yyasui:20160605184714p:plain

恐らくこの後で再起動が必要と思われる。

CUDAの導入

Ubuntuなので15.04ならばCUDAのライブラリは公開されている。従ってnetworkを選べば以下でインストールできるかと思った。

$ sudo dpkg -i cuda-repo-ubuntu1504_[version]_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda

しかし、これをやろうとするとsudo apt-get updateでNVIDIAリポジトリが無視される。これはOpenSSH仕様が変わってSHA1のキーが無効にされたが、NVIDIAリポジトリSHA1を利用しているからのようだ。

仕方ないのでUbuntu側のリポジトリを向けてやった。結果的に動いているようだが、ライブラリの不整合等の可能性もあるのであまりよろしくはないか。

$ sudo apt-get install nvidia-cuda-dev

cuDNNの導入

v4を探す気が起きなかったのでv5を落としてきて書いてある通りに入れた。

tar xvzf cudnn-7.5-linux-x64-v4.tgz
sudo cp cuda/cudnn.h /usr/local/cuda/include
sudo cp cuda/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

パスの設定

これもそのまま写すだけ。

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64"
export CUDA_HOME=/usr/local/cuda

確認

確認はGPUを使うというページ自体がある(Using GPUs  |  TensorFlow)からそれをそのまま流用すればいい。結果は次の通り。

Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GeForce GTX 750 Ti    , pci bus id: 0000:01:00.0
b: /job:localhost/replica:0/task:0/gpu:0
a: /job:localhost/replica:0/task:0/gpu:0
MatMul: /job:localhost/replica:0/task:0/gpu:0
[[ 22.  28.]
 [ 49.  64.]]

GPUマッピングされているみたいなので問題なさそう。