一、Triton Server
1.1 架构介绍
Triton是一个高性能的推理软件框架,它既支持GPU推理,又支持CPU推理,既能部署在server上,也能部署在端侧设备上。同时,它还支持多种机器学习框架的推理引擎作为backend以及它们对应的模型格式,比如:
backend(inference engine) | model format |
---|---|
TensorRT | .plan |
ONNX Runtime | .onnx |
TensorFlow | .graphdef / .savedmodel |
PyTorch | .pt |
OpenVINO | .xml & .bin |
Python | .py |
Triton的整个架构如下图所示:
client通过HTTP/REST
或GRPC
请求把输入量发送给Triton server,Triton server收到请求后调用对应的backend进行推理,然后把推理结果返回给client。
1.2 Triton Server的主要特性:
- Dynamic Batching: 一般地讲,batch size越大,GPU利用率越高。Triton可以在限定的延迟要求范围内,把来自不同client的多路请求整合成一个batch,然后一起推理,从而提高整体的吞吐量。
- Concurrent Execution: Triton可以在一个GPU上同时运行多个不同模型或者同一个模型的多个副本,只要这些模型的大小总和没有超过GPU的显存容量。通过运行同一个模型的多个副本,可以有效降低对该模型请求的响应延迟。
- Model Analyzer: 对于当前运行的所有模型,Triton会自动地找到运行这些模型的最佳配置,比如:batch size、延迟、吞吐量以及显存使用。通过这样,使得运行的所有模型一直处于最高效的状态。
1.3 Ensemble Models
一个请求可以让Triton推理一个模型,也可以让Triton推理几个模型组成的pipeline,也就是Ensemble Models
。用户可以定义一个配置文件,把多个模型或者多个处理组装成一个pipeline,比如:pre-processing > inference > post-processing
,这样一个请求就能得到跑完所有模型和处理的响应结果。在pipeline中,模型和模型之间的数据传输完全是由Triton负责,所以让Triton去跑完pipeline中的所有模型和处理肯定是要比单独一个模型一个请求来的快速高效。
1.4 配置文件
Triton中一个模型或者一个处理对应一个文件目录:
<model-repository-path>/<model-name>/config.pbtxt1/model.plan
config.pbtxt
就是配置文件,1/
是模型文件子目录,model.plan
是模型文件。模型文件子目录必须是数字而且不能是0
开头,所以会看到很多项目里都是1/
。模型文件子目录存放的就是模型文件,比如model.onnx
,model.pt
等。
单个模型的配置文件一般是下面的格式:
name: "decoder"
backend: "onnxruntime"
default_model_filename: "decoder.onnx"max_batch_size: 640
input [
...
]output [
...
]dynamic_batching {preferred_batch_size: [ 16, 32 ]}instance_group [{count: 2kind: KIND_GPU}
]
backend: "onnxruntime"
就是指定backend,如果是其他的模型格式,比如PyTorch,TensorRT和TensorFlow,对应的就是pytorch
,tensorrt
和tensorflow
。
Ensemble Models的配置文件一般是下面的格式:
name: "attention_rescoring"
platform: "ensemble"
max_batch_size: 64 #MAX_BATCHinput [...
]output [...
]ensemble_scheduling {step [{model_name: "feature_extractor"...},{model_name: "encoder"...},{model_name: "scoring"...}]
}
这里就没有指定backend
,因为pipeline里面不同的模型可能用的是不同的backend
,需要指定的是platform: "ensemble"
。另外有些backend也需要指定platform来区分模型的类别,比如TensorFlow backend,根据模型的类别platform需要设置为tensorflow_savedmodel
或者tensorflow_graphdef
。
1.5 client请求
client请求调用可以参考WeNet项目:https://github.com/wenet-e2e/wenet/blob/main/runtime/gpu/client/client.py。WeNet里用的GRPC client。
1.6 Triton Server的启动
Triton Server的启动可以参考WeNet项目:https://github.com/wenet-e2e/wenet/blob/main/runtime/gpu/tensorrt/run_streaming_small_model.sh#L118
二、TensorRT
TensorRT是专门适用于NVIDIA GPU推理加速的SDK。它包括两部分,一个是模型优化器optimizer,另一个是推理引擎runtime。
optimizer就是通过一些优化手段把.onnx
文件转成.plan
文件。转换过程可以参考K2项目:https://github.com/k2-fsa/sherpa/blob/master/triton/scripts/build_trt.sh
从导出ONNX文件到转成.plan
文件,再到启动Triton Server,一整套流程可以参考K2项目:https://github.com/k2-fsa/sherpa/blob/master/triton/scripts/build_wenetspeech_zipformer_offline_trt.sh
参考资料:
1.https://www.supermicro.com/en/glossary/triton-inference-server
2.https://qiita.com/Getty708/items/b802a54f1f2e9926dfa6
3.https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/backend/README.html#where-can-i-find-all-the-backends-that-are-available-for-triton
4.https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/backend/docs/backend_platform_support_matrix.html
5.https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/backend/README.html#backends
6.https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/user_guide/model_repository.html#model-versions
7.https://vilsonrodrigues.medium.com/a-friendly-introduction-to-tensorrt-building-engines-de8ae0b74038