先来一段摘抄自网上的TensorRT介绍:

TensorRT是英伟达针对自家平台做的加速包,TensorRT主要做了这么两件事情,来提升模型的运行速度。

  1. TensorRT支持INT8和FP16的计算。深度学习网络在训练时,通常使用 32 位或 16 位数据。TensorRT则在网络的推理时选用不这么高的精度,达到加速推断的目的。
  2. TensorRT对于网络结构进行了重构,把一些能够合并的运算合并在了一起,针对GPU的特性做了优化。现在大多数深度学习框架是没有针对GPU做过性能优化的,而英伟达,GPU的生产者和搬运工,自然就推出了针对自己GPU的加速工具TensorRT。一个深度学习模型,在没有优化的情况下,比如一个卷积层、一个偏置层和一个reload层,这三层是需要调用三次cuDNN对应的API,但实际上这三层的实现完全是可以合并到一起的,TensorRT会对一些可以合并网络进行合并。我们通过一个典型的inception block来看一看这样的合并运算。

TensorRT用来做模型的推理优化,也是有Python接口的,实际使用测试下来,python接口的模型推理速度C++基本差不多的。这里较为详细的记录TensorRT python接口从环境的配置到模型的转换,再到推理过程,还有模型的INT8量化,有时间的话也一并总结记录了,笔者使用的版本是TensorRT7.0版本,此版本支持模型动态尺寸的前向推理,下面也会分为静态推理和动态推理来介绍。

TensorRT环境的配置

tensorRT的配置是很简单的,官网注册,填调查问卷,就可以下载了,笔者用的是TensorRT-7.0.0.11.CentOS-7.6.x86_64-gnu.cuda-9.0.cudnn7.6.tar.gz版本,到存放目录直接解压,配置一下lib下各种编译好的包,还有很重要的cuda环境。

tar -zxvf TensorRT-7.0.0.11.CentOS-7.6.x86_64-gnu.cuda-9.0.cudnn7.6.tar.gz
sudo vim ~/.bashrc
#添加下面路径,注意改成自己的tensorRT的lib路径,cuda的路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/caidou/A/TensorRT-7.0.0.11/lib
export C_INCLUDE_PATH=/usr/local/cuda-9.0/include/:${C_INCLUDE_PATH}
export CPLUS_INCLUDE_PATH=/usr/local/cuda-9.0/include/:${CPLUS_INCLUDE_PATH}
#使其生效
source ~/.bashrc

然后pip安装解压后python 目录下的合适版本的python-tensorrt,pip安装pycuda。import成功就可以啦。

import tensorrt
import pycuda

TensorRT模型的转换

模型的转换主要有两种方式,一种是把pytorch或者keras等训练的模型先转换成ONNX模型,再用TensorRT直接解析ONNX模型;但是有时候这种方法转换tensorrt模型因为某些层的操作,或者转为ONNX时版本变化太多会生成trt模型失败,这时候可以用tensorrt自己的API去重写网络,转为trt模型。这里仅仅记录前者,分为静态尺寸出入的转换和动态尺寸出入,利用API转换官方教程也是有的。

转为动态尺寸的trt模型

import tensorrt as trt
import pycuda.driver as cuda
import pycuda.autoinit
import common
import os
def build_engine(onnx_file_path,engine_file_path):"""Takes an ONNX file and creates a TensorRT engine to run inference with"""TRT_LOGGER = trt.Logger(trt.Logger.WARNING)with trt.Builder(TRT_LOGGER) as builder, builder.create_network(common.EXPLICIT_BATCH) as network, trt.OnnxParser(network, TRT_LOGGER) as parser:builder.max_workspace_size = 1 << 28 # 256MiBbuilder.max_batch_size = 1config = builder.create_builder_config()config.max_workspace_size = common.GiB(6)profile = builder.create_optimization_profile()profile.set_shape("input_1_0", (1,100,100,3),(1,1024,1024,3), (1,2048,2048,3))idx = config.add_optimization_profile(profile)# Parse model fileif not os.path.exists(onnx_file_path):print('ONNX file {} not found, please run yolov3_to_onnx.py first to generate it.'.format(onnx_file_path))exit(0)print('Loading ONNX file from path {}...'.format(onnx_file_path))with open(onnx_file_path, 'rb') as model:print('Beginning ONNX file parsing')if not parser.parse(model.read()):print ('ERROR: Failed to parse the ONNX file.')for error in range(parser.num_errors):print (parser.get_error(error))return Noneprint('Completed parsing of ONNX file')print('Building an engine from file {}; this may take a while...'.format(onnx_file_path))engine = builder.build_engine(network,config=config)print("Completed creating Engine")with open(engine_file_path, "wb") as f:f.write(engine.serialize())return engine
if __name__ =="__main__":onnx_path1 = '/home/caidou/project/trt_python/mode1_1_-1_-1_3.onnx'engine_path = '/home/caidou/trt_python/model_1_-1_-1_3.engine'build_engine(onnx_path1,engine_path)

其中的common是官方的。

