view_headline機械学習、ディープラーニング

TensorFlowのインストール(GPU利用編)

このページはCUDAに対応したNVidia製グラフィックカードを持っている人向けの内容です。

このページではGPU計算を有効にしたTensorFlowをインストールする手順を紹介します。 GPUは並列化処理に優れておりTensorFlowでの数値計算速度を向上させることができます。

TensorFlowはCUDAと呼ばれる、NVidia社が開発した並列計算プラットフォームを利用して高速化させることができます。CUDAについてはこちらを参考にしてください。

GPU版TensorFlowが利用できるNVidia GeForce GPU

2017年3月6日現在、TensorFlowのインストールページではCuda Compute Capability3.0以上のグラフィックカードが必要と記載されていいます。 CUDA 3.0以上対応GeForceグラフィックカードは下記のとおりです。 参考:CUDA GPUs
ざっと見たところ、6XX系以上のGeForceグラフィックカードを持っていれば大丈夫のようです。

デスクトップ版GeForce
GTX 10XX系1080Ti, 1080, 1070, 1060, 1050
TITAN系NVIDIA TITAN X, GTX TITAN X, GTX TITAN Z, GTX TITAN Black
GTX 9XX系980Ti, 980, 970, 960, 950
GTX 7XX系780Ti, 780, 770, 760, 750Ti, 750
GT 7XX系GT740, GT730(*), GT720, GT705
GTX 6XX系690, 680, 670, 660Ti, 660, 650Ti BOOST, 650Ti, 650
GT 6XX系GT640[GDDR5版]
(*) GT730 DDR3, 128bit版を除く
ノートブック版GeForce
10XX系1080, 1070, 1060
9XX系980, 980M, 970M, 965M, 960M, 950M, 940M, 930M, 920M, 910M
8XX系880M, 870M, 860M, 850M, 840M, 830M
7XX系780M, 770M, 765M, 760M, 750M, 745M, 740M, 735M, 730M
GTX 6XX系680MX, 680M, 675MX, 670MX, 660M, 650M, 645M, 640M, 640M LE

インストール環境

手順を作成するにあたって用意したマシン環境です。

GPUNVidia GeForce GTX 780ASUS GTX780-DC2OC-3GD5
OSUbuntu 16.04 64bitUbuntu Desktop
Python3.5.2sudo apt-get install python3
TensorFlowr1.0https://github.com/tensorflow/tensorflow/tree/r1.0

インストール手順

Ubuntu 16.04/Python3.5/GPUサポート有り/GTX780/ソースインストール/virtualenv利用 の構成でのインストール手順を紹介します。
ちなみにこの手順は2017/3/7に検証した手順であり、将来同じ手順で正しくTensorFlowをインストールできない可能性があります。

1. CUDA Tookitのインストール

参考:NVIDIA CUDA Installation Guide For Linux

CUDAが利用できるGPUが認識されているか確認

lspci | grep -i nvidia

ここで何も表示されない場合、NVIDIA製のグラフィックボードがインストールされていない、もしくは認識されていないため これ以降の手順は実施できません。

gccがインストールされていることを確認します。

gcc --version

gcc 5.3.1以降がインストールされていればOK

Linuxカーネルヘッダーをインストールします。

sudo apt-get install linux-headers-$(uname -r)

Ubuntu 16.04用のCUDA Tookitをインストールします。
まず、CUDAダウンロードページからUbuntu用debファイルをダウンロードします。

ダウンロードした.debファイルは/tmpに移動しておきます。

cuda toolkitをインストールします。(インストールサイズが2GBほどあるので注意。ネットワークが遅いと数十分から数時間かかります。)

sudo dpkg -i /tmp/cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda

環境変数LD_LIBRARY_PATHを設定します。

export LD_LIBRARY_PATH=/usr/local/cuda-8.0/extras/CUPTI/lib64:/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
echo "export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}" >> ~/.profile
2. cuDNNのインストール

参考:NVIDIA cuDNN

cuDNNはディープラーニング研究者・開発者用のライブラリであり、ダウンロードするにはnVidiaのAccelerated Computing Developer Programのメンバーになる必要があります。 メンバー登録自体は簡単で、nVidiaのサイトでアカウントを作成するだけです。

nVidiaのcuDNNダウンロードサイトに行きDownloadボタンをクリックします。

Join Nowボタンをクリックします。

Eメールアドレス、氏名、組織名、国、規約に同意ボタンをチェックし、Nextボタンをクリックします。
組織ではなく個人で登録する場合は組織名(Organization)の箇所は適当にIndividual Developerとでもしておけば良いです。

次のページに行くとアンケート形式でいくつか質問をされます。

登録完了後再度上のDownloadボタンを押すことでcuDNNをダウンロードすることができます。
インストール方法はメンバー登録後cuDNNのダウンロードページにあるインストールガイドに記載されているのでそちらを参考にしてください。 私の環境ではダウンロードしたcuDNNのアーカイブ内のlib64/, include/ディレクトリをそのままCUDA Toolkitの$LD_LIBRARY_PATHに上書き展開しています。

