2019年10月27日日曜日

TensorFlow Lite GPU delegateのAndroid用ライブラリをビルドする

目的


TensorFlow LiteのAndroid用バイナリをビルドする手順を記載する。
特に、GPU delegate用のライブラリは手順がなかったのでメモ程度に残す。


動機


前回のブログで作成したTF-LiteモデルをAndroidスマホで動かしてみようとした。
公式のサンプルを改造して動かしてみていたが、FP16 Quant modelのGPU delegateがどうしても動作できなかった。
公式ではリポジトリから0.0.0-nightlyをダウンロードして組み込んでいる。これは、2019年5月のビルドで少し古いため、新しいバージョンでビルドしてみて確認してみたかった。
(ただ、結果はFP16 Quant modelのGPU delegateは動作しなかった...)


参考


手順


Bazelのインストール


TensorFlowをビルドするときと同じ。2.0rcをビルドしたときと同じものを使用する。
バージョンは0.25.3。


Android NDKのインストール


公式の手順では、"The current recommended version is 17c"とバージョンが指定されている。リンクから17cのLinux 64 ビット(x86) をダウンロードする。
ダウンロード後は適当なフォルダに展開しておく(パスを通す必要は特に無い)。

※v2.0.0および、master(8b036e0cfb7e9bb1c016860cd7fe79752b97443c)では、最新のr20でも問題なくビルドはできた。


Android SDKのインストール


Android Studioの最新版をインストールする。
ここから3.5.1 for Linux 64-bit をダウンロードし、android-stuio/studio.sh を実行する。
インストール後、Welcome to Android StuidoのConfigure > SDK ManagerからSDKにName: Android 10.0(Q)、API Level: 29にチェックが入っていることを確認する。 


TensorFlowのClone


GithubからTensorFlowのリポジトリをCloneする(ここではmasterを想定)。
$ git clone https://github.com/tensorflow/tensorflow.git


Python仮想環境の準備


不要とは思うが念の為、Pythonの仮想環境を作成して作業する。
$ mkvirtualenv  --python=python3 tflite-gpu2.0
$ pip install pip six numpy wheel setuptools mock 'future>=0.17.1'
$ pip install keras_applications==1.0.6 --no-deps
$ pip install keras_preprocessing==1.0.5 --no-deps


ビルド


configureを行い、tensorflow-lite、tensorflow-lite-gpuの順にバイナリを作成する。
tensorflow-lite-gpuはGPU delegateの部分しか無いため、tensorflow-liteも必要。

configureのポイント

  • CUDAはNo。
  • Android builds?はYes。
  • path of the Android NDK to useには、配置したNDKのパスを入力。
  • path of the Android SDK to useは、デフォルトであれば/home/xxxx//Android/Sdkで問題ないはず。
  • NDK API level、SDK API levelはデフォルトのまま。

Configureを実行
$ ./configure 
WARNING: --batch mode is deprecated. Please instead explicitly shut down your Bazel server using the command "bazel shutdown".
You have bazel 0.25.3- (@non-git) installed.
Please specify the location of python. [Default is /home/xxxxx/.virtualenvs/tflite-gpu2.0/bin/python]: 


Traceback (most recent call last):
  File "", line 1, in 
AttributeError: module 'site' has no attribute 'getsitepackages'
Found possible Python library paths:
  /home/xxxxx/.virtualenvs/tflite-gpu2.0/lib/python3.7/site-packages
Please input the desired Python library path to use.  Default is [/home/xxxxx/.virtualenvs/tflite-gpu2.0/lib/python3.7/site-packages]

Do you wish to build TensorFlow with XLA JIT support? [Y/n]: 
XLA JIT support will be enabled for TensorFlow.

Do you wish to build TensorFlow with OpenCL SYCL support? [y/N]: 
No OpenCL SYCL support will be enabled for TensorFlow.

Do you wish to build TensorFlow with ROCm support? [y/N]: 
No ROCm support will be enabled for TensorFlow.

Do you wish to build TensorFlow with CUDA support? [y/N]: 
No CUDA support will be enabled for TensorFlow.

Do you wish to download a fresh release of clang? (Experimental) [y/N]: 
Clang will not be downloaded.

Do you wish to build TensorFlow with MPI support? [y/N]: 
No MPI support will be enabled for TensorFlow.

Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native -Wno-sign-compare]: 


Would you like to interactively configure ./WORKSPACE for Android builds? [y/N]: Y
Searching for NDK and SDK installations.

Please specify the home path of the Android NDK to use. [Default is /home/xxxxx/Android/Sdk/ndk-bundle]: /home/xxxxx/WorkSpace/android/android-ndk-r17c


Please specify the (min) Android NDK API level to use. [Available levels: ['14', '15', '16', '17', '18', '19', '21', '22', '23', '24', '26', '27', '28']] [Default is 18]: 


Please specify the home path of the Android SDK to use. [Default is /home/xxxxx/Android/Sdk]: 


Please specify the Android SDK API level to use. [Available levels: ['29']] [Default is 29]:  


Please specify an Android build tools version to use. [Available versions: ['29.0.2']] [Default is 29.0.2]: 


Preconfigured Bazel build configs. You can use any of the below by adding "--config=<>" to your build command. See .bazelrc for more details.
--config=mkl          # Build with MKL support.
--config=monolithic   # Config for mostly static monolithic build.
--config=gdr          # Build with GDR support.
--config=verbs        # Build with libverbs support.
--config=ngraph       # Build with Intel nGraph support.
--config=numa         # Build with NUMA support.
--config=dynamic_kernels # (Experimental) Build kernels into separate shared objects.
--config=v2           # Build TensorFlow 2.x instead of 1.x.
Preconfigured Bazel build configs to DISABLE default on features:
--config=noaws        # Disable AWS S3 filesystem support.
--config=nogcp        # Disable GCP support.
--config=nohdfs       # Disable HDFS support.
--config=noignite     # Disable Apache Ignite support.
--config=nokafka      # Disable Apache Kafka support.
--config=nonccl       # Disable NVIDIA NCCL support.
Configuration finished

ビルド、tensorflow-lite、tensorflow-lite-gpuの2つをビルドする。
まずは、tensorflow-lite。
bazel build \
          --cxxopt='-std=c++11' -c opt \
          --fat_apk_cpu=x86,x86_64,arm64-v8a,armeabi-v7a \
          //tensorflow/lite/java:tensorflow-lite

つぎは、tensorflow-lite-gpu。
tensorflow-lite-gpuのビルド方法はドキュメントが無いのだけど、BUILDファイルを参照するとターゲットが存在する。
$ bazel build \
          --cxxopt='-std=c++11' -c opt \
          --fat_apk_cpu=x86,x86_64,arm64-v8a,armeabi-v7a \
          //tensorflow/lite/java:tensorflow-lite-gpu

ビルドできたライブラリ(*.aar)はbazel-genfiles/tensorflow/lite/java配下にできる。
tensorflow-lite.aar、tensorflow-lite-gpu.aarを用いる。
$ ls bazel-genfiles/tensorflow/lite/java/*.aar
bazel-genfiles/tensorflow/lite/java/tensorflow-lite-gpu.aar
bazel-genfiles/tensorflow/lite/java/tensorflowlite.aar
bazel-genfiles/tensorflow/lite/java/tensorflow-lite.aar
bazel-genfiles/tensorflow/lite/java/tensorflowlite_gpu.aar


アプリへの組込


公式の手順が古くなっているため、少し変更が必要。
compileフラグは古いバージョンでしか使えない。implementationフラグに置き換えればOK。

0 件のコメント:

コメントを投稿