TensorRT介绍及使用

news2024/10/1 12:16:34

1、简介

TensorRT是一个针对已训练好模型的SDK,通过该SDK能够在NVIDIA的设备上进行高性能的推理。优点如下:

总结下来主要有以下6点:

  1. Reduced Precision:将模型量化成INT8或者FP16的数据类型(在保证精度不变或略微降低的前提下),以提升模型的推理速度。
  2. Layer and Tensor Fusion:通过将多个层结构进行融合(包括横向和纵向)来优化GPU的显存以及带宽。
  3. Kernel Auto-Tuning:根据当前使用的GPU平台选择最佳的数据层和算法。
  4. Dynamic Tensor Memory:最小化内存占用并高效地重用张量的内存。
  5. Multi-Stream Execution:使用可扩展设计并行处理多个输入流。
  6. Time Fusion:使用动态生成的核去优化随时间步长变化的RNN网络。
     

2、将模型转化为TensorRT的步骤

哪些格式的模型能够导出并转换成TensorRT模型呢,官方提到了三种方式:

  1. using TF-TRT: 使用TF-TRT(TensorFlow-TensorRT )
  2. automatic ONNX conversion from .onnx files:从ONNX通用格式转换得到(注意,这里需要自己提前将模型转成ONNX格式)
  3. manually constructing a network using the TensorRT API (either in C++ or Python):自己用TensorRT API构建模型(这个对新人不太友好,难度有点大)
     

对于TesorRT来说,最推荐的方式是:通过onnx转成TensorRT的方式。

如说对于Pytorch的模型,我们一般需要先转成ONNX通用格式,然后再转成TensorRT模型,最后部署的时候可以选择C++或者Python
在这里插入图片描述

 

3、工作流程_步骤

TensorRT使用流程分为两个阶段:预处理阶段推理阶段

其部署大致流程如下:

  • 1.导出网络定义以及相关权重;
  • 2.解析网络定义以及相关权重;
  • 3.根据显卡算子构造出最优执行计划;
  • 4.将执行计划序列化存储;
  • 5.反序列化执行计划;
  • 6.进行推理

ps: tensorrt实际上和硬件绑定的,所以在部署过程中,如果硬件(显卡)和软件(驱动、cudatoolkit、cudnn)发生了改变,那么这一步开始就要重新走一遍了。

 4、关键操作

4.1、onnx文件导出

        使用的是pytorch代码生成的pth,用python代码生成onnx文件

import torch
import torch.onnx
import onnx
import onnxruntime
import numpy as np
from torchvision.models import resnet50

device = torch.device("GPU")

def to_numpy(tensor):
    return tensor.detach().cpu().numpy() if tensor.requires_grad else tensor.cpu().numpy()


def main():
    weights_path = "resNet34.pth"
    onnx_file_name = "resnet34.onnx"
    batch_size = 1
    img_h = 224
    img_w = 224
    img_channel = 3

    # create model and load pretrain weights
    model = resnet34(pretrained=False, num_classes=5)
    model.load_state_dict(torch.load(weights_path, map_location='cpu'))

    model.eval()
    # input to the model
    # [batch, channel, height, width]
    x = torch.rand(batch_size, img_channel, img_h, img_w, requires_grad=True)
    torch_out = model(x)

    # export the model
    torch.onnx.export(model,             # model being run
                      x,                 # model input (or a tuple for multiple inputs)
                      onnx_file_name,   
                      input_names=["input"],
                      output_names=["output"],
                      verbose=False)

    # check onnx model
    onnx_model = onnx.load(onnx_file_name)
    onnx.checker.check_model(onnx_model)

    ort_session = onnxruntime.InferenceSession(onnx_file_name)

    # compute ONNX Runtime output prediction
    ort_inputs = {ort_session.get_inputs()[0].name: to_numpy(x)}
    ort_outs = ort_session.run(None, ort_inputs)

    np.testing.assert_allclose(to_numpy(torch_out), ort_outs[0], rtol=1e-03, atol=1e-05)
    print("Exported model has been tested with ONNXRuntime, and the result looks good!")


if __name__ == '__main__':
    main()

4.2 将ONNX格式转成TensorRT格式

这个需要用到TensorRT目录下的转换工具,这种方式是最简单的。

直接使用trtexec工具将其转为TensorRT engine格式。

 命令:

trtexec.exe --onnx=resnet50.onnx --saveEngine=resnet50.engine

下面就可以 使用engine反序列化推理了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/128242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux学习笔记——Linux实用操作(三)

4.10、环境变量 学习目标: 理解环境变量的作用掌握符号$的作用掌握在Linux中配置环境变量 4.10.1、环境变量 1、在讲解which命令的时候,我们知道使用的一系列命令其实本质上就是一个个的可执行程序。 比如,cd命令的本体就是:…

股价狂跌超70%,特斯拉到底怎么了?

​在2022年的尾声,曾在新能源汽车领域盛极一时的特斯拉即将取得上市以来最糟糕的年度表现,直接跌出全球上公司市值前10名。目前特斯拉已连续第7个交易日下跌,截至2022年12月28日,跌超11%,创八个月最大跌幅,…

Leetcode 855. 考场就座

