tensorRT 7.0 学习笔记(五)———量化/动态输入shape(c++ api)

8 篇文章 1 订阅

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值