TensorFlowのGPU版をインストールして動かしてみる。OSはUbuntu系のものを使用。Pythonは3.4。
GPUはGT730を利用。TITANとかK20とかそんな高いもの買えるわけないだろ。
これを書いている時点では、TensorFlowが対応しているGPUは下記のようになっている。
NVIDIA's Cuda Toolkit (>= 7.0) NVidia Compute Capability >= 3.0
推奨されるGPUとして下記が挙げられている。
だいたいどれも15万以上はするハイスペックな製品。
私のようなしがない自営業者はそんな製品買えないので、1万円を切る値段で買えるGeforce GT730で動かしてみる。このレベルの製品ではご利益があるかは怪しいところだが。
得られるご利益の方は置いておいて、GT730でもとりあえずGPU版をインストールして動かすことはできる。
今回買った製品、GF-GT730-LE1GHD/D5。
購入時の金額は7200円くらい。自宅でCUDAのコードを書いて検証する用くらいには十分に使えた。
しかしメモリ1GBはさすがにケチり過ぎだったようだ。tutorialのサンプルコードですら分割して実行しないとメモリが溢れて下記のようなエラーが出たりする。
tensorflow.python.framework.errors.ResourceExhaustedError: OOM when allocating tensor with shape[10000,28,28,32]
常にバッチサイズを気にしながら省メモリなコードを書く練習にはなるけど、まともに使うならせめて4GBはないと厳しいよね。
Nvidiaの公式サイトから、Cuda Toolkitをインストールする。pipで入れる際はtensorflowのバージョンが上がるたびにCUDAの対象バージョン変わることがあるので、事前にチェックする必要がある。
cudaのバージョンが変わった場合などは、release.mdのところに書かれるはず。リンク先でpipでページ検索すると、下記のような記述が見られる。
GPU Pip wheels are built with cuda 7.5 and cudnn-v4, making them required for the binary releases. Lower versions of cuda/cudnn can be supported by installing from sources and setting the options during ./configure
上記に従い、Cuda Toolkit7.5とcudnn-v4をインストールする。
まずは下記コマンドでPCIにGPUが刺さってるか確認。
$ lspci | grep -i nvidia 01:00.0 VGA compatible controller: NVIDIA Corporation GK208 [GeForce GT 730] (rev a1)
cuda-toolkitは下記サイトに各プラットフォーム用のものが置かれている。本例ではUbuntu系を利用しているので、Ubuntu用のRunと書かれている自動インストーラを利用してみる。
https://developer.nvidia.com/cuda-toolkit-archive
1GBあるのでダウンロードはけっこうかかる。
ダウンロードしたらsudoで実行。Xが立ち上がっているとエラーが出るので、(Ubuntuの場合)Ctrl + Alt + F1でCUIモードに移動しておいて、service lightdm stopでXを落としてインストールする。
$ sudo service lightdm stop $ sudo sh cuda_7.5.18_linux.run
インストールオプションをいろいろ聞かれるけど基本全部デフォルトのままで問題なかった。(exampleの置き場所だけ適当に変更した)
インストールが成功したら、.~/bash_profileあたりにLD_LIBRARY_PATHにcudaのパスを設定しておく。
export CUDA_HOME=/usr/local/cuda if [ -z "$LD_LIBRARY_PATH" ]; then export LD_LIBRARY_PATH=${CUDA_HOME}/lib64 else export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${CUDA_HOME}/lib64 fi
sourceで読み込んで確認。
$ source ~/.bash_profile $ echo $LD_LIBRARY_PATH /usr/local/cuda/lib64
cuDNNはNVIDIA CUDA Deep Neural Networkの略。ダウンロードするにはdeveloper登録をする必要がある。下記サイトで登録、ダウンロードする。
https://developer.nvidia.com/cudnn
ユーザ登録にけっこう時間がかかるという噂を見かけたけど、自分が試した時はすぐにダウンロードが可能になった。
今回の対応バージョンである、cudnn-7.0-linux-x64-v4.0をダウンロードした。
下記を実行してヘッダファイル等を、前工程でインストールしたcudaのディレクトリにコピーする。
$ tar xvf cudnn-7.0-linux-x64-v4.0-prod.tgz $ sudo cp cuda/* usr/local/cuda/ $ sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
cudaはデフォルトだと/usr/local/cudaにシンボリックリンクを張ってインストールされるので、上記コマンドで通るはず。パスを変えてる場合は適宜パスを変更すること。
これで準備は整ったので、TensorFlowのGPU版をインストールする。
$ sudo pip3 install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.8.0-cp34-cp34m-linux_x86_64.whl
hello worldで動作確認。
import tensorflow as tf sess = tf.Session() hello = sess.run( tf.constant('hello world') ) print( hello )
上記コードを実行すると、ログがつらつらと流れた後にhello worldの文字が出力される。GPU使いますよ、というメッセージも含まれる。
I tensorflow/core/common_runtime/gpu/gpu_init.cc:102] Found device 0 with properties: name: GeForce GT 730 major: 3 minor: 5 memoryClockRate (GHz) 0.954 pciBusID 0000:01:00.0 Total memory: 1023.81MiB
自分がインストールしている際に引っかかったエラーとして、Cudaはの7.0を入れてインストールしてみたところ、下記のようなエラーが出た。
$ python3 hello.py ImportError: libcudart.so.7.5: cannot open shared object file: No such file or directory
以前は7.0がdefaultだったはずだが、現状はpipでインストールした場合は7.5がデフォルトになっていたことから発生したもの。
こういう場合、対処方法としてCudaの7.5を入れるか、Githubからソースを落としてきて ./configure すると良いらしい。
$ git clone https://github.com/tensorflow/tensorflow.git $ cd tensorflow $ ./configure
上記のように実行すると、PythonのバージョンやCudaのバージョン等を問われるので、当該バージョンを回答していけば使えるようになるとか。自分は7.5で入れ直したので、本当にそれで動くかは未検証。
下記のように実行すると、CPUを利用してくれるらしい。
with tf.Session() as sess: with tf.device("/cpu:0"):
チュートリアルの2つめのコードで比較してみる。
ちゃんとCPUで動いてるかはtopを見るとわかる。例えば4コアの場合、GPUで動かしている場合はCPU使用率は1つのコアを100%近く使うだけになるが、GPUの場合は4コアをフルで使おうとする。
以下、timeで計測した実行時間。
CPU : 82m2.001s GPU : 27m49.297s
安物GPUでも3倍近く速くなった。ちなみにCPUはCore i5-4440。
尚、最後にaccuracyを見ようしたらうちのGPUはメモリ足りなくなってエラーになったので、10回にわけてaccuracyを測るという残念なコードを実装する必要が出ていたりします。