Triton部署PPOCRv4模型

目录

简介

Triton Inference Server安装

Paddle模型转TensorRT模型

1)导出ONNX模型

2)使用trtexec将ONNX模型转为.plan模型

TensorRT模型部署

Triton Client推理


简介

本文介绍如何使用Triton模型推理框架来部署百度的PPOCRv4模型。主要包括Triton Inference Server安装、PPOCRv4的Paddle模型转TensorRT模型、TensorRT模型部署和模型推理验证。

部署环境如下:

操作系统:Ubuntu18.04、显卡:Nvidia RTX3080,Cuda: 11.1

Triton镜像版本:nvcr.io/nvidia/tritonserver:20.11-py3

Triton Inference Server安装

使用Triton Docker镜像方法安装,首先必须安装Nvidia Docker

1)拉取Triton Docker镜像

docker pull nvcr.io/nvidia/tritonserver:22.02-py3

2)运行Triton镜像

sudo docker run --gpus all 
--rm -p8000:8000 -p8001:8001 -p8002:8002 /   # 不同协议对应端口号
-v/data/models:/models /  # 存放模型的文件,data是宿主机目录
-v/data/plugins:/plugins /
--env LD_PRELOAD=/plugins/libmyplugins.so 
nvcr.io/nvidia/tritonserver:20.11-py3 tritonserver #镜像名字
--model-repository=/models

Paddle模型转TensorRT模型

Github拉取PaddlePaddleOCR项目,然后按照官方文档说明配置好项目环境。按照官方文档将PPOCRv4模型导出为onnx模型。

1)导出ONNX模型

# 检测模型导出ONNX

paddle2onnx --model_dir ./model/ch_PP-OCRv4_det_server_infer \

--model_filename inference.pdmodel \

--params_filename inference.pdiparams \

--save_file ./model/ch_PP-OCRv4_det_server_infer.onnx \

--opset_version 10 \

--input_shape_dict="{'x':[-1,3,-1,-1]}" \

--enable_onnx_checker True
# 识别模型导出ONNX

paddle2onnx --model_dir ./model/ch_PP-OCRv4_rec_server_infer \

--model_filename inference.pdmodel \

--params_filename inference.pdiparams \

--save_file ./model/ch_PP-OCRv4_rec_server_infer.onnx \

--opset_version 10 \

--input_shape_dict="{'x':[-1,3,-1,-1]}" \

--enable_onnx_checker True

转换后得到检测和识别模型的onnx文件:

ch_PP-OCRv4_det_server_infer.onnx

ch_PP-OCRv4_rec_server_infer.onnx

2)使用trtexec将ONNX模型转为.plan模型

使用tensorRT的trtexec工具将onnx模型转换为rt模型,Triton镜像中包含tensorRT,进入Triton镜像,trtexec在/usr/ src/tensorrt/bin/trtexec下,运行如下命令:

