TensorRT学习笔记--Ubuntu20.04安装TensorRT 8.2.5

news2024/11/27 18:01:31

目录

前言

1--查看本机环境配置

2--下载并安装Tensor RT

3--实例测试

3-1--验证Onnx模型的可用性

3-2--将Onnx模型转换为推理引擎engine

3-3--基于Tensor RT使用engine模型进行推理

4--参考


前言

        推荐结合官方文档 3.2.3节中的Tar File Installation安装教程进行安装;

1--查看本机环境配置

import torch
print(torch.__version__)
print(torch.version.cuda)
print(torch.backends.cudnn.version())

博主的配置环境:

        ① Ubuntu 20.04

        ② Cuda 11.3

        ③ NVIDIA GeForce RTX 3060

        ④ Pytorch 1.12.0

        ⑤ Python 3.9

2--下载并安装Tensor RT

① 下载地址:Tensor RT官方下载地址

        博主下载的版本为Tensor RT 8.2.5.1。

② 安装依赖:

pip install 'pycuda<2021.1'

# 注意onnxruntime-gpu的版本需与实际环境进行匹配,这里博主选择1.11版本
pip install onnxruntime-gpu==1.11

 ③ 解压并配置环境变量: 

# 解压
tar -zxvf TensorRT-8.2.5.1.Linux.x86_64-gnu.cuda-11.4.cudnn8.2.tar.gz
# 配置环境变量
sudo gedit ~/.bashrc # 也可以使用vim

# 末尾添加以下两条路径,需根据解压的实际路径
export LD_LIBRARY_PATH=$PATH:/home/liujinfu/Downloads/TensorRT-8.2.5.1/lib:$LD_LIBRARY_PATH
export LIBRARY_PATH=$PATH:/home/liujinfu/Downloads/TensorRT-8.2.5.1/lib::$LIBRARY_PATH

# 保存后刷新环境变量
source ~/.bashrc

④ 安装Tensor RT库:

cd TensorRT-8.2.5.1/python
# 根据Python版本安装,博主为python3.9
pip install tensorrt-8.2.5.1-cp39-none-linux_x86_64.whl 

# 安装依赖
cd TensorRT-8.2.5.1/graphsurgeon
pip install graphsurgeon-0.4.5-py2.py3-none-any.whl

⑤ 查看安装版本:

import onnxruntime as ort
import tensorrt
print(ort.get_device())
print(ort.get_available_providers())
print(tensorrt.__version__)

3--实例测试

        深度学习模型部署流程一般为:Pytorch → Onnx → TensorRT;这里博主选取一个姿态估计的Onnx模型(ThreeDPose)作为实例测试:Onnx模型下载地址

3-1--验证Onnx模型的可用性

# 导入第三方库
import onnx
import numpy as np
import onnxruntime as ort
import cv2

# 导入下载的Onnx模型 
model_path = './Resnet34_3inputs_448x448_20200609.onnx'
onnx_model = onnx.load(model_path)
onnx.checker.check_model(onnx_model)

# 前处理:读入图像并调整为输入维度
img = cv2.imread("data/InitImg.png")
img = cv2.resize(img,(448,448)).transpose(2,0,1)
img = np.array(img)[np.newaxis, :, :, :].astype(np.float32)

# 设置模型session以及输入信息
sess = ort.InferenceSession(model_path,providers= ort.get_available_providers()) # 这一步可能会报错,一般与onnxruntime的版本有关,需根据实际情况进行调整
input_name1 = sess.get_inputs()[0].name
input_name2 = sess.get_inputs()[1].name
input_name3 = sess.get_inputs()[2].name

# 使用Onnx模型进行推理 
output = sess.run(None, {input_name1: img, input_name2: img, input_name3: img})

print(output)

# 后处理
# 代码。。。

        正常运行,没有报错就表明下载的Onnx模型没有问题;

3-2--将Onnx模型转换为推理引擎engine

        借助Tensor RT自带的可执行文件trtexec,将Onnx模型转换为推理引擎:

