NVIDIA Triton初体验

  |   0 评论   |   0 浏览

背景

借助 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]}]}

高级特征

模型并行

动态batch

自定义backend

参考

  1. NVIDIA Triton 推理服务器
  2. Triton Inference Server Tags
  3. Nvidia Triton 使用入门教程
  4. 从零搭建torch环境,保姆级教程,新手小白,进进进!!!