如何运用TensorRt对Pytorch模型进行转换以及一些常问问题

TensorRt用来干嘛

TensorRT是英伟达(NVIDIA)推出的深度学习推理引擎,能够加速深度学习应用程序的推理速度。它主要用于将训练好的深度学习模型(如TensorFlow、PyTorch等)优化并转换为高度优化的运行时引擎,以提高模型的推理性能和效率。TensorRT不仅可以适用于英伟达的GPU加速器,还可以在其他芯片上提供高性能的深度学习推理效果。因此,TensorRT被广泛应用于嵌入式设备、自动驾驶、视频分析、语音识别等众多人工智能场景,能够大幅提升深度学习在实际应用中的效率和性能。

TensorRt是怎么实现推理加速的

TensorRT实现加速推理的主要原理有以下几个方面:

1.精度缩减:在保证模型精度的前提下,通过裁剪、量化、融合等方式,大幅减少模型的运算量,从而加快模型的推理速度。

2.层合并:将模型中功能相同的层合并为一个大的运算单元,从而减少层之间数据的传输和操作,进一步提高模型的运算效率。

3.并行计算:通过并行计算的方式,将模型中的计算任务划分为多个小任务,并同时计算,从而提高计算效率。

4.运算融合:将多个运算融合为一个计算,以减少内存访问和数据传输,提高计算效率。

5.动态图优化:通过实时优化运算图,使每个阶段的计算都能最大程度地利用硬件资源,并让计算和数据移动之间的延迟最小化,从而提高推理效率。

TensorRT为以上技术提供了优秀的软硬件支持,在保证模型准确性的同时,能够大幅提高深度学习模型在实际应用中的推理效率。

案例

一个常见的案例是使用TensorRT加速图像分类任务。

在这个案例中,首先需要训练一个深度卷积神经网络(CNN)进行图像分类任务。然后,使用TensorRT将训练好的模型转换为高度优化的运行时引擎。

接下来,使用转换后的TensorRT模型进行图像分类推理时,TensorRT将利用在推理中执行各种计算的优化技术,从而提高模型的推理速度和效率。

举个例子,可以使用TensorFlow来训练一个深度卷积神经网络进行图像分类。然后,将训练好的模型转换为TensorRT引擎。最后,在使用TensorRT引擎进行推理时,可以对比使用TensorFlow原生模型和使用TensorRT引擎后的模型的推理性能,以评估TensorRT的推理加速效果。

该案例适用于需要进行实时图像分析和分类的场景,例如自动驾驶、机器人视觉、嵌入式系统等。

代码(Pytorch)

生成TensorRT引擎通常需要以下几个步骤: 1. 定义模型并进行训练:使用深度学习框架,如TensorFlow、PyTorch等,定义并训练目标模型。此步骤主要关注模型的设计和训练,并不涉及TensorRT引擎。 2. 将模型转换为TensorRT格式:使用TensorRT提供的“builder” API,将训练好的模型转换成TensorRT格式,生成可执行的TensorRT引擎。 3. 优化TensorRT引擎:针对目标硬件平台的具体情况,进一步优化生成的TensorRT引擎,例如指定TensorRT引擎使用的数据类型、运算算法、并行度等参数,以取得最优的性能表现。 下面是一个基于TensorFlow模型转换为TensorRT引擎的示例代码:

import torch
import tensorrt as trt
import os 

# 定义转换的目标模型
pt_model_path = "/path/to/pytorch_model.pt"

# 初始化TensorRT builder和optimizer
TRT_LOGGER = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(TRT_LOGGER)
builder.max_batch_size = 1
builder.max_workspace_size = 1 << 30  # 1GB
network = builder.create_network()

# 指定输入和输出tensor的形状
input_shape = (3, 224, 224)
output_shape = 1000

# 加载PyTorch模型
pt_model = torch.load(pt_model_path)

# 运输模型至GPU设备
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
pt_model.to(device)

