Skip to content

Commit a3381ae

Browse files
committed
add inference to develop
1 parent 5b85bfd commit a3381ae

File tree

3 files changed

+218
-0
lines changed

3 files changed

+218
-0
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
.. _install_or_build_cpp_inference_lib:
2+
3+
安装与编译C++预测库
4+
===========================
5+
6+
直接下载安装
7+
-------------
8+
9+
====================== ========================================
10+
版本说明 C++预测库
11+
====================== ========================================
12+
cpu_avx_mkl `fluid.tgz <https://guest:@paddleci.ngrok.io/repository/download/Manylinux1_CpuAvxCp27cp27mu/.lastSuccessful/fluid.tgz>`_
13+
cpu_avx_openblas `fluid.tgz <https://guest:@paddleci.ngrok.io/repository/download/Manylinux1_CpuAvxOpenblas/.lastSuccessful/fluid.tgz>`_
14+
cpu_noavx_openblas `fluid.tgz <https://guest:@paddleci.ngrok.io/repository/download/Manylinux1_CpuNoavxOpenblas/.lastSuccessful/fluid.tgz>`_
15+
cuda7.5_cudnn5_avx_mkl `fluid.tgz <https://guest:@paddleci.ngrok.io/repository/download/Manylinux1_Cuda75cudnn5cp27cp27mu/.lastSuccessful/fluid.tgz>`_
16+
cuda8.0_cudnn5_avx_mkl `fluid.tgz <https://guest:@paddleci.ngrok.io/repository/download/Manylinux1_Cuda80cudnn5cp27cp27mu/.lastSuccessful/fluid.tgz>`_
17+
cuda8.0_cudnn7_avx_mkl `fluid.tgz <https://guest:@paddleci.ngrok.io/repository/download/Manylinux1_Cuda8cudnn7cp27cp27mu/.lastSuccessful/fluid.tgz>`_
18+
cuda9.0_cudnn7_avx_mkl `fluid.tgz <https://guest:@paddleci.ngrok.io/repository/download/Manylinux1_Cuda90cudnn7avxMkl/.lastSuccessful/fluid.tgz>`_
19+
====================== ========================================
20+
21+
从源码编译
22+
----------
23+
用户也可以从 PaddlePaddle 核心代码编译C++预测库,只需在编译时配制下面这些编译选项:
24+
25+
================= =========
26+
选项 值
27+
================= =========
28+
CMAKE_BUILD_TYPE Release
29+
FLUID_INSTALL_DIR 安装路径
30+
WITH_FLUID_ONLY ON(推荐)
31+
WITH_SWIG_PY OFF(推荐
32+
WITH_PYTHON OFF(推荐)
33+
WITH_GPU ON/OFF
34+
WITH_MKL ON/OFF
35+
================= =========
36+
37+
建议按照推荐值设置,以避免链接不必要的库。其它可选编译选项按需进行设定。
38+
39+
下面的代码片段从github拉取最新代码,配制编译选项(需要将PADDLE_ROOT替换为PaddlePaddle预测库的安装路径):
40+
41+
.. code-block:: bash
42+
43+
pip install paddlepaddle-gpu
44+
PADDLE_ROOT=/path/of/capi
45+
git clone https://github.com/PaddlePaddle/Paddle.git
46+
cd Paddle
47+
mkdir build
48+
cd build
49+
cmake -DFLUID_INSTALL_DIR=$PADDLE_ROOT \
50+
-DCMAKE_BUILD_TYPE=Release \
51+
-DWITH_FLUID_ONLY=ON \
52+
-DWITH_SWIG_PY=OFF \
53+
-DWITH_PYTHON=OFF \
54+
-DWITH_MKL=OFF \
55+
-DWITH_GPU=OFF \
56+
..
57+
make
58+
make inference_lib_dist
59+
60+
成功编译后,使用C++预测库所需的依赖(包括:(1)编译出的PaddlePaddle预测库和头文件;(2)第三方链接库和头文件;(3)版本信息与编译选项信息)
61+
均会存放于PADDLE_ROOT目录中。目录结构如下:
62+
63+
.. code-block:: text
64+
65+
PaddleRoot/
66+
├── CMakeCache.txt
67+
├── paddle
68+
│   └── fluid
69+
│   ├── framework
70+
│   ├── inference
71+
│   ├── memory
72+
│   ├── platform
73+
│   ├── pybind
74+
│   └── string
75+
├── third_party
76+
│   ├── boost
77+
│   │   └── boost
78+
│   ├── eigen3
79+
│   │   ├── Eigen
80+
│   │   └── unsupported
81+
│   └── install
82+
│   ├── gflags
83+
│   ├── glog
84+
│   ├── mklml
85+
│   ├── protobuf
86+
│   ├── snappy
87+
│   ├── snappystream
88+
│   └── zlib
89+
└── version.txt
90+
91+
version.txt 中记录了该预测库的版本信息,包括Git Commit ID、使用OpenBlas或MKL数学库、CUDA/CUDNN版本号,如:
92+
93+
.. code-block:: text
94+
95+
GIT COMMIT ID: c95cd4742f02bb009e651a00b07b21c979637dc8
96+
WITH_MKL: ON
97+
WITH_GPU: ON
98+
CUDA version: 8.0
99+
CUDNN version: v5
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
############
2+
模型预测部署
3+
############
4+
5+
PaddlePaddle Fluid 提供了 C++ API 来支持模型的部署上线
6+
7+
.. toctree::
8+
:maxdepth: 2
9+
10+
build_and_install_lib_cn.rst
11+
native_infer.rst
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
Paddle 预测 API
2+
===============
3+
4+
为了更简单方便的预测部署,Fluid 提供了一套高层 API
5+
用来隐藏底层不同的优化实现。
6+
7+
`预测库相关代码 <https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/contrib/inference>`__
8+
包括
9+
10+
- 头文件 ``paddle_inference_api.h`` 定义了所有的接口
11+
- 库文件\ ``libpaddle_fluid.so`` 或 ``libpaddle_fluid.a``
12+
- 库文件 ``libpaddle_inference_api.so`` 或
13+
``libpaddle_inference_api.a``
14+
15+
编译和依赖可以参考 :ref:`install_or_build_cpp_inference_lib` 。
16+
17+
下面是一些 API 概念的介绍
18+
19+
PaddleTensor
20+
------------
21+
22+
PaddleTensor 定义了预测最基本的输入输出的数据格式,其定义是
23+
24+
.. code:: cpp
25+
26+
struct PaddleTensor {
27+
std::string name; // variable name.
28+
std::vector<int> shape;
29+
PaddleBuf data; // blob of data.
30+
PaddleDType dtype;
31+
};
32+
33+
- ``name`` 用于指定输入数据对应的 模型中variable 的名字
34+
(暂时没有用,但会在后续支持任意 target 时启用)
35+
- ``shape`` 表示一个 Tensor 的 shape
36+
- ``data`` 数据以连续内存的方式存储在\ ``PaddleBuf``
37+
中,\ ``PaddleBuf``
38+
可以接收外面的数据或者独立\ ``malloc``\ 内存,详细可以参考头文件中相关定义。
39+
- ``dtype`` 表示 Tensor 的数据类型
40+
41+
engine
42+
------
43+
44+
高层 API 底层有多种优化实现,我们称之为 engine,目前有三种 engine
45+
46+
- 原生 engine,由 paddle 原生的 forward operator
47+
组成,可以天然支持所有paddle 训练出的模型,
48+
- Anakin engine,封装了
49+
`Anakin <https://github.com/PaddlePaddle/Anakin>`__
50+
,在某些模型上性能不错,但只能接受自带模型格式,无法支持所有 paddle
51+
模型,
52+
- TensorRT mixed engine,用子图的方式支持了
53+
`TensorRT <https://developer.nvidia.com/tensorrt>`__ ,支持所有paddle
54+
模型,并自动切割部分计算子图到 TensorRT 上加速(WIP)
55+
56+
其实现为
57+
58+
.. code:: cpp
59+
60+
enum class PaddleEngineKind {
61+
kNative = 0, // Use the native Fluid facility.
62+
kAnakin, // Use Anakin for inference.
63+
kAutoMixedTensorRT // Automatically mixing TensorRT with the Fluid ops.
64+
};
65+
66+
预测部署过程
67+
------------
68+
69+
总体上分为以下步骤
70+
71+
1. 用合适的配置创建 ``PaddlePredictor``
72+
2. 创建输入用的 ``PaddleTensor``\ ,传入到 ``PaddlePredictor`` 中
73+
3. 获取输出的 ``PaddleTensor`` ,将结果取出
74+
75+
下面完整演示一个简单的模型,部分细节代码隐去
76+
77+
.. code:: cpp
78+
79+
#include "paddle_inference_api.h"
80+
81+
// 创建一个 config,并修改相关设置
82+
paddle::NativeConfig config;
83+
config.model_dir = "xxx";
84+
config.use_gpu = false;
85+
// 创建一个原生的 PaddlePredictor
86+
auto predictor =
87+
paddle::CreatePaddlePredictor<NativeConfig, PaddleEngineKind::kNative>(config);
88+
// 创建输入 tensor
89+
int64_t data[4] = {1, 2, 3, 4};
90+
paddle::PaddleTensor tensor{.name = "",
91+
.shape = std::vector<int>({4, 1}),
92+
.data = PaddleBuf(data, sizeof(data)),
93+
.dtype = PaddleDType::INT64};
94+
// 创建输出 tensor,输出 tensor 的内存可以复用
95+
std::vector<paddle::PaddleTensor> outputs;
96+
// 执行预测
97+
CHECK(predictor->Run(slots, &outputs));
98+
// 获取 outputs ...
99+
100+
编译时,联编 ``libpaddle_fluid.a/.so`` 和
101+
``libpaddle_inference_api.a/.so`` 便可。
102+
103+
详细代码参考
104+
------------
105+
106+
- `inference
107+
demos <https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/fluid/inference/api/demo_ci>`__
108+
- `复杂单线程/多线程例子 <https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/inference/api/api_impl_tester.cc>`__

0 commit comments

Comments
 (0)