TensorFlowをソースコードからビルドしてAVX2とFMAを有効化する

Developers's blog

2019.04.10中村 昴
TensorFlowをソースコードからビルドしてAVX2とFMAを有効化する

概要

TensorFlowをpipでインストールして実行したところ、以下のようなログが表示され、AVX2FMAが有効でないことがわかった。

 2019-04-09 10:28:05.680156: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
 Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA

AVX2FMAは、SIMDの拡張命令セットで、これらを使用することで速度の向上が期待できる。 今回は、TensorFlowでAVX2FMAを有効にするため、ソースコードからビルドをした。

環境

  • macOS Sierra 10.12.6
  • Python 3.6.8
  • Xcode 9.2
  • Bazel 0.21.0
  • TensorFlow 1.13.1

手順

1. Pythonの仮想環境の作成

pyenv, pyenv-virtualenvを使用する。

 $ pyenv virtualenv 3.6.8 TensorFlow-build # python 3.6.8、「TensorFlow-build」という名前の仮想環境を作成する
 $ pyenv local TensorFlow-build # 現在のディレクトリでTensorFlow-buildを使用するよう設定する 

2. TensorFlowの依存パッケージのインストール

 $ pip install -U pip six numpy wheel setuptools mock # 最新版をインストールする
 $ pip install -U keras_applications==1.0.6 --no-deps # keras_applications 1.0.6のみのインストール(依存パッケージはインストールしない)
 $ pip install -U keras_preprocessing==1.0.5 --no-deps # keras_preprocessing 1.0.5のみのインストール 

3. Bazelのインストール

Bazelとは、Googleが開発したビルドツールで、TensorFlowのビルドにも用いられている。

参考 Googleが開発する最新ビルドツール「Bazel」を使ってみよう

今回は、公式の推奨する、バイナリインストーラー方式でインストールする。

3.1 Xcodeをインストールする

Xcodeは、Bazel でobjc_*ios_*をサポートするのに用いられる。 インストールはApp Storeから行う。XcodeはiOS SDK 8.1、本体6.1以降のバージョンが必要となる。

インストール後、下記のコマンドでライセンスに同意する。

 $ sudo xcodebuild -license accept 

3.2 Bazelインストーラーをダウンロードする

bazel-0.21.0-installer-darwin-x86_64.sh を下記URLからダウンロードする。 https://github.com/bazelbuild/bazel/releases

0.21.0よりも新しいバージョンを使用すると、TensorFlowをビルドできない。

3.3 インストーラーを実行する

下記コマンドで実行する。--userフラグをつけると、Bazelが$HOME/binにインストールされ、.bazelrcのパスが $HOME/.bazelrcになる。

 $ chmod +x bazel-0.21.0-installer-darwin-x86_64.sh # 実行権限を付与
 $ ./bazel-0.21.0-installer-darwin-x86_64.sh --user # インストールを実行 

3.4 環境変数を設定する

~/.bash_profileに下記コマンドを追記して、Bazelのバスを通す。

 $ export PATH="$PATH:$HOME/bin" 

3.5 動作を確認する

 $ bazel version # バージョン情報を出力する 

出力結果

 Starting local Bazel server and connecting to it... 
 INFO: Invocation ID: 06b87c44-ed30-4d0d-8211-cb25664ca345
 Build label: 0.21.0
 Build target: bazel-out/darwin-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
 Build time: Wed Dec 19 12:57:09 2018 (1545224229)
 Build timestamp: 1545224229
 Build timestamp as int: 1545224229 

4. TensorFlowのソースコードのダウンロード

gitでソースコードを取得する。

 $ git clone https://github.com/tensorflow/tensorflow.git # ソースを取得する
 $ cd tensorflow # ソースコードのディレクトリに移動する 

ビルドするTensorFlowのバージョンのブランチをチェックアウトする。 利用可能なバージョンは、リリースページから確認できる。

 $ git checkout branch_name # r1.9, r1.10, etc. 

5. オプションの設定

下記コマンドでオプションを設定する。

 $ ./configure 

今回はすべてデフォルトの設定にした。

前述の通り、Bazelのバージョンが0.21.0よりも新しいと、ここでエラーとなる。

 You have bazel 0.24.1 installed.
 Please downgrade your bazel installation to version 0.21.0 or lower to build TensorFlow! 

6. ビルド

以下のコマンドでビルドする。筆者の環境では1.5時間かかった。

 $ bazel build --config=opt --copt=-mavx2 --copt=-mfma //tensorflow/tools/pip_package:build_pip_package 

ビルドに成功すると、最後に以下のようなログが出力される。

 Target //tensorflow/tools/pip_package:build_pip_package up-to-date:
   bazel-bin/tensorflow/tools/pip_package/build_pip_package
 INFO: Elapsed time: 5396.832s, Critical Path: 348.37s
 INFO: 3499 processes: 3499 local.
 INFO: Build completed successfully, 3500 total actions 

続いてpipパッケージをビルドする。

 $ ./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg # /tmp/tensorflow_pkg に配置する 

7. インストール

以下のコマンドでビルドしたTensorFlowをインストールする。

 $ pip install /tmp/tensorflow_pkg/tensorflow-<version-tags>.whl 

動作確認をする。

 $ cd .. # ソースコードのディレクトリから抜ける
 $ python -c "import tensorflow as tf; tf.enable_eager_execution(); print(tf.reduce_sum(tf.random_normal([1000, 1000])))" # TensorFlowを動かす 

出力結果

 tf.Tensor(3945.0461, shape=(), dtype=float32) 

AVX2FMAに関するログが出力されていないことが確認できる。

なお、TensorFlowのソースコードがあるディレクトリでTensorFlowをインポートすると、以下のようにエラーになるので注意。

 ImportError: Could not import tensorflow. Do not import tensorflow from its source directory; change directory to outside the TensorFlow source tree, and relaunch your Python interpreter from there. 

参考

お問い合わせはこちらから