目录
简介
本文介绍如何使用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
结果展示: