DEVELOPER’s BLOG

技術ブログ

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

2019.04.10 中村 昴
TensorFlow 機械学習
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. 

参考

関連記事

TensorFlowでVGG19を使ったインスタ映え画像の生成

概要 DeepArtのようなアーティスティックな画像を作れるサービスをご存知でしょうか? こういったサービスではディープラーニングが使われており、コンテンツ画像とスタイル画像を元に次のような画像の画風変換を行うことができます。この記事では画風変換の基礎となるGatysらの論文「Image Style Transfer Using Convolutional Neural Networks」[1]の解説と実装を行っていきます。 引用元: Gatys et a

記事詳細
TensorFlowでVGG19を使ったインスタ映え画像の生成
TensorFlow ニューラルネットワーク 画像認識
【Python】TensorFlow / SegmentationチュートリアルでU-netを学習させる

はじめに 前回の「画像セグメンテーションのためのU-net概要紹介」では画像のクラス分類のタスクを、画像のSegmentationのタスクにどう発展させるかを解説し、SegmentationのネットワークであるU-netの理論ついて簡単に解説しました。 今回はTensorFlowのSegmentationのチュートリアルを行いながら、実際にU-netを学習させてみたいと思います。 尚、本記事ではTensorflowの詳しい解説は行いません。 参考 : ht

記事詳細
【Python】TensorFlow / SegmentationチュートリアルでU-netを学習させる
TensorFlow ニューラルネットワーク 機械学習
TensorFlowのAVX2, FMAの有無で性能の比較をする

概要 ビルド済みのTensorFlowをpipでインストールすると、CPUの命令セットのAVX2やFMAが有効にならない。 AVX2やFMAを用いると、演算速度や精度の向上が期待できる。 参考 MMX, SSE, AVX, FMA命令とは何かを明らかにしたい会 そこで今回は、ソースコードからビルドしてAVX2とFMAを有効にしたTensorFlowを用意し、ビルド済みのパッケージをインストールしたものと、速度や精度の比較を行った。 環境 プロセッサ Int

記事詳細
TensorFlowのAVX2, FMAの有無で性能の比較をする
TensorFlow 機械学習

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