在windows上用python版tensorrt推理

在这里插入图片描述

文章目录

  • 尝试一:利用torch导出的pth文件,调用torch2trt来进行trt推理
    • 1.1 搭建环境
    • 1.2 如何trt推理
    • 1.3 遇到的问题
  • 尝试二:把onnx模型转为sim版的onnx模型
    • 2.1 搭建onnxim环境
    • 2.2 使用 onnxsim
  • 尝试三:把onnx-sim转到trt,并推理trt
    • 3.1 把onnxsim转到trt (windows上)
    • 3.2 推理trt
    • 3.3 遇到的问题

笔者有个需求,如题,简单来说就是用tensorrt加速推理,然后踩了众多坑,这里总结如下。先说结论,最后是onnx转为onnx-sim版本,已经查过精度几乎没啥影响,然后转trt,最后用python脚本推理trt搞定。

  • 这里做了一些尝试,笔者这里尝试出现的问题可能跟模型有关,大家自行选择,想跟笔者一样操作直接从尝试二开始看。
  • 注意: 在此之前肯定要先安装tensorrt才行,可以参考我的另一篇博客在windows安装python版本的tensorrt

环境记录:(笔者自己记录,仅参考)
torch-1.13.0+cu117
torchvision 0.14.0+cu117
torchaudio-0.13.0+cu117

尝试一:利用torch导出的pth文件,调用torch2trt来进行trt推理

参考官方的github:https://github.com/NVIDIA-AI-IOT/torch2trt
这里粘贴一下,很简单,搭建环境,然后再导入模型后直接一行推理

1.1 搭建环境

git clone https://github.com/NVIDIA-AI-IOT/torch2trt
cd torch2trt
python setup.py install

1.2 如何trt推理

import torch
from torch2trt import torch2trt
from torchvision.models.alexnet import alexnet# create some regular pytorch model...
model = alexnet(pretrained=True).eval().cuda()# create example data
x = torch.ones((1, 3, 224, 224)).cuda()# convert to TensorRT feeding sample data as input
model_trt = torch2trt(model, [x])y = model(x)  # 原始推理方式
y_trt = model_trt(x)  # trt推理方式# check the output against PyTorch
print(torch.max(torch.abs(y - y_trt)))

1.3 遇到的问题

  • 问题一:在验证torch2trt的时候遇到的问题
OSError: [WinError 127] 找不到指定的程序。 Error loading "\path\to\site-packages\torch\lib\cublas64_11.dll" or one of its dependencies.

解决方案:
这里网上很多说pytorch版本问题,当然也有可能,但这里我最直接的问题是路径中我的是大写的Lib,而这个是小写的lib,因此把环境变量加入,我就ok了,具体操作(在windows上):
windows上查看环境变量

set

windows上设置环境变量(当然这里你要找下你的cublas64_11.dll在哪儿)

set PATH=\path\to\Lib\site-packages\torch\lib;(其他一堆你原来的环路径,用英文的分号隔开)

然后就OK了。

  • 问题二:在torch2trt转模型的时候遇到的问题,也就是跑上述推理trt的脚本
File "XXXXXX\lib\site-packages\torch2trt-0.4.0-py3.7.egg\torch2trt\torch2trt.py", line 300, in wrapperconverter["converter"](ctx)File "XXXXXX\lib\site-packages\torch2trt-0.4.0-py3.7.egg\torch2trt\converters\getitem.py", line 30, in convert_tensor_getiteminput_trt = input._trt
AttributeError: 'Tensor' object has no attribute '_trt'

这个问题就没解决,网上查了资料说是有算子不支持,为了验证这个问题,我就去用命令行直接把onnx转到trt,试一试能不能行,然后发现果真不行,仍然报了如下错误:

onnx2trt_utils.cpp:374: Your ONNX model has been generated with INT64 weights, while TensorRT does not natively support INT64. Attempting to cast down to INT32.

这个问题直接解决也是很费事,然后查到可以转sim版本的,而且也几乎不影响精度,于是乎onnx去转sim版本的onnx。

尝试二:把onnx模型转为sim版的onnx模型

2.1 搭建onnxim环境

要配置 onnxsim 环境,你可以按照以下步骤进行:

  1. 安装 onnxsim:
    你可以使用 pip 安装 onnxsim。在命令行中运行以下命令:
    pip install onnx-simplifier
    
  2. 确保依赖项已安装:
    onnxsim 依赖于 ONNX,因此确保你已经安装了 ONNX。你可以使用以下命令安装 ONNX:
    pip install onnx
    

2.2 使用 onnxsim

安装完成后,你可以在命令行中使用 onnxsim 命令行工具。例如:

python -m onnxsim input.onnx output.onnx

其中,input.onnx 是输入的 ONNX 模型文件名,output.onnx 是输出的简化后的 ONNX 模型文件名。
你可以根据需要调整输入和输出的文件路径。

