tensorrt加速推理整到一半还没整明白。因为另一个项目紧急,写了个简单的进展汇报给同事,由同事接着做下去。等以后有空了完全弄明白tensorrt,再回来修改这篇文章。

TensorRT当前进展

(本文前4节为已做工作总结,可直接跳过,看“5 当前进展”,并开展下一步工作!)

1  TensorRT的基本功能

TensorRT是NVIDIA开发的一个可以在NVIDIA旗下的GPU上进行高性能推理的C++库,是一个高性能推理优化引擎。

其核心库是使用c++去加速NVIDIA生产的GPU,具有python API。它可以加速的框架模型有:tensorflow、Caffe、Pytorch、MXNet等。

它可以吸收在这些流行框架上受过训练的神经网络,优化神经网络计算,生成一个轻量级的运行时引擎,然后它将在这些GPU平台上最大限度地提高吞吐量、延迟和性能。

1.1工作原理

主要的优化模型工作集中在:

1)分析图结构中没有用到的输出layer,对网络层进行合并。

2)融合卷积操作、bias和ReLU操作。

3)把有相似参数的操作和有相同输入源的tensor聚合。

4)通过直接将layer的输出对应到最终的destination,这样融合了级联层。

1.2官方指导

2需要的库

2.1  tensorflow、tensorrt

已安装

2.2  pycuda

已安装

2.3  uff、graphsurgeon

已安装

3准备工作

3.1  pb文件

以keras训练出的yolov3_tiny.h5为例,在Nano中/Documents/1tensorrt_pb_uff文件夹下,运行first_step_freeze_model.py进行转换:

python3 first_step_freeze_model.py --model=“yolov3_tiny.h5” —output=“yolov3_tiny.pb”

(这个好像只能对yolo_tiny转.pb文件,yolo不行)

3.2  pb文件转uff文件

使用自带的convert_to_uff工具转uff文件:

python3 /usr/lib/python3.6/dist-packages/uff/bin/convert_to_uff.py --input-file yolov3_tiny.pb

4  tensorrt基本流程

4.1导入模型

4.1.1创造builder和network。

IBuilder* builder=createInferBuilder(gLogger);

nvinfer1::INetworkDefinition* network=builder->createNetwork();

4.1.2创造parse

使用parse导入模型填充网络。

parser->parse(args);

4.1.3导入caffe和tensorflow、ONNX模型,可以参考官网的指导。

https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#create_network_c

4.1.4创造engine

有了网络结构后可以创造engine了。builder有两个重要的属性,分别是batchsize和worksize。

2使用builder object建立引擎。

1、builder->setMaxBatchSize(maxBatchSize);

2、builder->setMaxWorkspaceSize(1 << 20);

3、ICudaEngine* engine = builder->buildCudaEngine(*network);

释放空间:

engine->destroy();

network->destroy();

builder->destroy();

4.3序列化模型

序列化和反序列化是可以自由选择的,使用序列化模型的主要原因是使用读取模型定义网络再创造engine是很耗时的操作,序列化后可以避免每次 都需要重新建立engine。

当engine建立了之后,可以将其序列化保存下来为以后使用。

注意:序列化的模型在不同的模型和tensorRT的版本之间是不能够相互使用的。

序列化:

IHostMemory *serializedModel=engine->serialize();

serializedModel->destroy();

反序列化:

IRuntime* runtime = createInferRuntime(glogger);

ICudaEngine* engine = runtime->deserializeCudaEngin(modelData,modelSize, nullptr)

4.3进行预测

1、IExecutionContext *context = engine->createExecutionContext();

2、int inputIndex = engine.getBindingIndex(INPUT_BLOB_NAME);

int outputIndex = engine.getBindingIndex(OUTPUT_BLOB_NAME);

3、void* buffers[2];

buffers[inputIndex] = inputbuffer;

buffers[outputIndex] = outputBuffer;

4、context.enqueue(batchSize, buffers, stream, nullptr);

5当前进展

5.1  tensorRT_mnist_example-master代码分析

以下为代码简介。

5.1.1  mnist.py

训练mnist,权重文件保存为mnist.pb。

5.1.2  mnist_pred.py

对mnist.py中训练出的mnist.pb,进行tensorrt优化推理,然后再进行预测。

5.2  mnist_pred.py代码分析

优化推理主要有三步:第一步,find_data查找数据,事实上就是一个参数解析函数;第二步,build_engine创建引擎;第三步,inference推理。

5.2.1  find_data查找数据

事实上就是一个参数解析函数,定义parser解析器。

5.2.2  build_engine创建引擎

创建推理引擎,对网络进行推理解析

with trt.Builder(TRT_LOGGER) as builder, builder.create_network() as network, trt.UffParser() as parser:

5.2.3  inference推理

推理共5行代码。

# 将数据移动到GPU

[cuda.memcpy_htod_async(inp.device, inp.host, stream) for inp in inputs]

# 执行inference.

context.execute_async(batch_size=batch_size,bindings=bindings, stream_handle=stream.handle)

# 将结果从 GPU写回到host端