# 转换模型为TensorRT格式
dummy_input = torch.randn(1, 3, 224, 224, device=device)
traced_model = torch.jit.trace(pt_model, dummy_input)
scripted_model = traced_model.script()
opt_model = scripted_model._c._get_method('forward')

# 添加输入和输出Tensor至TensorRT网络
input_tensor = network.add_input('input_0', dtype=trt.float32, shape=input_shape)
output_tensor = network.add_output('output_0', dtype=trt.float32, shape=output_shape)

# 将PyTorch模型转换为TensorRT引擎
opt_model = opt_model.graph_for(dummy_input).print_pytorch_node_names()
with torch.no_grad():
    engine = builder.build_cuda_engine(network)

# 保存引擎文件
engine_path = "/path/to/tensorRT/engine"
with open(engine_path, 'wb') as f:
    f.write(engine.serialize())

print("TensorRT engine generated successfully!")

上述示例代码中,首先加载了保存的PyTorch模型,并将其转换为trace或script模式,从而生成TensorRT可以调用的模型格式。然后,使用TensorRT的“builder” API构建一个新的网络,并将输入和输出Tensor添加到网络中。最后,调用“build_cuda_engine” 方法将网络转换为TensorRT引擎,并将它序列化并保存到指定的文件路径。
以上Python代码使用TensorRT进行了图像分类推理,主要流程包括以下几个步骤:

1.加载TensorRT引擎:从指定的文件路径读取TensorRT引擎数据,使用TensorRT Runtime进行反序列化操作,获得“engine”对象。

2.创建TensorRT上下文:利用“engine”对象创建TensorRT上下文对象“ctx”,获取输入和输出Tensor的“binding index”。

3.创建输入和输出Tensor:根据指定的输入和输出Tensor形状信息,使用PyCUDA分配显存空间,并获取相应的PyCUDA数组对象。

4.加载测试图片:将指定的图片文件读取到内存中,并使用OpenCV库调整图片尺寸和颜色通道顺序,符合TensorRT模型的输入要求。

5.输入数据转移:使用PyCUDA将输入图片数据从CPU内存复制到GPU显存中。

6.推理执行:利用上下文对象“ctx”执行模型推理,传入输入和输出Tensor数组,实现向前计算。

7.输出结果获取:将输出Tensor中推理结果传输回CPU内存,并将结果数据转换为Numpy数组格式。针对该案例,输出结果是1000大小的numpy数组,包含了不同类别的概率分布结果。

8.输出结果解析:获取输出结果中概率最大的类别,即为模型的预测结果。

应用TensorRT进行推理的Python代码,具体逻辑和执行方式根据模型和应用的实际情况而异。重要的是了解TensorRT的使用方法和API调用方式,以正确地加载和使用优化后的TensorRT引擎,并获取高性能的深度学习推理结果。
需要注意的是,生成TensorRT引擎的具体API和参数设置,取决于应用的具体场景和硬件平台。完整的TensorRT Python API文档可以在官网上找到。

为什么要创建TensorRT引擎构建器

TensorRT的引擎构建器(builder)是使用TensorRT API构建高性能深度学习推理引擎的核心组件。TensorRT引擎构建器在构建引擎时,提供了更多的控制和优化选项,以便生成性能更好的推理引擎,而不是简单地将深度学习模型的网络图翻译为C++/CUDA代码。 具体来说,TensorRT引擎构建器可通过以下方式对推理引擎进行优化: 1. 定义输入和输出的Tensor形状及数据类型:在构建TensorRT引擎之前,需要指定模型的输入和输出张量的形状和数据类型。这样的做法可以确定所需的内存空间大小,以便在构建引擎时预先分配所需的GPU显存空间,从而达到降低内存消耗的目的。 2. 控制TensorRT中的计算精度:TensorRT支持FP32、FP16和INT8精度数值的混合计算,可以根据实际情况在不同精度间切换,以在保持精度的同时提升计算速度。 3. 对TensorRT运算符进行优化:TensorRT支持使用组合算法替换深度学习算子,以提高计算效率和减少内存消耗。针对特定的深度学习算子和硬件平台,TensorRT提供了从多个候选组合中筛选最优方案的策略,以生成具有最佳性能的优化推理引擎。 4. 实现网络层的融合:TensorRT支持卷积、池化和批归一等多个常用深度学习算子的层融合,即将多个算子的计算合并为一个更高效的算子以提升计算速度和内存效率。 以上优化策略需要使用TensorRT的引擎构建器进行控制和调度。通过使用TensorRT引擎构建器,我们可以以更好的灵活性、更高的性能、更低的内存占用等方式,对深度学习推理管道进行高效率的优化。

