Skip to content

Latest commit

 

History

History

manufacture_sdk

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

工业级多端多平台预编译部署开发包

PaddleX-Deploy全面升级,支持飞桨视觉套件PaddleX、PaddleDetection、PaddleClas、PaddleSeg的统一部署能力,端到端打通PaddleInference、PaddleLite、OpenVINO、Triton等多种高性能预测引擎,如果需要从源码编译使用,可至目录PaddlePaddle模型C++部署

在工业部署的开发过程中,常常因环境问题导致在部署代码编译环节中耗费较多的时间和人力成本。如果产线上的业务逻辑稍微复杂一点,尤其是串联多个模型时,则需要在模型推理前插入预处理、中间结果处理等操作,如此复杂的逻辑对应的部署代码开发工程量是很大的。

为更进一步地提升部署效率,❤️ PaddleX部署全新发布Manufacture SDK,提供工业级多端多平台部署加速的预编译飞桨部署开发包(SDK),通过配置业务逻辑流程文件即可以低代码方式快速完成推理部署。❤️

目录

1 Manufactue SDK简介

PaddleX Manufacture基于PaddleX-Deploy的端到端高性能部署能力,将应用深度学习模型的业务逻辑抽象成Pipeline,而接入深度学习模型前的数据前处理、模型预测、模型串联时的中间结果处理等操作都对应于Pipeline中的节点PipelineNode,用户只需在Pipeline配置文件中编排好各节点的前后关系,就可以给Pipeline发送数据并快速地获取相应的推理结果。Manufacture SDK的架构设计如下图所示:

  • PaddleX Pipeline:完成业务逻辑的推理预测,同时提供向其发送数据和获取结果的接口。
  • PaddleX Config: 定义Pipeline的节点类型和前后关系。
  • PaddleX Node:功能节点,例如图像解码节点、图像缩放节点、兴趣区域提取节点、模型推理节点。
  • PaddleX Deploy:高性能模型推理能力。

以PaddleX导出后的单一检测模型(无数据前处理、无中间结果处理)为例,配置好流程配置文件后使用简单几行代码就可以完成预测:

2 下载安装Manufacture SDK

Manufature SDK的文件夹结构如下所示:

PaddleXManufacture
├── demo              # 使用PaddleXManufacture的demo
├── include           # 存放PaddleXManufacture的头文件
├── lib               # 存放PaddleXManufacture的链接库
├── share             # 用于find_package
├── third_party       # 依赖的第三方库,paddle推理引擎、yaml-cpp、mkl等
└── version.txt       # 版本信息

下载安装Windows Manufacture SDK

版本说明 Manufacture SDK 编译器 构建工具 cuDNN CUDA TensorRT
v1.0 PaddleXManufacture_win64_210_cuda102_cudnn76_trt70 gcc 8.2 cmake+vs2019 7.6 10.2 7.0

下载安装Linux Manufacture SDK

版本说明 Manufacture SDK 编译器 构建工具 cuDNN CUDA TensorRT
v1.0 PaddleXManufacture_linux_paddle210_cuda102_cudnn8_trt72 gcc 8.2 cmake 8 10.2 7.2

3 Pipeline配置文件说明

PaddleX的模型导出后都会在模型文件夹中自动生成一个名为pipeline.yml流程编排文件,下面展示单一检测模型的流程配置文件:

pipeline_name: detector
pipeline_nodes:
- src0:
    next: decode0
    type: Source
- decode0:
    next: predict0
    type: Decode
- predict0:
    init_params:
      gpu_id: 0
      model_dir: test_inference/inference_model
      use_gpu: false
      use_trt: false
    next: sink0
    type: Predict
- sink0:
    type: Sink
version: 1.0.0

从上面示例可以看出,Pipeline配置文件是一个存储字典的yaml文件,文件中必须包含pipeline_namepipeline_nodes两个关键字。每个关键词和键值说明如下:

关键字 键值
pipeline_name Pipeline的名称
pipeline_nodes Pipeline的节点列表。列表中必须包含输入节点(Source)和输出节点(Sink)列表中每个节点还是一个字典,关键字是该节点的名字,键值用于定义节点类型(type)、节点初始化参数(init_params)、连接的下一个节点的名字(next),需要注意的是,每个节点的名字是独语无二的

4 Pipeline Node说明

目前支持的功能节点有:输入、图像解码、图像缩放、感兴趣区域提取、模型推理、检测框过滤、检测/分割结果可视化、输出。各功能节点的类型、初始化参数说明如下:

