Tensorrt学习笔记_trtlite安装-程序员宅基地

技术标签: tensorrt  边缘计算  深度学习  人工智能  deepstream  

1. what is tensorrt

tensorrt

参考:TensorRT的介绍与应用

1. tensorflow、tensorrt数据格式

tensorflow temsorrt
NWHC NCWH

N:batch-size
W:width
H:height
C:通道

2. end_to_end_tensorflow_mnist

cd /opt/developutils/deepstream/tensorrt/TensorRT-7.2.3.4/samples/python/end_to_end_tensorflow_mnist
python -m pip install -r requirements.txt
mkdir models
python model.py
convert-to-uff models/lenet5.pb
python sample.py -d /opt/developutils/deepstream/tensorrt/TensorRT-7.2.3.4/data/

3. 使用tensorrt创建自定义网络

4. 使用python接口导入Tensorflow模型

5. 在python中序列化引擎

6.how does tensorrt work?

  • [] 生成的计划文件不能跨平台或tensorrt版本移植
  • [] 构建阶段在图层上执行以下优化
    - 消除为使用输出层
    - 融合卷积、偏差和relu操作
    - 聚合足够相似的参数和相同的源张量的操作(例如,googlenet v
    - 5 inception模块中的1*1卷积)
    - 通过将层输出定向到正确的最终目标来合并连接层
  • [] 如有必要, bulider还会修改权重的精度
  • [] 构建阶段还在虚拟数据上运行图层以其从内核目录中选择最快的内核,并在适当的情况下执行权重预格式化和内存优化

7. what capabilities does tensorrt provide

  • cafeparser
  • uffparser
  • onnxparser

参考:TensorRT的介绍与应用 看到yolov3

### 模型转换代码
resnet50---》onnx---》engine---》load engine

-- coding: UTF-8 --

“”"
@Time: 2021/8/11下午5:10
@Author: geekplusa
@FIleName: app_onnx_resnet50.py
@Descripttion: [resnet50—》onnx—》engine—》load engine]
@Software: PyCharm
“”"

#~~~~~~~~~import-start

pip install {}

import torch
import torchvision
from torchsummary import summary
import time
import pycuda.driver as cuda
import pycuda.autoinit
#~~~~~~~import-end

torch.manual_seed(0)
device = torch.device(‘cuda:0’ if torch.cuda.is_available() else ‘cpu’)

resnet50 = torchvision.models.resnet50().to(device)
resnet50.eval()

input_data = torch.randn(1, 3, 1080, 1920, dtype=torch.float32, device=device)
output_data_pytorch = resnet50(input_data).cpu().detach().numpy()

nRound = 1
torch.cuda.synchronize()
t0 = time.time()
for i in range(nRound):
resnet50(input_data)
torch.cuda.synchronize()
t1 = time.time()
time_pytorch = (t1 - t0) /nRound

print(‘PyTorch time:’, time_pytorch)

input_names = [‘input’]
output_names = [‘output’]

torch.onnx.export(resnet50, input_data, ‘resnet50.onnx’, input_names=input_names, output_names=output_names, verbose=True, opset_version=11)

输入可变

torch.onnx.export(resnet50, input_data, ‘resnet50.dynamic_shape.onnx’, dynamic_axes={“input”: [0, 2, 3]}, input_names=input_names, output_names=output_names, verbose=True, opset_version=11)

“”"
继续运行python代码前,先执行如下命令
trtexec --verbose --onnx=…/samples/python/network_api_pytorch_mnist/resnet50.onnx --saveEngine=…/samples/python/network_api_pytorch_mnist/resnet50.trt
trtexec --verbose --onnx=…/samples/python/network_api_pytorch_mnist/resnet50.onnx --saveEngine=…/samples/python/network_api_pytorch_mnist/resnet50_fp16.trt --fp16
以下命令仅供参考
trtexec --verbose --onnx=…/samples/python/network_api_pytorch_mnist/resnet50.dynamic_shape.onnx --saveEngine=resnet50.dynamic_shape.trt --optShapes=input:1x3x1080x1920 --minShapes=input:1x3x1080x1920 --maxShapes=input:1x3x1080x1920
trtexec --verbose --onnx=…/samples/python/network_api_pytorch_mnist/resnet50.dynamic_shape.onnx --saveEngine=resnet50.dynamic_shape_fp16.trt --optShapes=input:1x3x1080x1920 --minShapes=input:1x3x1080x1920 --maxShapes=input:1x3x1080x1920 --fp16
“”"

