Pytorch-Onnx-TensorRT

TensorRT严格地依赖于硬件条件,所以与Cuda、Cudnn版本强相关。

Following are the four steps for this example application:

  1. Convert the pretrained image segmentation PyTorch model into ONNX. ONNX是一个深度学习模型的标准,来帮助从不同的框架中进行转换,例如Caffe2、Chainer、PaddlePaddle、Pytorch、MXNet。

  2. Import the ONNX model into TensorRT. 导入 ONNX 模型包括从磁盘上保存的文件中加载它,并将其从其原生框架或格式转换为 TensorRT 网络。

  3. Apply optimizations and generate an engine. TensorRT可以基于输入模型、目标 GPU 平台和指定的其他配置参数构建优化的 TensorRT 引擎。

  4. Perform inference on the GPU. 为TensorRT导入输入数据,进行模型推理,计算速度。

ONNX parser:

Takes a converted PyTorch trained model into the ONNX format as input and populates a network object in TensorRT.

model = model.cuda()
model.eval()
_, c, h, w = input_size
dummy_input = torch.randn(1, c, h, w, device='cuda')
torch.onnx.export(model, dummy_input, "model.onnx", verbose=False, input_names=["input"], output_names=["output"])

# torch.onnx.export(model, dummy_input, model_onnx_path, input_names=inputs, output_names=outputs, dynamic_axes=dynamic_axes)
# model表示要导出的模型
# dummy_inputs表示模型的输入,任何非Tensor参数都将硬编码到导出的模型中;任何Tensor参数都将成为导出的模型的输入,并按照他们在dummy_input中出现的顺序输入。
# input_names/output_names按顺序分配名称到图中的输入/输出节点,只需保持数量对应,可以任意命名
# dynamic_axes表示动态轴,可以动态改变相关维度的输入尺寸

print('loading ONNX model and check that the IR is well formed')
onnx_model = onnx.load('model.onnx')
onnx.checker.check_model(onnx_model)
# print('ONNX model graph...')
# model_graph = onnx.helper.printable_graph(onnx_model.graph)

print('Onnxruntime for inference...')
image = np.random.randn(1, 3, 1024, 1024).astype(np.float32)
sess = rt.InferenceSession('model.onnx')
input_name1 = sess.get_inputs()[0].name

print('Check the performance of Pytorch and ONNX')
output = sess.run(None, {input_name1: image})[0]  # 1, C, 1024, 1024
image_tensor = torch.tensor(image)
output_tensor = model(image_tensor)
diff = torch.max(torch.abs(output_tensor - torch.tensor(output)))
print('different is :', diff)

Pytorch支持原生的Onnx格式转码:

import torch
from torchvision import models
import onnx
import onnxruntime as rt

net = models.resnet.resnet18(pretrained=True)
dummpy_input = torch.randn(1,3,224,224)
torch.onnx.export(net, dummpy_input, 'resnet18.onnx')  # 直接函数调用

# Load the ONNX model 加载模型
model = onnx.load("resnet18.onnx")

# Check that the IR is well formed 验证模型合法性
onnx.checker.check_model(model)

# Print a human readable representation of the graph  打印模型,查看ONNX,共由3个字典组成,input/initializers/operators
# ONNX的可视化,Netron和visualDL
print(onnx.helper.printable_graph(model.graph))

# 支持ONNX的runtime将统一的ONNX格式的模型包运行起来,包括对ONNX模型进行解读,优化,运行。
data = np.array(np.random.randn(1,3,224,224))
sess = rt.InferenceSession('resnet18.onnx')
input_name = sess.get_inputs()[0].name
label_name = sess.get_outputs()[0].name

pred_onx = sess.run([label_name], {input_name:data.astype(np.float32)})[0]
print(pred_onx)
print(np.argmax(pred_onx))

ONNX to TensorRT

使用TensorRT Backend For ONNX快速地将ONNX转换为trt模型,以及测试转换后的Trt模型有多快

TensorRT

TRT_LOGGER = trt.Logger(trt.Logger.INFO)
TRT_LOGGER = trt.Logger(trt.Logger.WARNING)

