github:https://github.com/NVIDIA/TensorRT
官网快速入门链接:Quick Start Guide :: NVIDIA Deep Learning TensorRT Documentation
引言:
TensorRT 是 NVIDIA 推出的一个高性能深度学习推理库,专门用于优化和加速已经训练好的深度学习模型,特别是在 NVIDIA GPU 上。它能够极大地提高深度学习推理的速度,同时降低内存和计算资源的消耗。TensorRT 主要的功能包括:
1. 模型优化
TensorRT 提供多种优化技术,能够提升模型推理的效率,主要包括:
- 层融合(Layer Fusion):将多个操作融合为一个操作,从而减少内存带宽需求和提高计算效率。例如,卷积层和激活函数可以合并为一个单一操作。
- 精度降低(Precision Calibration):TensorRT 支持降低模型的数值精度(例如,从 FP32 精度降到 FP16 或 INT8),可以大幅提高推理速度并减少内存占用,同时对精度的影响通常很小。
- 张量重排(Tensor Reordering):通过重新安排计算图中的张量数据顺序,减少内存访问的延迟。
- 内存管理(Memory Management):优化内存分配和数据传输,使得内存利用更加高效。
2. 支持多种精度
TensorRT 支持多种精度的计算,适应不同的硬件需求。常见的精度模式包括:
- FP32:单精度浮点,通常在较为通用的硬件上使用,提供最高的精度。
- FP16:半精度浮点,在支持 FP16 的硬件(如 NVIDIA V100 和 A100 GPU)上,可以提高推理速度并减少内存占用。
- INT8:整数8位精度,适用于需要更高推理速度并且对精度要求较低的场景。INT8 计算通常需要额外的量化步骤,但在许多深度学习任务中,精度损失可以忽略不计。
3. 推理加速
TensorRT 能够显著加速推理过程,特别是在 NVIDIA 的 A100、V100、T4 等 GPUs 上。通过硬件加速的优化,TensorRT 可以提供比传统框架(如 TensorFlow、PyTorch)直接运行模型更高的推理吞吐量和更低的延迟。
4. 多平台支持
TensorRT 支持多种 NVIDIA GPU,包括数据中心的服务器级 GPU(如 A100、V100、T4)以及边缘设备(如 Jetson 系列),使得它在不同硬件环境下都能高效运行。
5. TensorRT Builder API
TensorRT 提供了强大的 API,使开发者可以灵活地定制推理管道。例如:
- 动态批处理:TensorRT 允许开发者根据输入数据的实际需求调整批次大小,从而在保持性能的同时提高吞吐量。
- 模型优化器:可以将各种深度学习框架(如 TensorFlow、PyTorch、ONNX 等)训练的模型转换为 TensorRT 支持的格式,并应用优化。
6. 跨框架支持
TensorRT 支持从多种深度学习框架(例如 TensorFlow、Keras、PyTorch、Caffe 等)导入模型,主要通过 ONNX(Open Neural Network Exchange)格式进行模型转换。TensorRT 提供了以下几种方式来加载和优化模型:
- ONNX 支持:TensorRT 能够直接导入 ONNX 格式的模型,进行加速和优化。
- TensorFlow/Keras 支持:通过 TensorFlow 或 Keras 导出的模型,可以轻松地使用 TensorRT 进行加速。
- 自定义操作支持:对于不支持的操作,TensorRT 也允许用户实现自己的自定义层,并进行优化。
7. 实时推理支持
TensorRT 提供了非常低的推理延迟,适合实时应用场景。例如,它被广泛应用于自动驾驶、机器人、视频流分析等需要快速响应的领域。
8. 深度学习推理服务器(TensorRT Inference Server)
TensorRT 还提供了推理服务器解决方案,允许用户将模型部署为服务。这个服务器支持多种框架和模型格式,可以通过 HTTP、gRPC 等协议提供推理服务,具有高吞吐量和低延迟的特性,适用于生产环境中的在线推理任务。
9. 优化网络层
TensorRT 还提供了一些高级优化,包括对常见网络层(如卷积、全连接层、批归一化层等)的特殊加速方法。这些优化能显著提高推理的计算效率,尤其是在大规模模型中。
10. 集成与易用性
TensorRT 支持与现有的 AI 框架和工具链集成,提供了 Python 和 C++ API,且支持在不同的操作系统平台(包括 Linux 和 Windows)上运行。通过集成 TensorRT,开发者能够方便地在已有的深度学习框架基础上提升性能。
11. 部署到嵌入式设备
TensorRT 还可以被用于嵌入式系统,例如 Jetson 系列和 NVIDIA Drive 平台,适合需要低功耗、低延迟且高吞吐量的边缘计算应用。
总结:
TensorRT 作为一个高效的深度学习推理优化工具,能够帮助开发者显著提高模型在 NVIDIA GPU 上的推理性能。其主要功能包括模型优化、精度调整、多平台支持和高效的推理加速,适用于从云端数据中心到边缘设备等各种应用场景。
正文
一、准备知识
在您选择的框架中训练深度学习模型后,TensorRT 使您能够以更高的吞吐量和更低的延迟运行它。
NVIDIA TensorRT是一个用于高性能深度学习的推理框架。它可以与TensorFlow、PyTorch和MXNet等训练框架相辅相成地工作。
使用TensorRT来部署深度学习模型以实现对模型的加速,从而提高深度学习模型运行的效率。
TensorRT是英伟达官方针对自己的硬件设备面向AI工作者推出的一种部署方案。TensorRT可以对网络进行压缩、优化以及运行时部署,并且没有框架的开销。当然这个加速程度很大程度上取决于你的显卡算力还有模型结构复杂程度,也有可能因为没有优化的地方,从而没有多大的提升。
TensorRT使用流程
TensorRT使用流程如下图所示,分为两个阶段:预处理阶段和推理阶段。其部署大致流程如下:1.导出网络定义以及相关权重;2.解析网络定义以及相关权重;3.根据显卡算子构造出最优执行计划;4.将执行计划序列化存储;5.反序列化执行计划;6.进行推理
可以从步骤3可以得知,tensorrt实际上是和你的硬件绑定的,所以在部署过程中,如果你的硬件(显卡)和软件(驱动、cudatoolkit、cudnn)发生了改变,那么这一步开始就要重新走一遍了。
二、导出onnx模型
2.1 简述
这一步主要是为了将深度学习模型的结构和参数导出来。考虑到实际部署环境的精简性,我这里还是建议大家在使用中先将深度学习模型导出ONNX文件,然后拿着ONNX文件去部署就可以了。
原因很简单,因为ONNX不像Pytorch和TensorFlow那样,还需要安装这些框架运行的依赖包(比如 conda install pytorch,不然你没办法用pytorch的代码),TensorRT可以直接从ONNX文件中读取出网络定义和权重信息。
除此以外,ONNX更像是“通用语言”,ONNX的出现本身就是为了描述网络结构和相关权重,除此以外,还有专门的工具可以对ONNX文件进行解析,查看相关结构,例如网站:https://lutzroeder.github.io/netron/
为pytorch模型为例:(导出时需要输入数据、model和输出名这三个主要参数)
# 构造模型实例model = HRNet()# 反序列化权重参数model.load_state_dict(torch.load(self.weight_path),strict=False)model.eval()# 定义输入名称,list结构,可能有多个输入input_names = ['input']# 定义输出名称,list结构,可能有多个输出output_names = ['output']# 构造输入用以验证onnx模型的正确性input = torch.rand(1, 3, self.resolution[0], self.resolution[1])# 导出torch.onnx.export(model, input, output_path,export_params=True,opset_version=11,do_constant_folding=True,input_names=input_names,output_names=output_names)
参数介绍:
model为pytorch模型实例
input为测试输入数据(形状必须要和模型输入一致,但是数值可以是随机的)
output_path为导出路径,xxx.onnx
export_params为是否导出参数权重,必然是True
opset_version=11 发行版本,11就可以了
do_constant_folding是否对常量进行折叠,True就可以了
input_names是模型输入的名称,list类型,因为模型可能有多个输入
output_names同上,只不过这是针对输出的
简单点的pytoch代码
- 从以下位置导入 ResNet-50 模型 torchvision 。这将加载带有预训练权重的 ResNet-50 副本。
import torchvision.models as modelsresnet50 = models.resnet50(pretrained=True, progress=False).eval())
- 从 PyTorch 保存 ONNX 文件。 注意:我们需要一批数据来从 PyTorch 保存 ONNX 文件。我们将使用虚拟批次。
import torchBATCH_SIZE = 32 dummy_input=torch.randn(BATCH_SIZE, 3, 224, 224)
- 保存 ONNX 文件。
import torch.onnx torch.onnx.export(resnet50, dummy_input, "resnet50_pytorch.onnx", verbose=False))
原文链接:https://blog.csdn.net/JianguoChow/article/details/122684310