转为静态的尺寸的trt模型

import tensorrt as trt
import pycuda.driver as cuda
import pycuda.autoinit
import common
import os
def build_engine(onnx_file_path,engine_file_path):"""Takes an ONNX file and creates a TensorRT engine to run inference with"""TRT_LOGGER = trt.Logger(trt.Logger.WARNING)with trt.Builder(TRT_LOGGER) as builder, builder.create_network(common.EXPLICIT_BATCH) as network, trt.OnnxParser(network, TRT_LOGGER) as parser:builder.max_workspace_size = 1 << 28 # 256MiBbuilder.max_batch_size = 1# Parse model fileif not os.path.exists(onnx_file_path):print('ONNX file {} not found, please run yolov3_to_onnx.py first to generate it.'.format(onnx_file_path))exit(0)print('Loading ONNX file from path {}...'.format(onnx_file_path))with open(onnx_file_path, 'rb') as model:print('Beginning ONNX file parsing')if not parser.parse(model.read()):print ('ERROR: Failed to parse the ONNX file.')for error in range(parser.num_errors):print (parser.get_error(error))return Noneprint('Completed parsing of ONNX file')print('Building an engine from file {}; this may take a while...'.format(onnx_file_path))engine = builder.build_cuda_engine(network)print("Completed creating Engine")with open(engine_file_path, "wb") as f:f.write(engine.serialize())return engine
if __name__ =="__main__":onnx_path1 = '/home/caidou/project/trt_python/model4_256_256.onnx'engine_path = '/home/caidou/project/trt_python/model4_256_256.engine'build_engine(onnx_path1,engine_path)

就是不需要设置一下尺寸范围,还有一些其他设置。注意生成engine 时候的API,用错了会报错。

TensorRT模型的推理

推理依旧分为动态尺寸的和固定尺寸的,动态推理这一块C++版本的资料比较多,python接口的比较少,固定尺寸的推理官方也有demo,分为异步同步推理,但是不知道为什么笔者实测下来速度区别很小。

python推理接收numpy格式的数据输入。

动态推断

import tensorrt as trt
import pycuda.driver as cuda
#import pycuda.driver as cuda2
import pycuda.autoinit
import numpy as np
import cv2
def load_engine(engine_path):#TRT_LOGGER = trt.Logger(trt.Logger.WARNING)  # INFOTRT_LOGGER = trt.Logger(trt.Logger.ERROR)with open(engine_path, 'rb') as f, trt.Runtime(TRT_LOGGER) as runtime:return runtime.deserialize_cuda_engine(f.read())path ='/home/caidou/trt_python/model_1_-1_-1_3.engine'
#这里不以某个具体模型做为推断例子.# 1. 建立模型,构建上下文管理器
engine = load_engine(path)
context = engine.create_execution_context()
context.active_optimization_profile = 0#2. 读取数据,数据处理为可以和网络结构输入对应起来的的shape,数据可增加预处理
imgpath = '/home/caidou/test/aaa.jpg'
image = cv2.imread(imgpath)
image = np.expand_dims(image, 0)  # Add batch dimension.  #3.分配内存空间,并进行数据cpu到gpu的拷贝
#动态尺寸,每次都要set一下模型输入的shape,0代表的就是输入,输出根据具体的网络结构而定,可以是0,1,2,3...其中的某个头。
context.set_binding_shape(0, image.shape)
d_input = cuda.mem_alloc(image.nbytes)  #分配输入的内存。output_shape = context.get_binding_shape(1)
buffer = np.empty(output_shape, dtype=np.float32)
d_output = cuda.mem_alloc(buffer.nbytes)    #分配输出内存。
cuda.memcpy_htod(d_input,image)
bindings = [d_input ,d_output]#4.进行推理,并将结果从gpu拷贝到cpu。
context.execute_v2(bindings)  #可异步和同步
cuda.memcpy_dtoh(buffer,d_output)
output = buffer.reshape(output_shape)#5.对推理结果进行后处理。这里只是举了一个简单例子,可以结合官方静态的yolov3案例完善。

整体的pipline就是上面的1-5.

静态推断

静态推断和动态推断差不多,只不过不需要每次都分配输入和输出的内存空间。

import tensorrt as trt
import pycuda.driver as cuda
#import pycuda.driver as cuda2
import pycuda.autoinit
import numpy as np
import cv2
path ='/home/caidou/trt_python/model_1_4_256_256.engine'
engine = load_engine(path)
imgpath = 'aaa.jpg'
context = engine.create_execution_context()
image1 = cv2.write(imgpath)
image1 = cv2.resize(image1,(256,256))
image2 = image1.copy()
image3 = image1.copy()
image4 = image1.copy()
image = np.concatenate((image1,image2,image3,image4))
image = image.reshape(-1,256,256)# image = np.expand_dims(image, axis=1)
image = image.astype(np.float32)image = image.ravel()#数据平铺
outshape= context.get_binding_shape(1)
output = np.empty((outshape), dtype=np.float32)
d_input = cuda.mem_alloc(1 * image.size * image.dtype.itemsize)
d_output = cuda.mem_alloc(1*output.size * output.dtype.itemsize)
bindings = [int(d_input), int(d_output)]
stream = cuda.Stream()
for i in tqdm.tqdm(range(600)):cuda.memcpy_htod(d_input,image)context.execute_v2(bindings)cuda.memcpy_dtoh(output, d_output)