from trt_lite2 import TrtLite
import numpy as np
import os

class PyTorchTensorHolder(pycuda.driver.PointerHolderBase):
def init(self, tensor):
super(PyTorchTensorHolder, self).init()
self.tensor = tensor

def get_pointer(self):
    return self.tensor.data_ptr()

for engine_file_path in [‘resnet50.trt’, ‘resnet50_fp16.trt’]:
if not os.path.exists(engine_file_path):
print(‘Engine file’, engine_file_path, ‘doesn’t exist. Please run trtexec and re-run this script.’)
exit(1)

print('====', engine_file_path, '===')
trt = TrtLite(engine_file_path=engine_file_path)
trt.print_info()
i2shape = {0: (1, 3, 1080, 1920)}
io_info = trt.get_io_info(i2shape)
d_buffers = trt.allocate_io_buffers(i2shape, True)
output_data_trt = np.zeros(io_info[1][2], dtype=np.float32)

d_buffers[0].copy_(input_data.reshape(d_buffers[0].size()))
trt.execute([t.data_ptr() for t in d_buffers], i2shape)
output_data_trt = d_buffers[1].cpu().numpy()

torch.cuda.synchronize()
t0 = time.time()
for i in range(nRound):
    trt.execute([t.data_ptr() for t in d_buffers], i2shape)
torch.cuda.synchronize()
time_trt = (time.time() - t0) / nRound
print('TensorRT time:', time_trt)

print('Speedup:', time_pytorch / time_trt)
print('Average diff percentage:',
      np.mean(np.abs(output_data_pytorch - output_data_trt) / np.abs(output_data_pytorch)))
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq122716072/article/details/118495780

智能推荐

codeforce Anton and Fairy Tale-程序员宅基地

文章浏览阅读432次。题意:有一个谷仓,它的容量为N。第i天先会增加M(不会超出它的容量),然后减少i, 问第几天后谷仓为空,且第一天谷仓是满的。第i天 增加 减少 1 0 1 2 1

使用VS2019进行python开发 调试 环境创建_vs2019 python调试-程序员宅基地

文章浏览阅读2.1k次,点赞2次,收藏25次。VS作为宇宙第一编辑器,对Python开发也有很好的支持。添加安装打开Visual Studio Installer点击修改勾选python以及用于科学分析脚本简单使用新建一个python项目选择Python环境查看Python环境添加Python环境可以选择当前已经有的环境,或者创建新的环境.常用的调试快捷键F5 F9 F10 F11这些vs常用的调试快捷键都是可以用的几个有用的窗口打开python调试交互窗口菜单:调试->窗口->python调试交_vs2019 python调试

如何利用对比学习做无监督——[CVPR22]Deraining&[ECCV20]Image Translation_unpaired deep image deraining using dual contrasti-程序员宅基地

文章浏览阅读5.9k次,点赞4次,收藏27次。知乎同名账号同步发布。目录0,参考文献和前置知识和阅读注意1,[ECCV20]Contrastive Learning for Unpaired Image-to-Image Translation1.1,创新点和架构1.2,multi-layer、patchwise的对比学习0,参考文献和前置知识和阅读注意参考文献本文通过两篇paper,简述一下如何利用对比学习做无监督。(ECCV20)Contrastive Learning for Unpaired Image-to-Image Tra_unpaired deep image deraining using dual contrastive learning论文引用

