stylesheet

2017-10-30

TensorFlow CPU最適化ビルド

PyPIからインストールしたCPU版のTensorFlowを使用していると以下のような警告が「毎回」出る。

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.

訳すと「拡張命令に対応してるのに拡張命令サポートを有効にしてコンパイルされてないぜ。Why?」、意図するところは「tensorflowの実力はこんなものじゃないぜ。早くおまえのマシンとシンクロするんだ。」ということか。競合と速度比較されるので開発者も大変なのだろう。

ただの警告なので放置しても問題無いわけだが、使用するたびにログ出力されては気分がよろしくないのは確かではある。 それならばと、CPU最適化版へ取り替えようと思うわけだが、残念なことにPyPIではCPU最適化版の配布は行われていなかった。
この際であるから、手間はかかるとはいえ、いっそソースコードからビルドを試みてシンクロ率100%を目指すこととした。

導入環境

pythonに関してはpyenvを使用している。未導入の場合はpython-devやpython-pipなど必要になると思われる。

  • Ubuntu 16.04 LTS
  • python 2.7
  • jdk 1.8
  • gcc 5.4

事前準備

TensorFlowのビルドはmakeではなくbazelという聞き慣れないビルドツールを使用するので、こちらのインストールを行う。

調べるとどうやら社内利用のGoogle謹製ツールのようだ。repoといいgradleといい、さらりと紛れこませてくる。 また、bazelを使用するにあたってjdk1.8を要求される。

インストールはAPTにレポジトリを追加して行う。

$ 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 -
$ sudo apt update && sudo apt install bazel

また、TensorFlowが依存するPythonパッケージをインストールしておく。

$ pip install numpy pip wheel

configure

ソースコードは最新のv1.4.0-rc1バージョンを使用。
git cloneしてconfigureを行う。クラウド関連のサポートなど不要だが全てデフォルト状態で設定した。

$ git clone --depth=1 -b v1.4.0-rc1 https://github.com/tensorflow/tensorflow
$ cd tensroflow
$ ./configure
Do you wish to build TensorFlow with jemalloc as malloc support? [Y/n]: 
jemalloc as malloc support will be enabled for TensorFlow.

Do you wish to build TensorFlow with Google Cloud Platform support? [Y/n]: 
Google Cloud Platform support will be enabled for TensorFlow.

Do you wish to build TensorFlow with Hadoop File System support? [Y/n]: 
Hadoop File System support will be enabled for TensorFlow.

Do you wish to build TensorFlow with Amazon S3 File System support? [Y/n]: 
Amazon S3 File System support will be enabled for TensorFlow.

Do you wish to build TensorFlow with XLA JIT support? [y/N]: 
No XLA JIT support will be enabled for TensorFlow.

Do you wish to build TensorFlow with GDR support? [y/N]: 
No GDR support will be enabled for TensorFlow.

Do you wish to build TensorFlow with VERBS support? [y/N]: 
No VERBS support will be enabled for TensorFlow.

Do you wish to build TensorFlow with OpenCL support? [y/N]: 
No OpenCL support will be enabled for TensorFlow.

Do you wish to build TensorFlow with CUDA support? [y/N]: 
No CUDA support will be enabled for TensorFlow.

Do you wish to build TensorFlow with MPI support? [y/N]: 
No MPI support will be enabled for TensorFlow.

Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]: 


Add "--config=mkl" to your bazel command to build with MKL support.
Please note that MKL on MacOS or windows is still not supported.
If you would like to use a local MKL instead of downloading, please set the environment variable "TF_MKL_ROOT" every time before build.
Configuration finished

ビルド

bazel buildは以下のオプションを付けた。
最適化フラグはデフォルトの"-march=native"で、マシンに応じた最適化をしてくれる。

尚、マシンスペックによるが相応の時間を覚悟しておくべき。数分程度では終わらない。

  • 最適化フラグ: --config=opt (デフォルトの-march=native)
  • MKLサポート追加: --config=mkl
  • gcc4互換ABI: --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
  • ビルド時のRAM馬鹿食い対策: --local_resources 2048,.5,1.0
$ bazel build --config=mkl --config=opt //tensorflow/tools/pip_package:build_pip_package --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" --local_resources 2048,.5,1.0

2時間弱掛かったがこれでpythonパッケージを生成する準備が整う。
以下コマンドでwhlファイルを生成してインストールを行う。

$ ./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
$ pip install /tmp/tensorflow_pkg/tensorflow-*.whl

以上で完了。import tensorflowを行って正しくインストールできたか確認しておくと良い。

総評

警告は表示されなくなったし、速度も多少改善された気がするが、生成したパッケージは環境が異なると使用できないし、アップデートも手動で再ビルドすることになる。

TensorFlowを使ってみようという人にとって作業自体は特段難しいものではないが、ソースコードからのビルドは手間に見合うかどうかは疑問ではある。
最適化の有無で数割程度速度アップするとのことだが、もともとが実用的な速度で動作するわけでもないので、ここは素直にGPUを用意するのが正解であろう。

参照