Python api构建tensorrt加速模型的步骤详解

目录
  • 一、创建TensorRT有以下几个步骤:
  • 二、Python api和C++ api在实现网络加速有什么区别?
  • 三、构建TensorRT加速模型
    • 3.1 加载tensorRT
    • 3.2 创建网络
    • 3.3 ONNX构建engine

一、创建TensorRT有以下几个步骤:

1.用TensorRT中network模块定义网络模型
2.调用TensorRT构建器从网络创建优化的运行时引擎
3.采用序列化和反序列化操作以便在运行时快速重建
4.将数据喂入engine中进行推理

二、Python api和C++ api在实现网络加速有什么区别?

个人看法
1.python比c++更容易读并且已经有很多包装很好的科学运算库(numpy,scikit等),
2.c++是接近硬件的语言,运行速度比python快很多很多,因为python是解释性语言c++是编译型语言

三、构建TensorRT加速模型

3.1 加载tensorRT

1.import tensorrt as trt
2.为tensorrt实现日志报错接口方便报错,在下面的代码我们只允许警告和错误消息才打印,TensorRT中包含一个简单的日志记录器Python绑定。

TRT_LOGGER = trt.Logger(trt.Logger.WARNING)

3.2 创建网络

简单来说就是用tensorrt的语言来构建模型,如果自己构建的话,主要是灵活但是工作量so large,一般还是用tensorrt parser来构建
(1)Caffe框架的模型可以直接用tensorrt内部解释器构建
(2)除caffe,TF模型以外其他框架,先转成ONNX通用格式,再用ONNX parser来解析
(3)TF可以直接通过tensorrt内部的UFF包来构建,但是tensorrt uff包中并支持所有算子
(4)自己将wts放入自己构建的模型中,工作量so large,但是很灵活。

3.3 ONNX构建engine

因为博主用的ONNXparser来构建engine的,下面就介绍以下ONNX构建engine,步骤如下:
(1)导入tensorrt

import tensorrt as trt

(2)创建builder,network和相应模型的解释器,这里是onnxparser

EXPLICIT_BATCH = 1 << (int)
(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)
with builder = trt.Builder(TRT_LOGGER) as builder,
	builder.create_network(EXPLICIT_BATCH) as network, trt.OnnxParser(network,
 TRT_LOGGER) as parser:
with open(model_path, 'rb') as model:
parser.parse(model.read())

这个代码的主要意思是,构建报错日志,创建build,network和onnxparser,然后用parser读取onnx权重文件。

3.3.1 builder介绍

builder功能之一是搜索cuda内核目录,找到最快的cuda以求获得最快的实现,因此有必要使用相同的GPU进行构建(相同的操作,算子进行融合,减少IO操作),engine就是在此基础上运行的,builder还可以控制网络以什么精度运行(FP32,FP16,INT8),还有两个特别重要的属性是最大批处理大小和最大工作空间大小。

builder.max_batch_size = max_batch_size
builder.max_workspace_size = 1 << 20

3.3.2序列化模型

序列化和反序列化模型的主要是因为network和定义创建engine很耗时,因此可以通过序列化一次并在推理时反序列化一次来避免每次应用程序重新运行时重新构建引擎。
note:序列化引擎不能跨平台或TensorRT版本移植。引擎是特定于它们所构建的GPU模型(除了平台和TensorRT版本)
代码如下:

#序列化模型到模型流
serialized_engine = engine.serialize()
#反序列化模型流去执行推理,反序列化需要创建一个运行时对象
with trt.Runtime(TRT_LOGGER) as runtime:
	engine = runtime.deserialize_cuda_engine(serialized_engine)
#也可以将序列化模型write
with open(“sample.engine”, “wb”) as f:
	f.write(engine.serialize())
#然后再读出来进行反序列化
with open(“sample.engine”, “rb”) as f, trt.Runtime(TRT_LOGGER) as runtime:
	engine = runtime.deserialize_cuda_engine(f.read())

3.3.3执行推理过程