cd TensorRT-8.2.5.1/bin

./trtexec --onnx=/home/liujinfu/Desktop/Tensor_Test/Resnet34_3inputs_448x448_20200609.onnx --saveEngine=/home/liujinfu/Desktop/Tensor_Test/Resnet34_3inputs_448x448_20200609.trt --workspace=6000

# --onnx=path1 表示待转换的onnx模型
# --saveEngine=path2 表示保存的推理engine模型

3-3--基于Tensor RT使用engine模型进行推理

# 导入第三方库
import torch
import cv2
import tensorrt as trt
import numpy as np
 
def trt_version():
   return trt.__version__
 
def torch_device_from_trt(device):
   if device == trt.TensorLocation.DEVICE:
       return torch.device("cuda")
   elif device == trt.TensorLocation.HOST:
       return torch.device("cpu")
   else:
       return TypeError("%s is not supported by torch" % device)
 
 
def torch_dtype_from_trt(dtype):
   if dtype == trt.int8:
       return torch.int8
   elif trt_version() >= '7.0' and dtype == trt.bool:
       return torch.bool
   elif dtype == trt.int32:
       return torch.int32
   elif dtype == trt.float16:
       return torch.float16
   elif dtype == trt.float32:
       return torch.float32
   else:
       raise TypeError("%s is not supported by torch" % dtype)
 
class TRTModule(torch.nn.Module):
        
    def __init__(self, engine=None, input_names=None, output_names=None):
        super(TRTModule, self).__init__()
        self.engine = engine
        if self.engine is not None:
            # engine创建执行context
            self.context = self.engine.create_execution_context()
    
        self.input_names = input_names
        self.output_names = output_names
 
    def forward(self, *inputs):
        batch_size = inputs[0].shape[0]
        bindings = [None] * (len(self.input_names) + len(self.output_names))
        # 创建输出tensor,并分配内存
        outputs = [None] * len(self.output_names)
        for i, output_name in enumerate(self.output_names):
            idx = self.engine.get_binding_index(output_name) # 通过binding_name找到对应的input_id
            dtype = torch_dtype_from_trt(self.engine.get_binding_dtype(idx)) # 找到对应的数据类型
            shape = (batch_size,) + tuple(self.engine.get_binding_shape(idx)) # 找到对应的形状大小
            device = torch_device_from_trt(self.engine.get_location(idx))
            output = torch.empty(size=shape, dtype=dtype, device=device)
            outputs[i] = output
            bindings[idx] = output.data_ptr() # 绑定输出数据指针
    
        for i, input_name in enumerate(self.input_names):
            idx = self.engine.get_binding_index(input_name)
            bindings[idx] = inputs[0].contiguous().data_ptr() # 应当为inputs[i],对应3个输入。但由于我们使用的是单张图片,所以将3个输入全设置为相同的图片。
    
        self.context.execute_async(
            batch_size, bindings, torch.cuda.current_stream().cuda_stream
            ) # 执行推理
    
        outputs = tuple(outputs)
        if len(outputs) == 1:
            outputs = outputs[0] 
            
        return outputs

if __name__ == "__main__":
    
    logger = trt.Logger(trt.Logger.INFO)
    
    # 加载推理引擎,返回ICudaEngine对象
    with open("./Resnet34_3inputs_448x448_20200609.trt", "rb") as f, trt.Runtime(logger) as runtime:
        engine = runtime.deserialize_cuda_engine(f.read())
    
    # 查看输入输出的名字,类型,大小
    for idx in range(engine.num_bindings):
        is_input = engine.binding_is_input(idx)
        name = engine.get_binding_name(idx)
        op_type = engine.get_binding_dtype(idx)
        shape = engine.get_binding_shape(idx)
        print('input id:', idx, ' is input: ', is_input, ' binding name:', name, ' shape:', shape, 'type: ', op_type)
    
    trt_model = TRTModule(engine, ["input.1", "input.4", "input.7"], ["499", "504", "516", "530"])
    
    # 加载测试图片
    image = cv2.imread("./test1.jpg")
    
    # 前处理
    image = cv2.resize(image, (200,64))
    image = image.transpose(2,0,1)
    img_input = image.astype(np.float32)
    img_input = torch.from_numpy(img_input)
    img_input = img_input.unsqueeze(0)
    img_input = img_input.to('cuda:0')
    
    # 运行模型进行推理
    result_trt = trt_model(img_input)

