Triton Inference Serve调研

1 Triton Inference Serve简介

Triton inference serve是NVIDA开源的推理框架,官网Triton Inference Server,具有如下特点:

  • 支持常见深度学习框架导出模型的推理,如 TensorRT, TensorFlow GraphDef, TensorFlow SavedModel, ONNX, PyTorch TorchScript and OpenVINO 等格式。
  • 支持机器学习模型XGBoost, LightGBM, Scikit-Learn的推理。
  • 支持模型管理,如版本控制,动态加载等。
  • 支持动态Batching。
  • 支持模型Ensembling。
  • 提供HTTP/GRPC接口。支持服务器资源统计(metrics)
  • 提供Python和C的客户端,客户端链接

2 Triton Inference Serve 使用

下载tritonserver镜像

首先需要确认tritonserver和CUDA Toolkit、TensorRT版本的对应关系,查看链接: https://docs.nvidia.com/deeplearning/triton-inference-server/release-notes/, 从release note中查找合适的tritonserver版本。docker下载命令:

docker pull nvcr.io/nvidia/tritonserver:21.03-py3  【本文使用的版本】
docker pull nvcr.io/nvidia/tritonserver:21.07-py3 
docker pull nvcr.io/nvidia/tritonserver:21.08-py3 

onnx可视化工具 netron

https://github.com/lutzroeder/Netron 【使用netron查看输入和输出】
通过netron查看,模型的输入、输出名称,模型的输入维度,模型的输出维度等信息,如下图所示。

使用netron查看模型的输入和输出信息

tritonserver的模型仓库构建

请先阅读官方文档,获取更清晰的表述。构建仓库 https://github.com/triton-inference-server/server/blob/main/docs/model_repository.md
tritonserver模型仓库是按照文件目录组织的,如下图所示:

模型仓库结构

图中文件夹名称即为模型的名称,如:alpha_pose_engine_17、yolo3_spp_onnx。模型目录中至少包含模型以及config.pbtxt两个文件,模型单独存放在文件夹中并用数字命名,用来表示模型的版本。其中,engine表示tensorrt格式的模型,onnx表示onnx格式的模型,命名中含有这两个关键字主要为了用来区分不同类型的模型。

PS:模型文件夹中,ONNX模型的默认名称为model.onnx, TensorRT模型的默认名称为model.plan。

tritonserver的配置文件编写

请先阅读官方文档,获取更清晰的表述。配置文件编写 https://github.com/triton-inference-server/server/blob/main/docs/model_configuration.md。

下面分别从yolo3_spp_onnx、yolov3_spp_engine对模型的配置进行说明。

yolo3_spp_onnx配置文件:

name: "yolo3_spp_onnx"
platform: "onnxruntime_onnx"
max_batch_size : 0
input [
  {
    name: "input"
    data_type: TYPE_FP32
    dims: [-1, 3, 608, 608]
  }
]
output [
  {
    name: "output"
    data_type: TYPE_FP32
    dims: [-1, 22743, 85]
    label_filename: "labels.txt"
  }
]
  • name 表示模型名称,和上述的文件夹同名
  • platform 模型的格式,onnxruntime_onnx表示模型是onnx格式表示的。
  • max_batch_size 批处理的最大size,在转换成onnx时,要保证模型是支持动态batch,若不开启,直接设置为0即可。
  • input 模型输入信息,包括输入节点名称、维度、类型。
  • output 模型输出信息,包括输入节点名称、维度、类型。

yolov3_spp_engine配置文件:

name: "yolov3_spp_engine"
platform: "tensorrt_plan"
max_batch_size : 0
input [
  {
    name: "input"
    data_type: TYPE_FP32
    dims: [1, 3, 608, 608]
  }
]
output [
  {
    name: "boxes"
    data_type: TYPE_FP32
    dims: [1, 22743, 85]
    reshape { shape: [1, 22743, 85] }
    label_filename: "labels.txt"
  }
]
  • name 表示模型名称,和上述的文件夹同名
  • platform 模型的格式,tensorrt_plan表示模型是tensorrt格式表示的。
  • max_batch_size 批处理的最大size,在转换成tensorrt时,要保证模型是支持动态batch,若不开启,直接设置为0即可。
  • input 模型输入信息,包括输入节点名称、维度、类型。
  • output 模型输出信息,包括输入节点名称、维度、类型。