Codeforces Round #516 (Div. 2, by Moscow Team Olympiad) D. Labyrinth_4 5 3 2 1 2 ..... .***. ...** *....codeforces-程序员宅基地

文章浏览阅读141次。D. Labyrinthtime limit per test2 secondsmemory limit per test512 megabytesinputstandard inputoutputstandard outputYou are playing some computer game. One of its levels puts you in a ..._4 5 3 2 1 2 ..... .***. ...** *....codeforces

设计模式之Factory method-程序员宅基地

文章浏览阅读2.7k次。刚开始一直没搞清楚abstract factory 和factory method有什么区别..因为二者常常混在一起用。再仔细想想:AF出来的是一个Factory,这个factory可以创造一系列产品。而FM所属对象本身就是一个factory,调用FM函数将产生一个产品。AF---->Factory(自己可能就提供FM)---->Product。它这个和AF是面向不同层次的,AF更加广泛高一些。当然也可以做一个AF类,而且只有一个createProduct函数(本来一个F

vscode插件开发(二)插件结构_.vscode文件夹-程序员宅基地

文章浏览阅读1.9k次,点赞4次,收藏3次。这一篇我们来了解一下vscode插件的代码结构_.vscode文件夹

随便推点

Cisco(GNS3) - 数据链路层协议PPP_gns3ppp协议-程序员宅基地

文章浏览阅读2.5k次,点赞3次,收藏22次。PPP(Point to Point Protocol)广域网点对点串行链路上的封装协议,相比HDLC(High-Level Data Link Control)协议具有更好的扩展功能,例如数据压缩、身份验证、链路捆绑等。PPP基本配置(Authentication) PPP身份认证(PAP) PPP身份认证(CHAP) PPP链路捆绑(MultiLink)一: PPP基本配置..._gns3ppp协议

JAVA1.8新特性_java 1.8 annotation 的作用域 use_type和type_parameter-程序员宅基地

文章浏览阅读215次。“Java is still not dead—and people are starting to figure that out.”本教程将用带注释的简单代码来描述新特性,你将看不到大片吓人的文字。一、接口的默认方法Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下:复制代码代码如下:_java 1.8 annotation 的作用域 use_type和type_parameter

Ubuntu系统下安装gnome桌面_ubuntu启动gnome桌面-程序员宅基地

文章浏览阅读8.9k次。sudo apt-get install gnome-shell_ubuntu启动gnome桌面

mysql 个别字段设置默认值_mysql laravel 给某个字段设置默认值-程序员宅基地

文章浏览阅读1.4k次。项目中经常遇到一些问题:添加到表中数据一般不会出现什么错误,反而读取数据各种报错像我这种,自以为很简单的读取,也不debug,直接获取数据,然后。。非常浪费时间,有个别报错。查看的时候,原来是某个字段为空 转化 数据类型的出现错误。解决办法:那就是‘设置默认值’我试过在实体里添加默认值 没有效果数据库---找到数据表-修改字段默认值--存入数据的时候还是没有效果..._mysql laravel 给某个字段设置默认值

html+css 图片右上角加删除叉,图片删除_css 右上角半圆删除-程序员宅基地

文章浏览阅读3.8w次,点赞4次,收藏17次。html+css 图片右上角加删除叉,图片删除_css 右上角半圆删除

计算机休眠不播放音乐,如何设置win8系统进入睡眠状态后音乐继续播放-程序员宅基地

文章浏览阅读3.3k次。我们离开电脑一段时间后,ghost win8系统也会根据用户设置时间自动进入睡眠或待机状态。但是有win8系统用户反馈进入睡眠状态后播放音乐也会自动停止,需要手动按下键盘或移动鼠标才能继续播放音乐,那么如何设置win8系统进入睡眠状态后音乐继续播放呢?方法当然是有的,有需要不妨看看下面详细操作。解决方法:1、接在桌面空白的地方单击右键选择“个性化”;2、开“个性化”,点击右下角的“屏幕保护程序”进..._联想电脑休眠有音乐