请注意,onnxsim 主要用于简化和优化模型,并不会影响模型的运行时行为。如果你的主要目标是简化 ONNX 模型以减小文件大小和提高加载速度,onnxsim 是一个很有用的工具。

如此,就可以完成onnx-sim模型转换。

尝试三:把onnx-sim转到trt,并推理trt

3.1 把onnxsim转到trt (windows上)

trtexec.exe --onnx=XXXXXX.onnx --saveEngine=XXXXXXX.engine --workspace=6000

成功转换~

3.2 推理trt

参考官方:https://github.com/NVIDIA/TensorRT/blob/main/quickstart/IntroNotebooks/4.%20Using%20PyTorch%20through%20ONNX.ipynb

这边也记录一下:

  • 首先安装pycuda环境
    pip install pycuda
    
  • 读取engine
    import tensorrt as trt
    import pycuda.driver as cuda
    import pycuda.autoinitf = open("resnet_engine_pytorch.trt", "rb")
    runtime = trt.Runtime(trt.Logger(trt.Logger.WARNING)) 
    engine = runtime.deserialize_cuda_engine(f.read())
    context = engine.create_execution_context()
    
  • 分配输入输出内存
    import numpy as np# need to set input and output precisions to FP16 to fully enable itinput_batch = np.ones([1, 3, h, w], dtype=target_dtype)  # such as: np.float32
    output = np.empty([BATCH_SIZE, 1000], dtype = target_dtype) # allocate device memory
    d_input = cuda.mem_alloc(1 * input_batch.nbytes)
    d_output = cuda.mem_alloc(1 * output.nbytes)
    bindings = [int(d_input), int(d_output)]stream = cuda.Stream()
    
  • 执行推理
    def predict(batch): # result gets copied into output# transfer input data to devicecuda.memcpy_htod_async(d_input, batch, stream)# execute modelcontext.execute_async_v2(bindings, stream.handle, None)# transfer predictions backcuda.memcpy_dtoh_async(output, d_output, stream)# syncronize threadsstream.synchronize()return outputpred = predict(preprocessed_images)
    

这样就推理ok了,不过这边也还遇到一个问题,顺便记录下。

3.3 遇到的问题

ValueError: ndarray is not contiguous

后面发现是preprocessed_images有问题,用这个即可校验:

print(batch.flags['C_CONTIGUOUS'])
print(batch.flags['F_CONTIGUOUS'])

解决方案:
最后是连续化一下向量即可:

if not (preprocessed_images.flags['C_CONTIGUOUS'] or preprocessed_images.flags['F_CONTIGUOUS']):preprocessed_images= np.ascontiguousarray(preprocessed_images)

到这里,您就完成了在windows上用python进行tensorrt的推理操作,速度瞬间快了很多有木有哈哈~
Enjoy~

∼ O n e p e r s o n g o f a s t e r , a g r o u p o f p e o p l e c a n g o f u r t h e r ∼ \sim_{One\ person\ go\ faster,\ a\ group\ of\ people\ can\ go\ further}\sim One person go faster, a group of people can go further

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

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

相关文章

Python之代码覆盖率框架coverage使用介绍

Python代码覆盖率工具coverage.py其实是一个第三方的包,同时支持Python2和Python3版本。 安装也非常简单,直接运行: pip install coverage 安装完成后,会在Python环境下的\Scripts下看到coverage.exe; 首先我们编写…

【LIBS】交叉编译TCPDUMP

目录 1. 安装编译工具2. 设置环境变量3. 编译libpcap3.1 安装依赖3.2 交叉编译 4. 编译TCPDUMP4.1 克隆仓库与生成构建环境4.2 静态链接LIBPCAP4.3 动态链接LIBPCAP4.4 构建与安装 5. 查看交叉编译结果5.1 文件布局 1. 安装编译工具 sudo apt-get install -y autoconf automak…

架构篇25:高可用存储架构-双机架构

文章目录 主备复制主从复制双机切换主主复制小结存储高可用方案的本质都是通过将数据复制到多个存储设备,通过数据冗余的方式来实现高可用,其复杂性主要体现在如何应对复制延迟和中断导致的数据不一致问题。因此,对任何一个高可用存储方案,我们需要从以下几个方面去进行思考…

爬取第一试卷网高三数学试卷并下载到本地

import requests import re import os filename 试卷\\ if not os.path.exists(filename):os.mkdir(filename) url https://www.shijuan1.com/a/sjsxg3/list_727_1.html headers {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.…

第二百八十七回

文章目录 1. 概念介绍2. 使用方法2.1 实现步骤2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取文件类型"相关的内容,本章回中将介绍如何播放视频.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 播放视频是我们常用…

DDOS攻击有哪几种类型

DDOS攻击“分布式拒绝服务”是目前网站服务器所常见的恶意攻击,其原理是通过控制大量肉鸡(虚假流量)访问网站服务器消耗带宽、内存等资源,其目的是使得网站服务器无法正常的访问,其后果是直接导致企业业务受损,数据丢失&#xff0…

