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 参考项目

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容