【tensorrt】——int8量化过程浅析/对比

本文详细介绍了使用TensorRT进行INT8量化推理的步骤,包括模型网络定义、校准器设置、构建引擎和性能测试。强调了INT8推理需要在计算能力大于6.1的显卡上,以及校准数据的重要性。通过对比INT8、FP16和FP32三种精度的模型在推理速度和显存占用上的差异,显示了INT8在保持性能的同时降低了模型大小。
摘要由CSDN通过智能技术生成

关键词:tensorrt, int8

简介: int8推理需要在计算能力大于6.1的显卡上。INT8引擎从32位网络定义构建,类似于32位和16位引擎,但有更多的配置步骤。特别地,构建器和网络必须配置为使用INT8, INT8要求按张量动态范围。INT8校验器可以确定如何最好地将权值和激活表示为8位整数,并相应地设置每个张量的动态范围。或者,您可以自定义每个张量的动态范围;这在sampleINT8API中有涉及。

1. 整体流程

  1. 定义好模型网络
  2. 设置好校准器(就是一些验证样本)
  3. 设置好builder,设置能用int8模式
  4. 构建好模型
  5. 测试/保存模型

定义网络模型

为INT8执行定义网络与为其他精度定义网络完全相同。权重应该作为FP32值导入,构建器将校准网络,以找到适当的量化因子,将网络的精度降低到INT8。可以采用导入的方式,导入caffe,onnx的模型

设置校准器

在为INT8构建网络时,校准是一个额外的步骤。应用程序必须提供TensorRT样本输入,换句话说,校准数据。然后,TensorRT将在FP32中执行推断,并收集有关中间激活层的统计数据,它将使用这些统计数据构建更低精度的INT8引擎。

必须使用在运行时使用的具有代表性的图像进行校准。因为样本是基于Caffe的,所以Caffe在运行网络之前执行的任何图像预处理(如缩放、裁剪或均值减法)都将在Caffe中完成,并作为一组文件捕获。示例使用一个实用程序类(MNISTBatchStream)来读取这些文件,并为校准创建适当的输入。
校准用的样本需要保证:预处理一样

注意: 校准数据必须代表运行时提供给TensorRT的输入数据;例如,对于图像分类网络,它不应该仅仅由类别的一小部分图像组成。对于ImageNet网络,大约500张校准图像就足够了。

tensorrt 提供了4种校准器可供继承(具体差别还未知):

  1. IInt8EntropyCalibrator
  2. IInt8EntropyCalibrator2
  3. IInt8MinMaxCalibrator
  4. IInt8LegacyCalibrator

继承一个校准器之后,需要重写getBatchSize() and getBatch()两个函数,第一个函数返回校准时的batch大小,后一个函数返回一个batch的数据

在校准开始时,builder调用’ getBatchSize() ‘方法来获取校准集的批大小。然后重复调用’ getBatch() '方法来从应用程序获取批大小,直到该方法返回false。每个校准批次必须包括指定批次大小的图像数量。(这部分是隐藏的,tensorrt的builder自动调的

设置builder

进行一些常规设置:

  1. Set minimum and average number of timing iterations.
    config->setAvgTimingIterations(1);
    config->setMinTimingIterations(1);

  2. Set maximum workspace size.
    config->setMaxWorkspaceSize(1_GiB);

  3. Set allowed builder precision to INT8 in addition to FP32. Default builder precision is FP32.
    config->setFlag(BuilderFlag::kINT8);

  4. Set maximum batch size.
    builder->setMaxBatchSize(mParams.batchSize);

  5. Pass the calibrator object (calibrator) to the builder.
    config->setInt8Calibrator(calibrator.get());

构建模型

像float32模型一样构建模型:

mEngine = std::shared_ptr<nvinfer1::ICudaEngine>(
builder->buildEngineWithConfig(*network, *config), samplesCommon::InferDeleter());

测试/保存模型

后续就是保存模型,或者像float32模型一样写推理脚本,推理测试。

int8/float16对比测试

模型tensorrt engine size/MB显存占用输入尺寸耗时/ms
hrnetw18(int8)13.41710640*4804.437
hrnetw18(f16)17.11514640*4804.725
hrnetw18(f32)29.01619640*48010.0

其他

  • tensorrt是提供了python api的,所有的int8量化都可以在python中实现,可以优选python毕竟预处理方便一些
  • int8量化较float16类型的推理速度提升有限
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值