4--参考

TensorRT8.2最新版入门教程

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

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

相关文章

【docker09】镜像发布到docker私有库

镜像发布到docker私有库 1.Docker Registry 官方Docker Hub地址:https://hub.docker.com/&#xff0c;中国大陆访问太慢&#xff0c;并且具有被阿里云取代的趋势&#xff0c;不太主流Dockerhub、阿里云这样的公共镜像仓库可能不太方便&#xff0c;涉及机密的公司不可能提供镜像…

PDF如何转换成excel文档?这个方法很实用

PDF如何转换成excel文档&#xff1f;PDF文件是我们经常使用的文件之一&#xff0c;我们在很多工作场景都能接触到PDF文件&#xff0c;不过PDF文件并不能适用于各种情况&#xff0c;比如我们想对文件内的数据进行更改&#xff0c;我们就需要把PDF文件转换成excel表格再进行修改&…

js 生成条形码

简介&#xff1a; 通过js生成条形码 效果展示&#xff1a; 示例代码&#xff1a; <!-- Created by IntelliJ IDEA. User: songsir Date: 2018/11/26 Time: 10:49 --> <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&…

分享一下我3个月收割大厂offer的一些经验总结

前几天&#xff0c;有位老粉私信我&#xff0c;说看到某95后学弟晒出阿里P7的工资单&#xff0c;他是真酸了…想狠补下技术&#xff0c;努力冲一把大厂。 为了帮到他&#xff0c;也为了大家能在最短的时间内做面试复习&#xff0c;我把软件测试面试系列都汇总在这一篇文章了。…

对抗搜索 学习笔记

先来看一道有意思题 situation 大意&#xff1a; 两个人玩井字棋&#xff0c;要求把所有位置填满后结束游戏。一方希望两者的连起来的线之差最多&#xff0c;一方希望最少。现在给定初始局面&#xff08;已经存在一些棋子&#xff09;以及先手&#xff0c;求最后的两者的连起…

SAP FICO预制凭证界面隐藏过账按钮

会计凭证一旦过账了就不能再进行修改&#xff0c;但其也提供了类似国内财务软件同样的预制功能&#xff0c;预制凭证过账之前不会更新会计系统。预制凭证虽然不更新科目余额&#xff0c;但同样会生成凭证编号&#xff0c;其凭证内容可以随意更改&#xff0c;也可以删除。一旦过…

bios设置u盘启动重装系统教程

​如今&#xff0c;大部分人都会采用U盘启动盘装系统&#xff0c;而使用U盘装系统之前&#xff0c;有一个很重要的步骤&#xff0c;那就是设置U盘启动。大部分电脑都可以直接通过u盘启动快捷键来选择U盘启动&#xff0c;少部分电脑只能通过bios设置u盘为第一启动项。那么&#…

支付宝的架构

自 2008 年双 11 以来&#xff0c;在每年双 11 超大规模流量的冲击上&#xff0c;蚂蚁金服都会不断突破现有技术的极限。2010 年双 11 的支付峰值为 2 万笔/分钟&#xff0c;到 2017 年双 11 时这个数字变为了 25.6 万笔/秒。 2018 年双 11 的支付峰值为 48 万笔/秒&#xff0c…

log4j2的使用

Log4j2的使用 概述 Apache Log4j 2是对Log4j的升级版&#xff0c;参考了logback的一些优秀的设计&#xff0c;并且修复了一些问题&#xff0c;因此带来了一些重大的提升&#xff0c;主要有&#xff1a; 异常处理&#xff0c;在logback中&#xff0c;Appender中的异常不会被应…

若依 ruoyi 配置多数据源 生成代码 导出代码

