Skip to content

Commit

Permalink
Merge pull request PaddlePaddle#44 from qili93/add_api
Browse files Browse the repository at this point in the history
[DOC] Add CXX and Python API Doc
  • Loading branch information
qili93 authored Nov 27, 2020
2 parents 452ddf0 + d354fcb commit ab80d89
Show file tree
Hide file tree
Showing 36 changed files with 2,823 additions and 50 deletions.
7 changes: 7 additions & 0 deletions docs/_static/theme_overrides.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
code, .rst-content tt, .rst-content code {
white-space: normal;
}

.rst-content .section ol p, .rst-content .section ul p {
margin-bottom: 2px;
}
1 change: 0 additions & 1 deletion docs/api_reference/cxx_api_doc.md

This file was deleted.

119 changes: 119 additions & 0 deletions docs/api_reference/cxx_api_doc/Config/CPUConfig.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
# 使用 CPU 进行预测

**注意:**
1. 在 CPU 型号允许的情况下,进行预测库下载或编译试尽量使用带 AVX 和 MKL 的版本
2. 可以尝试使用 Intel 的 MKLDNN 进行 CPU 预测加速,默认 CPU 不启用 MKLDNN
3. 在 CPU 可用核心数足够时,可以通过设置 `SetCpuMathLibraryNumThreads` 将线程数调高一些,默认线程数为 1

## CPU 设置

API定义如下:

```c++
// 设置 CPU Blas 库计算线程数
// 参数:cpu_math_library_num_threads - blas库计算线程数
// 返回:None
void SetCpuMathLibraryNumThreads(int cpu_math_library_num_threads);

// 获取 CPU Blas 库计算线程数
// 参数:None
// 返回:int - cpu blas库计算线程数。
int cpu_math_library_num_threads() const;
```
代码示例:
```c++
// 创建默认 Config 对象
paddle_infer::Config config();
// 设置 CPU Blas 库线程数为 10
config.SetCpuMathLibraryNumThreads(10);
// 通过 API 获取 CPU 信息
int num_thread = config.cpu_math_library_num_threads();
std::cout << "CPU blas thread number is: " << num_thread << std::endl; // 10
```

## MKLDNN 设置

**注意:**
1. 启用 MKLDNN 的前提为已经使用 CPU 进行预测,否则启用 MKLDNN 无法生效
2. 启用 MKLDNN BF16 要求 CPU 型号可以支持 AVX512,否则无法启用 MKLDNN BF16
3. `SetMkldnnCacheCapacity` 请参考 <a class="reference external" href="https://github.com/PaddlePaddle/FluidDoc/blob/develop/doc/fluid/design/mkldnn/caching/caching.md">MKLDNN cache设计文档</a>

API定义如下:

```c++
// 启用 MKLDNN 进行预测加速
// 参数:None
// 返回:None
void EnableMKLDNN();

// 判断是否启用 MKLDNN
// 参数:None
// 返回:bool - 是否启用 MKLDNN
bool mkldnn_enabled() const;

// 设置 MKLDNN 针对不同输入 shape 的 cache 容量大小
// 参数:int - cache 容量大小
// 返回:None
void SetMkldnnCacheCapacity(int capacity);

// 指定使用 MKLDNN 加速的 OP 列表
// 参数:std::unordered_set<std::string> - 使用 MKLDNN 加速的 OP 列表
// 返回:None
void SetMKLDNNOp(std::unordered_set<std::string> op_list);

// 启用 MKLDNN BFLOAT16
// 参数:None
// 返回:None
void EnableMkldnnBfloat16();

// 判断是否启用 MKLDNN BFLOAT16
// 参数:None
// 返回:bool - 是否启用 MKLDNN BFLOAT16
bool mkldnn_bfloat16_enabled() const;

// 指定使用 MKLDNN BFLOAT16 加速的 OP 列表
// 参数:std::unordered_set<std::string> - 使用 MKLDNN BFLOAT16 加速的 OP 列表
// 返回:None
void SetBfloat16Op(std::unordered_set<std::string> op_list);
```
代码示例 (1):使用 MKLDNN 进行预测
```c++
// 创建 Config 对象
paddle_infer::Config config(FLAGS_infer_model + "/mobilenet");
// 启用 MKLDNN 进行预测
config.EnableMKLDNN();
// 通过 API 获取 MKLDNN 启用结果 - true
std::cout << "Enable MKLDNN is: " << config.mkldnn_enabled() << std::endl;
// 设置 MKLDNN 的 cache 容量大小
config.SetMkldnnCacheCapacity(1);
// 设置启用 MKLDNN 进行加速的 OP 列表
std::unordered_set<std::string> op_list = {"softmax", "elementwise_add", "relu"};
config.SetMKLDNNOp(op_list);
```

