在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; 首先我们编写…

nginx技能点汇总

nginx技能点汇总 常用正则 . : 匹配除换行符以外的任意字符 ? : 重复0次或1次: 重复1次或更多次 * : 重复0次或更多次 \d :匹配数字 ^ : 匹配字符串的开始 $ : 匹配字符串的结束 {n} &#x…

【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…

TestNG注释- @BeforeMethod

在这篇文章中,我们将学习TestNG中的BeforeMethod注释。BeforeMethod注释方法将在类中的每个测试用例或方法之前执行,但在BeforeClass注释方法之后执行。因此,这意味着BeforeMethod注释将运行与特定类中的测试用例一样多的次数。 那么&#x…

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

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

【linux-interconnect】What NVIDIA MLNX_OFED is?

NVIDIA MLNX_OFED Documentation v23.07 - NVIDIA Docs 文章目录 What NVIDIA MLNX_OFED is?Overview[Software Download](https://docs.nvidia.com/networking/display/mlnxofedv23070512#src-2396583107_NVIDIAMLNX_OFEDDocumentationv23.07-SoftwareDownload) Wh…

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

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将看得见的界面设计与看不…

开发 Chrome 浏览器插件时进行 Vue3+Vite 多页面多入口配置

使用 Vite 开发 Chrome 插件时,构建多页面以及多 js 文件 因为发现 Vite 多页面构建有很多分歧以及问题点,所以我把我在 Chrome 插件开发上面使用到的 Vite 多页面以及多入口文件构建配置单独拿出来 开发 Chrome 插件是,一般会需要一个 popup…

eNSP学习——交换机基础

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

Leetcode HOT 100 - 2. 两数相加(Java + 链表)

文章目录 题目思路Java 链表第 1 步:第 2 步: 复杂度Code 题目 Problem: 2. 两数相加给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加&am…

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

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

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

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

mmdetecion

安装和测试: GET STARTED — MMDetection 3.3.0 documentation mmdetection从配置到训练_openmim-CSDN博客 训练voc数据集: mmdetection训练自己的VOC数据集及常见问题_mmdetection训练voc数据集-CSDN博客 训练自己的COCO数据集及常见问题见下文&…

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

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

flink学习之窗口处理函数

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

Java事务的传播

Java事务的传播详解 欢迎来到本博客,今天我们将深入探讨Java中事务传播行为,这是在处理多个事务边界时至关重要的一环。 1. 事务传播概述 在Java中,事务是一系列操作的执行单元,要么全部执行成功,要么全部回滚。事务…

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

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