3. libcupti-devのインストール
sudo apt-get install libcupti-dev
4. Bazelのインストール

参考URL:https://bazel.build/versions/master/docs/install.html

BazelはGoogle製のビルドツールです。TensorFlowをソースからビルドする際に必要になります。
bazelがJDK1.9に対応していないため、JDK1.9がOSにインストールされていると上記手順途中でエラーが発生します。 私は下記のようにしてJava9/JDK1.9をアンインストールしました。
* 利用している他のソフトウェアがJava1.9を利用している場合はそのソフトウェアが動作しなくなる可能性があります。 コマンドの意味や影響がわからなければ実行しないでください。

sudo apt-get purge openjdk-9* java-9*

次にJDK1.8をインストールします。

sudo apt-get install openjdk-8-j*
java -version
  # openjdk version "1.8.x_xxx" と表示されることを確認。

Bazelの配布用URIとパッケージソースの追加

echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -

Bazelのインストール

sudo apt-get update && sudo apt-get install bazel
5. PythonのVirtualenv環境のセットアップ

TensorFlow専用のPython実行環境を作成します。Virtualenvを使うとプロジェクト専用のPythonバージョン、Pythonソフトウェアパッケージ を構築できるようになります。Virtualenv環境を切り替えるとPythonのバージョンや利用できるパッケージも自由に切り替えられるようになります。

pip3をインストールします。

sudo apt-get install python3-pip

virtualenvをインストールします。

sudo apt-get install python-virtualenv

TensorFlow用のvirtualenv環境を作成し、環境を有効にします。下記のコマンドを実行すると/home/<ユーザ名> ディレクトリ直下に 新たにtensorflowというディレクトリを作成します。

virtualenv -p python3 --system-site-packages ~/tensorflow
source ~/tensorflow/bin/activate

環境が有効になっていればプロンプトが下記のように変化しているはずです。

(tensorflow)$

この状態でpip installを実行すると、このvirtualenv環境にのみpipパッケージがインストールされます。

※ちなみに環境を抜けたい場合は下記を実行すればOKです。

(tensorflow)$ deactivate

次にTensorFlowで必要なパッケージをvirtualenv環境にインストールします。

(tensorflow)$ pip install six numpy wheel
6. TensorFlowのソースをダウンロード/ビルド構成を設定する。

まずはGithubのTensorFlowのレポジトリからソースコードをダウンロードします。

(tensorflow)$ mkdir -p ~/projects
(tensorflow)$ cd ~/projects
(tensorflow)$ git clone https://github.com/tensorflow/tensorflow
(tensorflow)$ cd tensorflow
(tensorflow)$ git checkout r1.0

ソースのビルド構成を設定します。下記を参考にCUDAに関係しない設定はそのままEnterでデフォルトの設定を使うようにします。

(tensorflow)$ ./configure
Please specify the location of python. [Default is /home/ユーザ名/tensorflow/bin/python]:
Please specify optimization flags to use during compilation [Default is -march=native]:
Do you wish to use jemalloc as the malloc implementation? (Linux only) [Y/n]
Do you wish to build TensorFlow with Google Cloud Platform support? [y/N]
Do you wish to build TensorFlow with Hadoop File System support? [y/N]
Do you wish to build TensorFlow with the XLA just-in-time compiler (experimental)? [y/N]
Please input the desired Python library path to use. Default is [/home/ユーザ名/tensorflow/lib/python3.5/site-packages]
Do you wish to build TensorFlow with OpenCL support? [y/N]
Do you wish to build TensorFlow with CUDA support? [y/N]  Y
CUDA support will be enabled for TensorFlow
Please specify which gcc should be used by nvcc as the host compiler. [Default is /usr/bin/gcc]:
Please specify the Cuda SDK version you want to use, e.g. 7.0. [Leave empty to use system default]:  8.0
Please specify the location where CUDA 8.0 toolkit is installed. Refer to README.md for more details. [Default is /usr/local/cuda]:
Please specify the cuDNN version you want to use. [Leave empty to use system default]:  5
Please specify the location where cuDNN 5 library is installed. Refer to README.md for more details. [Default is /usr/local/cuda]:
Please specify a list of comma-separated Cuda compute capabilities you want to build with.
You can find the compute capability of your device at: https://developer.nvidia.com/cuda-gpus.
Please note that each additional compute capability significantly increases your build time and binary size.
[Default is: "3.5,5.2"]:   3.5

ちなみに私の環境ではここで下記のようなエラーが出力されてしまいました。

