|
| 1 | +## 编译 PaddlePaddle 预测库 |
| 2 | + |
| 3 | +### 概述 |
| 4 | + |
| 5 | +使用 C-API 进行预测依赖于将 PaddlePaddle 核心代码编译成链接库,只需在编译时需配制下面这些编译选项: |
| 6 | + |
| 7 | +必须配置选项: |
| 8 | +- `WITH_C_API`,必须配置为`ON`。 |
| 9 | + |
| 10 | +推荐配置选项: |
| 11 | +- `WITH_PYTHON`,推荐配置为`OFF` |
| 12 | +- `WITH_SWIG_PY`,推荐配置为`OFF` |
| 13 | +- `WITH_GOLANG`,推荐设置为`OFF` |
| 14 | + |
| 15 | +可选配置选项: |
| 16 | +- `WITH_GPU`,可配置为`ON/OFF` |
| 17 | +- `WITH_MKL`,可配置为`ON/OFF` |
| 18 | + |
| 19 | +对推荐配置中的选项建议按照设置,以避免链接不必要的库。其它可选编译选项按需进行设定。 |
| 20 | + |
| 21 | +下面的代码片段从github拉取最新代码,配制编译选项(需要将PADDLE_ROOT替换为PaddlePaddle预测库的安装路径): |
| 22 | + |
| 23 | +```shell |
| 24 | +PADDLE_ROOT=/path/of/capi |
| 25 | +git clone https://github.com/PaddlePaddle/Paddle.git |
| 26 | +cd Paddle |
| 27 | +mkdir build |
| 28 | +cd build |
| 29 | +cmake -DCMAKE_INSTALL_PREFIX=$PADDLE_ROOT \ |
| 30 | + -DCMAKE_BUILD_TYPE=Release \ |
| 31 | + -DWITH_C_API=ON \ |
| 32 | + -DWITH_SWIG_PY=OFF \ |
| 33 | + -DWITH_GOLANG=OFF \ |
| 34 | + -DWITH_PYTHON=OFF \ |
| 35 | + -DWITH_MKL=OFF \ |
| 36 | + -DWITH_GPU=OFF \ |
| 37 | + .. |
| 38 | +``` |
| 39 | + |
| 40 | +执行上述代码生成Makefile文件后,执行:`make && make install`。成功编译后,使用C-API所需的依赖(包括:(1)编译出的PaddlePaddle预测库和头文件;(2)第三方链接库和头文件)均会存放于`PADDLE_ROOT`目录中。 |
| 41 | + |
| 42 | +编译成功后在 `PADDLE_ROOT` 下会看到如下目录结构(包括了编译出的PaddlePaddle头文件和链接库,以及第三方依赖链接库和头文件(如果需要,由链接方式决定)): |
| 43 | + |
| 44 | +```text |
| 45 | +├── include |
| 46 | +│ └── paddle |
| 47 | +│ ├── arguments.h |
| 48 | +│ ├── capi.h |
| 49 | +│ ├── capi_private.h |
| 50 | +│ ├── config.h |
| 51 | +│ ├── error.h |
| 52 | +│ ├── gradient_machine.h |
| 53 | +│ ├── main.h |
| 54 | +│ ├── matrix.h |
| 55 | +│ ├── paddle_capi.map |
| 56 | +│ └── vector.h |
| 57 | +├── lib |
| 58 | +│ ├── libpaddle_capi_engine.a |
| 59 | +│ ├── libpaddle_capi_layers.a |
| 60 | +│ ├── libpaddle_capi_shared.so |
| 61 | +│ └── libpaddle_capi_whole.a |
| 62 | +└── third_party |
| 63 | + ├── gflags |
| 64 | + │ ├── include |
| 65 | + │ │ └── gflags |
| 66 | + │ │ ├── gflags_completions.h |
| 67 | + │ │ ├── gflags_declare.h |
| 68 | + │ │ ... |
| 69 | + │ └── lib |
| 70 | + │ └── libgflags.a |
| 71 | + ├── glog |
| 72 | + │ ├── include |
| 73 | + │ │ └── glog |
| 74 | + │ │ ├── config.h |
| 75 | + │ │ ... |
| 76 | + │ └── lib |
| 77 | + │ └── libglog.a |
| 78 | + ├── openblas |
| 79 | + │ ├── include |
| 80 | + │ │ ├── cblas.h |
| 81 | + │ │ ... |
| 82 | + │ └── lib |
| 83 | + │ ... |
| 84 | + ├── protobuf |
| 85 | + │ ├── include |
| 86 | + │ │ └── google |
| 87 | + │ │ └── protobuf |
| 88 | + │ │ ... |
| 89 | + │ └── lib |
| 90 | + │ └── libprotobuf-lite.a |
| 91 | + └── zlib |
| 92 | + ├── include |
| 93 | + │ ... |
| 94 | + └── lib |
| 95 | + ... |
| 96 | +
|
| 97 | +``` |
| 98 | + |
| 99 | +### 链接说明 |
| 100 | + |
| 101 | +目前提供三种链接方式: |
| 102 | + |
| 103 | +1. 链接`libpaddle_capi_shared.so` 动态库 |
| 104 | + - 使用 PaddlePaddle C-API 开发预测程序链接`libpaddle_capi_shared.so`时,需注意: |
| 105 | + 1. 如果编译时指定编译CPU版本,且使用`OpenBLAS`数学库,在使用C-API开发预测程序时,只需要链接`libpaddle_capi_shared.so`这一个库。 |
| 106 | + 1. 如果是用编译时指定CPU版本,且使用`MKL`数学库,由于`MKL`库有自己独立的动态库文件,在使用PaddlePaddle C-API开发预测程序时,需要自己链接MKL链接库。 |
| 107 | + 1. 如果编译时指定编译GPU版本,CUDA相关库会在预测程序运行时动态装载,需要将CUDA相关的库设置到`LD_LIBRARY_PATH`环境变量中。 |
| 108 | + - 这种方式最为简便,链接相对容易,**在无特殊需求情况下,推荐使用此方式**。 |
| 109 | + |
| 110 | +2. 链接静态库 `libpaddle_capi_whole.a` |
| 111 | + - 使用PaddlePaddle C-API 开发预测程序链接`libpaddle_capi_whole.a`时,需注意: |
| 112 | + 1. 需要指定`-Wl,--whole-archive`链接选项。 |
| 113 | + 1. 需要显式地链接 `gflags`、`glog`、`libz`、`protobuf` 等第三方库,可在`PADDLE_ROOT/third_party`下找到。 |
| 114 | + 1. 如果在编译 C-API 时使用OpenBLAS数学库,需要显示地链接`libopenblas.a`。 |
| 115 | + 1. 如果在编译 C-API 是使用MKL数学库,需要显示地链接MKL的动态库。 |
| 116 | + |
| 117 | +3. 链接静态库 `libpaddle_capi_layers.a`和`libpaddle_capi_engine.a` |
| 118 | + - 使用PaddlePaddle C-API 开发预测程序链接`libpaddle_capi_whole.a`时,需注意: |
| 119 | + 1. 这种链接方式主要用于移动端预测。 |
| 120 | + 1. 为了减少生成链接库的大小把`libpaddle_capi_whole.a`拆成以上两个静态链接库。 |
| 121 | + 1. 需指定`-Wl,--whole-archive -lpaddle_capi_layers` 和 `-Wl,--no-whole-archive -lpaddle_capi_engine` 进行链接。 |
| 122 | + 1. 第三方依赖库需要按照与方式2同样方法显示地进行链接。 |
0 commit comments