note:下面过程的前提是已经创建好了engine

# 为输入和输出分配一些主机和设备缓冲区:
#确定尺寸并创建页面锁定内存缓冲区
h_input = cuda.pagelocked_empty(trt.volume(engine.get_binding_shape(0)),dtype=np.float32)
h_output =cuda.pagelocked_empty(trt.volume(engine.get_binding_shape(1)),dtype=np.float32)
#为输入和输出分配设备内存
d_input = cuda.mem_alloc(h_input.nbytes)
d_output = cuda.mem_alloc(h_output.nbytes)
#创建一个流,在其中复制输入/输出并运行推断
stream = cuda.Stream()
# 创建一些空间来存储中间激活值,因为engine保存了network定义和训练时的参数,这些都是构建的上下文执行的。
with engine.create_execution_context() as context:
 	# 输入数据传入GPU
	cuda.memcpy_htod_async(d_input, h_input, stream)
 	# 执行推理.
 	context.execute_async(bindings=[int(d_input), int(d_output)],
 	stream_handle=stream.handle)
 	# 将推理后的预测结果从GPU上返回.
 	cuda.memcpy_dtoh_async(h_output, d_output, stream)
 	# 同步流
 	stream.synchronize()
 	# 返回主机输出
	return h_output

note:一个engine可以有多个执行上下文,允许一组权值用于多个重叠推理任务。例如,可以使用一个引擎和一个上下文在并行CUDA流中处理图像。每个上下文将在与引擎相同的GPU上创建。