with trt.Builder(TRT_LOGGER) as builder, builder.create_network() as network, trt.OnnxParser(network, TRT_LOGGER) as parser:
  builder.max_workspace_size = MAX_WORKSPACE_SIZE
  builder.max_batch_size = MAX_BATCH_SIZE

  with open(model_file, 'rb') as model:
    parser.parse(model.read())
    return builder.build_cuda_engine(network)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PyTorch是一个深度学习框架,可以用来构建神经网络模型。ONNX是一种开放的神经网络交换格式,可以将不同框架的模型转换为统一的格式。TensorRT是NVIDIA推出的用于加速深度学习推理的库,可以将模型转换为高效的C++代码。因此,将PyTorch模型转换为ONNX格式,再将ONNX模型转换为TensorRT格式,可以提高模型的推理速度和效率。 ### 回答2: Pytorch是一款非常流行的深度学习框架之一,而ONNX(Open Neural Network Exchange)则是一种用于在不同深度学习框架之间交换模型的标准格式。TensorRT是基于NVIDIA GPU优化的深度学习推理引擎,可以加速深度学习模型的预测速度。Pytorch转ONNX转TensorRT的过程主要包括以下几个步骤: 第一步,使用Pytorch训练好的模型可以通过Pytorch提供的方法将模型转化为ONNX格式的模型。这一步通常需要在节省内存的情况下,对训练的模型进行优化并减少其大小。Pytorch提供了一些方法,例如ONNX的exporter,可以在不损失精度的情况下将Pytorch模型转换为ONNX格式。 第二步,将ONNX模型转换为TensorRT格式的模型。这一步通常需要使用TensorRT提供的工具将ONNX格式的模型转换为可以使用TensorRT来加速推理的格式。TensorRT可以根据模型的结构,对其进行优化,从而提高推理的速度和效率。 第三步,使用TensorRT引擎来进行推理。在这一步中,可以使用一些Python或C++的API来调用TensorRT引擎,以加速推理的过程。通常情况下,TensorRT会在NVIDIA GPU上运行,以提高推理的速度和效率。 总之,Pytorch转ONNX转TensorRT是一种很常见的深度学习模型加速优化的方法。通过这种方法,可以将训练好的模型转化为可以快速进行推理的格式,并提高推理的速度和效率,从而更好的满足实际应用需求。同时也可以加深对于Pytorch、ONNX和TensorRT的理解和应用。 ### 回答3: 先介绍一下三个工具的概念。 PyTorch是一个基于Python的库,提供了高度可拓展性和可定制化的机器学习算法、模型和数据处理工具,特别适合用于深度学习。 ONNX(Open Neural Network Exchange)是一个开放的模型表示和转换工具,使得不同框架之间的模型转换和协作更加容易。ONNX 可以将每个框架的模型表示转换为通用表示格式,这样就可以一次性完成跨框架的模型部署。 TensorRT是NVIDIA推出的高性能深度学习推理库,可以对训练好的深度学习模型进行优化,并在NVIDIA GPU上加速模型的推理过程。使用TensorRT能够提升模型的运行速度和效率。 下面是如何将PyTorch模型转为TensorRT模型的过程: 1.将PyTorch模型转化为ONNX格式。有两种方法可以实现这一步骤:一种是使用PyTorch官方提供的torch.onnx.export方法,将PyTorch模型转化为ONNX格式;另一种方法是使用ONNX官方提供的onnx-coreml转换工具。 2.使用TensorRT提供的工具trtexec将ONNX模型转化为TensorRT格式。通过命令行的方式调用trtexec,在将模型转换为TensorRT格式的同时,可以指定一些优化参数,比如设置合适的batch size、设置推理设备的数据类型、设置最大批处理等参数,以提高模型的性能和效率。 3.将转换后的模型导入到TensorRT库中,使用C++或Python等支持TensorRT的代码进行推理。 总体而言,PyTorch转ONNX、ONNX转TensorRT这一过程需要先对PyTorch模型进行格式转化,再将ONNX格式的模型转转化为TensorRT格式,最终通过TensorRT库对模型进行推理。需要注意的是,不同的深度学习模型在转换过程中有着各自的特点和难点,需要根据具体情况进行优化和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值