本文档将介绍如何基于Docker快速将Paddle转换的ONNX模型部署到Triton服务上。 并以ResNet50模型为例, 讲述整个流程。点击下载模型
拉取 Triton Docker镜像之前,首先需要安装Docker,如果需要使用GPU预测请安装NVIDIA Container Toolkit。
拉取镜像的命令:
<xx.yy>
指的是你需要拉取的Triton docker版本,目前支持20.11
,所以请手动替换<xx.yy>
为20.11
。- 镜像后缀为
-py3
为Triton的服务端(server),-py3-clientsdk
为Triton的客户端(client)。
docker pull nvcr.io/nvidia/tritonserver:<xx.yy>-py3
docker pull nvcr.io/nvidia/tritonserver:<xx.yy>-py3-clientsdk
在启动Triton服务之前,我们需要准备模型库,主要包括模型文件,模型配置文件和标签文件等。模型库的概念和使用方法请参考model_repository,模型配置文件涉及到需要关键的配置,更详细的使用方法可参考model_configuration。 以PaddleClas中的ResNet50模型为例, 模型库的详细构成如下。
完整的模型库目录结构如下:
model_repository # 模型库目录
-- resnet50_onnx # 要加载的模型目录
|-- 1 # 模型版本号, 默认加载最高版本
| |-- model.onnx # ResNet50转换后的onnx模型
-- config.pbtxt # 模型配置文件
-- model2 # 如果有多个模型目录,会同时加载多个模型
|-- 1
| |-- model.onnx
-- config.pbtxt
模型配置文件config.pbtxt按需填写,最基本配置如下,如需要更高级配置请参考model_configuration。
name: "resnet50_onnx" # 模型名, 需与外层目录名一致
platform: "onnxruntime_onnx" # 使用的推理引擎
max_batch_size : 0 # 最大的batch数, 0为不限制
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]
}
]
注意: ONNX 模型可以通过设置启动参数,自动生成最基本配置文件,这样可不用在模型目录中填写config.pbtxt文件
启动时设置 --strict-model-config=false
# 例如
docker run --gpus=1 --rm -p8000:8000 -p8001:8001 -p8002:8002 -v /path/to/model_repository/:/model_repository/ nvcr.io/nvidia/tritonserver:<xx.yy>-py3 tritonserver --model-repository=/model_repository/ --strict-model-config=false
# 可通过curl指令获取配置文件
curl localhost:8000/v2/models/<model name>/config
# resnet50例子
curl localhost:8000/v2/models/resnet50_onnx/config
1.通过PaddleClas模型部署指南 得到Paddle Inference类型的ResNet50模型,其他套件模型请参考:PaddleDetection模型部署指南 、PaddleSeg模型部署指南
ResNet50
|-- model.pdiparams # 静态图模型参数
|-- model.pdiparams.info # 参数额外信息,一般无需关注
|-- model.pdmodel # 静态图模型文件
|-- resnet50_imagenet.yml # 配置文件
2.将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
注意:
- 留意模型转换的输出,根据提示调整opset_version的值
- paddle inference模型中配置文件(如 resnet50_imagenet.yml)在进行推理请求时会用到
经过Triton的优化可以使用GPU提供极佳的推理性能,且可以在仅支持CPU的系统上工作。以上两种情况下,我们都可以使用上述的Triton Docker镜像部署。
使用以下命令对刚刚创建的ResNet模型库运行Triton服务。必须安装NVIDIA Container Toolkit,Docker才能识别GPU。 --gpus = 1参数表明Triton可以使用1块GPU进行推理。
docker run --gpus=1 --rm -p8000:8000 -p8001:8001 -p8002:8002 -v /path/to/model_repository/:/model_repository/
nvcr.io/nvidia/tritonserver:<xx.yy>-py3 tritonserver --model-repository=/model_repository/
启动Triton之后,您将在控制台上看到如下输出,显示服务器正在启动并加载模型。当您看到如下输出时,Triton已加载好模型,可进行推理请求。
+----------------------+---------+--------+
| Model | Version | Status |
+----------------------+---------+--------+
| <model_name> | <v> | READY |
| .. | . | .. |
| .. | . | .. |
+----------------------+---------+--------+
...
...
...
I1002 21:58:57.891440 62 grpc_server.cc:3914] Started GRPCInferenceService at 0.0.0.0:8001
I1002 21:58:57.893177 62 http_server.cc:2717] Started HTTPService at 0.0.0.0:8000
I1002 21:58:57.935518 62 http_server.cc:2736] Started Metrics Service at 0.0.0.0:8002
Triton会逐个目录加载模型,如果加载不成功,则会报告失败以及失败的原因。所有模型均应显示“ READY”状态,表示已正确加载。如果您的模型未显示在表中,请检查模型库和CUDA驱动程序的路径。
在没有GPU的系统上,请在不使用--gpus参数的情况下运行,其他参数与上述启动GPU部署服务的命令一致。
docker run --rm -p8000:8000 -p8001:8001 -p8002:8002 -v /path/to/model_repository/:/model_repository/
nvcr.io/nvidia/tritonserver:<xx.yy>-py3 tritonserver --model-repository=/model_repository/
使用Triton的ready接口来验证服务器和模型是否已准备好进行推断
curl -v localhost:8000/v2/health/ready
打印:
...
< HTTP/1.1 200 OK
< Content-Length: 0
< Content-Type: text/plain
推理请求需要基于Triton的客户端代码,对部署代码进行编译。
git clone https://github.com/PaddlePaddle/PaddleX.git
cd PaddleX
git checkout deploykit
启动容器时,需要-v参数把部署代码挂载进容器
# 启动前需把paddle模型的配置文件移到挂载目录,ResNet50模型为例
mv ResNet50/resnet50_imagenet.yml /path/to/PaddleX/deploy/cpp
# 启动容器
docker run -it --net=host nvcr.io/nvidia/tritonserver:<xx.yy>-py3-clientsdk -v /path/to/PaddleX/:/PaddleX/ bash
打开项目路径,运行编译脚本
cd /PaddleX/deploy/cpp/
sh scripts/triton_build.sh --triton_client=/workspace/install/
编译后会在PaddleX/deploy/cpp/build/demo
目录下生成model_infer
可执行二进制文件示例,用于进行模型预处理、推理请求以及后处理。
以ResNet50为例,执行下面的指令即可进行推理请求。
./build/demo/model_infer --image resnet50/test.jpeg --cfg_file resnet50/infer_cfg.yml --url localhost:8000 --model_name resnet50_onnx --model_type clas
参数说明
参数名称 | 含义 |
---|---|
model_name | 模型名称 |
url | 服务的远程IP地址+端口,如:localhost:8000 |
model_version | 模型版本号,默认为1 |
cfg_file | Paddle Inference模型配置文件路径,如resnet50/infer_cfg.yml |
image | 需要预测的单张图片的文件路径 |
image_list | 待预测的图片路径列表文件路径,列表里每一行是一张图片的文件路径 |
model_type | 模型来源,det/seg/clas/paddlex,分别表示模型来源于PaddleDetection、PaddleSeg、PaddleClas和PaddleX |