构建Android平台上的PaddlePaddle库

用户可通过交叉编译的方式,在用户熟悉的开发平台(Linux,Mac OS X和Windows)上编译Android平台上适用的PaddlePaddle库。 本文档将以Linux x86-64平台为例,介绍交叉编译Android平台上适用的PaddlePaddle库的方法和步骤。

准备交叉编译环境

从源码交叉编译PaddlePaddle,用户需要提前准备好交叉编译环境。Android平台上使用的C/C++交叉编译工具链为Android NDK,用户可自行前往下载预编译好的版本,也可通过以下命令获取:

wget -q https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip
unzip -q android-ndk-r14b-linux-x86_64.zip

Android NDK中包含了所有Android API级别、所有架构(arm/arm64/x86/mips)需要用到的编译工具和系统库。用户可根据自己的编译目标架构、所需支持的最低Android API级别,构建独立工具链。 比如:

your/path/to/android-ndk-r14b-linux-x86_64/build/tools/make-standalone-toolchain.sh \
        --arch=arm --platform=android-21 --install-dir=your/path/to/my_standalone_toolchain

此命令将在your/path/to/my_standalone_toolchain目录生成一套编译工具链,面向架构为32位ARM架构,支持的最小的Android API级别为21,使用的编译器为arm-linux-androideabi-gcc (GCC) 4.9。

注意:PaddlePaddle要求使用的编译工具链所支持的Andoid API级别不小于21

配置交叉编译参数

CMake系统对交叉编译提供了支持cmake-toolchains。为了简化cmake配置,PaddlePaddle为交叉编译提供了工具链配置文档cmake/cross_compiling/android.cmake,以提供一些默认的编译器和编译参数相关配置。注意,从CMake 3.7版本开始,CMake官方对Android平台的交叉编译提供了通用的支持。PaddlePaddle若检测到用户使用的CMake版本不低于3.7时,将会将用户传进来的配置参数传递CMake系统,交由CMake系统本身来处理。有关参数配置的详细说明见cmake-toolchains

交叉编译Android版本的PaddlePaddle库时,有一些必须配置的参数:

  • CMAKE_SYSTEM_NAME,CMake编译的目标平台,必须设置为Android。在设置CMAKE_SYSTEM_NAME=Android后,PaddlePaddle的CMake系统才认为是在交叉编译Android系统的版本,并自动编译宿主机版protoc可执行文件、目标机版protobuf库、以及Android所需arm_soft_fp_abi分支的目标机版OpenBLAS库。此外,还会强制设置一些PaddlePaddle参数的值(WITH_GPU=OFFWITH_AVX=OFFWITH_PYTHON=OFFWITH_RDMA=OFF)。
  • WITH_C_API,必须设置为ON。在Android平台上只支持使用C-API来预测。
  • WITH_SWIG_PY,必须设置为OFF。在Android平台上不支持通过swig调用来训练或者预测。

Android平台可选配置参数:

  • ANDROID_STANDALONE_TOOLCHAIN,独立工具链所在的绝对路径,或者相对于构建目录的相对路径。PaddlePaddle的CMake系统将根据该值自动推导和设置需要使用的交叉编译器、sysroot、以及Android API级别;否则,用户需要在cmake时手动设置这些值。无默认值。
  • ANDROID_ABI,目标架构ABI。目前只支持armeabi-v7a,默认值为armeabi-v7a
  • ANDROID_NATIVE_API_LEVEL,工具链的Android API级别。若没有显式设置,PaddlePaddle将根据ANDROID_STANDALONE_TOOLCHAIN的值自动推导得到。
  • ANROID_ARM_MODE,是否使用ARM模式。可设置ON/OFF,默认值为ON
  • ANDROID_ARM_NEON,是否使用NEON指令。目前必须设置成ON,默认值为ON

其他配置参数:

  • HOST_C/CXX_COMPILER,宿主机的C/C++编译器。在编译宿主机版protoc可执行文件和目标机版OpenBLAS库时需要用到。默认设置成环境变量CC的值;若环境变量CC没有设置,则设置成cc编译器。

一种常用的cmake配置如下:

cmake -DCMAKE_SYSTEM_NAME=Android \
      -DANDROID_STANDALONE_TOOLCHAIN=your/path/to/my_standalone_toolchain \
      -DANDROID_ABI=armeabi-v7a \
      -DANDROID_ARM_NEON=ON \
      -DANDROID_ARM_MODE=ON \
      -DCMAKE_INSTALL_PREFIX=your/path/to/install \
      -DWITH_C_API=ON \
      -DWITH_SWIG_PY=OFF \
      ..

用户还可根据自己的需求设置其他编译参数。比如希望最小化生成的库的大小,可以设置CMAKE_BUILD_TYPEMinSizeRel;若希望最快的执行速度,则可设置CMAKE_BUILD_TYPERelease。亦可以通过手动设置CMAKE_C/CXX_FLAGS_MINSIZEREL/RELEASE来影响PaddlePaddle的编译过程。

编译和安装

CMake配置完成后,执行以下命令,PaddlePaddle将自动下载和编译所有第三方依赖库、编译和安装PaddlePaddle预测库。

make
make install

注意:如果你曾经在源码目录下编译过其他平台的PaddlePaddle库,请先使用rm -rf命令删除third_party目录和build目录,以确保所有的第三方依赖库和PaddlePaddle代码都是针对新的CMake配置重新编译的。

执行完安装命令后,your/path/to/install目录中会包含includelib目录,其中include中包含C-API的头文件,lib中包含一个Android版本的库。自此,PaddlePaddle的已经安装完成,用户可将your/path/to/install目录下的生成文件用于深度学习相关Android App中,调用方法见C-API文档。