1.int8 量化
首先需要为 Ibuilder 设置校准器(caliborator)主要作用就是通过一定的算法把每层的weights 和输出tensor 映射到 int范围,TRT提供了以下几种校准器:
需要在继承其中之一后实现 getBatch()方法,然后调用:
为builder设置校准器。
同时
实现 writeCalibrationCache() and readCalibrationCache() 缓存/载入校准表
builder内部的工作原理:
1.调用 getBatch Size()确定输入的batch Size
2.反复调用 getBatch()获得多个batch 输入,batchSize 一定要等于个体Batch Size(),如果没有数据了,那么getBatch()硬刚返回false
创建一个Int8 cudaEngine,builder需要以下几步:
1.创建一个32-bit的 engine,在 校准数据集上进行推理,收集每层响应向量的的张量分布直方图
2.根据直方图生成校准表
3.根据校准表和network definition建立Int8 cudaEngine
配置 int8量化注意的要点:
2.dynamic input shapes (动态输入维度)
1.先决条件
目前我搜集到的资料来看只有onnx模型支持,即需要转换成onnx模型时指定 dynamic_axes:
来源:https://blog.csdn.net/weixin_42365510/article/details/112088887
在trt7.0中如果想实现batch inference(批推理)要么再生成原始模型时(uff/onnx/caffe)设定一个固定的batchSize,要么按照以上方法将batch 维度设置为dynamic axes
2.trt设置步骤
创建 INetworkDefinition时要制定为EXPICIT_BATCH:
构建时,指定一个或多个:optimization profiles,在其中指定运行时允许的维度范围,以及维度由那个优化器进行优化
optimization profiles:
用于描述一个输入tensor维度范围,当使用运行时改变维度时,必须在build time创建至少一个 optimize profile
创建 optimize profile:
在推理时需要指定特定的optimize profile:
如果一个execution context 有关的cudaEngine 由动态shaoe的inputs。则必须至少指定一个唯一的(其他excution context 未使用的) profile的索引
setOptimizationProfile可以交换不同的profiles