TensorRT&Triton学习笔记(一):triton和模型部署+client

您所在的位置:网站首页 python调用api接口进行推理 TensorRT&Triton学习笔记(一):triton和模型部署+client

TensorRT&Triton学习笔记(一):triton和模型部署+client

2024-07-10 15:38| 来源: 网络整理| 查看: 265

前言

先介绍TensorRT、Triton的关系和区别:

TensorRT:为inference(推理)为生,是NVIDIA研发的一款针对深度学习模型在GPU上的计算,显著提高GPU上的模型推理性能。即一种专门针对高性能推理的模型框架,也可以解析其他框架的模型如tensorflow、torch。

主要优化手段如下:

请添加图片描述

Triton:类似于TensorFlow Serving,但triton包括server和client。

triton serving能够实现不同模型的统一部署和服务,提供http和grpc协议,给triton client请求模型推理。

---------------------------------------分割线------------------------------------------------

如果是要将模型和推理嵌入在服务或软硬件中,那么TensorRT是很好的选择,使用它来加载模型进行推理,提升性能(tensorrt runtime);

不然,常规的做法是模型推理和其他业务隔离,模型统一部署在triton server,然后其他业务通过triton client来进行模型推理的请求。

声明

这篇文章的主题会先主要介绍Triton的入门内容,TensorRT的内容后续会持续更新。

(代码较多,可以根据目录选择感兴趣的内容观看)

实验环境:Ubuntu18.04, GeForce RTX 2080Ti

Triton部署 安装

通过docker的形式,首先拉取镜像

# 为Triton的版本 docker pull nvcr.io/nvidia/tritonserver:-py3 # 例如,拉取 20.12 docker pull nvcr.io/nvidia/tritonserver:20.12-py3

例如,20.12的版本需要NVIDIA Driver需要455以上,支持TensorRT 7.2.2。TensorRT版本要对应,不然模型可能会无法部署。

其他版本信息可以前往官网查看:https://docs.nvidia.com/deeplearning/tensorrt/container-release-notes/rel_22-02.html#rel_22-02

启动

CPU版本的启动

docker run --rm -p8000:8000 -p8001:8001 -p8002:8002 -v/full/path/to/docs/examples/model_repository:/models nvcr.io/nvidia/tritonserver:22.01-py3 tritonserver --model-repository=/models

GPU版本的启动,使用1个gpu

docker run --gpus=1 --rm -p8000:8000 -p8001:8001 -p8002:8002 -v/full/path/to/docs/examples/model_repository:/models nvcr.io/nvidia/tritonserver:22.01-py3 tritonserver --model-repository=/models /full/path/to/docs/examples/model_repository:模型仓库的路径。除了本地文件系统,还支持Google Cloud、S3、Azure这些云存储,https://github.com/triton-inference-server/server/blob/main/docs/model_repository.md–rm:表示容器停止运行时会删除容器8000为http端口,8001为grpc端口

正常启动的话,可以看到部署的模型运行状态,以及对外提供的服务端口

请添加图片描述 请添加图片描述

验证服务

也可以通过以下命令来验证服务是否正常运行

curl -v localhost:8000/v2/health/ready

请添加图片描述

模型生成

Triton支持以下模型:TensorRT、ONNX、TensorFlow、Torch、OpenVINO、DALI,还有Python backend自定义生成的Python模型。

我们以一个简单的模型结构来演示:

INPUT0节点通过四则运算得到OUTPUT0节点;INPUT1节点通过embedding table映射为OUTPUT1。

请添加图片描述

完整代码参考:https://github.com/QunBB/DeepLearning/tree/main/Triton/gen_model

TensorFlow

tensorflow可以生成SavedModel或者GraphDef的模型格式

SavedModel模型需要按照以下的目录结构进行存储:

/ / config.pbtxt 1/ model.savedmodel/

GraphDef:

