Skip to content

Commit d3b07a6

Browse files
authored
Add documentation of cross-compiling for iOS (#5239)
* Add documentation of cross-compiling for iOS. * Correst the typo in documentation of cross-compiling for raspberry pi. * Set ANDROID_API to 21 when it is specified < 21 for arm64-v8a in build_android.sh. * Check the input and print the usage in MergeModel.cpp.
1 parent 36d2060 commit d3b07a6

File tree

5 files changed

+112
-2
lines changed

5 files changed

+112
-2
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
# 构建iOS平台上的PaddlePaddle库
2+
交叉编译iOS平台上适用的PaddlePaddle库,需要在MacOS系统上进行。本文的将介绍在MacOS上,从源码交叉编译iOS平台上适用的PaddlePaddle库。
3+
4+
## 准备交叉编译环境
5+
Apple官方为iOS开发提供了完整的交叉编译工具和集成开发环境,用户从App Store下载安装Xcode即可。也可自行前往官网下载,[Xcode](https://developer.apple.com/cn/xcode/)。安装完成之后,可在命令行执行`xcodebuild -version`,判断是否安装成功。
6+
7+
```bash
8+
$ xcodebuild -version
9+
Xcode 9.0
10+
Build version 9A235
11+
```
12+
13+
## 配置交叉编译参数
14+
15+
PaddlePaddle为交叉编译提供了工具链配置文档[cmake/cross_compiling/ios.cmake](https://github.com/PaddlePaddle/Paddle/blob/develop/cmake/cross_compiling/ios.cmake),以提供一些默认的编译器和编译参数配置。
16+
17+
交叉编译iOS版本的PaddlePaddle库时,有一些必须配置的参数:
18+
19+
- `CMAKE_SYSTEM_NAME`,CMake编译的目标平台,必须设置为`iOS`。在设置`CMAKE_SYSTEM_NAME=iOS`后,PaddlePaddle的CMake系统会自动编译所有的第三方依赖库,并且强制设置一些PaddlePaddle参数的值(`WITH_C_API=ON``WITH_GPU=OFF``WITH_AVX=OFF``WITH_PYTHON=OFF``WITH_RDMA=OFF`)。
20+
- `WITH_C_API`,是否编译C-API预测库,必须设置为ON。在iOS平台上只支持使用C-API来预测。
21+
- `WITH_SWIG_PY`,必须设置为ON。在iOS平台上不支持通过swig调用来训练或者预测。
22+
23+
iOS平台可选配置参数:
24+
25+
- `IOS_PLATFORM`,可设置为`OS/SIMULATOR`,默认值为`OS`
26+
- `OS`,构建目标为`arm`架构的iPhone或者iPad等物理设备。
27+
- `SIMULATOR`,构建目标为`x86`架构的模拟器平台。
28+
- `IOS_ARCH`,目标架构。针对不同的`IOS_PLATFORM`,可设置的目标架构如下表所示:
29+
30+
| IOS_PLATFORM | IOS_ARCH |
31+
|--------------|----------------------|
32+
| OS | armv7, armv7s, arm64 (默认) |
33+
| SIMULATOR | i386, x86_64 (默认) |
34+
35+
- `IOS_DEPLOYMENT_TARGET`,最小的iOS部署版本,默认值为`7.0`
36+
- `IOS_ENABLE_BITCODE`,是否使能[Bitcode](https://developer.apple.com/library/content/documentation/IDEs/Conceptual/AppDistributionGuide/AppThinning/AppThinning.html#//apple_ref/doc/uid/TP40012582-CH35-SW3),可设置`ON/OFF`,默认值为`ON`
37+
- `IOS_USE_VECLIB_FOR_BLAS`,是否使用[vecLib](https://developer.apple.com/documentation/accelerate/veclib)框架进行BLAS矩阵计算,可设置`ON/OFF`,默认值为`OFF`
38+
- `IOS_DEVELOPMENT_ROOT``Developer`目录,可显式指定为`/path/to/platform/Developer`。若未显式指定,PaddlePaddle将会根据`IOS_PLATFORM`自动选择`Xcode`对应`platform``Developer`目录。
39+
- `IOS_SDK_ROOT`,所使用`SDK`的根目录,可显式指定为`/path/to/platform/Developer/SDKs/SDK`。若未显式指定,PaddlePaddle将会自动选择`IOS_DEVELOPMENT_ROOT`目录下最新的`SDK`版本。
40+
41+
其他配置参数:
42+
43+
- `USE_EIGEN_FOR_BLAS`,是否使用Eigen库进行矩阵计算,在`IOS_USE_VECLIB_FOR_BLAS=OFF`时有效。可设置`ON/OFF`,默认值为`OFF`
44+
- `HOST_C/CXX_COMPILER`,宿主机的C/C++编译器。默认值为环境变量`CC/CXX`的值;若环境变量`CC/CXX`未设置,则使用`cc/c++`编译器。
45+
46+
常用的cmake配置如下:
47+
48+
```bash
49+
cmake -DCMAKE_SYSTEM_NAME=iOS \
50+
-DIOS_PLATFORM=OS \
51+
-DIOS_ARCH="arm64" \
52+
-DIOS_ENABLE_BITCODE=ON \
53+
-DIOS_USE_VECLIB_FOR_BLAS=ON \
54+
-DCMAKE_INSTALL_PREFIX=your/path/to/install \
55+
-DWITH_C_API=ON \
56+
-DWITH_TESTING=OFF \
57+
-DWITH_SWIG_PY=OFF \
58+
..
59+
```
60+
61+
```bash
62+
cmake -DCMAKE_SYSTEM_NAME=iOS \
63+
-DIOS_PLATFORM=SIMULATOR \
64+
-DIOS_ARCH="x86_64" \
65+
-DIOS_USE_VECLIB_FOR_BLAS=ON \
66+
-DCMAKE_INSTALL_PREFIX=your/path/to/install \
67+
-DWITH_C_API=ON \
68+
-DWITH_TESTING=OFF \
69+
-DWITH_SWIG_PY=OFF \
70+
..
71+
```
72+
73+
用户还可根据自己的需求设置其他编译参数。比如希望最小化生成库的大小,可以设置`CMAKE_BUILD_TYPE``MinSizeRel`;若希望得到最快的执行速度,则可设置`CMAKE_BUILD_TYPE``Release`。亦可以通过手动设置`CMAKE_C/CXX_FLAGS`来影响PaddlePaddle的编译过程。
74+
75+
**性能TIPS**,为了达到最快的计算速度,在CMake参数配置上,有以下建议:
76+
77+
- 设置`CMAKE_BUILD_TYPE``Release`
78+
- 设置`IOS_USE_VECLIB_FOR_BLAS=ON`,调用`vecLib`框架提供的BLAS函数进行矩阵计算。
79+
80+
## 编译和安装
81+
82+
CMake配置完成后,执行以下命令,PaddlePaddle将自动下载和编译所有第三方依赖库、编译和安装PaddlePaddle预测库。
83+
84+
```
85+
$ make
86+
$ make install
87+
```
88+
89+
注意:如果你曾在源码目录下编译过其他平台的PaddlePaddle库,请先使用`rm -rf`命令删除`third_party`目录和`build`目录,以确保所有的第三方依赖库和PaddlePaddle代码都是针对新的CMake配置重新编译的。
90+
91+
执行完安装命令后,`your/path/to/install`目录中会包含以下内容:
92+
93+
- `include`目录,其中包含所有C-API的头文件
94+
- `lib`目录,其中包含PaddlePaddle的C-API静态库
95+
- `third_party`目录,其中包含所依赖的所有第三方库
96+
97+
注意,不同架构的PaddlePaddle库建议安装到不同的目录下,然后使用`lipo`工具将多个静态库合并成一个支持多个架构的fat库。
98+
99+
自此,PaddlePaddle库已经安装完成,用户可将合成的fat库用于深度学习相关的iOS App中,调用方法见C-API文档。

doc/howto/cross_compiling/cross_compiling_for_raspberry_cn.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,4 @@ make install
5959

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

62-
执行完安装命令后,`your/path/to/install`目录中会包含`include``lib`目录,其中`include`中包含C-API的头文件,`lib`中包含一个Raspberry Pi版本的库。
62+
执行完安装命令后,`your/path/to/install`目录中会包含`include``lib`目录,其中`include`中包含C-API的头文件,`lib`中包含一个Raspberry Pi版本的库。

doc/howto/cross_compiling/cross_compiling_for_raspberry_en.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ cmake -DCMAKE_SYSTEM_NAME=RPi \
4444
..
4545
```
4646

47-
To build the inference library, please set the argument WITH_API to ON: `WITH_C_API=ON`.
47+
To build the inference library, please set the argument WITH\_C\_API to ON: `WITH_C_API=ON`.
4848

4949
You can add more arguments. For example, to minimize the size of the generated inference library, you may use `CMAKE_BUILD_TYPE=MinSizeRel`. For performance optimization, you may use `CMAKE_BUILD_TYPE=Release`.
5050

paddle/scripts/docker/build_android.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ set -xe
44

55
if [ $ANDROID_ABI == "arm64-v8a" ]; then
66
ANDROID_ARCH=arm64
7+
if [ $ANDROID_API -lt 21 ]; then
8+
echo "Warning: arm64-v8a requires ANDROID_API >= 21."
9+
ANDROID_API=21
10+
fi
711
else # armeabi, armeabi-v7a
812
ANDROID_ARCH=arm
913
fi

paddle/trainer/MergeModel.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ using namespace paddle; // NOLINT
2727
using namespace std; // NOLINT
2828

2929
int main(int argc, char** argv) {
30+
if (FLAGS_model_dir.empty() || FLAGS_config_file.empty() ||
31+
FLAGS_model_file.empty()) {
32+
LOG(INFO) << "Usage: ./paddle_merge_model --model_dir=pass-00000 "
33+
"--config_file=config.py --model_file=out.paddle";
34+
return 0;
35+
}
36+
3037
initMain(argc, argv);
3138
initPython(argc, argv);
3239

0 commit comments

Comments
 (0)