macOSで構築したPython環境でTensorFlowのチュートリアルのサンプルを実行したら、以下のワーニングメッセージが表示しました。
2017-07-23 23:59:04.998330: 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.
2017-07-23 23:59:04.998353: 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.
2017-07-23 23:59:04.998361: 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.
2017-07-23 23:59:04.998369: 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.
「TensorFlowはSSE4.2, AVX, AVX2, FMAでコンパイルされていないが、このマシンならこれらにより加速することができる。」ということらしいです。
SSE4.2, AVX, AVX2, FMAって何?
調べてみれば、これらはINTELが開発したCPUの拡張命令セットです。これらの拡張命令は結構前の世代からサポートされてきたみたいですが、初めて知りました。拡張命令セットの内容はよくわからないが、これらでTensorFlowのライブラリをコンパイルすれば実行時間を短縮できるらしいので、やり方を調べ、ここにメモを残しておきます。
Python仮想環境管理のためのcondaインストール
以下のところでanacondaをダウンロードし、インストールします。anacondaはPythonで開発するためのパッケージは最初からいろいろ入っているので、anacondaでPythonをインストールし直しました。
参考
https://gist.github.com/aphlysia/d5fcee79ff81b8272faf
HomebrewでBazelをインストール
Bazelとは、Googleが開発したビルドツールです。makeのようなものです。
まだBazelのいいところわからないから、これから勉強したいです。
とりあえずここでインストールして使用していきます。
brew install bazel
TensorFlowのソースコードをgit cloneで取得
普通は、pip install tensorflowでTensorFlowのライブラリをPythonにインストールできますが、そうしたら冒頭のあのワーニングメッセージが表示されます。その為、ここは敢えてソースコードをダウンロードして、拡張命令セットを使用するように設定してライブラリをビルドして、インストールします。
git clone https://github.com/tensorflow/tensorflow
コンフィグレーション & コンパイル
コンフィグレーション
対話式で、コンパイル設定を行う。ここでとりあえず全部デフォルトで最後までENTER切っていいです。
cd tensorflow
./configure
コンパイル
以下の命令を実行すればコンパイル開始。自分のマシンにサポートされる拡張命令セットを一つずつ"--copt="の後ろに付けて、コンパイル実行。マシンの性能によりますが、自分のマシン(Core i5-4285U 2.4GHz)は40分ぐらい時間かかりました。
bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-msse4.1 --copt=-msse4.2 -k //tensorflow/tools/pip_package:build_pip_package
配布パッケージ作成
コンパイル完了後、インストールするためのパッケージを作成します。
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
パッケージは /tmp/tensorflow_pkg に生成されます。
condaでPython仮想環境作成
仮想環境を使わずに直接pip installでPythonにライブラリ追加してもいいですが、使用する目的によって環境を分けたほうがいいと思うので、仮想環境内で拡張命令セットでコンパイルしたライブラリをインストールすることにしました。
conda create -n tensorflow python=3.6 anaconda
-nの後ろは{仮想環境名}
仮想環境に切り替え
source activate tensorflow
仮想環境内でコンパイルしたパッケージをインストール
pip install /tmp/tensorflow_pkg/{パッケージ名}.whl
インストール完了後もう一度冒頭のサンプルを実行したらワーニングメッセージが出なくなりました。
まとめ
拡張命令セットでコンパイルしたライブラリがインストールされた仮想環境でもう一度、TensorFlowのサンプルを実行したら、ワーニングメッセージが出てこなくなりまりました。簡単なサンプルなので、結局、あまり「速くなった」という感じはしませんでした。また後日複雑なもので比較してみたいと思います。