high_level_api_cn.md 3.0 KB
Newer Older
Y
Yan Chunwei 已提交
1 2 3 4 5 6 7
# Paddle 预测 API

为了更简单方便的预测部署,Fluid 提供了一套高层 API 用来隐藏底层不同的优化实现。

预测库包含:

- 头文件 `paddle_inference_api.h` 定义了所有的接口
8
- 库文件 `libpaddle_inference.so/.a(Linux/Mac)` `libpaddle_inference.lib/paddle_inference.dll(Windows)` 
Y
Yan Chunwei 已提交
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

下面是详细的一些 API 概念介绍

## PaddleTensor

PaddleTensor 定义了预测最基本的输入输出的数据格式,其定义是

```c++
struct PaddleTensor {
  std::string name;  // variable name.
  std::vector<int> shape;
  PaddleBuf data;  // blob of data.
  PaddleDType dtype;
};
```

- `name` 用于指定输入数据对应的 模型中variable 的名字 (暂时没有用,但会在后续支持任意 target 时启用)
- `shape` 表示一个 Tensor 的 shape
- `data`  数据以连续内存的方式存储在`PaddleBuf` 中,`PaddleBuf` 可以接收外面的数据或者独立`malloc`内存,详细可以参考头文件中相关定义。
- `dtype` 表示 Tensor 的数据类型

## engine

32
高层 API 底层有多种优化实现,我们称之为 engine,目前有两种 engine
Y
Yan Chunwei 已提交
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64

- 原生 engine,由 paddle 原生的 forward operator 组成,可以天然支持所有paddle 训练出的模型,
- TensorRT mixed engine,用子图的方式支持了 [TensorRT](https://developer.nvidia.com/tensorrt) ,支持所有paddle 模型,并自动切割部分计算子图到 TensorRT 上加速(WIP)

其实现为

```c++
enum class PaddleEngineKind {
  kNative = 0,       // Use the native Fluid facility.
  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 =
T
tangwei12 已提交
65
      paddle::CreatePaddlePredictor<paddle::NativeConfig, paddle::PaddleEngineKind::kNative>(config);
Y
Yan Chunwei 已提交
66 67 68 69
// 创建输入 tensor
int64_t data[4] = {1, 2, 3, 4};
paddle::PaddleTensor tensor{.name = "",
                            .shape = std::vector<int>({4, 1}),
T
tangwei12 已提交
70 71
                            .data = paddle::PaddleBuf(data, sizeof(data)),
                            .dtype = paddle::PaddleDType::INT64};
Y
Yan Chunwei 已提交
72 73 74 75 76 77 78
// 创建输出 tensor,输出 tensor 的内存可以复用
std::vector<paddle::PaddleTensor> outputs;
// 执行预测
CHECK(predictor->Run(slots, &outputs));
// 获取 outputs ...
```

79
编译时,联编 `libpaddle_inference.a/.so(Linux/Mac)``libpaddle_inference.lib/paddle_inference.dll(Windows)` 便可。
Y
Yan Chunwei 已提交
80 81 82

## 详细代码参考

L
Luo Tao 已提交
83 84
- [inference demos](./demo_ci)
- [复杂单线程/多线程例子](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/inference/api/test_api_impl.cc)