[cuda.memcpy_dtoh_async(out.host, out.device, stream) for out in outputs]

# 同步stream

stream.synchronize()

# 返回host端的输出结果

return [out.host for out in outputs]

mnist tensorrt 运行_TensorRT学习相关推荐

  1. TensorRT运行官方案例Mnist时提示找不到dll文件,cuda、cudnn、TensorRT的环境变量的问题,TensorRT运行时默认会到lib下去找要的文件

    先看目录哦 非本文内容 我是谁呢 简单介绍 个人主页 近况说明 简单介绍 博客推荐 本文内容 非本文内容 我是谁呢 简单介绍 -普普通通简简单单学生一枚,软件工程专业,会学大数据.深度学习的一些知识, ...

  2. NVIDIA TensorRT高性能深度学习推理

    NVIDIA TensorRT高性能深度学习推理 NVIDIA TensorRT™ 是用于高性能深度学习推理的 SDK.此 SDK 包含深度学习推理优化器和运行时环境,可为深度学习推理应用提供低延迟和 ...

  3. tensorrt轻松部署高性能dnn推理_NVIDIA TensorRT高性能深度学习推理

    NVIDIA TensorRT高性能深度学习推理 NVIDIA TensorRT™ 是用于高性能深度学习推理的 SDK.此 SDK 包含深度学习推理优化器和运行时环境,可为深度学习推理应用提供低延迟和 ...

  4. 如何使用TensorRT加速深度学习推理

    文章目录 1.TensorRT 简介 2.一个简单的TensorRT示例 3.简要代码演练 3.1.批量输入 4.配置文件 5.优化您的应用 6.使用混合精度计算 7.设置最大工作区大小 8.重用Te ...

  5. 使用自己的数据训练Yolov4-tiny模型,并用tensorrt运行(配置github host、编译安装opencv4.1.1+contrib和darknet、制作数据集、训练全流程)

    目录 0. 修改host文件 (选做) 1. 编译安装opencv 4.1.1+contrib 2. 准备训练环境 3. 制作自己的数据集 4. 预训练权重和配置文件 5. 创建训练配置文件 6. 训 ...

  6. NVIDIA教你用TensorRT加速深度学习推理计算 | 量子位线下沙龙笔记

    主讲人:Ken(何琨)| NVIDIA开发者社区经理 张康 屈鑫 编辑整理 量子位 出品 | 公众号 QbitAI 12月22日,量子位联合NVIDIA英伟达举行了线下交流会,跟现场近百位开发者同学共 ...

  7. LT-mapper,LT-SLAM代码运行与学习

    文章目录 下一篇: 1 安装编译 1.1编译安装LT_mapper 报错1:fatal error: filesystem: 没有那个文件或目录 思路1,用`#include <experime ...

  8. LT-mapper,LT-removert代码运行与学习

    文章目录 0.上一篇 1.配置参数 2.代码运行 (1)Removert 主程序启动--Removert Main Started (2)开始自移除--Self-removing starts (3) ...

  9. 3080算力添加、ValueError: Unknown CUDA arch (8.6) or GPU not supported 解决RTX30 运行深度学习代码报错

    ValueError: Unknown CUDA arch (8.6) or GPU not supported 解决RTX30 运行深度学习代码报错 之前安装pytorch的时候有遇到一个问题,不支 ...

最新文章

  1. 烂大街的Spring循环依赖该如何回答?
  2. 远程桌工具-Remote Desktop Organizer
  3. 乔氏西去,敬告各位!
  4. 设置自增递增零开始_MySQL中如何设置自动递增id主键重新计数从1开始?
  5. 图论算法——图的遍历
  6. 为什么i3的cpu基础频率最高,达到4.0了?
  7. jsp 中实现点击按钮 实现页面跳转到HTML
  8. junit学习笔记(二):hamcrest和TestSuit
  9. Linux系统安全强化指南
  10. java输出空心菱形 用斜杠,java基础知识总结1
  11. 2个最好的中文图标搜索引擎
  12. 服务器被入侵了,怎么防范服务器被黑客入侵情况
  13. oracle双活svc,基于SVC的三种主流双活数据中心架构深入探讨
  14. 基于ResNet的MSTAR数据集目标分类
  15. thrift linux java,解决Linux下安装thrift出现的Building Java Library ........ : no问题(以及其他安装thrift出现的问题)...
  16. SAN存储与协议,了解SCSI、FC和ISCSI
  17. 领英精灵和领英助理哪个好,看这一篇就够了
  18. 【AHK】在Obsidian中以选定日期生成链接
  19. sql server 2005安装内存不能读
  20. qt中的QNetwork的通信的使用

热门文章

  1. 如何在Windows下发布QT应用程序
  2. TensorFlow:曼德布洛特(Mandelbrot)集合
  3. 使用更安全的C字符串操纵
  4. ELK实践(二):收集Nginx日志
  5. 学习VIM之2014
  6. php json 格式化
  7. 【Ajax技术】解决XHR与中文乱码问题
  8. THE NAUGHTY BOY
  9. 大话IT第13期:2011年云计算市场年中盘点
  10. 智能手机之新手篇[转]