一:Paddle Inference推理 简介
Paddle Inference 是飞桨的原生推理库,提供服务器端的高性能推理能力。由于 Paddle Inference 能力直接基于飞桨的训练算子,因此它支持飞桨训练出的所有模型的推理。
Paddle Inference 功能特性丰富,性能优异,针对不同平台不同的应用场景进行了深度的适配优化,做到高吞吐、低时延,保证了飞桨模型在服务器端即训即用,快速部署。
Paddle Inference 推理流程 :
推理具体流程:
1. 准备模型
Paddle Inference原生支持由PaddlePaddle深度学习框架训练产出的推理模型。PaddlePaddle用于推理的模型分别通过paddle.jit.save(动态图)与paddle.static.save_inference_model(静态图)或paddle.Model().save(高层API)保存下来的。如果手中的模型是通过TnesorFlow、Pytorch等框架训练出来的,可以使用X2Paddle工具将模型转换为PaddlePaddle格式。
更详细的模型导出模型请参考模型导出文档。
可使用模型可视化工具来查看模型结构,已确认符合组网预期。
2. 准备环境
参照PaddlePaddle安装 页面,通过下载预编译库或者源码编译的方式准备Paddle Inference 的基础开发环境。
3.开发推理流程
Paddle Inference 采用 Predictor 进行推理。Predictor 是一个高性能推理引擎,该引擎通过对计算图的分析,完成对计算图的一系列的优化(如 OP 的融合、内存 / 显存的优化、 MKLDNN,TensorRT 等底层加速库的支持等),能够大大提升推理性能。
开发推理程序只需要简单的 5 个步骤 (这里以 C++ API 为例):
-
配置推理选项
paddle_infer::Config
,包括设置模型路径、运行设备、开启/关闭计算图优化、使用MKLDNN / TensorRT
进行部署的加速等。 -
创建推理引擎
paddle_infer::Predictor
,通过调用CreatePredictor(Config)
接口,一行代码即可完成引擎初始化,其中Config
为第1步中生成的配置推理选项。准备输入数据,需要以下几个步骤
-
将原始输入数据根据模型需要做相应的预处理,比如减均值等标准化操作
-
先通过
auto input_names = predictor->GetInputNames()
获取模型所有输入Tensor
的名称 -
再通过
auto tensor = predictor->GetInputTensor(input_names[i])
获取输入Tensor
的指针 -
最后通过
tensor->copy_from_cpu(data)
,将预处理之后的数据data
拷贝到tensor
中
-
-
执行推理,只需要运行
predictor->Run()
一行代码,即可完成推理执行。获得推理结果并进行后处理,需要以下几个步骤:
-
先通过
auto out_names = predictor->GetOutputNames()
获取模型所有输出Tensor
的名称 -
再通过
auto tensor = predictor->GetOutputTensor(out_names[i])
获取输出Tensor
的 指针 -
最后通过
tensor->copy_to_cpu(data)
,将tensor
中的数据copy
到data
指针上 -
可以使用与训练完全相同的输入数据进行推理并对比结果一致性,或者批量推理验证数据集并计算模型精度的方式来判断推理结果的正确性。
-
将模型推理输出数据进行后处理,比如根据检测框位置裁剪图像等
-
4.推理示例
Paddle Inference 提供了 C++, Python 两种 API 的使用示例和开发说明文档,您可以参考示例中的说明快速了解使用方法,并集成到您自己的项目中去。
- c++示例
- python示例
5.性能优化
1)根据实际场景开启相应的推理优化配置项
以C++API 为例,根据实际场景开启相关的优化开关,示例如下,具体参考C++API 文档。
- CPU 推理:
EnableMKLDNN
、EnableMkldnnBfloat16
、SetCpuMathLibraryNumThreads
、EnableONNXRuntime
等 - GPU 推理:
EnableTensorRtEngine
等 - 基础优化:
SwitchIrOptim
、EnableMemoryOptim
等
参考系统调优概述使用混合精度推理和多线程推理。
2) 使用 PaddleSlim 进行模型小型化
如果开启以上相关优化配置后,还需要进一步提升推理性能,可以在我们提供的深度学习模型压缩工具库 PaddleSlim
的帮助下,通过低比特量化、知识蒸馏、稀疏化和模型结构搜索等方式,进行模型小型化。
下一节:
paddle模型的保存及加载API详解