ONNX转.plan指令:(注意不要加:--best --workspace=1024,参数,加了该参数后,得到的模型是混合精度FP32+FP16+INT8,且模型大小会变小,然后预测精度就会下降

# 检测模型

trtexec --onnx=./model/ ch_PP-OCRv4_det_server_infer.onnx \

--saveEngine=./model/ ch_PP-OCRv4_det_server_infer.plan \

--minShapes=x:1x3x160x640 \

--optShapes=x: 1x3x160x640 \

--maxShapes=x: 1x3x160x640

# 识别模型

trtexec --onnx=./model/ch_PP-OCRv4_rec_server_infer.onnx \

--saveEngine=./model/ch_PP-OCRv4_rec_server_infer.plan \

--minShapes=x:1x3x48x320 \  # 识别模型要转成48*320的,48*100宽度太小

--optShapes=x:1x3x48x320 \

--maxShapes=x:1x3x48x320

转换后得到检测和识别模型的.plan文件:

ch_PP-OCRv4_det_server_infer.plan

ch_PP-OCRv4_rec_server_infer.plan

TensorRT模型部署

把模型和对应的配置文件放在宿主机目录中(比如:data/models)。然后重起Triton镜像,Triton Inference Server就会加载对应目录下的模型。

docker restart tritonserver  # 重启Triton镜像

model文件夹结构:

model
    └─model_name
        └─1(版本)
            └─model.plan(必须是model)
        └─config.pbtxt(模型的配置文件)

PPOCRv4检测模型config.pbtxt:

platform: "tensorrt_plan"
max_batch_size : 0
input [
  {
    name: "x"
    data_type: TYPE_FP32
    dims: [ 1, 3, 320, 320 ]
  }
]
output [
  {
    name: "save_infer_model/scale_0.tmp_1"
    data_type: TYPE_FP32
    dims: [ 1, 1, 320, 320 ]
  }
]

PPOCRv4识别模型config.pbtxt:

platform: "tensorrt_plan"
max_batch_size : 0
input [
  {
    name: "x"
    data_type: TYPE_FP32
    dims: [ 1,3,32,100 ]
  }
]
output [
  {
    name: "save_infer_model/scale_0.tmp_1"
    data_type: TYPE_FP32
    dims: [ 1,25,6625 ]
  }
]

其中:

platform是模型对应的平台,不同模型的存储格式都有对应的值。具体如下表。

input、output包括输入输出的节点名称、数据类型、数据维度。(可以使用网站:Netron 查看对应的onnx模型得到)

Triton Client推理

Triton镜像重启成功后,可以使用Triton Client来调用模型进行推理,验证模型是否正常加载。这里使用python来实现,需要自己写模型的前后处理,riton server推理仅仅是做了模型的前向传播的工作。由于PPOCRv4检测和识别模型的后处理比较长,这边没办法把所有的代码都贴出来,需要的可以评论或者私信作者。

部分调用Triton识别模型推理代码:

 def get_img_res(self, img, process_op):
        h, w = img.shape[:2]
        img = self.resize_norm_img(img, w * 1.0 / h)
        img = img[np.newaxis, :]
   
        # rt模型推理
        triton_client = get_triton_client()
        INPUT_HEIGHT = 48
        INPUT_WIDTH = 100

        model_name = "rec_sever_v4_plan"

        inputs = []
        outputs = []
        inputs.append(grpcclient.InferInput('x', [1, 3, INPUT_HEIGHT, INPUT_WIDTH], "FP32"))
        outputs.append(grpcclient.InferRequestedOutput('save_infer_model/scale_0.tmp_1'))
        outputs.append(grpcclient.InferRequestedOutput('softmax_2.tmp_0'))  # V4识别模型输出节点名称

        # 前处理 相关程序
        inputs[0].set_data_from_numpy(img)

        # Test with outputs
        results = triton_client.infer(model_name=model_name,
                                      inputs=inputs,
                                      outputs=outputs,
                                      client_timeout=5,
                                      )
        result = results.as_numpy('softmax_2.tmp_0')  # V4识别模型输出节点名称
        print(result.shape)
        result = process_op(result)
        return result

结果展示:

DeepStream是一个用于视频分析的应用程序框架,而Triton是一个用于推理部署的开源平台。结合使用DeepStream和Triton可以实现高效的视频分析和推理部署。下面提供一个简单的教程,帮助你了解如何使用DeepStream和Triton进行部署。 1. 安装DeepStream 首先,你需要安装DeepStream。你可以从NVIDIA的官方网站下载最新版本的DeepStream,也可以使用包管理器进行安装。 2. 安装Triton 接下来,你需要安装Triton。你可以从NVIDIA的官方网站下载最新版本的Triton,也可以使用包管理器进行安装。安装完成后,你需要启动Triton服务。 3. 创建DeepStream应用程序 创建一个DeepStream应用程序,用于将视频流发送到Triton进行推理。你可以使用DeepStream SDK提供的示例代码作为基础,或者根据自己的需求编写应用程序。 4. 配置DeepStream 在DeepStream应用程序中,你需要配置DeepStream管道,将视频流发送到Triton进行推理。在配置文件中,你需要指定Triton服务器的IP地址和端口号,以及模型的名称和版本号。 5. 部署模型 使用Triton客户端将模型部署Triton服务器上。你需要指定模型的名称、版本号、输入和输出格式等信息。部署完成后,你可以使用DeepStream应用程序发送视频流进行推理。 6. 运行DeepStream 运行DeepStream应用程序,将视频流发送到Triton进行推理。你可以使用DeepStream提供的命令行工具或者API进行控制和管理。 以上是一个简单的教程,帮助你了解如何使用DeepStream和Triton进行部署。当然,具体的实现细节还需要根据你的具体需求进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值