到此这篇关于Python api构建tensorrt加速模型的文章就介绍到这了,更多相关Python api tensorrt加速模型内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python自动化调用百度api解决验证码

    自动化测试验证码登陆的三种解决方式 1,找开发关闭验证码 2,找开发设置万能验证码 3,使用第三方接口识别验证–不能100%识别,比自己搭建的ocr识别的识别率高很多 具体讲的就是第三种-调用百度云识别验证码: from selenium import webdriver from PIL import Image import base64 import requests import time def baidu_api(Verification_code, AK, SK):#Verific

  • python 利用百度API进行淘宝评论关键词提取

    利用百度API自然语言处理技术中的评论观点抽取方面,对淘宝购物的评论进行分析,把关键词进行提取,方便买家快速了解该商品的相关特点,具体实现过程如下: 1.创建相关新应用 首先,需要登录百度AI平台,创建一个关于自然语言处理技术的应用(领取免费额度),获得AppID.API Key和Secret Key如下: 然后下载Python的SDK,然后可以通过阅读API的使用手册和自然语言处理技术的观点抽取相关案例: 2.获取Access Token 使用百度API时需要先获取Access Token,并

  • python调用api实例讲解

    我们在做自动化运维的时候,经常需要调用api中的接口,不过很多人不知道具体的调用方法,在学习python中的requests库后,我们就可以很轻松的实现了. 1.说明 api接口调用是指使用python的requests库进行访问,基本上是get或post请求,有些接口会加密,然后必须使用对方提供给我们的公钥加密或解密,配上相应的参数进行访问,我们所需要的数据在请求后的返回结果中,所看到的基本上都是json格式的解析,所以请求后可以使用requests自带的json函数进行解析,然后提取所需的数

  • Python 调用API发送邮件

    在运营或者对各种 SDK 或者 API 进行调试的时候,邮件功能基本上都会被使用到. 在测试的时候,可能很多人都会使用 SMTP 或者自己的邮箱使用 SMTP 来进行发送,通常来说是没有问题的. 但是需要知道一个网站或者一个平台在一个很短的时间内需要发送大量的邮件,同时邮件还有可能被防火墙阻挡等情况的发生导致无法送达. 因此普通邮箱自带的 SMTP 通常是没有办法满足需求的,因此我们可能需要一些专业的邮箱服务,具体使用哪个服务,我们就不在这里说明了,避免广告嫌疑. 一般来说专业的邮箱服务器都会提

  • python调用百度API实现人脸识别

    1.代码 from aip import AipFace import cv2 import time import base64 from PIL import Image from io import BytesIO import pyttsx3 # """ 你的 APPID AK SK """ APP_ID = '1965####' API_KEY = 'YXL65ekIloykyjrT4kzc####' SECRET_KEY = 'lFi

  • 用 Django 开发一个 Python Web API的方法步骤

    Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 Web 应用程序框架.它是Python API开发中最受欢迎的名称之一,自2005年成立以来,其知名度迅速提升. Django由Django软件基金会(Django Software Foundation)维护,并获得了社区的大力支持,在全球拥有11,600多个成员.在Stack Overflow上,Django大约有191,000个带标签的问题.Spotify,YouTube和Instagram等网站都依

  • python基于爬虫+django,打造个性化API接口

    简述 今天也是同事在做微信小程序的开发,需要音乐接口的测试,可是用网易云的开放接口比较麻烦,也不能进行测试,这里也是和我说了一下,所以就用爬虫写了个简单网易云歌曲URL的爬虫,把数据存入mysql数据库,再利用django封装装了一个简单的API接口,给同事测试使用. 原理 创建django项目,做好基础的配置,在views里写两个方法,一个是从mysql数据库中查数据然后封装成API,一个是爬虫方法,数据扒下来以后,通过django的ORM把数据插入到mysql数据库中. 这里的路由也是对应两

  • python3 kubernetes api的使用示例

    一.安装 github:https://github.com/kubernetes-client/python 安装 pip install kubernetes 二.认证 1.kubeconfig文件认证 首先引入SDK支持库.然后将 ~/.kube 的config文件的内容复制到本地目录,保存为文件kubeconfig.yaml,然后运行下面的python代码. [root@k8s-m ~]# cp .kube/config kubeconfig.yaml #使用 from kubernet

  • python调用jenkinsAPI构建jenkins,并传递参数的示例

    安装jenkins 安装jenkins很简单,可以用多种方式安装,这里知道的有: 在官网下载rpm包,手动安装,最费事 centos系统通过yum安装,ubuntu通过apt-get安装(不推荐,因为很多东西都使用了默认的) 直接下载官网上的war包 我这里直接用的下载war包 遇到的坑 在安装之前,公司的服务器上已经有一个版本的jekins在运行了,所有参数都已经被设置过了,所以,重新安装的版本,虽然文件夹,用户都和以前的版本不一样,但是每次jenkins页面都是直接跳转上个版本的,并不会进入

  • Python api构建tensorrt加速模型的步骤详解

    目录 一.创建TensorRT有以下几个步骤: 二.Python api和C++ api在实现网络加速有什么区别? 三.构建TensorRT加速模型 3.1 加载tensorRT 3.2 创建网络 3.3 ONNX构建engine 一.创建TensorRT有以下几个步骤: 1.用TensorRT中network模块定义网络模型 2.调用TensorRT构建器从网络创建优化的运行时引擎 3.采用序列化和反序列化操作以便在运行时快速重建 4.将数据喂入engine中进行推理 二.Python api

  • python3 通过 pybind11 使用Eigen加速代码的步骤详解

    python是很容易上手的编程语言,但是有些时候使用python编写的程序并不能保证其运行速度(例如:while 和 for),这个时候我们就需要借助c++等为我们的代码提速.下面是我使用pybind11调用c++的Eigen库的简单介绍: 第一步:准备系统和IDE: Windows 10 vs2015 (用于调试c++代码) vscode (调试python代码) 第二步:python虚拟环境: 1.创建虚拟python虚拟环境: 在vscode的terminal中执行 python -m v

  • 用Python实现简单的人脸识别功能步骤详解

    前言 让我的电脑认识我,我的电脑只有认识我,才配称之为我的电脑! 今天,我们用Python实现简单的人脸识别技术! Python里,简单的人脸识别有很多种方法可以实现,依赖于python胶水语言的特性,我们通过调用包可以快速准确的达成这一目的.这里介绍的是准确性比较高的一种. 一.首先 梳理一下实现人脸识别需要进行的步骤: 流程大致如此,在此之前,要先让人脸被准确的找出来,也就是能准确区分人脸的分类器,在这里我们可以用已经训练好的分类器,网上种类较全,分类准确度也比较高,我们也可以节约在这方面花

  • Python人工智能之混合高斯模型运动目标检测详解分析

    [人工智能项目]混合高斯模型运动目标检测 本次工作主要对视频中运动中的人或物的边缘背景进行检测. 那么走起来瓷!!! 原视频 高斯算法提取工作 import cv2 import numpy as np # 高斯算法 class gaussian: def __init__(self): self.mean = np.zeros((1, 3)) self.covariance = 0 self.weight = 0; self.Next = None self.Previous = None c

  • python实现微信跳一跳辅助工具步骤详解

    说明 1.windows上安装安卓模拟器,安卓版本5.1以上 2.模拟器里下载安装最新的微信6.6.1 3.最好使用python2.7,python3的pyhook包有bug,解决比较麻烦 步骤 1.windows上安装python2.7,配置好环境变量和pip 2.到这个网站下载对应版本的pyHook和pywin32 http://www.lfd.uci.edu/~gohlke/pythonlibs 2.打开cmd,安装下载好的whl文件和其他库 pip install pywin32-221

  • 移植busybox构建最小根文件系统的步骤详解

    Busybox:瑞士军刀,里面装有很多小命令. STEP 1:构建目录结构 创建根文件系统目录,主要包括以下目录 /dev /etc /lib /usr /var /proc /tmp /home /root /mnt /bin /sbin /sys #mkdir /home/rootfs #cd /home/rootfs #mkdir dev etc lib usr var proc tmp home root mnt sys STEP 2: 使用busybox构建/bin /sbin lin

  • Python使用Numpy实现Kmeans算法的步骤详解

    目录 Kmeans聚类算法介绍: 1.聚类概念: 2.Kmeans算法: 定义: 大概步骤: Kmeans距离测定方式: 3.如何确定最佳的k值(类别数): 手肘法: python实现Kmeans算法: 1.代码如下: 2.代码结果展示: 聚类可视化图: 手肘图: 运行结果: 文章参考: Kmeans聚类算法介绍: 1.聚类概念: 将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类.由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异.

  • Python 绘制酷炫的三维图步骤详解

    通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维矢量(SVG)图. 八面体 我们先以下面这个八面体为例. 1 安装相关包 首先安装两个必备包: import pyrr # NumPy 的 3D 函数库 import svgwrite # svg图形处理库 2 定义 3D 图生成环境 接下来定义几个类设置好 3 维图基础环境: viewport :矩形图范围 camera:包括视图矩阵和投影矩阵

  • Python opencv相机标定实现原理及步骤详解

    相机标定相机标定的目的 获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的选择和平移矩阵),内参和外参系数可以对之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像. 相机标定的输入 标定图像上所有内角点的图像坐标,标定板图像上所有内角点的空间三维坐标(一般情况下假定图像位于Z=0平面上). 相机标定的输出 摄像机的内参.外参系数. 拍摄的物体都处于三维世界坐标系中,而相机拍摄时镜头看到的是三维相机坐标系,成像时三维相机坐标系向二维图像坐标系转换.不同的镜头成像时的转换矩阵不同,同时可能引

  • python的mysqldb安装步骤详解

    python的mysqldb安装步骤详解 安装MySQLdb: 一. 什么是MySQLdb? 解释:MySQLdb是Python操作MySQL的一个接口包.这里要理解一个概念,python操作数据库,都是需要一个类似MySQLdb这样的中间层,这些中间层抽象了具体的实现,提供了统一的API供开发者使用. 二. 如何安装MySQLdb? python2环境下: sudo pip install MySQL-python. MySQL-python目前暂时还不支持python3,有些小问题,可以安装

随机推荐