From 04a72c009e30d79dd1a0e327f968f577bdebef2c Mon Sep 17 00:00:00 2001 From: Superjomn Date: Fri, 29 Jun 2018 07:30:22 +0000 Subject: [PATCH 1/3] add inference doc --- source/advanced_usage/deploy/index.rst | 7 +- .../deploy/native_inference_engine.md | 89 +++++++++++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 source/advanced_usage/deploy/native_inference_engine.md diff --git a/source/advanced_usage/deploy/index.rst b/source/advanced_usage/deploy/index.rst index 0a391acfd38e3..906a466a9bc7f 100644 --- a/source/advanced_usage/deploy/index.rst +++ b/source/advanced_usage/deploy/index.rst @@ -5,6 +5,11 @@ 服务端 ###### +.. toctree:: + :maxdepth: 2 + + native_inference_engine.md + 移动端 -###### \ No newline at end of file +###### diff --git a/source/advanced_usage/deploy/native_inference_engine.md b/source/advanced_usage/deploy/native_inference_engine.md new file mode 100644 index 0000000000000..312f0dbb80f7e --- /dev/null +++ b/source/advanced_usage/deploy/native_inference_engine.md @@ -0,0 +1,89 @@ +# Paddle 预测 API + +为了更简单方便的预测部署,Fluid 提供了一套高层 API 用来隐藏底层不同的优化实现。 + + 预测库相关代码位于https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/contrib/inference,其中发布的包括 + +- 头文件 `paddle_inference_api.h` 定义了所有的接口 +- 库文件`libpaddle_fluid.so` 或 `libpaddle_fluid.a` +- 库文件 `libpaddle_inference_api.so` 或 `libpaddle_inference_api.a` + +编译和依赖可以参考 [安装与编译C++预测库](http://www.paddlepaddle.org/docs/develop/documentation/fluid/zh/howto/inference/build_and_install_lib_cn.html) 。 + +下面是一些 API 概念的介绍 + +## PaddleTensor + +PaddleTensor 定义了预测最基本的输入输出的数据格式,其定义是 + +```c++ +struct PaddleTensor { + std::string name; // variable name. + std::vector shape; + PaddleBuf data; // blob of data. + PaddleDType dtype; +}; +``` + +- `name` 用于指定输入数据对应的 模型中variable 的名字 (暂时没有用,但会在后续支持任意 target 时启用) +- `shape` 表示一个 Tensor 的 shape +- `data` 数据以连续内存的方式存储在`PaddleBuf` 中,`PaddleBuf` 可以接收外面的数据或者独立`malloc`内存,详细可以参考头文件中相关定义。 +- `dtype` 表示 Tensor 的数据类型 + +## engine + +高层 API 底层有多种优化实现,我们称之为 engine,目前有三种 engine + +- 原生 engine,由 paddle 原生的 forward operator 组成,可以天然支持所有paddle 训练出的模型, +- Anakin engine,封装了 [Anakin](https://github.com/PaddlePaddle/Anakin) ,在某些模型上性能不错,但只能接受自带模型格式,无法支持所有 paddle 模型, +- TensorRT mixed engine,用子图的方式支持了 [TensorRT](https://developer.nvidia.com/tensorrt) ,支持所有paddle 模型,并自动切割部分计算子图到 TensorRT 上加速(WIP) + +其实现为 + +```c++ +enum class PaddleEngineKind { + kNative = 0, // Use the native Fluid facility. + kAnakin, // Use Anakin for inference. + kAutoMixedTensorRT // Automatically mixing TensorRT with the Fluid ops. +}; +``` + +## 预测部署过程 + +总体上分为以下步骤 + +1. 用合适的配置创建 `PaddlePredictor` +2. 创建输入用的 `PaddleTensor`,传入到 `PaddlePredictor` 中 +3. 获取输出的 `PaddleTensor` ,将结果取出 + +下面完整演示一个简单的模型,部分细节代码隐去 + +```c++ +#include "paddle_inference_api.h" + +// 创建一个 config,并修改相关设置 +paddle::NativeConfig config; +config.model_dir = "xxx"; +config.use_gpu = false; +// 创建一个原生的 PaddlePredictor +auto predictor = + paddle::CreatePaddlePredictor(config); +// 创建输入 tensor +int64_t data[4] = {1, 2, 3, 4}; +paddle::PaddleTensor tensor{.name = "", + .shape = std::vector({4, 1}), + .data = PaddleBuf(data, sizeof(data)), + .dtype = PaddleDType::INT64}; +// 创建输出 tensor,输出 tensor 的内存可以复用 +std::vector outputs; +// 执行预测 +CHECK(predictor->Run(slots, &outputs)); +// 获取 outputs ... +``` + +编译时,联编 `libpaddle_fluid.a/.so` 和 `libpaddle_inference_api.a/.so` 便可。 + +## 详细代码参考 + +- [inference demos](https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/contrib/inference/demo) +- [复杂单线程/多线程例子](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/contrib/inference/test_paddle_inference_api_impl.cc) From 941d17fed46d7658f602a39222239ca85774821e Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Sat, 30 Jun 2018 10:02:33 +0800 Subject: [PATCH 2/3] Update inference engine --- source/advanced_usage/deploy/index.rst | 2 +- .../deploy/native_inference_engine.md | 89 -------------- .../deploy/native_inference_engine.rst | 109 ++++++++++++++++++ .../install/build_and_install_lib_cn.rst | 99 ++++++++++++++++ 4 files changed, 209 insertions(+), 90 deletions(-) delete mode 100644 source/advanced_usage/deploy/native_inference_engine.md create mode 100644 source/advanced_usage/deploy/native_inference_engine.rst create mode 100644 source/beginners_guide/install/build_and_install_lib_cn.rst diff --git a/source/advanced_usage/deploy/index.rst b/source/advanced_usage/deploy/index.rst index 906a466a9bc7f..c6fadebf70f9f 100644 --- a/source/advanced_usage/deploy/index.rst +++ b/source/advanced_usage/deploy/index.rst @@ -8,7 +8,7 @@ .. toctree:: :maxdepth: 2 - native_inference_engine.md + native_inference_engine.rst 移动端 diff --git a/source/advanced_usage/deploy/native_inference_engine.md b/source/advanced_usage/deploy/native_inference_engine.md deleted file mode 100644 index 312f0dbb80f7e..0000000000000 --- a/source/advanced_usage/deploy/native_inference_engine.md +++ /dev/null @@ -1,89 +0,0 @@ -# Paddle 预测 API - -为了更简单方便的预测部署,Fluid 提供了一套高层 API 用来隐藏底层不同的优化实现。 - - 预测库相关代码位于https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/contrib/inference,其中发布的包括 - -- 头文件 `paddle_inference_api.h` 定义了所有的接口 -- 库文件`libpaddle_fluid.so` 或 `libpaddle_fluid.a` -- 库文件 `libpaddle_inference_api.so` 或 `libpaddle_inference_api.a` - -编译和依赖可以参考 [安装与编译C++预测库](http://www.paddlepaddle.org/docs/develop/documentation/fluid/zh/howto/inference/build_and_install_lib_cn.html) 。 - -下面是一些 API 概念的介绍 - -## PaddleTensor - -PaddleTensor 定义了预测最基本的输入输出的数据格式,其定义是 - -```c++ -struct PaddleTensor { - std::string name; // variable name. - std::vector shape; - PaddleBuf data; // blob of data. - PaddleDType dtype; -}; -``` - -- `name` 用于指定输入数据对应的 模型中variable 的名字 (暂时没有用,但会在后续支持任意 target 时启用) -- `shape` 表示一个 Tensor 的 shape -- `data` 数据以连续内存的方式存储在`PaddleBuf` 中,`PaddleBuf` 可以接收外面的数据或者独立`malloc`内存,详细可以参考头文件中相关定义。 -- `dtype` 表示 Tensor 的数据类型 - -## engine - -高层 API 底层有多种优化实现,我们称之为 engine,目前有三种 engine - -- 原生 engine,由 paddle 原生的 forward operator 组成,可以天然支持所有paddle 训练出的模型, -- Anakin engine,封装了 [Anakin](https://github.com/PaddlePaddle/Anakin) ,在某些模型上性能不错,但只能接受自带模型格式,无法支持所有 paddle 模型, -- TensorRT mixed engine,用子图的方式支持了 [TensorRT](https://developer.nvidia.com/tensorrt) ,支持所有paddle 模型,并自动切割部分计算子图到 TensorRT 上加速(WIP) - -其实现为 - -```c++ -enum class PaddleEngineKind { - kNative = 0, // Use the native Fluid facility. - kAnakin, // Use Anakin for inference. - kAutoMixedTensorRT // Automatically mixing TensorRT with the Fluid ops. -}; -``` - -## 预测部署过程 - -总体上分为以下步骤 - -1. 用合适的配置创建 `PaddlePredictor` -2. 创建输入用的 `PaddleTensor`,传入到 `PaddlePredictor` 中 -3. 获取输出的 `PaddleTensor` ,将结果取出 - -下面完整演示一个简单的模型,部分细节代码隐去 - -```c++ -#include "paddle_inference_api.h" - -// 创建一个 config,并修改相关设置 -paddle::NativeConfig config; -config.model_dir = "xxx"; -config.use_gpu = false; -// 创建一个原生的 PaddlePredictor -auto predictor = - paddle::CreatePaddlePredictor(config); -// 创建输入 tensor -int64_t data[4] = {1, 2, 3, 4}; -paddle::PaddleTensor tensor{.name = "", - .shape = std::vector({4, 1}), - .data = PaddleBuf(data, sizeof(data)), - .dtype = PaddleDType::INT64}; -// 创建输出 tensor,输出 tensor 的内存可以复用 -std::vector outputs; -// 执行预测 -CHECK(predictor->Run(slots, &outputs)); -// 获取 outputs ... -``` - -编译时,联编 `libpaddle_fluid.a/.so` 和 `libpaddle_inference_api.a/.so` 便可。 - -## 详细代码参考 - -- [inference demos](https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/contrib/inference/demo) -- [复杂单线程/多线程例子](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/contrib/inference/test_paddle_inference_api_impl.cc) diff --git a/source/advanced_usage/deploy/native_inference_engine.rst b/source/advanced_usage/deploy/native_inference_engine.rst new file mode 100644 index 0000000000000..0521eb03265f2 --- /dev/null +++ b/source/advanced_usage/deploy/native_inference_engine.rst @@ -0,0 +1,109 @@ +Paddle 预测 API +=============== + +为了更简单方便的预测部署,Fluid 提供了一套高层 API +用来隐藏底层不同的优化实现。 + +预测库相关代码位于 +https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/contrib/inference +,其中发布的包括 + +- 头文件 ``paddle_inference_api.h`` 定义了所有的接口 +- 库文件\ ``libpaddle_fluid.so`` 或 ``libpaddle_fluid.a`` +- 库文件 ``libpaddle_inference_api.so`` 或 + ``libpaddle_inference_api.a`` + +编译和依赖可以参考 :ref:`install_or_build_cpp_inference_lib` 。 + +下面是一些 API 概念的介绍 + +PaddleTensor +------------ + +PaddleTensor 定义了预测最基本的输入输出的数据格式,其定义是 + +.. code:: cpp + + struct PaddleTensor { + std::string name; // variable name. + std::vector shape; + PaddleBuf data; // blob of data. + PaddleDType dtype; + }; + +- ``name`` 用于指定输入数据对应的 模型中variable 的名字 + (暂时没有用,但会在后续支持任意 target 时启用) +- ``shape`` 表示一个 Tensor 的 shape +- ``data`` 数据以连续内存的方式存储在\ ``PaddleBuf`` + 中,\ ``PaddleBuf`` + 可以接收外面的数据或者独立\ ``malloc``\ 内存,详细可以参考头文件中相关定义。 +- ``dtype`` 表示 Tensor 的数据类型 + +engine +------ + +高层 API 底层有多种优化实现,我们称之为 engine,目前有三种 engine + +- 原生 engine,由 paddle 原生的 forward operator + 组成,可以天然支持所有paddle 训练出的模型, +- Anakin engine,封装了 + `Anakin `__ + ,在某些模型上性能不错,但只能接受自带模型格式,无法支持所有 paddle + 模型, +- TensorRT mixed engine,用子图的方式支持了 + `TensorRT `__ ,支持所有paddle + 模型,并自动切割部分计算子图到 TensorRT 上加速(WIP) + +其实现为 + +.. code:: cpp + + enum class PaddleEngineKind { + kNative = 0, // Use the native Fluid facility. + kAnakin, // Use Anakin for inference. + kAutoMixedTensorRT // Automatically mixing TensorRT with the Fluid ops. + }; + +预测部署过程 +------------ + +总体上分为以下步骤 + +1. 用合适的配置创建 ``PaddlePredictor`` +2. 创建输入用的 ``PaddleTensor``\ ,传入到 ``PaddlePredictor`` 中 +3. 获取输出的 ``PaddleTensor`` ,将结果取出 + +下面完整演示一个简单的模型,部分细节代码隐去 + +.. code:: cpp + + #include "paddle_inference_api.h" + + // 创建一个 config,并修改相关设置 + paddle::NativeConfig config; + config.model_dir = "xxx"; + config.use_gpu = false; + // 创建一个原生的 PaddlePredictor + auto predictor = + paddle::CreatePaddlePredictor(config); + // 创建输入 tensor + int64_t data[4] = {1, 2, 3, 4}; + paddle::PaddleTensor tensor{.name = "", + .shape = std::vector({4, 1}), + .data = PaddleBuf(data, sizeof(data)), + .dtype = PaddleDType::INT64}; + // 创建输出 tensor,输出 tensor 的内存可以复用 + std::vector outputs; + // 执行预测 + CHECK(predictor->Run(slots, &outputs)); + // 获取 outputs ... + +编译时,联编 ``libpaddle_fluid.a/.so`` 和 +``libpaddle_inference_api.a/.so`` 便可。 + +详细代码参考 +------------ + +- `inference + demos `__ +- `复杂单线程/多线程例子 `__ diff --git a/source/beginners_guide/install/build_and_install_lib_cn.rst b/source/beginners_guide/install/build_and_install_lib_cn.rst new file mode 100644 index 0000000000000..3884284ea020f --- /dev/null +++ b/source/beginners_guide/install/build_and_install_lib_cn.rst @@ -0,0 +1,99 @@ +.. _install_or_build_cpp_inference_lib: + +安装与编译C++预测库 +=========================== + +直接下载安装 +------------- + +====================== ======================================== +版本说明 C++预测库 +====================== ======================================== +cpu_avx_mkl `fluid.tgz `_ +cpu_avx_openblas `fluid.tgz `_ +cpu_noavx_openblas `fluid.tgz `_ +cuda7.5_cudnn5_avx_mkl `fluid.tgz `_ +cuda8.0_cudnn5_avx_mkl `fluid.tgz `_ +cuda8.0_cudnn7_avx_mkl `fluid.tgz `_ +cuda9.0_cudnn7_avx_mkl `fluid.tgz `_ +====================== ======================================== + +从源码编译 +---------- +用户也可以从 PaddlePaddle 核心代码编译C++预测库,只需在编译时配制下面这些编译选项: + +================= ========= +选项 值 +================= ========= +CMAKE_BUILD_TYPE Release +FLUID_INSTALL_DIR 安装路径 +WITH_FLUID_ONLY ON(推荐) +WITH_SWIG_PY OFF(推荐 +WITH_PYTHON OFF(推荐) +WITH_GPU ON/OFF +WITH_MKL ON/OFF +================= ========= + +建议按照推荐值设置,以避免链接不必要的库。其它可选编译选项按需进行设定。 + +下面的代码片段从github拉取最新代码,配制编译选项(需要将PADDLE_ROOT替换为PaddlePaddle预测库的安装路径): + + .. code-block:: bash + + pip install paddlepaddle-gpu + PADDLE_ROOT=/path/of/capi + git clone https://github.com/PaddlePaddle/Paddle.git + cd Paddle + mkdir build + cd build + cmake -DFLUID_INSTALL_DIR=$PADDLE_ROOT \ + -DCMAKE_BUILD_TYPE=Release \ + -DWITH_FLUID_ONLY=ON \ + -DWITH_SWIG_PY=OFF \ + -DWITH_PYTHON=OFF \ + -DWITH_MKL=OFF \ + -DWITH_GPU=OFF \ + .. + make + make inference_lib_dist + +成功编译后,使用C++预测库所需的依赖(包括:(1)编译出的PaddlePaddle预测库和头文件;(2)第三方链接库和头文件;(3)版本信息与编译选项信息) +均会存放于PADDLE_ROOT目录中。目录结构如下: + + .. code-block:: text + + PaddleRoot/ + ├── CMakeCache.txt + ├── paddle + │   └── fluid + │   ├── framework + │   ├── inference + │   ├── memory + │   ├── platform + │   ├── pybind + │   └── string + ├── third_party + │   ├── boost + │   │   └── boost + │   ├── eigen3 + │   │   ├── Eigen + │   │   └── unsupported + │   └── install + │   ├── gflags + │   ├── glog + │   ├── mklml + │   ├── protobuf + │   ├── snappy + │   ├── snappystream + │   └── zlib + └── version.txt + +version.txt 中记录了该预测库的版本信息,包括Git Commit ID、使用OpenBlas或MKL数学库、CUDA/CUDNN版本号,如: + + .. code-block:: text + + GIT COMMIT ID: c95cd4742f02bb009e651a00b07b21c979637dc8 + WITH_MKL: ON + WITH_GPU: ON + CUDA version: 8.0 + CUDNN version: v5 From f2f7fbb3ea913222394eb70e292c6d866a233fa6 Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Sat, 30 Jun 2018 10:05:07 +0800 Subject: [PATCH 3/3] Follow comment --- paddle | 2 +- source/advanced_usage/deploy/native_inference_engine.rst | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/paddle b/paddle index 494cecd650ab8..653686c753304 160000 --- a/paddle +++ b/paddle @@ -1 +1 @@ -Subproject commit 494cecd650ab89b10a24784399a98aae904256c4 +Subproject commit 653686c753304f1b1d2a433cae96b96434e6c2d6 diff --git a/source/advanced_usage/deploy/native_inference_engine.rst b/source/advanced_usage/deploy/native_inference_engine.rst index 0521eb03265f2..e1eee3f818796 100644 --- a/source/advanced_usage/deploy/native_inference_engine.rst +++ b/source/advanced_usage/deploy/native_inference_engine.rst @@ -4,9 +4,8 @@ Paddle 预测 API 为了更简单方便的预测部署,Fluid 提供了一套高层 API 用来隐藏底层不同的优化实现。 -预测库相关代码位于 -https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/contrib/inference -,其中发布的包括 +`预测库相关代码 `__ +包括 - 头文件 ``paddle_inference_api.h`` 定义了所有的接口 - 库文件\ ``libpaddle_fluid.so`` 或 ``libpaddle_fluid.a``