在考场里,一排有 N 个座位,分别编号为 0, 1, 2, ..., N-1 。当学生进入考场后,他必须坐在能够使他与离他最近的人之间的距离达到最大化的座位上。如果有多个这样的座位,他会坐在编号最小的座位上。(另外,如果考场里没有…

「回顾2022,展望2023」- 技术和兴趣,工作和生活,我们都在旅途中

技术 Java,云原生,前端 技术面好像变窄了 远离CI/CD,重新回到起点 2019年毕业,2018年9月份在距离学校(南昌)不远不近的公司实习开始实习,毕业后去过深圳、上海,最后是杭州,到现在,又…

OV7670图像传感器介绍

OV7670图像传感器简介 OV7670是图像传感器,其体积小、工作电压低,能提供单片VGA摄像头和影像处理器的所有功能。通过SCCB 总线控制,可以输出整帧、子采样、取窗口等方式的各种分辨率8位影响数据。该产品VGA图像最高达到30帧/秒。用户可以完全…

西门子PLC串口协议与以太网通信协议对比

西门子plc品牌众多,通信协议的类型就更多了,具体可分为串口协议和以太网通信协议两大类。 串口协议主要有:MODBUS RTU 通信协议;PROFIBUS 通信协议;USS通信协议;PPI通信协议;MPI通信协议&#…

YGG:2022年年终回顾

2022 年,Yield Guild Games(YGG)扩大并发展了区块链游戏生态系统和开放的元宇宙。在这篇文章中,我们庆祝我们的公会成员、合作伙伴和社区所取得的里程碑式的成就,并期待接下来的发展。 游戏和基础设施合作伙伴的数量不…

推荐 6 个 GitHub 开源项目

本期推荐开源项目目录:1. B 站自动任务工具2. 学习 Solidity3. 高性能异步抖音爬取工具4. Java学习指南5. 中后台管理系统模版6. ChatGPT 中文调教指南01B 站自动任务工具BiliBiliTool 是一个自动化工具,它可以帮助你每天获取经验、每日签到、批量取关等…

分享几个嵌入式 C 中的实用技巧

1、动态绑定、回调函数 回调函数可以达到动态绑定的作用,在一定程度上可以降低层与层之间的耦合。关于回调函数,之前已经有写过一篇:C语言、嵌入式重点知识:回调函数。可能很多初学的小伙伴可能还不理解回调函数,可以…

【计算机图形学入门】笔记9:Shading3着色(插值、高级纹理映射)

09Shading3着色(插值、高级纹理映射)1.Barycentric Coordinates 重心坐标1.A点自己的重心坐标2.如何求出任意点的重心坐标?2.如何把纹理应用在实际的渲染中?Applying Textures3.Texture Magnification纹理放大。(解决纹…

Transform+ASM插桩系列(1)——熟悉Java字节码

前言 为什么要学习Java字节码呢,因为我们学的是插桩字节码技术,这块技术的根底就是字节码,要学会字节码的阅读和字节码的编写,虽然现在很多工具可以帮我们阅读和编写,但最根本的知识还是要理解的。万层楼高从地起&…

CTF之MISC题目-西游记

CTF系列文章 第一篇 CTF之密码学题目-classical && coding 第二篇 CTF之MISC题目-西游记 文章目录CTF系列文章前言一、题目是什么?二、解题步骤1.下载文件,解压2.暴力破解3.解压文件4.处理文本文件5.手动删除多余字符总结前言 CTF中关于MISC&a…

TensorFlow之回归模型-3

1 基本概念 回归模型 线性 线性模型 非线性模型 线性回归 逻辑回归 Log Loss(损失函数) 分类临界值 2 效率预测 如上所示,使用测试数据集进行评估、用图形显示逻辑回归的预测结果,其中,test_features是测试特…

hnu计网实验一-应用协议与数据包分析实验(使用Wireshark)

前言:这是个比较简单的实验,个人认为最难的不是分析部分,而是能否抓到一个好的包。为了抓到一个好的包我试了很多个网站,终于抓京东时抓到了令我个人最满意的包,因为没有其他各种杂乱的报文,就是那几条必要…

直流信号线性放大器非隔离转换模块0-10V转0-12V大功率负载180mA导轨安装

概述: 导轨安装DIN11 NIPO 系列模拟信号放大器是一种将输入信号放大、转换成按比例输出的直流信号放大器。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等需要直流信号测控的行业。此系列产品内部采用稳压电路,通过等比例控制线性放大输…

视频转换IC大全和桥接芯片大全

视频转换大全(桥接芯片大全) 本人从事多年视频转换ic多年累计大量宝贵资源,可以和大家交流交流,下面就视频转换或桥接芯片做下相关交流,期望可以帮助大家。 视频转换或视频桥接:就是把视频源的信号格式转成…

《MySQL高级篇》数据库建模工具---PowderDesigner的使用教程

文章目录PowerDesigner的使用11.1 开始界面11.2 概念数据模型11.3 物理数据模型11.4 概念模型转为物理模型11.5 物理模型转为概念模型11.6 物理模型导出SQL语句PowerDesigner的使用 PowerDesigner是一款开发人员常用的数据库建模工具,用户利用该软件可以方便地制作…

Python--字典及基本操作

字典也是 Python 提供的一种常用的数据结构,它用于存放具有映射关系的数据。 比如有份成绩表数据,语文:79,数学:80,英语:92,这组数据看上去像两个列表,但这两个列表的元素…

传统目标跟踪——背景分割法

目录 一、背景分割法 二、流程 三、代码 四、总结 一、背景分割法 传统的前景背景分割方法有GrabCut,分水岭算法,当然也包括一些阈值分割的算法。但是这些算法在应用中往往显得鲁棒性较弱,达不到一个好的分割效果。 现代的背景分割算法融入…

便宜的骨传导耳机好用吗?五款便宜的骨传导耳机推荐

市面上的骨传导耳机价格参差不齐,那价位较低的骨传导耳机能不能入手呢?只能说“一分钱,一分货”但是一些大牌骨传导耳机品牌也会出一些性价比较高的骨传导耳机,依靠大牌技术的加持,耳机的使用体验也会更好。可以看看下…