DEVELOPER’s BLOG
技術ブログ
TensorFlowをソースコードからビルドしてAVX2とFMAを有効化する
概要
TensorFlowをpipでインストールして実行したところ、以下のようなログが表示され、AVX2
とFMA
が有効でないことがわかった。
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
AVX2
とFMA
は、SIMDの拡張命令セットで、これらを使用することで速度の向上が期待できる。 今回は、TensorFlowでAVX2
とFMA
を有効にするため、ソースコードからビルドをした。
環境
- 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)
AVX2
とFMA
に関するログが出力されていないことが確認できる。
なお、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.