功能类型 type 功能作用 初始化参数 init_params 下一个节点 next 上一个节点
Source 接收Pipeline所需的输入数据 str/List(str): 可以是单个节点名字或多个节点名字组成的列表
Decode 图像解码 str/List(str): 可以是单个节点名字或多个节点名字组成的列表 只能有一个
Resize 图像大小缩放 width (int): 目标宽;
height (int): 目标高;
interp (int):差值类型,默认为1
str/List(str): 可以是单个节点名字或多个节点名字组成的列表 只能有一个
Predict PaddleX导出的分类/检测/分割模型预测 model_dir (str): PaddleX导出后的模型文件夹所在路径;
use_gpu (bool): 是否使用GPU,默认为false
gpu_id (int):GPU卡号,在use_gputrue时有效;
use_trt (bool): 是否开启TensorRT加速GPU端预测
str/List(str): 可以是单个节点名字或多个节点名字组成的列表 只能有一个
FilterBbox 过滤置信度低于阈值的检测框 score_thresh (float): 置信度阈值 str/List(str): 可以是单个节点名字或多个节点名字组成的列表 只能有一个
RoiCrop 感兴趣区域提取 str/List(str): 可以是单个节点名字或多个节点名字组成的列表 必须有两个:能给出图像数据的节点、能给出检测模型预测结果的节点
Visualize 目标检测/实例分割/语义分割模型预测结果可视化 save_dir (str): 存储可视化结果的文件夹路径 无 (可视化结果只能本地保存) 必须有两个:能给出图像数据的节点、能给目标检测/实例分割/语义分割模型预测结果的节点
Sink 获取Pipeline的输出数据 只能有一个

注意:上一个节点不需要在Pipeline配置文件中指定,只需要指定下一个节点即可,实际运行时程序解析连接至上一个节点

使用Pipeline部署

在部署之前,请确保已经进行了部署模型导出步骤。如果没有,请参考文档部署模型导出完成部署模型的导出。

我们在SDK下载包里放置了demo目录,下面以该demo为例讲解如何使用Pipeline部署。

一. 代码调用 —— 只需关注这几个接口: 初始化、设置输入、推理运行、获取输出 (demo/pipeline_infer.cpp)

#include "pipeline/include/pipeline.h"  // Pipline 入口头文件

std::vector<std::string> image_paths = {image_path};  // 输入图片地址
PaddleXPipeline::Pipeline pipeline;                   // 创建Pipeline实例
pipeline.Init(pipeline_cfg);                          // 初始化Pipeline, pipeline_cfg为上文所说的Pipeline配置文件
pipeline.SetInput("src0", image_paths);               // 设置输入, src0为上文配置文件中的输入节点名
pipeline.Run();                                       // 推理接口
std::vector<PaddleDeploy::Result> results;            // 初始化结果
pipeline.GetOutput("sink0", &results);                // 获取结果并存入参数results中, sink0为配置中的输出节点
std::cout << results[0] << std::endl;                 // 打印结果

二. 如何编写CMakeLists.txt —— 使用find_package轻松搞定 (demo/CMakeLists.txt)

# PADDLEX_DIR 为下载并解压的Manufacture SDK的目录
find_package(PaddleXManufacture REQUIRED PATHS ${PADDLEX_DIR}/share NO_DEFAULT_PATH)
include_directories(${PaddleXManufacture_INCLUDE_DIRS})
set(DEPS ${DEPS} ${PaddleXManufacture_LIBS})

SDK的预处理中使用了OpenCV, 所以需要额外下载链接:

windows环境OpenCV下载地址

ubuntu 16.04环境OpenCV下载地址

使用GPU、TensorRT版,需要额外链接CUDA、cuDNN 和TensorRT。本地安装链接的CUDA、cuDNN、TensorRT的版本一定要跟SDK编译时所使用的版本一致。

具体可参考SDK下载包中的demo/CMakeLists.txt

三.编译运行

windows编译可以看表计读数案例

linux上需要修改CMakeLists.txt 各个库位置,然后执行一下几行命令:

mkdir -p build
cd build
cmkae ..
make

编译后会在build目录生成 pipeline_infer.exe 或 pipeline_infer 可执行文件, 运行命令:

# pipeline_cfg 填pipeline配置文件路径
# image        填图片路径
pipeline_infer --pipeline_cfg /path/pipeline.yaml --image /path/image.png

多模型串联的工业表计读数部署

多模型串联可以看我们的表计读数案例, 里边有详细的部署介绍。