代码示例 (2):使用 MKLDNN BFLOAT16 进行预测

```c++
// 创建 Config 对象
paddle_infer::Config config(FLAGS_infer_model + "/mobilenet");

// 启用 MKLDNN 进行预测
config.EnableMKLDNN();

// 启用 MKLDNN BFLOAT16 进行预测
config.EnableMkldnnBfloat16();
// 设置启用 MKLDNN BFLOAT16 的 OP 列表
config.SetBfloat16Op({"conv2d"});

// 通过 API 获取 MKLDNN BFLOAT16 启用结果 - true
std::cout << "Enable MKLDNN BF16 is: " << config.mkldnn_bfloat16_enabled() << std::endl;
```
63 changes: 63 additions & 0 deletions docs/api_reference/cxx_api_doc/Config/ConfigClass.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# Config 构造函数

`Config` 类为用于配置构建 `Predictor` 对象的配置信息,如模型路径、是否开启gpu等等。

构造函数定义如下:

```c++
// 创建 Config 对象,默认构造函数
Config();

// 创建 Config 对象,输入为其他 Config 对象
Config(const Config& other);

// 创建 Config 对象,输入为非 Combine 模型的文件夹路径
Config(const std::string& model_dir);

// 创建 Config 对象,输入分别为 Combine 模型的模型文件路径和参数文件路径
Config(const std::string& prog_file, const std::string& params_file);
```
代码示例 (1):默认构造函数,通过API加载预测模型 - 非Combined模型
```c++
// 字符串 model_dir 为非 Combine 模型文件夹路径
std::string model_dir = "../assets/models/mobilenet_v1";
// 创建默认 Config 对象
paddle_infer::Config config();
// 通过 API 设置模型文件夹路径
config.SetModel(model_dir);
// 根据 Config 对象创建预测器对象
auto predictor = paddle_infer::CreatePredictor(config);
```

代码示例 (2):通过构造函数加载预测模型 - 非Combined模型

```c++
// 字符串 model_dir 为非 Combine 模型文件夹路径
std::string model_dir = "../assets/models/mobilenet_v1";

// 根据非 Combine 模型的文件夹路径构造 Config 对象
paddle_infer::Config config(model_dir);

// 根据 Config 对象创建预测器对象
auto predictor = paddle_infer::CreatePredictor(config);
```
代码示例 (3):通过构造函数加载预测模型 - Combined模型
```c++
// 字符串 prog_file 为 Combine 模型文件所在路径
std::string prog_file = "../assets/models/mobilenet_v1/__model__";
// 字符串 params_file 为 Combine 模型参数文件所在路径
std::string params_file = "../assets/models/mobilenet_v1/__params__";
// 根据 Combine 模型的模型文件和参数文件构造 Config 对象
paddle_infer::Config config(prog_file, params_file);
// 根据 Config 对象创建预测器对象
auto predictor = paddle_infer::CreatePredictor(config);
```
Loading

0 comments on commit ab80d89

Please sign in to comment.