/ / config.pbtxt 1/ model.graphdef import os import tensorflow as tf from tensorflow.python.framework import graph_io def create_modelfile(model_version_dir, max_batch, save_type="graphdef", version_policy=None): # your model net input0_shape = [None, 2] input1_shape = [None, 2] x1 = tf.placeholder(tf.float32, input0_shape, name='INPUT0') inputs_id = tf.placeholder(tf.int32, input1_shape, name='INPUT1') out = tf.add(tf.multiply(x1, 0.5), 2) embedding = tf.get_variable("embedding_table", shape=[100, 10]) pre = tf.nn.embedding_lookup(embedding, inputs_id) out0 = tf.identity(out, "OUTPUT0") out1 = tf.identity(pre, "OUTPUT1") try: os.makedirs(model_version_dir) except OSError as ex: pass # ignore existing dir with tf.Session() as sess: sess.run(tf.global_variables_initializer()) if save_type == 'graphdef': create_graphdef_modelfile(model_version_dir, sess, outputs=["OUTPUT0", "OUTPUT1"]) elif save_type == 'savemodel': create_savedmodel_modelfile(model_version_dir, sess, inputs={ "INPUT0": x1, "INPUT1": inputs_id }, outputs={ "OUTPUT0": out, "OUTPUT1": pre }) else: raise ValueError("save_type must be one of ['tensorflow_graphdef', 'tensorflow_savedmodel']") create_modelconfig(models_dir=os.path.dirname(model_version_dir), max_batch=max_batch, save_type=save_type, version_policy=version_policy) def create_graphdef_modelfile(model_version_dir, sess, outputs): """ tensorflow graphdef只能保存constant,无法保存Variable 可以借助tf.graph_util.convert_variables_to_constants将Variable转化为constant :param model_version_dir: :param sess: :return: """ graph = sess.graph.as_graph_def() new_graph = tf.graph_util.convert_variables_to_constants(sess=sess, input_graph_def=graph, output_node_names=outputs) graph_io.write_graph(new_graph, model_version_dir, "model.graphdef", as_text=False) def create_savedmodel_modelfile(model_version_dir, sess, inputs, outputs): """ :param model_version_dir: :param sess: :param inputs: dict, {input_name: input_tensor} :param outputs: dict, {output_name: output_tensor} :return: """ tf.saved_model.simple_save(sess, model_version_dir + "/model.savedmodel", inputs=inputs, outputs=outputs) torch

pytorch模型的目录结构格式:

/ / config.pbtxt 1/ model.pt import os import torch from torch import nn class MyNet(nn.Module): def __init__(self): super(MyNet, self).__init__() self.embedding = nn.Embedding(num_embeddings=100, embedding_dim=10) def forward(self, input0, input1): # tf.add(tf.multiply(x1, 0.5), 2) output0 = torch.add(torch.multiply(input0, 0.5), 2) output1 = self.embedding(input1) return output0, output1 def create_modelfile(model_version_dir, max_batch, version_policy=None): # your model net # 定义输入的格式 example_input0 = torch.zeros([2], dtype=torch.float32) example_input1 = torch.zeros([2], dtype=torch.int32) my_model = MyNet() traced = torch.jit.trace(my_model, (example_input0, example_input1)) try: os.makedirs(model_version_dir) except OSError as ex: pass # ignore existing dir traced.save(model_version_dir + "/model.pt") ONNX

ONNX的目录结构:

/ / config.pbtxt 1/ model.onnx

ONNX提供一种开源的深度学习和传统的机器学习模型格式,目的在于模型在不同框架之间进行转移。

下面我们介绍最常用的tensorflow和torch模型转成ONNX的方法。

tensorflow模型 --> ONNX

pip install -U tf2onnx # savedmodel python -m tf2onnx.convert --saved-model tensorflow-model-path --output model.onnx # checkpoint python -m tf2onnx.convert --checkpoint tensorflow-model-meta-file-path --output model.onnx --inputs input0:0,input1:0 --outputs output0:0 # graphdef python -m tf2onnx.convert --graphdef tensorflow-model-graphdef-file --output model.onnx --inputs input0:0,input1:0 --outputs output0:0

torch --> ONNX

import os import torch import torch.onnx def torch2onnx(model_version_dir, max_batch): # 定义输入的格式 example_input0 = torch.zeros([max_batch, 2], dtype=torch.float32) example_input1 = torch.zeros([max_batch, 2], dtype=torch.int32) my_model = MyNet() try: os.makedirs(model_version_dir) except OSError as ex: pass # ignore existing dir torch.onnx.export(my_model, (example_input0, example_input1), os.path.join(model_version_dir, 'model.onnx'), # 输入节点的名称 input_names=("INPUT0", "INPUT1"), # 输出节点的名称 output_names=("OUTPUT0", "OUTPUT1"), # 设置batch_size的维度 dynamic_axes={"INPUT0": [0], "INPUT1": [0], "OUTPUT0": [0], "OUTPUT1": [0]}, verbose=True) TensorRT

需要注意:TensorRT仅支持GPU。

/ / config.pbtxt 1/ model.plan

比较推荐的方式是从ONNX解析得到TensorRT模型(TensorRT)

import tensorrt as trt import os def onnx2trt(model_version_dir, onnx_model_file, max_batch): logger = trt.Logger(trt.Logger.WARNING) builder = trt.Builder(logger) # The EXPLICIT_BATCH flag is required in order to import models using the ONNX parser network = builder.create_network(1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3