写点什么

Tensorflow Lite 移动平台编译|Bazel 实践

用户头像
轻口味
关注
发布于: 刚刚
Tensorflow Lite移动平台编译|Bazel实践

Android 平台编译

如果不做定制化操作,我们不需要自己编译 TensorFlow Lite Android 库。我们可以直接使用位于 MavenCentral 的 TensorFlow Lite AAR。但是在某些情况下,我们需要本地编译 TensorFlow Lite。例如,您可能正在构建一个包含operations selected from TensorFlow的自定义二进制文件,或者需要对 TensorFlow Lite 进行局部修改。


使用官方 mave 获取 tflite 库:


allprojects {    repositories {        mavenCentral()        maven {  // Only for snapshot artifacts            name 'ossrh-snapshot'            url 'http://oss.sonatype.org/content/repositories/snapshots'        }        mavenLocal()    }}
dependencies { implementation 'org.tensorflow:tensorflow-lite:0.1.100'}
复制代码

编译过程

1. 安装 Bazel 及 Android 开发环境

Android 开发环境每个 Android 开发者都有,这里就不做重复介绍,Bazel 构建系统之前的文章已经做过介绍,下面主要说明下官方建议版本:


  1. Android NDK 用以编译 TensorFlow Lite 的 C/C++代码,推荐的版本为 19c;

  2. Android SDK Build tools API 建议大于 23.

2. 配置 WORKSPACE 和 .bazelrc

我们需要为构建 TF Lite 库进行环境配置。在 TensorFlow 源码检出根目录下运行/configure脚本,当脚本要求交互式地为/WORKSPACE 配置 Android 环境变量时,选择“Yes”。该脚本将尝试使用以下环境变量配置设置:


  • ANDROID_SDK_HOME

  • ANDROID_SDK_API_LEVEL

  • ANDROID_NDK_HOME

  • ANDROID_NDK_API_LEVEL


如果没有设置这些变量,则必须在脚本提示符中以交互方式提供它们。成功的配置会在.tf_configure.bazshrc 中生成类似于以下的条目:


build --action_env ANDROID_NDK_HOME="/usr/local/android/android-ndk-r19c"build --action_env ANDROID_NDK_API_LEVEL="21"build --action_env ANDROID_BUILD_TOOLS_VERSION="28.0.3"build --action_env ANDROID_SDK_API_LEVEL="23"build --action_env ANDROID_SDK_HOME="/usr/local/android/android-sdk-linux"
复制代码

3. 编译和安装

一旦配置完了 Bazel,我们就可以从源码根目录构建 TensorFlow Lite AAR,执行如下所示命令:


bazel build -c opt --fat_apk_cpu=x86,x86_64,arm64-v8a,armeabi-v7a \  --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \  //tensorflow/lite/java:tensorflow-lite
复制代码


编译完将在 bazel-bin/tensorflow/lite/java/中生成一个 AAR 文件。编译完的 AAR 包含全架构的 so 库。


我们可以构建更小的 AAR 文件,只针对以下一组模型:


bash tensorflow/lite/tools/build_aar.sh \  --input_models=model1,model2 \  --target_archs=x86,x86_64,arm64-v8a,armeabi-v7a
复制代码


上面的脚本将生成 tensorflow-lite.aar 文件和可选的 tensorflow-lite-select-tf-ops。如果其中一个模型使用 Tensorflow 操作,则 aar 文件。关于 tensorflow lite 的体积缩减可以参考: Reduce TensorFlow Lite binary size

使用 Docker 环境编译

在我们自己电脑配置比较麻烦或者有版本及环境冲突等问题,我们可以使用 Docker 构建,官方提供了编译 Android AAR 的 Docker file。

1. 安装 Docker

从官网下载并安装 Docker:https://www.docker.com/get-started

2. 下载 Dockerfile

下载现成的 Dockerfile:https://raw.githubusercontent.com/tensorflow/tensorflow/master/tensorflow/tools/dockerfiles/tflite-android.Dockerfile

3. 构建镜像

将下载的 Docker 文件放到一个空文件夹中,运行下面命令构建 Docker 映像:


docker build . -t tflite-builder -f tflite-android.Dockerfile
复制代码

4. 启动 docker 容器

我们使用交互式方式启动 docker 容器,将当前文件夹挂载到容器内的/host_dir(注意/tensorflow_src 是容器内的 TensorFlow 存储库):


docker run -it -v $PWD:/host_dir tflite-builder bash
复制代码

5.

进入容器后,我们可以运行以下程序来下载 Android 工具和库:


android update sdk --no-ui -a --filter tools,platform-tools,android-${ANDROID_API_LEVEL},build-tools-${ANDROID_BUILD_TOOLS_VERSION}
复制代码

6. 运行编译

配置 configure 和.bazelrc 后,启动编译。

7. 拷贝编译产物

在完成库的构建之后,我们将它们复制到容器中的/host_dir,以便在宿主机器上操作它们。


iOS 平台库构建

TensorFlow Lite 官方也同样为 iOS 提供了 CocoaPods 库。下面提供自定义的编译方案。iOS 平台的构建只能在 Mac 系统。

1. 安装 Xcode

如果我们的系统未安装 Xcode,需要使用 xcode-select 安装 Xcode 8 或更高版本和工具:


xcode-select --install
复制代码


如果是首次安装,还需要使用以下命令接受用户许可协议:


brew install automakebrew install libtool
复制代码

2. 安装 Bazel

按照之前文章介绍安装 Bazel。

3. 配置工作区和.bazshrc

运行 TensorFlow 源码根目录下的 ./configure 脚本,在询问您是否希望构建支持 iOS 的 TensorFlow 时,选择“Yes”。

4. 构建 TensorFlowLiteC 动态框架(推荐)

正确配置 Bazel 后,使用以下命令构建 TensorFlowLiteC 框架。


bazel build --config=ios_fat -c opt \  //tensorflow/lite/ios:TensorFlowLiteC_framework
复制代码


此命令将在 TensorFlow 源码 根目录的 bazel-bin/tensorflow/lite/ios/ 目录下生成 TensorFlowLiteC_framework.zip 文件。默认情况下,生成的框架全平台的二进制文件,其中包含 armv7、arm64 和 x86_64(但不包含 i386)。要查看在指定 --config=ios_fat 时使用的构建标志的完整列表,参阅 .bazelrc 文件中的 iOS 配置部分。

5. 构建 TensorFlowLiteC 静态框架

默认情况下,我们仅通过 Cocoapods 拉取到的是动态库。如果要改用静态框架,可以使用以下命令构建 TensorFlowLiteC 静态框架:


bazel build --config=ios_fat -c opt \  //tensorflow/lite/ios:TensorFlowLiteC_static_framework
复制代码


此命令将在 TensorFlow 源码根目录的 bazel-bin/tensorflow/lite/ios/ 目录下生成一个名为 TensorFlowLiteC_static_framework.zip 的文件。此静态框架的使用方式与动态框架完全相同。

TensorFlow Bazel 脚本分析

tensorflow 根目录下.bazelrc 文件中注明了各个构建目标对应命令,比如对应 Andorid 平台:


# Android configs. Bazel needs to have --cpu and --fat_apk_cpu both set to the# target CPU to build transient dependencies correctly. See# https://docs.bazel.build/versions/master/user-manual.html#flag--fat_apk_cpubuild:android --crosstool_top=//external:android/crosstoolbuild:android --host_crosstool_top=@bazel_tools//tools/cpp:toolchainbuild:android_arm --config=androidbuild:android_arm --cpu=armeabi-v7abuild:android_arm --fat_apk_cpu=armeabi-v7abuild:android_arm64 --config=androidbuild:android_arm64 --cpu=arm64-v8abuild:android_arm64 --fat_apk_cpu=arm64-v8abuild:android_x86 --config=androidbuild:android_x86 --cpu=x86build:android_x86 --fat_apk_cpu=x86build:android_x86_64 --config=androidbuild:android_x86_64 --cpu=x86_64build:android_x86_64 --fat_apk_cpu=x86_64
复制代码

总结

本文主要介绍了 Tensorflow 在 Android 和 iOS 平台的构建,编译的目标文件已经是各自平台可直接使用的了。针对底层库,比如 Android,我们可能只需要直接使用动态库,则直接编译出 Android 对应的动态库即可。如何只编译动态库,以及编译出来的库如何使用,我们后面有时间逐步介绍。心急的同学可以参考一个基于 tflite 的 Android 开源库:android_tflite,纯 Android NDK 实现的 GPU 加速 TensorFlow Lite 应用程序。实现了包含高精度人脸检测,年龄和性别估计,人体姿态估计,艺术风格转换等:


人脸检测:


![tflite_blazeface](/Users/shenjunwei/Documents/Doc/vegetable/source/_note/编程语言/写给 Android 程序员的 C++课程/_v_images/Tensorflow Lite 移动平台编译/tflite_blazeface-4700528.png)


年龄预估:


![tflite_gender](/Users/shenjunwei/Documents/Doc/vegetable/source/_note/编程语言/写给 Android 程序员的 C++课程/_v_images/Tensorflow Lite 移动平台编译/tflite_gender-4700554.jpg)


头发分隔:


![hair_segmentation](/Users/shenjunwei/Documents/Doc/vegetable/source/_note/编程语言/写给 Android 程序员的 C++课程/_v_images/Tensorflow Lite 移动平台编译/hair_segmentation-4700576.jpg)

发布于: 刚刚阅读数: 2
用户头像

轻口味

关注

🏆2021年InfoQ写作平台-签约作者 🏆 2017.10.17 加入

Android音视频、AI相关领域从业者,开源RTMP播放器:https://github.com/qingkouwei/oarplayer

评论

发布
暂无评论
Tensorflow Lite移动平台编译|Bazel实践