本系列为我在学习tensorRT 7.0 时的学习笔记主要参考了官方文档以及一些例子。
核心概念:
Tensorrt.INetWorkDefinition 可以由 parser(uff,tensorflow,caffe,等创建)tensorRT.Builder 可以创建空的Tensorrt.INetWorkDefinition
Tensorrt.builder+Tensorrt.INetWorkDefinition 创建tensorrt.ICudaEngine
基于tensorrt.ICudaEngine创建tensorrt.IExecutionContext用于加速推理
类:
Tensorrt.logger 获取错误与告警
tensorrt.ICudaEngine 最基本的元件,用于创建tensorrt.IExecutionContext
Tensorrt.builder 输入Tensorrt.INetWorkDefinition 创建tensorrt.ICudaEngine
Tensorrt.INetWorkDefinition计算图
基本类型:
1.Tensorrt.DataType 略,就是 int16 int32 float32 bool 等等这些
Tensorrt.WeightRole 这些权重干什么用的:
KERNEL conv/deconv的卷积核 fc的权重w
BIAS conv/deconv/fc 的偏差
SHIFT 偏移量(IScaleLayer)
SCALE:缩放量(IScaleLayer)
CONSTANT:权重(IConstantLayer)
2.tensorrt.weights 权重数组
dtype:DataType
Size 数量
Nbytes 总字节数
3.tensorrt.DimensionType
此维度数据组织的类型: SPATIAL,CHANNEL,INDEX,SEQUENCE
4.Dims
4.1 tensorrt.Dims 一个tensor的数据维度行为比较像 tuple
基于4.1派生出的:
Dims2/DimsHW/Dims3/DimsCHW/Dims4/DimsNCHW
5.IHostMemory 处理库中分配的内存(user可访问,不可allocated/deallocated)
6.Core
6.1Profiler 用于输出每层推理时消耗的时间
将其作为参数加入到IExecutionContext,当调用 IExecutionContext.execute()时会每层记录其所花时间。
report_layer_time(self: tensorrt.tensorrt.Profiler, layer_name: str, ms: float) → None
来自 <https://docs.nvidia.com/deeplearning/tensorrt/api/python_api/infer/Core/Profiler.html>
Execute()后调用,获取每层所花时间。
6.2
tensorrt.IOptimizationProfile
来自 <https://docs.nvidia.com/deeplearning/tensorrt/api/python_api/infer/Core/OptimizationProfile.html>
可动态调整的输入张量和有固定大小的张量的配置。当创建有动态大小的输入张量的ICudaEngine(或者固定输入张量),用户与要制定至少一个Optimization profile。Profiles
的索引为0,1,2,3,4.(当没有特别指定时默认使用index=0的那一个),如果模型输入的大小都是固定的,在没有用户提供的情况下会自动创建一个默认的Optimization profile。
Optimization profile 用于指定输入动态大小张量/固定大小的输入张量 的最小输入维度,最大输入维度,最优输入维度。
6.3 IBuilderConfig
指定创建模型时的一些参数,设置Optimization profile
※6.4 tensorrt.builder
基于INetworkDefinition创建ICudaEngine
※6.5 ICudaEngine
在创建好的network上进行推理,可用[]进行索引(返回绑定的name)绑定(将网络上一个张量与ICudaEngine进行绑定好进行 input/output)
※tensorrt.IExecutionContext
用于使用一个CudaEngine进行推理的上下文,一个CudaEngine可以有多个IExecutionContext进行同时推理调用execute/execute_async 进行同步/异步的推理。
6.6tensort.Runtime
用于将ICudaEngine反序列化
6.7tensorrt.Refitter
更新CudaEngine中的权重
7.NetWorkDefinition
可以调用api对网络增加层以及plugin
通过 api: mark_***将某个tensor设置为输出的tensor
※8plugin
7.1 tensorrt.PluginField
存储插件属性相关
Tensorrt FiledCollection
IpluginCreator plugin生成器(用于自定义层)管理插件的生成和序列化
7.2 IpluginRegistry
用于注册IpluginCreator
IpluginFactory
用于从序列化数据中反序列化出plugin
8 模型量化
8.1
tensorrt.CalibrationAlgoType
来自 <https://docs.nvidia.com/deeplearning/tensorrt/api/python_api/infer/Int8/Calibrator.html>
量化方法枚举
Tensorrt.IInt8Caliborator (interface)
用于量化校准的接口,量化由Builder操作。其必须提供方法来获取一系列图片进行量化,
(可选)实现一个方法
Parsers
1.uffParser
主要函数:parse 从uff buffer中生成netWork
Caffe Parser/Onnx Parser 类似。
例子:
参考github:
https://github.com/JDAI-CV/fast-reid/tree/master/tools/deploy
其中 trt_export.py 为如何导出onnx 模型(需要注意的是如果你的模型在导出模型时并没有指定dynamic_axes,则不能使用optimize_profile 来将模型的batchsize设置为动态的)
trt_inference.py 为如何利用trt模型进行推理。