TensorRT学习

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

TensorRT当前进展python

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

1  TensorRT的基本功能git

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

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

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

1.1  工做原理async

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

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

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

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

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

1.2 官方指导

https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/

2  须要的库

2.1  tensorflow、tensorrt

已安装

2.2  pycuda

已安装

2.3  uff、graphsurgeon

已安装

准备工做

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创建引擎。

一、builder->setMaxBatchSize(maxBatchSize);

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

三、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进行预测

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

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

int outputIndex = engine.getBindingIndex(OUTPUT_BLOB_NAME);

三、void* buffers[2];

buffers[inputIndex] = inputbuffer;

buffers[outputIndex] = outputBuffer;

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

当前进展

5.1  tensorRT_mnist_example-master代码分析

       代码github地址为:https://github.com/junyu0704/tensorRT_mnist_example。运行前须要编译(此步已完成,不须要再作)。

       如下为代码简介。

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]

相关文章
相关标签/搜索