未验证 提交 af00ed0e 编写于 作者: M MissPenguin 提交者: GitHub

add tipc doc for cpp infer (#5371)

* add tipc doc for cpp infer

* add images

* fix

* fix

* fix
上级 2939c8d8
# C++预测测试开发规范
## 目录
- [0.概述](#概述)
- [1.总览](#总览)
- [1.1 全链条自动化测试](#全链条自动化测试)
- [1.2 文本检测样板间概览](#文本检测样板间概览)
- [2.全链条规范接入流程](#全链条规范接入流程)
- [2.1 规范化输出预测日志](#规范化输出预测日志)
- [2.2 准备测试模型和数据](#准备测试模型和数据)
- [2.3 编写自动化测试代码](#编写自动化测试代码)
- [3.附录:自动化测试脚本test_inference_cpp.sh 函数介绍](#附录)
<a name="概述"></a>
## 0. 概述
训推一体认证(TIPC)旨在监控框架代码更新可能导致的**模型训练、预测报错、性能下降**等问题。本文主要介绍TIPC中**C++预测测试**的接入规范和监测点,是在[基础测试]()上针对C++测试的补充说明。
主要监控的内容有:
- 飞桨框架更新后,代码仓库模型的C++预测是否能正常走通;(比如API的不兼容升级)
- 飞桨框架更新后,代码仓库模型的C++预测速度是否合理;
为了能监控上述问题,希望把代码仓库模型的C++预测测试加到飞桨框架的CI和CE中,提升PR合入的质量。因此,需要在代码仓库中加入运行脚本(不影响代码仓库正常运行),完成模型的自动化测试。
可以建立的CI/CE机制包括:
1. **全量数据走通开源模型C++预测,并验证模型预测速度和精度是否符合设定预期;(单模型30分钟内)**
a. 保证预测结果正确,预测速度符合预期(QA添加中)
注:由于CI有时间限制,所以在测试的时候需要限制运行时间,所以需要构建一个很小的数据集完成测试。
<a name="总览"></a>
## 1. 总览
### 1.1 全链条自动化测试
本规范测试的链条如下(其中相邻两个模块之间是两两组合关系),可以根据代码仓库需要,适当删减链条。
![](images/tipc_cpp_infer.png)
上图各模块具体测试点如下:
- slim模型选型方面:
- **非量化模型(必选)**
- 量化模型(可选)
- Paddle C++ inference 预测部署方面:
- **Linux GPU上不同batchsize,是否开启TensorRT,不同预测精度(FP32,FP16,INT8)的运行状态(必选)**
- **Linux CPU上不同batchsize,是否开启MKLDNN,不同预测精度(FP32,FP16,INT8)的运行状态(必选)**
- Win GPU,macOS CPU和Win CPU(可选)
### 1.2 文本检测样板间概览
在PaddleOCR中,以文本检测为例,提供了本规范的样板间,可以完成概述部分提到的1种CI/CE机制。
C++预测测试工具位于PaddleOCR dygraph分支下的[test_tipc目录](https://github.com/PaddlePaddle/PaddleOCR/tree/dygraph/test_tipc),与C++预测样板间相关的主要文件如下:
```
test_tipc/
├── configs/ # 配置文件目录
├── ppocr_det_mobile # ppocr_det_mobile模型的测试配置文件目录
├── model_linux_gpu_normal_normal_infer_cpp_linux_gpu_cpu.txt # 测试Linux上c++预测的配置文件
├── results/ # 预先保存的预测结果,用于和实际预测结果进行精读比对
├── cpp_ppocr_det_mobile_results_fp32.txt # 预存的mobile版ppocr检测模型c++预测的fp32精度的结果
├── cpp_ppocr_det_mobile_results_fp16.txt # 预存的mobile版ppocr检测模型c++预测的fp16精度的结果
├── prepare.sh # 完成test_*.sh运行所需要的数据和模型下载
├── test_inference_cpp.sh # 测试c++预测的主程序
├── compare_results.py # 用于对比log中的预测结果与results中的预存结果精度误差是否在限定范围内
└── readme.md # 使用文档
```
不同代码仓库的`configs``results`目录下的内容可根据实际情况进行调整。
配置文件`model_linux_gpu_normal_normal_infer_cpp_linux_gpu_cpu.txt`需满足[TIPC配置文件命名规范](https://github.com/PaddlePaddle/PaddleOCR/tree/dygraph/test_tipc#%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E5%91%BD%E5%90%8D%E8%A7%84%E8%8C%83)
<a name="C++预测接入TIPC流程"></a>
## 2. C++预测接入TIPC流程
C++预测接入TIPC包含如下三个步骤,接下来将依次介绍这三个部分。
- 规范化输出预测日志
- 准备测试模型和数据
- 编写自动化测试代码
<a name="规范化输出预测日志"></a>
### 2.1 规范化输出预测日志
类似于python预测等基础测试,C++预测测试也需要规范不同代码仓库中Paddle Inference预测输出的格式,方便QA统一自动化测试。针对C++的预测log规范输出工具也已集成到[AutoLog工具包](https://github.com/LDOUBLEV/AutoLog)
C++测试要求规范输出预测结果及以下信息:
- 运行的硬件,CPU还是GPU
- 运行配置信息,是否开启了IR 优化、TRT、MKLDNN,以及具体使用的线程数
- 运行的模型名称
- 运行的数据信息,包括batch size,数据量
- 性能信息,inference 各阶段平均预测时间
- 单张图片的预测结果
代码主要修改有三步:编译中引入auto_log类,预测耗时打点和打印输出信息。
1.`external-cmake`目录中引入日志打印工具[`autolog`](https://github.com/LDOUBLEV/AutoLog/blob/main/auto_log/autolog.h),并在`CMakeLists.txt`中进行配置。
`external-cmake/auto-log.cmake`内容如下,[查看完整源码](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/deploy/cpp_infer/external-cmake/auto-log.cmake)
```
find_package(Git REQUIRED)
include(FetchContent)
set(FETCHCONTENT_BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}/third-party")
FetchContent_Declare(
extern_Autolog
PREFIX autolog
GIT_REPOSITORY https://github.com/LDOUBLEV/AutoLog.git
GIT_TAG main
)
FetchContent_MakeAvailable(extern_Autolog)
```
`CMakeLists.txt`中进行配置,[查看完整源码](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/deploy/cpp_infer/CMakeLists.txt#L210)
```
include(FetchContent)
include(external-cmake/auto-log.cmake)
include_directories(${FETCHCONTENT_BASE_DIR}/extern_autolog-src)
```
2.添加预测耗时打点:
(1)在模型预测中,统计前处理,预测,后处理时间,可参考[代码](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/deploy/cpp_infer/src/ocr_det.cpp#L171)
(2)在main函数中使用autolog工具打印日志,参考[代码](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/deploy/cpp_infer/src/main.cpp#L122)。主要包括:
- 引入头文件:
```
#include "auto_log/autolog.h"
```
- 调用AutoLogger类打印日志:
```
if (FLAGS_benchmark) {
AutoLogger autolog("ocr_det",
FLAGS_use_gpu,
FLAGS_use_tensorrt,
FLAGS_enable_mkldnn,
FLAGS_cpu_threads,
1,
"dynamic",
FLAGS_precision,
time_info,
cv_all_img_names.size());
autolog.report();
}
```
3.打印输出信息:
按照上述两步添加预测耗时打点和日志打印工具后,运行程序可打印出如下格式日志:
![](images/tipc_cpp_infer_log.png)
4.预测结果格式规范化:
(1)预先保存预测结果,作为校验预测结果是否正确的groundtruth。预测结果可以保存为两个,分别是FP32精度下预测的输入,和FP16预测精度下的输出结果。以OCR 为例,在`PaddleOCR/test_tipc/results`文件夹下存放了两个txt文件,分别是:
```
cpp_ppocr_det_mobile_results_fp32.txt
cpp_ppocr_det_mobile_results_fp16.txt
```
里面按行存储每张测试图片的预测结果,格式如下:
![](images/tipc_cpp_infer_gt.png)
(2)在运行日志中打印预测结果,或者保存在txt文件中,确保可以用python加载到输出并和预先保存的预测的结果进行对比。以PP-OCR检测为例,日志中的预测结果打印格式如下:
![](images/tipc_cpp_infer_res.png)
(3)预测精度比对。分别读取预测日志文件中的预测结果和预先保存在txt文件中的预测结果,验证两个结果是否是一致的。【验证是否一致的步骤可以在QA测试时完成,但是线下需要自测通过】
结果对比脚本可以参考代码:https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/test_tipc/compare_results.py
<a name="准备测试模型和数据"></a>
### 2.2 准备测试模型和数据
与python训练预测等基础测试方式类似,使用脚本`prepare.sh`可以下载测试所需推理模型和数据(可以直接使用python预测所准备的数据集)。`prepare.sh` 根据不同的运行模式,配合从配置文件中解析得到的模型区别性名称,下载不同的数据和训练模型用于完成后续测试。
![](images/tipc_cpp_infer_prepare.png)
<a name="编写自动化测试代码"></a>
### 2.3 编写自动化测试代码
C++预测的自动化测试代码在脚本[test_inference_cpp.sh](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/test_tipc/test_inference_cpp.sh)中,其中包含`编译opencv(可选)``编译可执行文件``运行测试`三个部分。
C++预测自动化测试的运行命令如下:
```shell
bash test_tipc/test_inference_cpp.sh test_tipc/configs/ppocr_det_mobile/model_linux_gpu_normal_normal_infer_cpp_linux_gpu_cpu.txt
```
理论上只需要修改配置文件和`prepare.sh`就可以完成自动化测试,本节将详细介绍如何修改配置文件,完成C++预测测试。运行脚本`test_inference_cpp.sh`将会在附录中详细介绍。
按如下方式在参数文件`model_linux_gpu_normal_normal_infer_cpp_linux_gpu_cpu.txt`中添加C++预测部分参数:
![](images/tipc_cpp_infer_params.png)
参数说明:
|行号 | 参数 | 参数介绍 |
|---|---|---|
|2 | model_name: ocr_det | 模型名称,该参数会在prepare.sh脚本中用到|
|3 | use_opencv: True/False | 表示是否使用use_opencv,如果代码仓库没有这个参数,可以设置为null。不需要opencv时,会跳过编译opencv的步骤|
|4 | infer_model: ./inference/ch_ppocr_mobile_v2.0_det_infer/ | 模型路径 |
|5 | infer_quant: True/False | 54行设置的模型路径是否是量化模型 |
|6 | inference: ./deploy/cpp_infer/build/ppocr det| C++预测命令|
|7 | --use_gpu:True|False | 设置GPU的参数,其他代码仓库可能是device参数,用于设置不同硬件的参数,作用类似。设置多个配置时,中间用|隔开,会分别运行不同配置下的预测 | --device:cpu|gpu|
|8 | --enable_mkldnn:True|False | 设置是否开启mkldnn |
|9 | --cpu_threads:1|6 | 设置CPU线程数,如果要测试CPU上不同线程下的预测速度和精度,可以设置多个值,不同值用|隔开 |
|10 | --rec_batch_num:1 | 设置batch_size 的参数 |
|11 | --use_tensorrt:False|True | 设置开启TRT的参数 |
|12 | --precision:fp32|fp16| 设置开启TRT后预测精度的参数 | --precision:fp32|int8|fp16 |
|13 | --det_model_dir: | 设置加载inference模型路径的参数,无需设置:后的部分 | null: |
|14 | --image_dir:./inference/ch_det_data_50/all-sum-510/ | 设置预测的数据路径 |
|15 | null:null | 预留位置,无需理会 | null:null:null |
|16 | --benchmark:True | 设置是否开启AutoLog的参数 |
<a name="附录"></a>
## 3. 附录:C++预测自动化测试脚本test_inference_cpp.sh 函数介绍
[C++预测核心函数](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/test_tipc/test_inference_cpp.sh#L43)
- func_cpp_inference() :执行C++预测的函数,如果是GPU上,会测试是否开启TensorRT和不同精度,不同batch_size下的情况;如果是CPU,会测试是否开启mkldnn,不同CPU线程数,不同batch_size下的情况。另外,如果是量化模型,则仅测试CPU+mkldnn和GPU+TensorRT+int8的组合。
[编译opencv](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/test_tipc/test_inference_cpp.sh#L116)
- 如果不需要opencv,如语音或nlp任务,删除本段代码即可。
- 需要编译opencv时,首先检查是否已经存在指定版本的opencv,比较md5,如果已有,则跳过编译,避免多次测试时重复下载和编译。
[编译可执行文件](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/test_tipc/test_inference_cpp.sh#L158)
- 可根据实际任务调整编译选项。
# 目录
- [1.背景](#背景)
- [2.目录与命名规范](#目录与命名规范)
- [3.文档规范](#文档规范)
- [3.1 主文档规范](#主文档规范)
- [3.2 子文档规范](#子文档规范)
<a name="背景"></a>
# 1. 背景
各代码仓库完成TIPC训推一体认证工具开发后,同时需要提供相应的**TIPC测试文档**,方便用户查阅每种模型的推理部署打通情况,并可以按照教程进行一键测试。
本文将**TIPC测试文档**的书写格式进行规范化,分为`目录规范``文档规范`两部分。
<a name="目录与命名规范"></a>
# 2. 目录与命名规范
**训推一体认证(Training and Inference Pipeline Certification(TIPC))工具目录统一命名为`test_tipc`**,位于代码仓库根目录下,下面以[PaddleOCR样板间](https://github.com/PaddlePaddle/PaddleOCR/tree/dygraph/test_tipc)为例说明目录结构规范。
```
test_tipc/
├── configs/ # 配置文件目录
├── ppocr_det_mobile # ppocr_det_mobile模型的测试配置文件目录
├── det_mv3_db.yml # 测试mobile版ppocr检测模型训练的yml文件
├── train_infer_python.txt.txt # 测试Linux上python训练预测(基础训练预测)的配置文件
├── model_linux_gpu_normal_normal_infer_cpp_linux_gpu_cpu.txt # 测试Linux上c++预测的配置文件
├── model_linux_gpu_normal_normal_infer_python_jetson.txt # 测试Jetson上python预测的配置文件
├── train_linux_gpu_fleet_amp_infer_python_linux_gpu_cpu.txt # 测试Linux上多机多卡、混合精度训练和python预测的配置文件
├── ...
├── ppocr_det_server # ppocr_det_server模型的测试配置文件目录
├── ...
├── ppocr_rec_mobile # ppocr_rec_mobile模型的测试配置文件目录
├── ...
├── ppocr_rec_server # ppocr_rec_server模型的测试配置文件目录
├── ...
├── ...
├── results/ # 预先保存的预测结果,用于和实际预测结果进行精读比对
├── python_ppocr_det_mobile_results_fp32.txt # 预存的mobile版ppocr检测模型python预测fp32精度的结果
├── python_ppocr_det_mobile_results_fp16.txt # 预存的mobile版ppocr检测模型python预测fp16精度的结果
├── cpp_ppocr_det_mobile_results_fp32.txt # 预存的mobile版ppocr检测模型c++预测的fp32精度的结果
├── cpp_ppocr_det_mobile_results_fp16.txt # 预存的mobile版ppocr检测模型c++预测的fp16精度的结果
├── ...
├── prepare.sh # 完成test_*.sh运行所需要的数据和模型下载
├── test_train_inference_python.sh # 测试python训练预测的主程序
├── test_inference_cpp.sh # 测试c++预测的主程序
├── test_serving.sh # 测试serving部署预测的主程序
├── test_lite_arm_cpu_cpp.sh # 测试lite在arm_cpu上部署的C++预测的主程序
├── compare_results.py # 用于对比log中的预测结果与results中的预存结果精度误差是否在限定范围内
└── readme.md # 使用文档
```
主要关注:
1. 所有工具位于`test_tipc`目录下,`test_tipc`目录位于代码仓库根目录下;
2. `results`目录存放精度测试所需的gt文件;
3. `doc`目录存放readme.md以外的其他子文档;
4. `prepare.sh`用于准备测试所需的模型、数据等;
5. `test_*.sh`为测试主程序,按照功能分为多个文件,命名格式为`test_[功能]_[语言].sh`
6. `configs`目录存放测试所需的所有配置文件,该目录下,按模型名称划分为子目录,子目录中存放所有该模型测试需要用到的配置文件,配置文件的命名遵循如下规范:
- 基础训练预测配置简单命名为:`train_infer_python.txt`,表示**Linux环境下单机、不使用混合精度训练+python预测**,其完整命名对应`train_linux_gpu_fleet_amp_infer_python_linux_gpu_cpu.txt`,由于本配置文件使用频率较高,这里进行了名称简化。
- 其他带训练配置命名格式为:`train_训练硬件环境(linux_gpu/linux_dcu/…)_是否多机(fleet/normal)_是否混合精度(amp/normal)_预测模式(infer/lite/serving/js)_语言(cpp/python/java)_预测硬件环境(linux_gpu/mac/jetson/opencl_arm_gpu/...).txt`。如,linux gpu下多机多卡+混合精度链条测试对应配置 `train_linux_gpu_fleet_amp_infer_python_linux_gpu_cpu.txt`,linux dcu下基础训练预测对应配置 `train_linux_dcu_normal_normal_infer_python_dcu.txt`
- 仅预测的配置(如serving、lite等)命名格式:`model_训练硬件环境(linux_gpu/linux_dcu/…)_是否多机(fleet/normal)_是否混合精度(amp/normal)_(infer/lite/serving/js)_语言(cpp/python/java)_预测硬件环境(linux_gpu/mac/jetson/opencl_arm_gpu/...).txt`,即,与2相比,仅第一个字段从train换为model,测试时模型直接下载获取,这里的“训练硬件环境”表示所测试的模型是在哪种环境下训练得到的。
<a name="文档规范"></a>
# 3. 文档规范
<a name="主文档规范"></a>
## 3.1 主文档规范
文档按以下格式进行撰写:
**推理部署导航**
**1. 简介**
- 内容:主要说明背景,各代码仓库应该差异不大。
- 示例:![](images/tipc_guide.png)
**2. 汇总信息**
- 内容:给出代码仓库所有模型的预测部署打通情况汇总信息,表格形式呈现,须包含`算法论文``模型名称``基础训练预测``更多训练方式``模型压缩``其他预测部署`这6个必选字段。
- 算法论文:该模型对应的算法,可以是算法简称;
- 模型名称:与代码仓库提供模型的名称对应;
- 基础训练预测:基础功能的支持情况,包括模型训练、Paddle Inference Python预测的支持情况,是所有代码仓库所有模型必须支持的功能。本字段有`"支持"``空缺`两种取值。
- 更多训练方式:包括多机多卡、混合精度。
- 模型压缩:包括裁剪、离线/在线量化、蒸馏。
- 其他预测部署:补充功能的支持情况,包括Paddle Inference C++预测、Paddle Serving部署、Paddle-Lite部署等,是各代码仓库可选支持的功能。填入已支持的功能,尚未支持的不填即可。支持的功能后注明硬件(lite相关)、语言等信息。
- 示例:![](images/tipc_table.png)
- **注意**:表格内填“支持“或填入了信息均表示可以使用本工具进行一键测试,代码仓库已支持但尚未接入测试的,都算还不支持,不应填写。
**3. 一键测试工具使用**
目录介绍:测试工具树状图,介绍各目录/文件的功能,示例:
![图片](images/tipc_dir_tree.png)
测试流程:测试流程整体说明,可参考[PaddleOCR样板间](https://github.com/PaddlePaddle/PaddleOCR/tree/dygraph/test_tipc#%E6%B5%8B%E8%AF%95%E6%B5%81%E7%A8%8B)
![图片](images/tipc_test_pipeline.png)
**最后需给出跳转链接,到每个test_*.sh的子文档**,如:
![图片](images/tipc_more_tutorial.png)
<a name="子文档规范"></a>
## 3.2 子文档规范
请参考子文档规范文档:
- [基础训练预测测试文档规范]()
- [cpp预测测试文档规范]()
- [serving测试文档规范]()
- [lite测试文档规范]()
# 背景
基础训练文档对应C++预测功能测试,主程序为`test_inference_cpp.sh`。本文介绍C++预测功能测试文档的撰写规范。
# 文档规范
本文档和[基础训练预测文档]()大体结构类似,主要去掉了训练相关的部分,文档目录结构如下:
### 1.测试结论汇总
内容:基于训练是否使用量化,可以将训练产出的模型可以分为`正常模型``量化模型`,表格形式给出这两类模型对应的预测功能汇总情况,包含`模型类型``device``batchsize``tensorrt``mkldnn``cpu多线程`这6个字段。
- 模型类型:“正常模型”或“量化模型”;
- device:CPU或GPU,其他字段取值对应本字段指定的环境;
- batchsize:一般包括1、6两种batchsize,根据实际支持情况填写。
- tensorrt:开启tensorrt支持的精度,包括`fp32``fp16``int8`三种,当device为CPU时,本字段填`-`
- mkldnn:开启mkldnn支持的精度,包括`fp32``fp16``int8`三种,当device为GPU时,本字段填`-`
- cpu多线程:支持时填`支持`,不支持时留空即可,当device为GPU时,本字段填`-`
示例:
![](images/tipc_cpp_infer_table.png)
### 2.测试流程
#### 2.1 功能测试
内容1:给出C++预测具体测试命令。
示例:
![](images/tipc_cpp_infer_shell.png)
内容2:给出预测log的解读指引。
示例:
![](images/tipc_cpp_infer_output.png)
#### 2.2 精度测试
内容:给出精度测试的具体命令和运行结果示例。
示例:
![](images/tipc_infer_compare_results.png)
### 3.更多教程
内容:给出代码仓库中基础训练预测的具体教程链接。
示例:
![](images/tipc_cpp_infer_more.png)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册