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。
一个请求可以让Triton推理一个模型,也可以让Triton推理几个模型组成的pipeline,也就是Ensemble Models
。用户可以定义一个配置文件,把多个模型或者多个处理组装成一个pipeline,比如:pre-processing > inference > post-processing
,这样一个请求就能得到跑完所有模型和处理的响应结果。在pipeline中,模型和模型之间的数据传输完全是由Triton负责,所以让Triton去跑完pipeline中的所有模型和处理肯定是要比单独一个模型一个请求来的快速高效。
Triton中一个模型或者一个处理对应一个文件目录:
/
/
config.pbtxt
1/
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: 2
kind: KIND_GPU
}
]
backend: "onnxruntime"
就是指定backend,如果是其他的模型格式,比如PyTorch,TensorRT和TensorFlow,对应的就是pytorch
,tensorrt
和tensorflow
。
Ensemble Models的配置文件一般是下面的格式:
name: "attention_rescoring"
platform: "ensemble"
max_batch_size: 64 #MAX_BATCH
input [
...
]
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
。
client请求调用可以参考WeNet项目:https://github.com/wenet-e2e/wenet/blob/main/runtime/gpu/client/client.py。WeNet里用的GRPC client。
Triton Server的启动可以参考WeNet项目:https://github.com/wenet-e2e/wenet/blob/main/runtime/gpu/tensorrt/run_streaming_small_model.sh#L118
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