TensorRT模型的量化

待续...

这一块等有时间了再补充

较为详细的记录总结TensorRT的python接口的使用,环境配置,模型转换和静态动态模型推理相关推荐

  1. python phpstudy_Java、python及phpstudy的环境配置

    由于重装了系统,电脑上啥都没了,正好借此机会写一些从空白开始配置新电脑,希望多踩一点坑,才能帮更多的人解决问题. 本文是小白向的,学习过程中看到一些教程缺胳膊少腿,可能会漏掉一些博主觉得easy但是是 ...

  2. atom配置python环境_python与excel有段情之二:python的安装和环境配置

    索引 python与excel有段情之一:前述 python与excel有段情之二:python的安装和环境配置 python与excel有段情之三:python编程前的准备工作和基本概念 pytho ...

  3. Win10系统下Python安装和Geany环境配置的几点总结

    Win10系统下Python安装和Geany文本编辑器配置的几点总结 (START OF MY BLOG LIFE) 一.Python的安装 Python直接可以在官网下载(https://www.p ...

  4. python的安装与环境配置

    python的安装与环境配置 1.在官网里选择你系统对应的版本,选择稳定版本,不一定要追求最新版本 2.下载好后选择自定义安装,建议不要装在c盘,勾选Add Python to PATH 3.这样安装 ...

  5. Python编辑器sublime text3环境配置

    最近又在玩Python啦,以此记录学历的一些东西,也算是激励自己吧. Python安装 Python的截止目前最新版本是3.6.1,这里直接就安装最新版本了. 安装过程如下:这里我去除了不想用的部分, ...

  6. choice python接口,数据可视化环境(Python接口)配置

    数据可视化环境(Python接口)配置 caffe程序是由c++语言写的,本身是不带数据可视化功能的.只能借助其它的库或接口,如opencv, python或matlab.大部分人使用python接口 ...

  7. Python人脸识别项目-环境配置

    环境配置 首先我们需要需要配置所需的环境,作者使用的编译器是Pycharm,在安装失败多次情况下(不知道为什么我Pycharm上装有问题),我发现了最简单的配置方法.首先在工作台中输入以下命令进行安装 ...

  8. Linux-Fedora 25 Python 3.5开发环境配置Eclipse+Pydev

    首先开发环境依赖于Eclipse, Eclipse的运行需要Java开发环境.所以首先设置系统的Java环境变量(此部分忘记截图).自行下载JDK和Eclipse,Eclipse版本选择jee版本. ...

  9. gdal 1.9+python 2.7开发环境配置

    最近项目使用Cesium平台基于WegGl做web地球,其中关于地形数据有一种支持格式为terrain的地形数据.这种格式可以通过一个python工具切dem来得到. 下面记录下配置gdal+pyth ...

最新文章

  1. Nginx配置使用积累[不断更新]
  2. GNU make 工具
  3. LUOGU P4195 Spoj3105 Mod
  4. 卡巴斯基授权许可文件_安全许可证的申请流程有哪些?
  5. Python 操作字典 的几个技巧
  6. git按照tag拉取代码_Git实操小课堂
  7. 在vue中使用SockJS实现webSocket通信
  8. java不同进程的相互唤醒_JAVA多线程之线程间的通信方式
  9. Windows结束某个端口的进程
  10. JavaScript实现:如何写出漂亮的条件表达式
  11. Vlan与VTP的介绍及工作原理
  12. 【动态规划笔记】背包方案数量
  13. 求n! 末尾有多少个0
  14. 给大家推荐几本最优秀的编程书
  15. 二线城市疯狂抢人,技术人才何去何从?
  16. java excel 数组公式_在Apache poi中的数组公式
  17. 墨画子卿第一章第4节:世界观的颠覆
  18. java生成二维码(底部添加文字+linux安装微软雅黑)
  19. 高中OJ3502. 【NOIP2013模拟11.4B组】方格游戏(game)
  20. 边缘计算一看就懂:真的很形象

热门文章

  1. IC公司认可的数字IC_FPGA设计课程
  2. Java在成都表现如何?
  3. acwing----春季每日一题2022篇(二)
  4. vue+elementUI中使用Echarts (懒人无脑版)
  5. 正则表达式的条件用法
  6. ORACLE GOLDENGATE报错问题汇总
  7. python图片直接保存到远端_Python在远程服务器中的实现挂代码-发送定期天气预报到邮箱+每天一句话(小白教程),远端,定时,至,每日...
  8. 项目:“表情包”制作---利用ffmpeg制作Gif动态图
  9. 微信授权登录代码示例
  10. 突发,韩国三星发生重大变化!