NVIDIA Triton初体验
背景
借助 NVIDIA Triton™,在任何处理器(GPU、CPU 或其他)上,对使用基于任何框架的,经过训练的机器学习模型或深度学习模型,进行推理部署。Triton 是 NVIDIA AI 平台的一部分,可通过 NVIDIA AI Enterprise 获取。这款开源软件可针对各种工作负载,实现标准化的 AI 模型部署和执行。
特点
支持所有训练和推理框架
使用 Triton,部署基于任何主流框架的 AI 模型,包括 TensorFlow,PyTorch,Python,ONNX,NVIDIA® TensorRT™、RAPIDS™ cuML,XGBoost,scikit-learn RandomForest,OpenVINO,C++ 自定义框架等。
可在任何平台上实现高性能推理
借助动态批处理、并发执行、最佳模型配置,音视频串流输入支持,最大限度地提升吞吐量和资源利用率。Triton 支持所有 NVIDIA GPU,x86 和 Arm® 架构 CPU 以及 AWS Inferentia。
专为 DevOps 和 MLOps 设计的开源软件
可将 Triton 集成到 DevOps 和 MLOps 解决方案中,例如集成到 Kubernetes 实现规模化,或集成到 Prometheus 进行监测。Triton 也可以通过所有主流云平台、本地 AI 平台和 MLOps 平台获取。
企业级安全性、可管理性和 API 稳定性
NVIDIA AI Enterprise(包括 NVIDIA Triton 和 Triton Management Service),是一个安全的、生产就绪型的 AI 软件平台,提供支持、安全性和 API 稳定性,帮助企业加速开发 AI,实现收益。
工具
大型语言模型推理
TensorRT-LLM 是一个开源库,用于定义、优化和执行大型语言模型 (LLM) 在生产环境的推理。它在开源 Python API 中保留了 FasterTransformer 的核心功能,并与 TensorRT 的深度学习编译器配合使用,以快速支持新模型和定制模型。
模型集成
许多现代 AI 工作负载都需要执行多个模型,而且每个查询通常都需要执行预处理和后处理步骤。Triton 支持模型集成和推理管道,能够在 CPU 或 GPU 上执行模型集成的不同环节,并且可以集成多个框架的模型。
基于树的模型
Triton 的 Forest Inference Library(FIL)后端能够在 CPU 和 GPU 上,针对基于树的模型实现高性能推理,同时兼具可解释性(SHAP 值)。该后端支持 XGBoost,LightGBM,scikit-learn RandomForest,RAPIDS cuML RandomForest 框架的模型,以及其他 Treelite 格式的模型。
NVIDIA PyTriton
PyTriton 提供了一个简单的接口,以便 Python 开发者使用 Triton 为模型、简单的处理功能乃至整个推理管道提供服务。Python 这种对 Triton 的原生支持,有助于实现机器学习模型的快速原型和测试,同时兼具性能和效率。只需一行代码即可启用 Triton,获取动态批处理、并发模型执行、以及 GPU 和 CPU 均可支持等收益。这样一来,开发者便无需设置模型库,也无需转换模型格式,现有推理管道的代码无需修改,直接使用。
NVIDIA Triton Model Analyzer
NVIDIA Triton Model Analyzer 是一种工具,能够自动评估 Triton 推理服务器中的模型部署配置,例如目标处理器上的批大小、精度和并发执行实例。此工具有助于选择最优模型配置方案,以便满足应用的服务质量(QoS)要求,例如时延、吞吐量和存储要求,并缩短查找最优配置的时长。此工具还支持模型集成和多模型分析。
初体验
环境
各版本区别:
- year-xy-py3 :包含 Triton 推理服务器,支持 Tensorflow、PyTorch、TensorRT、ONNX 和 OpenVINO 模型;
- year-xy-py3-sdk :包含 Python 和 C++ 客户端库、客户端示例和模型分析器;
- year-xy-tf2-python-py3 :仅支持 TensorFlow 2.x 和 python 后端的 Triton 推理服务器;
- year-xy-pyt-python-py3 :仅支持 PyTorch 和 python 后端的 Triton 服务器;
- year-xy-py3-min :用作创建自定义 Triton 服务器容器的基础,如 Customize Triton Container(自定义Triton容器)说明文件所描述的内容;
[2]
docker pull nvcr.io/nvidia/tritonserver:23.10-py3
基于 ubuntu 22.04
docker pull nvcr.io/nvidia/tritonserver:21.05-py3
docker pull nvcr.io/nvidia/tritonserver:21.05-py3-sdk
基于 ubuntu 20.04.2 LTS
准备示例推理模型
[3]
模型环境
pip install torch==1.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
模型文件
import torch
import torch.nn as nn
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.embedding = nn.Embedding(100, 8)
self.fc = nn.Linear(8, 4)
self.fc_list = nn.Sequential(*[nn.Linear(8, 8) for _ in range(4)])
def forward(self, input_ids):
word_emb = self.embedding(input_ids)
output1 = self.fc(word_emb)
output2 = self.fc_list(word_emb)
return output1, output2
if __name__ == "__main__":
model = SimpleModel()
ipt = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.long)
script_model = torch.jit.trace(model, ipt, strict=True)
torch.jit.save(script_model, "model.pt")
生成模型
[4]
$ python3 model.py
$ ls -lh
total 20K
-rw-rw-r-- 1 service service 16K Nov 13 19:38 model.pt
-rw-rw-r-- 1 service service 717 Nov 13 19:37 model.py
准备示例配置文件
config.pbtxt
内容如下:
name: "fc_model_pt"
platform: "pytorch_libtorch"
max_batch_size : 64
input [
{
name: "input__0"
data_type: TYPE_INT64
dims: [ -1 ]
}
]
output [
{
name: "output__0"
data_type: TYPE_FP32
dims: [ -1, -1, 4 ]
},
{
name: "output__1"
data_type: TYPE_FP32
dims: [ -1, -1, 8 ]
}
]
文件目录结构
$ find model_repository/
model_repository/
model_repository/fc_model_pt
model_repository/fc_model_pt/config.pbtxt.bak
model_repository/fc_model_pt/1
model_repository/fc_model_pt/1/model.pt
model_repository/fc_model_pt/config.pbtxt
启动triton
/opt/tritonserver/bin/tritonserver --model-repository /home/service/var/workspace/model_repository/
结果
I1114 12:59:54.563342 2644 server.cc:586]
+-------------+---------+--------+
| Model | Version | Status |
+-------------+---------+--------+
| fc_model_pt | 1 | READY |
+-------------+---------+--------+
……………………
I1114 12:59:54.566471 2644 grpc_server.cc:4062] Started GRPCInferenceService at 0.0.0.0:8001
I1114 12:59:54.566812 2644 http_server.cc:2887] Started HTTPService at 0.0.0.0:8000
I1114 12:59:54.608318 2644 http_server.cc:2906] Started Metrics Service at 0.0.0.0:8002
测试
curl -XPOST "http://10.5.153.28:8000/v2/models/fc_model_pt/versions/1/infer" -d '
{
"inputs": [
{
"name": "input__0",
"shape": [2, 3],
"datatype": "INT64",
"data": [[1, 2, 3], [4,5,6]]
}
],
"outputs": [
{"name": "output__0"},
{"name": "output__1"}
]
}
'
结果
{"model_name":"fc_model_pt","model_version":"1","outputs":[{"name":"output__0","datatype":"FP32","shape":[2,3,4],"data":[-1.7074081897735596,0.4401533603668213,0.8446651697158814,-0.5325927734375,-0.6631768941879273,-0.8618716597557068,0.11369305849075318,-0.5966331362724304,-0.051912903785705569,0.5555185079574585,0.1968037635087967,-0.27029910683631899,-0.006249755620956421,1.5140212774276734,0.02731955051422119,0.49077045917510989,0.8336622714996338,1.2654310464859009,-0.3692847192287445,0.6608856320381165,-0.5753769278526306,-0.8284984230995178,0.4251091480255127,-0.7369235754013062]},{"name":"output__1","datatype":"FP32","shape":[2,3,8],"data":[-0.7406602501869202,0.9585168361663818,0.03784707188606262,-0.5829362273216248,0.11487382650375366,-0.35772043466567995,0.33995741605758669,0.17169854044914246,-0.18156248331069947,0.23913732171058656,-0.3355589210987091,-0.34801915287971499,-0.4384351670742035,-0.12739092111587525,0.06365928798913956,0.04954097419977188,-0.313204824924469,0.14277362823486329,-0.3719756007194519,-0.4444347620010376,-0.39440056681632998,-0.13739459216594697,0.024220211431384088,0.016839273273944856,-0.27016329765319826,0.20828905701637269,-0.32355839014053347,-0.46160608530044558,-0.4960399568080902,-0.16580379009246827,-0.16772229969501496,0.24529409408569337,-0.43504834175109866,0.3174619972705841,-0.263438880443573,-0.46278610825538638,-0.2950047254562378,-0.18107785284519196,0.006746916100382805,0.08880672603845597,-0.05728423595428467,0.07742121070623398,-0.42583799362182619,-0.3262307941913605,-0.5734169483184815,-0.08062437921762467,-0.02673601545393467,0.10085389763116837]}]}