From cf938e30cd371942e5c533120addf5290b03c6ba Mon Sep 17 00:00:00 2001 From: huzhiqiang <912790387@qq.com> Date: Fri, 8 May 2020 21:26:12 +0800 Subject: [PATCH] [Doc][Compiling][Cherry-pick] Update Compiling docs for release/v2.6.0 (#3581) --- docs/user_guides/Compile/Android.md | 106 ++++++++++++++ docs/user_guides/Compile/iOS.md | 70 ++++++++++ docs/user_guides/Compile/v2.3_compile.md | 164 ++++++++++++++++++++++ docs/user_guides/source_compile.md | 170 ++--------------------- 4 files changed, 354 insertions(+), 156 deletions(-) create mode 100644 docs/user_guides/Compile/Android.md create mode 100644 docs/user_guides/Compile/iOS.md create mode 100644 docs/user_guides/Compile/v2.3_compile.md diff --git a/docs/user_guides/Compile/Android.md b/docs/user_guides/Compile/Android.md new file mode 100644 index 0000000000..7a4f1ba035 --- /dev/null +++ b/docs/user_guides/Compile/Android.md @@ -0,0 +1,106 @@ + +# 编译Android预测库 + +**注意:本编译方法只适用于release/v2.6.0之后版本(包括 v2.6.0)** + +安装了Android的编译环境,可以下载并编译 Paddle-Lite源码 + +```shell +# 1. 下载Paddle-Lite源码 并切换到release分支 +git clone https://github.com/PaddlePaddle/Paddle-Lite.git +cd Paddle-Lite && git checkout release/v2.3 + +# 2. 编译Paddle-Lite Android预测库 (armv8, gcc编译, 静态链接ndk stl) +./lite/tools/build_android.sh +``` + + + +### 编译结果 + +位于`Paddle-Lite/build.lite.android.armv8.gcc/inference_lite_lib.android.armv8`: + +```shell +inference_lite_lib.android.armv8/ +|-- cxx C++ 预测库和头文件 +| |-- include C++ 头文件 +| | |-- paddle_api.h +| | |-- paddle_image_preprocess.h +| | |-- paddle_lite_factory_helper.h +| | |-- paddle_place.h +| | |-- paddle_use_kernels.h +| | |-- paddle_use_ops.h +| | `-- paddle_use_passes.h +| `-- lib C++预测库 +| |-- libpaddle_api_light_bundled.a C++静态库 +| `-- libpaddle_light_api_shared.so C++动态库 +|-- java Java预测库 +| |-- jar +| | `-- PaddlePredictor.jar +| |-- so +| | `-- libpaddle_lite_jni.so +| `-- src +|-- demo C++和Java示例代码 +| |-- cxx C++ 预测库demo +| `-- java Java 预测库demo +``` + + + +### 编译命令 + +- 默认编译方法: (armv8, gcc, c++_static) +``` shell +./lite/tools/build_android.sh +``` + +- 打印 help 信息: + +```shell +./lite/tools/build_android.sh help +``` + +- 其他可选编译命令: + +```shell +--arm_abi: (armv8|armv7) arm版本,默认为armv8 +--toolchain: (gcc|clang) 编译器类型,默认为gcc +--android_stl: (c++_static|c++_shared|gnu_static|gnu_shared) NDK stl库链接方法,默认为静态链接c++_static +--with_java: (OFF|ON) 是否编译Java预测库, 默认为 ON +--with_cv: (OFF|ON) 是否编译CV相关预处理库, 默认为 OFF +--with_log: (OFF|ON) 是否输出日志信息, 默认为 ON +--with_extra: (OFF|ON) 是否编译OCR或NLP相关模型的kernel&OP,默认为OFF,只编译CV模型相关kernel&OP +``` + +- 裁剪预测库方法(只编译模型中的kernel&OP,降低预测库体积): + +```shell +./lite/tools/build_android.sh --with_strip=ON --opt_model_dir=YourOptimizedModelDir +``` +```shell +--with_strip: (OFF|ON); 是否根据输入模型裁剪预测库,默认为OFF +--opt_model_dir: 输入模型的绝对路径,需要为opt转化之后的模型 +``` +详情请参考: [裁剪预测库](https://paddle-lite.readthedocs.io/zh/latest/user_guides/library_tailoring.html) + + +- 编译 Android npu 预测库方法: + +```shell +./lite/tools/build_android.sh --with_huawei_kirin_npu=ON --huawei_kirin_npu_sdk_root=YourNpuSdkPath +``` +```shell +--with_huawei_kirin_npu: (OFF|ON); 是否编译编译huawei_kirin_npu 的预测库,默认为OFF +--huawei_kirin_npu_sdk_root: `huawei HiAi DDK`文件的绝对路径,可从下面网址下载: +https://developer.huawei.com/consumer/cn/hiai/ +``` +详情请参考:[PaddleLite使用NPU(华为)预测部署](https://paddle-lite.readthedocs.io/zh/latest/demo_guides/npu.html) + +- 编译Android opencl 预测库方法:(armv8, gcc, c++_static) + +```shell +./lite/tools/build_android.sh --with_opencl=ON +``` +```shell +--with_opencl: (OFF|ON); 是否编译opencl预测库, 默认为 OFF +``` diff --git a/docs/user_guides/Compile/iOS.md b/docs/user_guides/Compile/iOS.md new file mode 100644 index 0000000000..355cc11875 --- /dev/null +++ b/docs/user_guides/Compile/iOS.md @@ -0,0 +1,70 @@ + +# 编译iOS预测库 + +**注意:本编译方法只适用于release/v2.6.0之后版本(包括 v2.6.0)** + +安装了iOS的编译环境,可以下载并编译 Paddle-Lite源码 + +```shell +# 1. 下载Paddle-Lite源码 并切换到release分支 +git clone https://github.com/PaddlePaddle/Paddle-Lite.git +cd Paddle-Lite && git checkout release/v2.6.0 + +# 2. 编译Paddle-Lite Android预测库 (armv8, gcc编译, 静态链接ndk stl) +./lite/tools/build_ios.sh +``` + + + +### 编译结果 + +位于`Paddle-Lite/build.ios.ios64.armv8/inference_lite_lib.ios64.armv8`: + +```shell +inference_lite_lib.ios64.armv8 iOS预测库和头文件 +|-- include C++头文件 +| |-- paddle_api.h +| |-- paddle_image_preprocess.h +| |-- paddle_lite_factory_helper.h +| |-- paddle_place.h +| |-- paddle_use_kernels.h +| |-- paddle_use_ops.h +| `-- paddle_use_passes.h +`-- lib C++预测库(静态库) + `-- libpaddle_api_light_bundled.a +``` + + + +### 编译命令 + +- 默认编译方法: (armv8) +``` shell +./lite/tools/build_ios.sh +``` + +- 打印 help 信息: + +```shell +./lite/tools/build_ios.sh help +``` + +- 其他可选编译命令: + +```shell +--arch: (armv8|armv7) arm版本,默认为armv8 +--with_cv: (OFF|ON) 是否编译CV相关预处理库, 默认为 OFF +--with_log: (OFF|ON) 是否输出日志信息, 默认为 ON +--with_extra: (OFF|ON) 是否编译OCR或NLP相关模型的kernel&OP,默认为OFF,只编译CV模型相关kernel&OP +``` + +- 裁剪预测库方法(只编译模型中的kernel&OP,降低预测库体积): + +```shell +./lite/tools/build_android.sh --with_strip=ON --opt_model_dir=YourOptimizedModelDir +``` +```shell +--with_strip: (OFF|ON); 是否根据输入模型裁剪预测库,默认为OFF +--opt_model_dir: 输入模型的绝对路径,需要为opt转化之后的模型 +``` +详情参考: [裁剪预测库](https://paddle-lite.readthedocs.io/zh/latest/user_guides/library_tailoring.html) diff --git a/docs/user_guides/Compile/v2.3_compile.md b/docs/user_guides/Compile/v2.3_compile.md new file mode 100644 index 0000000000..3bd4923ddb --- /dev/null +++ b/docs/user_guides/Compile/v2.3_compile.md @@ -0,0 +1,164 @@ +# release/v2.3 源码编译 +**说明:release/v2.3 之前版本(包括v2.3版本)的源码编译请参考本文档** + +**注意:OpenCL、华为NPU、FPGA、CUDA、X86预测库、CV模块的编译,请见进阶使用指南的对应章节。** + +### 下载代码 + +```shell +git clone https://github.com/PaddlePaddle/Paddle-Lite.git +cd Paddle-Lite +git checkout +``` + +### 编译模式与参数 + +编译脚本`./lite/tools/build.sh`,支持三种编译模式: + +| 编译模式 | 介绍 | 适用对象 | +|:-------:|-----|:-------:| +| tiny_publish | 编译移动端部署库,无第三方库依赖 | 用户 | +| full_publish | 编译移动端部署库,有第三方依赖如protobuf、glags等,含有可将模型转换为无需protobuf依赖的naive buffer格式的工具,供tiny_publish库使用 | 用户 | +| test | 编译指定`arm_os`、`arm_abi`下的移动端单元测试 | 框架开发者 | + +编译脚本`./lite/tools/build.sh`,追加参数说明: + +| 参数 | 介绍 | 值 | +|-----------|-------------|-------------| +| --arm_os |必选,选择安装平台 | `android`、`ios`、`ios64`、`armlinux` | +| --arm_abi |必选,选择编译的arm版本,其中`armv7hf`为ARMLinux编译时选用| `armv8`、`armv7`、`armv7hf`(仅`armlinux`支持) | +| --arm_lang |arm_os=android时必选,选择编译器 | `gcc`、`clang`(`clang`当前暂不支持) | +| --android_stl |arm_os=android时必选,选择静态链接STL或动态链接STL | `c++_static`、`c++_shared`| +| --build_java | 可选,是否编译java预测库(默认为ON) | `ON`、`OFF` | +| --build_extra | 可选,是否编译全量预测库(默认为OFF)。详情可参考[预测库说明](./library.html)。 | `ON`、`OFF` | +| target |必选,选择编译模式,`tiny_publish`为编译移动端部署库、`full_publish`为带依赖的移动端部署库、`test`为移动端单元测试、`ios`为编译ios端`tiny_publish` | `tiny_publish`、`full_publish`、`test`、 `ios` | + +### 编译代码 + +**注意**:非开发者建议在编译前使用[**“加速第三方依赖库的下载”**](#id22)的方法,加速工程中第三方依赖库的下载与编译。 + +#### 编译`tiny publish`动态库 + +##### Android +```shell +./lite/tools/build.sh \ + --arm_os=android \ + --arm_abi=armv8 \ + --build_extra=OFF \ + --arm_lang=gcc \ + --android_stl=c++_static \ + tiny_publish +``` +##### IOS +```shell +./lite/tools/build.sh \ + --arm_os=ios64 \ + --arm_abi=armv8 \ + --build_extra=OFF \ + ios +``` +**注意:mac环境编译IOS 时,cmake版本需要高于cmake 3.15;mac环境上编译Android时,cmake版本需要设置为cmake 3.10。** + +ios tiny publish支持的编译选项: + +* `--arm_os`: 可选ios或者ios64 +* `--arm_abi`: 可选armv7和armv8(**注意**:当`arm_os=ios`时只能选择`arm_abi=armv7`,当`arm_os=ios64`时只能选择`arm_abi=armv8`) +* 如果mac编译过程中报错:"Invalid CMAKE_DEVELOPER_ROOT: does not exist", 运行: +```shell +sudo xcode-select -s /Applications/Xcode.app/Contents/Developer +``` +##### ARMLinux +```shell +./lite/tools/build.sh \ + --build_extra=OFF \ + --arm_os=armlinux \ + --arm_abi=armv7hf \ + --arm_lang=gcc \ + tiny_publish +``` +- `--arm_abi`: 树莓派3b使用armv7hf,RK3399使用armv8 + +#### 编译`full publish`动态库 + +##### Android +```shell +./lite/tools/build.sh \ + --arm_os=android \ + --arm_abi=armv8 \ + --build_extra=OFF \ + --arm_lang=gcc \ + --android_stl=c++_static \ + full_publish +``` +##### ARMLinux +```shell +./lite/tools/build.sh \ + --arm_os=armlinux \ + --arm_abi=armv7hf \ + --arm_lang=gcc \ + --build_extra=OFF \ + full_publish +``` +- `--arm_abi`: 树莓派3b使用armv7hf,RK3399使用armv8 + +### 编译结果说明 + +**编译最终产物位置**在 `build.lite.xxx.xxx.xxx` 下的 `inference_lite_lib.xxx.xxx` ,如 Android 下 ARMv8 的产物位于`inference_lite_lib.android.armv8`: + +![](https://user-images.githubusercontent.com/45189361/65375706-204e8780-dccb-11e9-9816-ab4563ce0963.png) + +**目录内容**(可能)如下: + +**Full_publish编译结果:** + +![](https://user-images.githubusercontent.com/45189361/65375704-19c01000-dccb-11e9-9650-6856c7a5bf82.png) + +**Tiny_publish结果:** + +![](https://user-images.githubusercontent.com/45189361/65375726-3bb99280-dccb-11e9-9903-8ce255371905.png) + +**IOS编译结果:** + +![](https://user-images.githubusercontent.com/45189361/65375726-3bb99280-dccb-11e9-9903-8ce255371905.png) + + + +**具体内容**说明: + +1、 `bin`文件夹:可执行工具文件 `paddle_code_generator`、`test_model_bin` + +2、 `cxx`文件夹:包含c++的库文件与相应的头文件 + +- `include` : 头文件 +- `lib` : 库文件 + - 打包的静态库文件: + - `libpaddle_api_full_bundled.a` :包含 full_api 和 light_api 功能的静态库 + - `libpaddle_api_light_bundled.a` :只包含 light_api 功能的静态库 + - 打包的动态态库文件: + - `libpaddle_full_api_shared.so` :包含 full_api 和 light_api 功能的动态库 + - `libpaddle_light_api_shared.so`:只包含 light_api 功能的动态库 + +3、 `demo`文件夹:示例 demo ,包含 C++ demo 和 Java demo。 + +- `cxx` : C++示例 demo + - `mobile_full` : full_api 的使用示例 + - `mobile_light` : light_api的使用示例 +- `java` :Java 示例 demo + - `android` : Java的 Android 示例 + +4、 `java` 文件夹:包含 Jni 的动态库文件与相应的 Jar 包 + +- `jar` : `PaddlePredictor.jar` +- `so` : Jni动态链接库 `libpaddle_lite_jni.so` + +5、 `third_party` 文件夹:第三方库文件`gflags` + +**注意:** + +1、 只有当`--arm_os=android` 时才会编译出: + +- Java库文件与示例:`Java`和`demo/java` + +- 动态库文件:`libpaddle_full_api_shared.so`,`libpaddle_light_api_shared.so` + +2、 `tiny_publish`编译结果不包括 C++ demo和 C++ 静态库,但提供 C++ 的 light_api 动态库、 Jni 动态库和Java demo diff --git a/docs/user_guides/source_compile.md b/docs/user_guides/source_compile.md index 8717e579c9..3638bbf8cb 100644 --- a/docs/user_guides/source_compile.md +++ b/docs/user_guides/source_compile.md @@ -236,175 +236,33 @@ brew cask install java ## 二、编译PaddleLite -**注:编译OpenCL、华为NPU、FPGA、CUDA、X86预测库、CV模块,见进阶使用指南的对应章节。** +`develop分支`和`release/v2.6.0`之后版本的源码编译请参考以下说明,release/v2.3之前版本(包括v2.3)源码编译请参考[release/v2.3源码编译方法](./Compile/v2.3_compile)。 -### 下载代码 +### Android 预测库编译方法 -```shell -git clone https://github.com/PaddlePaddle/Paddle-Lite.git -cd Paddle-Lite -git checkout -``` - -### 编译模式与参数 - -编译脚本`./lite/tools/build.sh`,支持三种编译模式: - -| 编译模式 | 介绍 | 适用对象 | -|:-------:|-----|:-------:| -| tiny_publish | 编译移动端部署库,无第三方库依赖 | 用户 | -| full_publish | 编译移动端部署库,有第三方依赖如protobuf、glags等,含有可将模型转换为无需protobuf依赖的naive buffer格式的工具,供tiny_publish库使用 | 用户 | -| test | 编译指定`arm_os`、`arm_abi`下的移动端单元测试 | 框架开发者 | - -编译脚本`./lite/tools/build.sh`,追加参数说明: - -| 参数 | 介绍 | 值 | -|-----------|-------------|-------------| -| --arm_os |必选,选择安装平台 | `android`、`ios`、`ios64`、`armlinux` | -| --arm_abi |必选,选择编译的arm版本,其中`armv7hf`为ARMLinux编译时选用| `armv8`、`armv7`、`armv7hf`(仅`armlinux`支持) | -| --arm_lang |arm_os=android时必选,选择编译器 | `gcc`、`clang`(`clang`当前暂不支持) | -| --android_stl |arm_os=android时必选,选择静态链接STL或动态链接STL | `c++_static`、`c++_shared`| -| --build_java | 可选,是否编译java预测库(默认为ON) | `ON`、`OFF` | -| --build_extra | 可选,是否编译全量预测库(默认为OFF)。详情可参考[预测库说明](./library.html)。 | `ON`、`OFF` | -| target |必选,选择编译模式,`tiny_publish`为编译移动端部署库、`full_publish`为带依赖的移动端部署库、`test`为移动端单元测试、`ios`为编译ios端`tiny_publish` | `tiny_publish`、`full_publish`、`test`、 `ios` | - -### 编译代码 - -**注意**:非开发者建议在编译前使用[**“加速第三方依赖库的下载”**](#id22)的方法,加速工程中第三方依赖库的下载与编译。 - -#### 编译`tiny publish`动态库 - -##### Android -```shell -./lite/tools/build.sh \ - --arm_os=android \ - --arm_abi=armv8 \ - --build_extra=OFF \ - --arm_lang=gcc \ - --android_stl=c++_static \ - tiny_publish -``` -##### IOS -```shell -./lite/tools/build.sh \ - --arm_os=ios64 \ - --arm_abi=armv8 \ - --build_extra=OFF \ - ios -``` -**注意:mac环境编译IOS 时,cmake版本需要高于cmake 3.15;mac环境上编译Android时,cmake版本需要设置为cmake 3.10。** - -ios tiny publish支持的编译选项: - -* `--arm_os`: 可选ios或者ios64 -* `--arm_abi`: 可选armv7和armv8(**注意**:当`arm_os=ios`时只能选择`arm_abi=armv7`,当`arm_os=ios64`时只能选择`arm_abi=armv8`) -* 如果mac编译过程中报错:"Invalid CMAKE_DEVELOPER_ROOT: does not exist", 运行: -```shell -sudo xcode-select -s /Applications/Xcode.app/Contents/Developer -``` -##### ARMLinux -```shell -./lite/tools/build.sh \ - --build_extra=OFF \ - --arm_os=armlinux \ - --arm_abi=armv7hf \ - --arm_lang=gcc \ - tiny_publish -``` -- `--arm_abi`: 树莓派3b使用armv7hf,RK3399使用armv8 - -#### 编译`full publish`动态库 +Paddle-Lite支持在 “Docker 环境、Linux 环境、Mac 环境” 源码编译Android 预测库 -##### Android -```shell -./lite/tools/build.sh \ - --arm_os=android \ - --arm_abi=armv8 \ - --build_extra=OFF \ - --arm_lang=gcc \ - --android_stl=c++_static \ - full_publish -``` -##### ARMLinux -```shell -./lite/tools/build.sh \ - --arm_os=armlinux \ - --arm_abi=armv7hf \ - --arm_lang=gcc \ - --build_extra=OFF \ - full_publish -``` -- `--arm_abi`: 树莓派3b使用armv7hf,RK3399使用armv8 - -### 编译结果说明 - -**编译最终产物位置**在 `build.lite.xxx.xxx.xxx` 下的 `inference_lite_lib.xxx.xxx` ,如 Android 下 ARMv8 的产物位于`inference_lite_lib.android.armv8`: - -![](https://user-images.githubusercontent.com/45189361/65375706-204e8780-dccb-11e9-9816-ab4563ce0963.png) - -**目录内容**(可能)如下: - -**Full_publish编译结果:** - -![](https://user-images.githubusercontent.com/45189361/65375704-19c01000-dccb-11e9-9650-6856c7a5bf82.png) - -**Tiny_publish结果:** - -![](https://user-images.githubusercontent.com/45189361/65375726-3bb99280-dccb-11e9-9903-8ce255371905.png) - -**IOS编译结果:** +**编译方法参见**:[Android预测库编译方法](./Compile/Android) -![](https://user-images.githubusercontent.com/45189361/65375726-3bb99280-dccb-11e9-9903-8ce255371905.png) +### iOS 预测库编译方法 -**具体内容**说明: +Paddle-Lite只支持在 “Mac 环境” 源码编译iOS 预测库 -1、 `bin`文件夹:可执行工具文件 `paddle_code_generator`、`test_model_bin` +**编译方法参见**:[iOS预测库编译方法](./Compile/iOS) -2、 `cxx`文件夹:包含c++的库文件与相应的头文件 - -- `include` : 头文件 -- `lib` : 库文件 - - 打包的静态库文件: - - `libpaddle_api_full_bundled.a` :包含 full_api 和 light_api 功能的静态库 - - `libpaddle_api_light_bundled.a` :只包含 light_api 功能的静态库 - - 打包的动态态库文件: - - `libpaddle_full_api_shared.so` :包含 full_api 和 light_api 功能的动态库 - - `libpaddle_light_api_shared.so`:只包含 light_api 功能的动态库 - -3、 `demo`文件夹:示例 demo ,包含 C++ demo 和 Java demo。 - -- `cxx` : C++示例 demo - - `mobile_full` : full_api 的使用示例 - - `mobile_light` : light_api的使用示例 -- `java` :Java 示例 demo - - `android` : Java的 Android 示例 - -4、 `java` 文件夹:包含 Jni 的动态库文件与相应的 Jar 包 - -- `jar` : `PaddlePredictor.jar` -- `so` : Jni动态链接库 `libpaddle_lite_jni.so` - -5、 `third_party` 文件夹:第三方库文件`gflags` - -**注意:** - -1、 只有当`--arm_os=android` 时才会编译出: - -- Java库文件与示例:`Java`和`demo/java` - -- 动态库文件:`libpaddle_full_api_shared.so`,`libpaddle_light_api_shared.so` +### 加速第三方依赖库的下载 -2、 `tiny_publish`编译结果不包括 C++ demo和 C++ 静态库,但提供 C++ 的 light_api 动态库、 Jni 动态库和Java demo +如出现源码编译耗时过长,一般是第三方库下载过慢或失败导致: -### 加速第三方依赖库的下载 +- 移动端相关编译所需的第三方库均位于 `/third-party` 目录下,默认编译过程中,会利用`git submodule update --init --recursive`链上相关的第三方依赖的仓库。 -移动端相关编译所需的第三方库均位于 `/third-party` 目录下,默认编译过程中,会利用`git submodule update --init --recursive`链上相关的第三方依赖的仓库。 +- 为加速`full_publish`、`test`编译模式中对`protobuf`等第三方依赖的下载,`build.sh` 和 `ci_build.sh`支持了从国内 CDN 下载第三方依赖的压缩包。 -为加速`full_publish`、`test`编译模式中对`protobuf`等第三方依赖的下载,`build.sh` 和 `ci_build.sh`支持了从国内 CDN 下载第三方依赖的压缩包。 +可使用本节方法加速第三方库下载过程,以加速编译: -使用方法:`git clone`完`Paddle-Lite`仓库代码后,手动删除本地仓库根目录下的`third-party`目录: +- **加速方法**:`git clone`完`Paddle-Lite`仓库代码后,手动删除本地仓库根目录下的`third-party`目录: ```shell git clone https://github.com/PaddlePaddle/Paddle-Lite.git @@ -413,4 +271,4 @@ cd Paddle-Lite rm -rf third-party ``` -之后再根据本文档,进行后续编译时,便会忽略第三方依赖对应的`submodule`,改为下载第三方压缩包。 +之后再根据本文档,进行后续编译时,便会忽略第三方依赖对应的`submodule`,改为直接下载第三方压缩包。 -- GitLab