目的
TensorFlow LiteのAndroid用バイナリをビルドする手順を記載する。
特に、GPU delegate用のライブラリは手順がなかったのでメモ程度に残す。
動機
前回のブログで作成したTF-LiteモデルをAndroidスマホで動かしてみようとした。
公式のサンプルを改造して動かしてみていたが、FP16 Quant modelのGPU delegateがどうしても動作できなかった。
公式ではリポジトリから0.0.0-nightlyをダウンロードして組み込んでいる。これは、2019年5月のビルドで少し古いため、新しいバージョンでビルドしてみて確認してみたかった。
(ただ、結果はFP16 Quant modelのGPU delegateは動作しなかった...)
TensorFlow LiteのAndroidのGPU delegate、ビルドの方法がどこにもない...— nb.o (@Nextremer_nb_o) October 22, 2019
⬇️のBuild TensorFlow Lite locallyを参考に、bazel buildで指定するターゲットにtensorflow-lite-gupを指定したら、なんとかできた。https://t.co/iGXCjgXKhT
参考
手順
Bazelのインストール
TensorFlowをビルドするときと同じ。2.0rcをビルドしたときと同じものを使用する。
バージョンは0.25.3。
バージョンは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。
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 件のコメント:
コメントを投稿