Android开发修炼之路——(一)Android App开发基础-3

本专栏文章: Android开发修炼之路——(一)Android App开发基础-1 Android开发修炼之路——(一)Android App开发基础-2 3 App的设计规范 本节介绍了App工程的源码设计规范,首先App将看得见的界面设计与看不…

eNSP学习——交换机基础

目录 原理概述 实验目的 实验步骤 实验内容 实验拓扑 实验步骤 基础配置 配置交换机双工模式 配置接口速率 思考题 原理概述 交换机之间通过以太网电接口对接时需要协商一些接口参数,比如速率、双工模式等。   接口速率:指的是交换机接口每秒钟传…

【Go 快速入门】安装 Go 语言 | 开发工具 Goland | 第一个 Go 语言程序

文章目录 前言安装 Go 语言编译器 Goland运行 Go 程序补充 前言 本系列教程,目的是帮助一个有其他编程基础的 Go 语言小白快速入门 Go 语言,而非启发式学习。每篇幅保证不说废话,尽可能精炼总结,为上手后续的 Go 相关项目打下基础…

基于物联网设计的水稻田智能灌溉系统(STM32+华为云IOT)

一、项目介绍 随着科技的不断发展和人们生活水平的提高,农业生产也逐渐向智能化、高效化的方向发展。水稻作为我国主要的粮食作物之一,其生长过程中的灌溉管理尤为重要。传统的灌溉方式往往依赖于人工观察和控制,不仅效率低下,而…

搜索与图论第五期 拓扑序列

前言 拓扑排序是非常重要的一部分,希望大家都能够手撕代码!!!(嘿嘿嘿) 一、拓扑排序定义(百度须知嘿嘿嘿) 拓扑排序 拓扑排序是一种对有向无环图(Directed Acyclic Gra…

flink学习之窗口处理函数

窗口处理函数 什么是窗口处理函数 Flink 本身提供了多层 API,DataStream API 只是中间的一环,在更底层,我们可以不定义任何具体的算子(比如 map(),filter(),或者 window()),而只是…

GitHub Copilot 与 ChatGPT:哪种工具更适合软件开发?

GitHub Copilot 与 ChatGPT:哪种工具更适合软件开发? 比较 ChatGPT 与 GitHub Copilot编程语言功能性定制化训练数据上下文准确性 ChatGPT 与 GitHub Copilot:哪个更适合软件开发?常见问题解答: 不断发展的编程世界正在…

深入理解stress/stress-ng

文章目录 一、概述二、安装2.1、源码编译安装2.2、命令行安装2.3、安装确认 三、重要参数详解3.1、查询支持的参数3.2、重要参数说明 四、实例4.1、压测CPU4.2、压测内存4.3、压测IO4.4、压测磁盘及IO4.5、压测磁盘及CPU 团队博客: 汽车电子社区 一、概述 stress是一种工作负载…

电子行业含砷废水,深度除砷技术

砷是一种类金属元素,砷化物生物毒性极强,是国际公认的第一类致癌物。因此,这些含砷废水必须经过一定的处理才能排放到环境中。那么,哪些行业会产生含砷废水呢?在地球上,砷是一种常见的元素。在自然界中,砷…

2023年CSDN年底总结-独立开源创作者第一年

2023年最大的变化,就是出来创业,当独立开源创作者,这一年发起SolidUI开源项目,把知乎重新开始运营起来。CSDN粉丝破万,CSDN博客专家和AI领域创作者。 2023年年度关键词:创业 https://github.com/CloudOrc…

SpringBoot责任链与自定义注解:优雅解耦复杂业务

引言 责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者处理请求。在实际应用中,责任链模式常用于解耦发送者和接收者,使得请求可以按照一定的规则被多个处理者依次处理。 首先,本…

Ceph篇之利用Prometheus监控ceph服务

一、Ceph内置模块 Ceph manager 内部的模块中包含了 prometheus 的监控模块,并监听在每个 manager 节点的 9283 端口,该端口用于将采集到的信息通过 http 接口向 prometheus 提供数据。 二、监控搭建 1、启用 prometheus 监控模块 ceph mgr module enable promethe…

Java+Spring Cloud +Vue+UniApp微服务智慧工地云平台源码

目录 智慧工地云平台功能 【劳务工种】所属工种有哪些? 1.管理人员 2.信息采集 3.证件管理 4.考勤管理 5.考勤明细 6.工资管理 7.现场统计 8.WIFI教育 9.课程库管理 10.工种管理 11.分包商管理 12.班组管理 13.项目管理 智慧工地管理平台是以物联网、…

Windows物理主机迁移至VMware ESXI服务器

文章目录 物理主机迁移至VMware ESXI服务器一、迁移环境二、迁移步骤1、主机A准备工作1、关闭主机A的防火墙2、主机A需要设置管理员密码3、主机A需要设置允许共享访问 2、主机B操作步骤1、安装**VMware vCenter Conver…