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

TensorFlowのインストール

TensorFlowとは

TensorFlowはGoogleの開発したオープンソースの数値計算ソフトウェアライブラリです。 ”機械学習のための”、という枕詞がつかないのは、機械学習に限定されない様々な用途で利用できるためです。
TensorFlowは他の多くの科学数値計算ライブラリと同様にPython上で動作します。(Python以外の言語で利用できないわけではありません。詳細はこちら。)

私も現在のところTensorFlowを勉強中なので、説明ができるレベルで理解ができ次第この項目に文章を追加していこうと思います。

TensorFlowのインストール

TensorFlowのインストール方法はオフィシャルサイトで詳しく説明されています。 ちなみにTensorFlowは現在はWindowsにネイティブで(仮想環境を介さずに)インストールできるようになりましたが、2016年11月までWindowsネイティブでの動作がサポート対象外だったこともあり、 Ubuntu Linuxでの実行をおすすめします。 私はUbuntu Linux OS上でTensorFlowを実行しています。

一点、私の環境では上記オフィシャル手順ではスムーズにインストールが完了しませんでした。

私と同じ環境でTensorFlowを実行したい方は、私の環境、および実施したインストール手順を下記に記載しますので参考にしてください。

OSUbuntu 16.04 64bitUbuntu Desktop
Python3.5.2sudo apt-get install python3
TensorFlowr1.0https://github.com/tensorflow/tensorflow/tree/r1.0

私の環境ではTensorFlowをソースインストールしています。 理由は、ソースからのインストール以外の方法でTensorFlowをインストールすると、私の環境では下記のようなワーニングが毎回コンソールに出力されてしまうためです。

W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE3 instructions, but these are available on your machine and could speed up CPU computations. W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations. W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations. W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations. W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations. W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations.

メッセージは、SSE3やAVXなどの拡張命令セットが利用できる環境であるにもかかわらず、これらの拡張命令を使用するようにTensorFlowがビルドされていないと言っているようです。 プリコンパイル済みTensorFlowをインストールすると毎回このワーニングがコンソールに出力されてしまいます。

インストール手順

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

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
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
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

ソースのビルド構成を設定します。全てそのまま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]

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

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で戻しておきましょう。

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

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

(tensorflow)$bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 //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はサポートされていないため、そのようなCPUを使っている場合はAVX2/FMAに関するオプションを削除した上で実行する必要があります。
自分の使っているマシンのCPUがAVX/AVX2/FMA/SSE4.2が利用可能か事前に調べておいてください。

(tensorflow)$ bazel build -c opt --copt=-mavx --copt=-mfpmath=both --copt=-msse4.2 --config=cuda //tensorflow/tools/pip_package:build_pip_package
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のソースインストールは完了です。

インストールの検証

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です。