1 Triton Inference Serve簡介
Triton inference serve是NVIDA開源的推理框架报破,官網(wǎng)Triton Inference Server,具有如下特點:
- 支持常見深度學(xué)習(xí)框架導(dǎo)出模型的推理随闪,如 TensorRT, TensorFlow GraphDef, TensorFlow SavedModel, ONNX, PyTorch TorchScript and OpenVINO 等格式傲绣。
- 支持機器學(xué)習(xí)模型XGBoost, LightGBM, Scikit-Learn的推理。
- 支持模型管理誓酒,如版本控制鹏浅,動態(tài)加載等诗轻。
- 支持動態(tài)Batching钳宪。
- 支持模型Ensembling。
- 提供HTTP/GRPC接口扳炬。支持服務(wù)器資源統(tǒng)計(metrics)
- 提供Python和C的客戶端吏颖,客戶端鏈接
2 Triton Inference Serve 使用
下載tritonserver鏡像
首先需要確認tritonserver和CUDA Toolkit、TensorRT版本的對應(yīng)關(guān)系恨樟,查看鏈接: 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的模型倉庫構(gòu)建
請先閱讀官方文檔,獲取更清晰的表述匙握。構(gòu)建倉庫 https://github.com/triton-inference-server/server/blob/main/docs/model_repository.md
tritonserver模型倉庫是按照文件目錄組織的咆槽,如下圖所示:
圖中文件夾名稱即為模型的名稱,如:alpha_pose_engine_17圈纺、yolo3_spp_onnx秦忿。模型目錄中至少包含模型以及config.pbtxt兩個文件,模型單獨存放在文件夾中并用數(shù)字命名蛾娶,用來表示模型的版本灯谣。其中,engine表示tensorrt格式的模型蛔琅,onnx表示onnx格式的模型胎许,命名中含有這兩個關(guān)鍵字主要為了用來區(qū)分不同類型的模型。
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北秽,在轉(zhuǎn)換成onnx時,要保證模型是支持動態(tài)batch最筒,若不開啟贺氓,直接設(shè)置為0即可。
- input 模型輸入信息床蜘,包括輸入節(jié)點名稱辙培、維度、類型邢锯。
- output 模型輸出信息扬蕊,包括輸入節(jié)點名稱、維度丹擎、類型尾抑。
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,在轉(zhuǎn)換成tensorrt時护戳,要保證模型是支持動態(tài)batch翎冲,若不開啟,直接設(shè)置為0即可媳荒。
- input 模型輸入信息抗悍,包括輸入節(jié)點名稱、維度钳枕、類型缴渊。
- output 模型輸出信息,包括輸入節(jié)點名稱鱼炒、維度疟暖、類型。
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
啟動參數(shù)解析:
- --gpus 指定容器使用的GPU
- -e指定環(huán)境變量硬爆,有些tensorrt可能使用了預(yù)定義的差價欣舵,需要通過LD_PRELOAD指定環(huán)境變量,用于提前加載模型缀磕,否則會出錯缘圈。
- --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
測試服務(wù)是否正常啟動
curl -v localhost:4000/v2/health/ready #
PS: 8000為http的GRPC端口糟把,8001為GRPC服務(wù)端口绢涡,8002為資源監(jiān)控信息獲取服務(wù)端口。
3 Triton Inference Serve 的客戶端使用
請先閱讀客戶端項目: tritonclient
tritonclient的使用非常簡單遣疯,按照官方提供的示例雄可,調(diào)用GRPC或者REST接口即可,難點在于需要清楚的了解模型的輸入缠犀、輸出数苫,同時自己編寫模型的預(yù)處理和模型的后處理。
4 參考項目
- AlphaPose_TRT轉(zhuǎn)換后的模型: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轉(zhuǎn)tensorrt:https://github.com/grimoire/mmdetection-to-tensorrt
- mmdetection轉(zhuǎn)onnx官方文檔:https://github.com/open-mmlab/mmdetection/blob/15f188208a61ccf64a2464cef69c137b33531e2d/docs/tutorials/pytorch2onnx.md#results-and-models