本文相关库说明&#xff1a;vue&#xff08;若依自带库&#xff09;db_game多数据源从库1db_paystore 多数据源从库2多数据源的情况下&#xff0c;想生成其他从库下数据库表对应的代码&#xff0c;但是若依自带的导入表中 是不会查询到从库各数据表信息的(只查询到若依框架对应…

我是这样解决 HBuilderX 安卓基座安装失败的问题

本文简介 点赞 关注 收藏 学会了 记录一个在使用 HBuilderX 开发 App 时遇到的问题。 同步资源失败&#xff0c;未得到同步资源的授权&#xff0c;请停止运行后重新运行&#xff0c;并注意手机上的授权提示 出现这个问题的原因是我把手机的 HBuilder App 给删掉了&#xff…

【自学Java】Java多维数组

Java多维数组 Java多维数组教程 Java 语言 中有 一维数组&#xff0c;也会有多维数组。如果有一个二维数组&#xff0c;那么数组的每个元素将会是一维数组&#xff0c;而不是单纯的元素。如果是一个多维数组&#xff0c;那么每个位置上面对应的是 纬度 - 1 的数组。 因为在平…

从官方文档学习Rabbit与SpringAMQP-乱版

本文也是笔者一直没有去详细学习的一个重要知识点MQ&#xff0c;也是架构中非常重要的一个中间件。 主要从Rabbit官网于Spring AMQP官方文档的角度去详细学习MQ 官方文档 Rabbit Spring AMQP 学习结果 测试项目地址 导读 本文主要从以下两个角度去学习MQ 一、RabbitMQ 官…

【nodejs】模块的加载机制

1、优先从缓存中加载 模块在第一次加载后会被缓存。意味着多次调用require()不会导致模块的代码被执行多次 注意&#xff1a;不论是内置模块、用户自定义模块、还是第三方模块&#xff0c;它们都会优先从缓存中加载&#xff0c;从而提高模块的加载效率。 &#xff08;1&#x…

【求证】 网上配镜靠谱吗?

肯定也有不少的小伙伴 看着网上琳琅满目的“明星同款”眼镜 心动不已 盘算着给自己弄一副“性价比” 最高“明星同款”那么网上配镜究竟靠不靠谱&#xff1f; 潍坊眼科医院眼健康管理中心提醒您 网上配镜需谨慎 网络平台的价格优势非常明显&#xff0c;部分销量高的店铺&#x…

二叉树基础计算

题目专题二叉树节点个数二叉树叶子节点个数二叉树第k 层节点个数二叉树查找值为x 的节点一共有这么几个题目&#xff0c;主要是用来表现题目的性质 分别是求 二叉树节点个数 二叉树叶子节点个数 二叉树第k 层节点个数 二叉树查找值为x 的节点 如果我使用的还是这个二叉树 其…

【linux】基础IO

文章目录一、复习文件相关知识二、复习C文件相关操作1、复习知识点2、复习操作三、文件的系统调用接口1、open2、write3、read小结四、文件描述符1、初步认识2、两个问题知识点3、文件描述符的分配规则五、重定向1、 dup2函数2、myshell里面实现重定向功能3、知识点六、如何理解…

【C++】stack、queue和deque

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;stack 的…

密集单目 SLAM 的概率体积融合

点击进入—>3D视觉工坊学习交流群笔者简述&#xff1a;这篇论文主要还是在于深度估计这块&#xff0c;深度估计由于硬件设备的不同是有很多方法的&#xff0c;双目&#xff0c;RGBD&#xff0c;激光雷达&#xff0c;单目&#xff0c;其中最难大概就是单目了。在该论文中作者…

Flutter不常用组件(四)

Offstage 创建一个在视觉上隐藏其子项的小部件。隐藏后不占空间。 该组件有以下几个属性&#xff1a; Key? key&#xff1a;标识键bool offstage true&#xff1a;是否隐藏。默认为trueWidget? child&#xff1a;子组件 Center(child: Column(mainAxisAlignment: MainAx…