TensorFlow1.0(CPU版)でXLAを有効化したら30%程スピードアップした


Pocket

TensorFlow1.0(CPU版)をインストールしたら実行時に「TensorFlowライブラリがSSE使うようにコンパイルされてないよ。あなたの環境ならもっとスピードアップができるよ。」っていうワーニングがでるようになりました。じゃあ試してみるかってことでソースコードからインストールしてみることにしてみました。加えて、どうせソースから入れるならついでにXLAも試してみようかということでやってみました。
(毎回ワーニングがでるのがウザかったという理由もあり)
*XLAは1.0ではまだ実験的採用です

 
TensorFlow1.0をインストールすると下記のワーニングが出るようになりました

 

環境

Ubuntu14.04 64bit
Python2.7
TensorFlow1.0(CPU support only)

*GPU版は最初からXLAが有効になっているらしい…(GPU持ってないんで試してませんが)

インストール方法

ソースコードからのインストール方法は公式ドキュメントの通りです。

以下、実際にやった手順です。
 

1.TensorFlowソースコードの取得

git clone https://github.com/tensorflow/tensorflow
cd tensorflow
git checkout r1.0

 

2.Bazelのインストール

Bazelのインストールも公式ドキュメントの通りですが、apt-getでインストールした場合上手く行きませんでした。
*TensorFlowのconfigureで↓の問題でつまる。
.configure error Unrecognized option: –action_env=PATH

Bazelは sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java8-installer pkg-config zip g++ zlib1g-dev unzip

次に、ここから自分の環境にあったインストーラをダウンロード。
今回は、「bazel-0.4.4-installer-linux-x86_64.sh」

cd ~/Download
sudo chmod +x bazel-0.4.4-installer-linux-x86_64.sh
./bazel-0.4.4-installer-linux-x86_64.sh --user

インストール出来たか確認。

bazel version

 

3.TensorFlowのコンフィグ

先ずは依存パッケージのインストール。

sudo apt-get install python-numpy python-dev python-pip python-wheel

次に、./configureを実行します。

cd tensorflow
./configure

いろいろ設定を聞かれるので環境に合わせて入力していきます。今回はほぼすべてデフォルト設定のままで、XLAだけ有効にしました。

 

4.ビルド

Bazelを使ってTensorFlowのpip packageをビルドします。

bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

ビルドはCorei5-4570(3.2GHz)マシンで30分ほどでした。
 

5.インストール

ビルドが終わると/tmp/tensorflow_pkgディレクトリに.whlパッケージができているので、pipでインストールします。

sudo pip install /tmp/tensorflow_pkg/tensorflow-1.0.0-cp27mu-linux_x86_64.whl

 

6.確認

最後に、pythonでTensorFlowパッケージがインポートできるか確認してインストール終了です。

python
>>>import tensorflow as tf

*ImportError: cannot import name pywrap_tensorflowとなる場合は、tensorflowディレクトリから出てから試しましょう

 

速度比較

簡単にですが以前と速度比較をしてみました。
前回やった物体領域予測の学習を0.12と1.0で比較してみました。

環境

CPU:Core i5-4570(3.2GHz)
Mem:24GB
 

結果

timeコマンドでuser時間を計測した結果を下記に示す。
TensorFlow0.12 : 252m
TensorFlow1.0 : 196m

約30%のスピードアップが確認できました。
 

コアダンプが発生する件

TensorFlow1.0にしてから(pipでインストールした場合も)コアダンプが発生するようになってしまいました。
気になって調べたら下記issueを発見しました。

(jemalloc) Error in `python’: double free or corruption (!prev)
どうやら、Ubuntu14.04のnumpy(OpenBLASのサポート?)が原因らしいです。
回避策としては、Ubuntu16.04にアップグレードするか、

sudo apt-get install libtcmalloc-minimal4
export LD_PRELOAD="/usr/lib/libtcmalloc_minimal.so.4"

とすれば良いらしい。
 

あとがき

上記のissueに書いてあったのですが、3月にはTensorFlow1.1がもうリリースされるっぽいですね。
開発はやすぎ!!そろそろKerasも入ってくるのかな。

そういえばKerasもGoogleの中の人が開発してるんですよね。
開発スピードも凄いですが、オープンソースのエコシステムが上手く機能している感じもすごいですよね。
オープンソースにすることで、Google内外問わず多くのエンジニアが更に使い易く改良し、その結果を取り入れて更なる改善…っていうサイクルが回ってるのがよく分かる。contribとか見るとほんと活発にいろんなプロジェクトが走ってるなと。
ただ、APIが乱立してどれ使ったらいいのか分からなくなってきてるのが辛いですが。

あと使う側としてはユーザ数が多いのもホント助かる。自分が躓くところは大抵他の誰かも躓いてて、ほとんどgithubのissuesかstackoverflowに書いてある。いやーありがたいことです。

 
 

Leave a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です