本文档将介绍如何基于Docker快速使用TensorRT部署Paddle转换的ONNX模型。并以ResNet50模型为例,讲述整个流程。点击下载模型
拉取TensorRT Docker镜像之前,首先需要安装Docker,如果需要使用GPU预测请安装NVIDIA Container Toolkit。
拉取镜像的命令:
<xx.yy>指的是你需要拉取的Tensorrt 镜像版本,以20.11为例,手动替换<xx.yy>为20.11:
$ docker pull nvcr.io/nvidia/tensorrt:<xx.yy>-py3
创建一个名为 tesnorrt-onnx 的Docker容器:
$ docker run -it --gpus=all --name tensorrt-onnx -v ~/paddle2onnx/:/paddle2onnx/ --net=host nvcr.io/nvidia/tensorrt:20.11-py3 /bin/bash
拉取项目代码、TensorRT代码(依赖头文件)。进入项目路径,运行编译脚本
$ git clone https://github.com/PaddlePaddle/PaddleX.git
$ cd PaddleX
$ git checkout deploykit
$ cd deploy/cpp
$ git clone https://github.com/NVIDIA/TensorRT.git
# 如果不是其他版本的容器, 将cuda_dir路径换成自己的cuda路径即可
$ sh scripts/tensorrt_build.sh --tensorrt_dir=/usr/lib/x86_64-linux-gnu/ --cuda_dir=/usr/local/cuda-11.1/targets/x86_64-linux/ --tensorrt_header=./TensorRT/
以ResNet50为例:
通过PaddleClas模型部署指南 得到Paddle Inference类型的ResNet50模型,其他套件模型请参考:PaddleDetection模型部署指南 、PaddleSeg模型部署指南
ResNet50
|-- model.pdiparams # 静态图模型参数
|-- model.pdiparams.info # 参数额外信息,一般无需关注
|-- model.pdmodel # 静态图模型文件
|-- resnet50_imagenet.yml # 配置文件
将paddle inference模型转为onnx模型, 详细可参考Paddle2ONNX文档
ResNet50模型转换如下,转换后模型输出在 onnx_models/resnet50_onnx/model.onnx。
paddle2onnx --model_dir path/to/ResNet50 --save_file onnx_models/resnet50_onnx/model.onnx --opset_version 9 --enable_onnx_checker True --model_filename model.pdmodel --params_filename model.pdiparams
注意:
resnet50_imagenet.yml)包含了前后处理、标签等信息,对转换后的onnx模型进行推理时还会用到。在进行推理前必须在配置文件中添加确定的输入输出信息(包括名字、类型、形状)。
以上述ResNet50模型为例,在resnet50_imagenet.yml中加入输入输出信息(input output字段)后为:
model_format: Paddle
toolkit: PaddleClas
transforms:
BGR2RGB:
"null": true
ResizeByShort:
target_size: 256
interp: 1
use_scale: false
CenterCrop:
width: 224
height: 224
Convert:
dtype: float
input:
- name: "inputs"
data_type: TYPE_FP32
dims:
- 1
- 3
- 224
- 224
output:
- name: "save_infer_model/scale_0.tmp_1"
data_type: TYPE_FP32
dims:
- 1
- 1000
labels:
- kit_fox
- English_setter
- Siberian_husky
当前TensorRT部署只支持固定的输入输出,不支持动态形状(shape)。如果转换后的onnx模型的输入是动态输入,需要在配置文件的预处理transforms中加入Resize操作,将所有不同形状的图片转换为固定的形状。
例如PaddleSeg模型部署指南 中导出的DeepLabv3p模型,转换为onnx后是形状为[-1, 3, -1, -1]的动态输入。修改配置文件如下,可将输入固化成[1, 3, 1024, 2048]形状:
Deploy:
model: model.pdmodel
params: model.pdiparams
transforms:
- type: Normalize
- type: Resize
target_size:
- 2048
- 1024
input:
- name: "x"
data_type: TYPE_FP32
dims:
- 1
- 3
- 1024
- 2048
output:
- name: "save_infer_model/scale_0.tmp_1"
data_type: TYPE_FP32
dims:
- 1
- 19
- 1024
- 2048
上述编译后会在PaddleX/deploy/cpp/build/demo目录下生成model_infer可执行二进制文件, 用于模型预测。以ResNet50为例,执行下面的指令进行预测:
./build/demo/model_infer --image resnet50/test.jpeg --cfg_file resnet50/deploy.yml --model_type clas --model_file resnet50/model.onnx
输出如下,结果为: Classify(类别id、标签、置信度)
init ClasModel,model_type=clas
start model init
start engine init
----------------------------------------------------------------
Input filename: resnet50/model.onnx
ONNX IR version: 0.0.7
Opset version: 9
Producer name: PaddlePaddle
Producer version:
Domain:
Model version: 0
Doc string:
----------------------------------------------------------------
WARNING: Logging before InitGoogleLogging() is written to STDERR
start model predict 1
Result for sample 0
Classify(65 Saluki 0.91879153)
参数说明
| 参数名称 | 含义 |
|---|---|
| model_file | onnx模型路径 |
| cfg_file | Paddle Inference模型配置文件路径,如resnet50/deploy.yml |
| image | 需要预测的单张图片的文件路径 |
| image_list | 待预测的图片路径列表文件路径,列表里每一行是一张图片的文件路径 |
| model_type | 模型来源,det/seg/clas/paddlex,分别表示模型来源于PaddleDetection、PaddleSeg、PaddleClas和PaddleX |
| gpu_id | 使用GPU预测时的设备ID,默认为0 |