2018年5月3日木曜日

android上でtensorflowをビルドする方法

[概要]
-android上でtensorflowの開発環境を構築します。
-性能評価のためkeras mnist_cnnを実行します。

[結論]
-スマホなのにベンチマーク結果が予想外に良い(少し古いノートPC並み)結果で驚き。最初はどうせ遅いだろうと思っていたが結構使えるんじゃないという感じ。
-ビルドには無茶苦茶時間がかかるので最初の設定には気をつけて。

[要約]
-Termuxをインストール
-TermuxArch (Arch Linux)をインストール
-bazelをビルドしてインストール
-tensorflowをビルドしてインストール
-Keras(tensorflow backend)でベンチマークを実施

[詳細]
-下記URLの前半を参考にTermux, TermuxArchをインストールする。
http://oregaji.blogspot.jp/2018/04/androidkeras2018415.html

-下記「android上でbazelをビルドする方法 」に従いjdk8, bazelをインストール。今回は現時点最新の0.12を使用。
http://oregaji.blogspot.jp/2018/04/androidbazel.html

-"Installing TensorFlow from Sources"を参考にtensorflowのインストール準備をしておく。
https://www.tensorflow.org/install/install_sources
-今回は現時点最新のr1.8を使用。
> git checkout r1.8

- **重要** third_party/png.BUILD を修正して
copts = ["-DPNG_ARM_NEON_OPT=0"],
を追加する。
下記のissueを参照のこと。
https://github.com/tensorflow/tensorflow/issues/18643#issuecomment-385234577
(これをやっておかないとビルドの最後で失敗するので注意)
- ./configure を実行
jemalloc=n, mpi=nにとりあえずしておく。

-ビルドする。
> bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package --jobs 4
(jobsは4くらいまでにしておかないと、リソース不足で止まる。jobs 4でも止まる時にはjobs 2とかにしておく。)         
(ビルドは2日くらいかかる勢いなのでひたすら待つ。Termuxは通知メニューでacquire wake lockしておき止まらないようにしておく。)

-pythonのpipパッケージを作る
> bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

-pipインストールする
> pip install /tmp/tensorflow_pkg/tensorflow-1.8.0-cp36-cp36m-linux_aarch64.whl
(tensorflowが依存するパッケージもインストールされる。中でもgprcioはビルドインストールに一晩くらいかかる、のでひたすら待つ。)

成功したら完了。

-Keras(tensorflow backend)でベンチマーク(mnist_cnn)を実施
-kerasをインストール
> pip install keras
-kerasバックエンドをtensorflowに変更
~/.keras/keras.jsonを
  "backend": "tensorflow",
に修正する。
-kerasのmnist_cnnサンプルを実行する
> git clone https://github.com/keras-team/keras.git
> cd keras/example
> python mnist_cnn.py

-ベンチマーク結果
mnist_cnnで1 epochあたり実測230秒台!!
比較すると、
  tensorflowバックエンド: 4分/epoch
  mxnetバックエンド: 33分/epoch
  CNTKバックエンド: 24分/epoch
となり、tensorflowは爆速!!aarch64では何かアクセラレーションが効いているの!?
知っている人がいたら教えて下さい。
デスクトップPCのGPU版に比べれば遅いけれど、スマホでここまで速度が出るとは思っていなかったので正直驚きです。

0 件のコメント:

コメントを投稿