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查看,模型的输入、输出名称,模型的输入维度,模型的输出维度等信息,如下图所示。
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