为什么要添加输入和输出张量到TensorRT网络中,原网络没有么

在深度学习神经网络的训练过程中,通常使用输入张量和目标值(ground truth)来更新权重和偏差,以使神经网络更好的拟合输入数据。而在推理过程中,不需要目标值,只需要输入张量,然后使用神经网络计算输出张量,即模型对输入的推理结果。因此,通常需要将输入张量和输出张量添加到TensorRT网络中,以便于对模型进行推理。 在构建TensorRT引擎之前,需要使用TensorRT的“network” API将训练好的深度学习模型中的输入和输出张量指定为网络输入和输出。这里所说的添加输入和输出张量到TensorRT网络中,是将这些输入和输出张量作为XML或二进制配置文件的一部分进行指定。也就是说,在生成TensorRT引擎时,引擎需要知道网络输入和输出张量的数量、形状和数据类型等信息,以便于正确地对输入数据进行处理并输出正确的结果。 需要注意的是,原始深度学习模型中通常也会存在输入和输出张量等信息,但这些信息并不一定符合TensorRT的要求,也可能被其他深度学习框架所使用。因此,需要在使用TensorRT时,通过手动将导入的模型转换为TensorRT格式,并将输入和输出张量添加到TensorRT网络中,以便让TensorRT能够正确地推理和优化深度学习模型。

为什么要将 PyTorch 模型序列化为script 或 traced模块,而不是直接转换

将PyTorch模型序列化为script或traced模块是为了方便使用TensorRT Python API将其转换为TensorRT引擎。TensorRT引擎需要了解模型的结构、参数和输入输出规格等信息,而这些信息可以在PyTorch模型转换为script或traced模块时被捕获并保存。因此,在转换模型之前,需要将模型序列化成script或traced模块以获得与TensorRT兼容的模型表示。然后,可以使用TensorRT Python API将该模型表示转换为TensorRT引擎,并对其进行优化。转换过程的详细步骤和技巧可以根据具体情况而定,通常需要针对不同的场景和硬件平台进行调整和优化。

其中script和traced模块具体是什么

script模块和traced模块都是PyTorch模型的序列化形式,用于将PyTorch模型导出为可独立运行的代码。这些模块之所以被广泛使用,是因为它们可以封装PyTorch模型的所有结构和参数信息,并且可以在不需要PyTorch环境的情况下加载、运行和测试模型。 1. script模块:通过将PyTorch的脚本代码转换为图形形式的中间表示,实现了以静态形式表示 PyTorch 模型的能力,SerializableModel就是 script模块的一种形式。可以理解为 PyTorch 的代码格式。 2. traced模块:通过在PyTorch模型上运行一批示例数据点,捕获所有操作的图形表示,构建了一个静态表示以及在该表示中使用的所有 PyTorch 操作的前向函数。因此,导出的 traced 模型具有激活跟踪,以确保与 PyTorch 的动态行为保持一致。可以理解为动态的 PyTorch 模型表示形式。通常沿用传统的Tensorflow、ONNX等文件格式。 无论是script模块还是 traced模块,都能够封装模型的参数、结构和前向计算,这对 PyTorch 模型转换和模型部署等方面都是非常有用的。在使用TensorRT对PyTorch模型进行加速和部署时,通过将PyTorch模型序列化为其中一种模块,并使用TensorRT Python API将其转换为TensorRT引擎,用户可以获得高效的推理性能和独立的部署代码。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值