Paddle Inference 是飞桨的原生推理库, 提供服务器端的高性能推理能力,直接基于飞桨的训练算子,因此它支持飞桨训练出的所有模型的推理;Paddle Inference 功能特性丰富,性能优异,针对不同平台不同的应用场景进行了深度的适配优化,做到高吞吐、低时延,保证了飞桨模型在服务器端即训即用,快速部署。
但由于Paddle Inference目前只提供了Python、C++、C、Go语言方法接口,C#无法直接使用。近几年以来 ,C#语言快速发展,并跻身于编程语言排行榜前几名的位置,为了能够在C#语言中调用Paddle Inference模型推理库,根据C++动态链接库的原理,推出PaddleInferenceSharp,实现直接在C#平台调用Paddle Inference部署深度学习模型。其实现原理可以参考下图:
为了防止复现代码出现问题,列出以下代码开发环境,可以根据自己需求设置。
此处最重要的是需要安装Paddle Inference C++版,具体安装方式可以参考下面的连接:Paddle Inference C++ 依赖库安装(Windows)。对于其他依赖项安装可以参考以下链接:NVIDIA TensorR 安装 (Windows C++)、OpenCV C++安装和配置。
项目所使用的源码均已经在Github和Gitee上开源,
Github:
git clone https://github.com/guojin-yan/PaddleInferenceSharp.git
Gitee:
git clone https://gitee.com/guojin-yan/PaddleInferenceSharp.git
序号 | API | 参数解释 | 说明 | |
---|---|---|---|---|
1 | 方法 | PaddleInfer() | 构造函数,初始化推理核心,读取本地模型 | |
参数 | string model_path | 静态图模型文件 | ||
string params_path | 模型配置文件信息,默认为空 | |||
2 | 方法 | void set_divice() | 设置推理设备 | 支持 CPU、GPU、ONNX runtime、oneDNN |
参数 | Divice divice | 设备名称选择 | ||
int num | 对于CPU、ONNX runtime代表线程数,默认为10; 对于GPU代表显卡编号,默认为0; 对于oneDNN代表cache数量,默认为1 |
|||
ulong memory_init_size | 显存分配空间(在使用GPU时作用),默认为500 | |||
int workspace_size | 显存工作空间(在使用GPU时作用),默认为30 | |||
3 | 方法 | List <string> get_input_names() | 获取输入节点名字 | |
4 | 方法 | void set_input_shape() | 设置输入节点形状 | 根据节点维度设置 |
参数 | int[] input_shape | 形状数组 | ||
string input_name | 节点名称 | |||
5 | 方法 | void load_input_data() | 设置图片/普通输入数据 | 方法重载 |
参数 | string input_name | 输入节点名称 | ||
float[] input_data | 输入数据 | |||
参数 | string input_name | 输入节点名称 | ||
byte[] image_data | 图片数据 | |||
ulong image_size | 图片长度 | |||
int type | 数据处理类型: type == 0: 均值方差归一化、直接缩放 type == 1: 普通归一化、直接缩放 type == 2: 均值方差归一化、仿射变换 |
|||
6 | 方法 | void infer() | 模型推理 | |
7 | 方法 | List <string> get_output_names() | 获取输出节点名字 | |
8 | 方法 | List <int> get_shape() | 获取指定节点形状 | |
参数 | string node_name | 节点名称 | ||
9 | 方法 | void T[] read_infer_result <T>() | 读取推理结果数据 | 支持读取Float32、Int32、Int64格式数据 |
参数 | string output_name | 输出节点名 | ||
int data_size | 输出数据长度 | |||
10 | 方法 | void delet() | 删除内存地址 |
序号 | 枚举名 | 枚举变量 | 含义 |
---|---|---|---|
1 | Divice 设备名称 |
CPU | 使用CPU推理 |
GPU | 使用GPU推理 | ||
ONNX_runtime | 使用ONNX_runtime推理 | ||
oneDNN | 使用oneDNN推理 |
关于上述方法的使用,后续会更新县官的案例教程以及详细的技术文档,敬请期待。