ERROR: /home/ユーザ名/projects/tensorflow/tensorflow/python/BUILD:2275:1: every rule of type _py_wrap_cc implicitly depends upon the target '@swig//:templates', but this target could not be found because of: no such package '@swig//': Error downloading [http://bazel-mirror.storage.googleapis.com/ufpr.dl.sourceforge.net/project/swig/swig/swig-3.0.8/swig-3.0.8.tar.gz, http://ufpr.dl.sourceforge.net/project/swig/swig/swig-3.0.8/swig-3.0.8.tar.gz, http://pilotfiber.dl.sourceforge.net/project/swig/swig/swig-3.0.8/swig-3.0.8.tar.gz] to /home/ユーザ名/.cache/bazel/_bazel_ユーザ名/3f6df72b6e217920e9a8b0ddfd37c24d/external/swig/swig-3.0.8.tar.gz: All mirrors are down: []. ERROR: Evaluation of query "deps((//tensorflow/... - //tensorflow/examples/android/...))" failed: errors were encountered while computing transitive closure.

私が確認した限りでは、tensorflowの外部依存パッケージ'swig'のダウンロードタイムアウトが原因のエラーのようです。
curlコマンドで上記エラー内の"bazel-mirror.storage.googleapis.com"と"pilotfiber.dl.sourceforge.net"および"pilotfiber.dl.sourceforge.net" に対してswig-3.0.8.tar.gzのダウンロードを試してみたところ、"bazel-mirror.storage.googleapis.com"以外の2つのミラーサイトの反応が遅いことがわかりました。 (数秒待てばダウンロード自体は始まります)。 おそらくbazelはパッケージのダウンロードに対するレスポンスタイムアウトの閾値が厳しく設定されており、 パッケージの配信サーバがもたつくとサーバがダウンしていると判断してしまうようです。

この問題を解決するため、 tensorflow/tensorflow/workspace.bzl ファイルを下記のように修正し、 レスポンスが遅い2つのサーバをダウンロードリストから外して再度./configureコマンドを実行したところ、無事エラーなくコマンドが完了しました。

native.new_http_archive(     name = "swig",     sha256 = "58a475dbbd4a4d7075e5fe86d4e54c9edde39847cdb96a3053d87cb64a23a453",     urls = [         "http://bazel-mirror.storage.googleapis.com/ufpr.dl.sourceforge.net/project/swig/swig/swig-3.0.8/swig-3.0.8.tar.gz",
        "http://ufpr.dl.sourceforge.net/project/swig/swig/swig-3.0.8/swig-3.0.8.tar.gz", ←この行を削除
        "http://pilotfiber.dl.sourceforge.net/project/swig/swig/swig-3.0.8/swig-3.0.8.tar.gz", ←この行を削除
    ],     strip_prefix = "swig-3.0.8",     build_file = str(Label("//third_party:swig.BUILD")), )

同じようなエラーが発生した方は上記の方法を試してみてください。./configureコマンドの実行が完了したあとは、ソースコードをgit reset --hardで戻しておきましょう。

7. TensorFlowのソースをビルドする。

bazel buildでソースをビルドします。
ちなみに私のマシン(CPU: i7-2600K@3.9GHz, 4C8T, RAM: 16GB)では23分かかりました。 CPU使用率もほとんどの時間で8コアとも使用率100%、メモリも見ていた限り最大で11GBほど使用していました。 他の作業と同時並行でビルドするのはやめたほうが良いです。他のアプリを閉じたうえでビルドしましょう。

(tensorflow)$bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=cuda //tensorflow/tools/pip_package:build_pip_package

上記のコマンドが完了すると、bazel-bin/tensorflow/tools/pip_package/build_pip_packageというファイルが作成されます。 そのファイル名の通り、TensorFlowのpipパッケージを作成するツールです。

※上記のコマンドはAVX/AVX2/FMA/SSE4.2の拡張命令セットが使えるCPUでのみ有効です。(ビルドは成功しますがプログラム実行時にエラーが発生します。)
私の持っているCPU(Intel Core i7 2600K)ではAVX2とFMAはサポートされてなかったため、AVX2/FMAに関するオプションを削除した上で実行しました。

(tensorflow)$ bazel build -c opt --copt=-mavx --copt=-mfpmath=both --copt=-msse4.2 --config=cuda //tensorflow/tools/pip_package:build_pip_package
8. TensorFlowのpipパッケージを作成し、インストールする。

カスタムビルドしたTensorFlowをpipパッケージ化します。 下記のコマンドを実行すると、/tmp/tensorflow_pkgディレクトリ直下にpipパッケージファイル(~.whl)を生成します。 このコマンドは先程までとは違い、20秒ほどで完了します。

(tensorflow)$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

生成された.whlファイルでpipインストールします。

(tensorflow)$ pip install $(ls /tmp/tensorflow_pkg/*.whl)
...
Successfully installed protobuf-3.2.0 tensorflow-1.0.0

これでTensorFlowのソースインストールは完了です。

9. インストールの検証

TensorFlowが正しくインストールされたか確認します。

# tensorflowのプロジェクトディレクトリにいるままだとエラーがでるのでディレクトリを出ます。
(tensorflow)$ cd ../
(tensorflow)$ python
>>> import tensorflow as tf
>>> hello = tf.constant('Hello world')
>>> sess = tf.Session()
>>> print(sess.run(hello))
# b'Hello world' と表示されればOKです。