tritonserver的启动

请先阅读官方文档,获取更清晰的表述。启动容器 https://github.com/triton-inference-server/server/blob/main/docs/quickstart.md#run-triton。

docker run --gpus=1 --name triton-serve \
-e LD_PRELOAD=/models/yolov3_spp_engine/ScatterND.so \
--rm -p4000:8000 -p4001:8001 -p4002:8002 \
-v /schinper-nfs/george/triton-serve/mmdet/triton-repository:/models nvcr.io/nvidia/tritonserver:21.03-py3  tritonserver --model-repository=/models

启动参数解析:

  • --gpus 指定容器使用的GPU
  • -e指定环境变量,有些tensorrt可能使用了预定义的差价,需要通过LD_PRELOAD指定环境变量,用于提前加载模型,否则会出错。
  • --rm 程序退出后,删除容器
  • -v 映射模型路径

停止并清理

docker stop triton-serve && docker rm triton-serve

tritonserver的启动成功示意图

启动成功后,会显示如下信息:

I1212 02:55:59.033293 1 server.cc:570] 
+--------------------------+---------+--------+
| Model                    | Version | Status |
+--------------------------+---------+--------+
| alpha_pose_engine_17     | 1       | READY  |
| alpha_pose_engine_dyn_17 | 1       | READY  |
| alpha_pose_onnx_17       | 1       | READY  |
| faster_rcnn_cat_dog_onnx | 1       | READY  |
| yolo3_spp_onnx           | 1       | READY  |
| yolov3_spp_engine        | 1       | READY  |
+--------------------------+---------+--------+

I1212 02:55:59.033567 1 tritonserver.cc:1658] 
+----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
| Option                           | Value                                                                                                                                              |
+----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
| server_id                        | triton                                                                                                                                             |
| server_version                   | 2.8.0                                                                                                                                              |
| server_extensions                | classification sequence model_repository schedule_policy model_configuration system_shared_memory cuda_shared_memory binary_tensor_data statistics |
| model_repository_path[0]         | /models                                                                                                                                            |
| model_control_mode               | MODE_NONE                                                                                                                                          |
| strict_model_config              | 1                                                                                                                                                  |
| pinned_memory_pool_byte_size     | 268435456                                                                                                                                          |
| cuda_memory_pool_byte_size{0}    | 67108864                                                                                                                                           |
| min_supported_compute_capability | 6.0                                                                                                                                                |
| strict_readiness                 | 1                                                                                                                                                  |
| exit_timeout                     | 30                                                                                                                                                 |
+----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+

I1212 02:55:59.035356 1 grpc_server.cc:3983] Started GRPCInferenceService at 0.0.0.0:8001
I1212 02:55:59.035866 1 http_server.cc:2717] Started HTTPService at 0.0.0.0:8000
I1212 02:55:59.078263 1 http_server.cc:2736] Started Metrics Service at 0.0.0.0:8002

测试服务是否正常启动

curl -v localhost:4000/v2/health/ready  #

PS: 8000为http的GRPC端口,8001为GRPC服务端口,8002为资源监控信息获取服务端口。

3 Triton Inference Serve 的客户端使用

请先阅读客户端项目: tritonclient

tritonclient的使用非常简单,按照官方提供的示例,调用GRPC或者REST接口即可,难点在于需要清楚的了解模型的输入、输出,同时自己编写模型的预处理和模型的后处理

4 参考项目

  • AlphaPose_TRT转换后的模型:https://github.com/oreo-lp/AlphaPose_TRT
  • Yolov4 on triton: https://github.com/isarsoft/yolov4-triton-tensorrt
  • 安装tensorrt:https://zhuanlan.zhihu.com/p/392143346
  • mmdetection转tensorrt:https://github.com/grimoire/mmdetection-to-tensorrt
  • mmdetection转onnx官方文档:https://github.com/open-mmlab/mmdetection/blob/15f188208a61ccf64a2464cef69c137b33531e2d/docs/tutorials/pytorch2onnx.md#results-and-models

你可能感兴趣的:(Triton Inference Serve调研)