1. TensorRT量化的定义及意义 您所在的位置:网站首页 浮点和半浮点的区别 1. TensorRT量化的定义及意义

1. TensorRT量化的定义及意义

#1. TensorRT量化的定义及意义| 来源: 网络整理| 查看: 265

前言

手写AI推出的全新TensorRT模型量化课程,链接:TensorRT下的模型量化。

课程大纲如下:

在这里插入图片描述

1. 量化的定义及意义 1.1 什么是量化? 定义

量化(Quantization)是指将高精度浮点数(如float32)表示为低精度整数(如int8)的过程,从而提高神经网络的效率和性能。具体而言,量化就是将我们训练好的模型,不论是权重、还是计算op,都转换为低精度去计算。实际中我们谈论的量化更多的是INT8量化。

常用的量化方法

常用的量化方法包括对称量化和非对称量化:

对称量化是将权重范围均匀地分布在正负两个方向,将浮点数映射到一个正负整数范围中;非对称量化是指使用不同的比例因子(scale factor)和零点(zero point)对每个通道进行量化。

需要注意的是,模型量化会对模型的精度和准确度产生一定的影响,因为量化后的模型可能无法完全保留原始模型中的所有信息和特征。因此,在进行模型量化时需要进行适当的权衡和优化。

我们平时训练出的模型如YOLOv5正常导出,默认都是FP32的精度。在未量化前,网络模型的权重和偏差参数使用FP32高精度浮点数来表示,而浮点数的计算会占用大量的存储空间和计算资源。

现在我们来看下ResNet18导出的ONNX模型的输入、权重、偏置以及输出的数据类型ResNet18导出至ONNX的代码如下:

import torch import torchvision.models as models model = models.resnet18(pretrained = False) # 懒得下载预训练权重,这里只是用于测试一下而已 input = torch.randn(1,3,224,224) torch.onnx.export(model,input,"resnet18.onnx")

使用netron来查看onnx的模型,在查看网络层中,输入、权重和偏置发现都是FP32的数据类型,如下图显示第一个conv卷积核中,输入和权重的类型: 在这里插入图片描述

1.2 为什么要量化 未量化存在的问题

我们平时训练出的模型如YOLOv5正常导出,默认都是FP32的精度,在深度学习训练和推理的过程中,最常用的精度就是FP32。在未量化前,网络模型的权重和偏差参数使用FP32高精度浮点数来表示,而浮点数的计算会占用大量的存储空间和计算资源。

量化后的优势: 减少内存占用,模型容量变小,如FP32权重变成INT8,大小直接缩小了4倍数;加速计算,实际卷积计算的op是INT8类型,在特定硬件下可以利用INT8的指令集去实现高吞吐,不论是GPU还是INTEL、ARM等平台都有INT8的指令集优化;减少功耗和延迟,有利于嵌入式侧设备的应用;量化是模型部署中的一种重要的优化方法,可以在部分精度损失的前提下,大幅提高神经网络的效率和性能 不同类型的区别: FP32是单精度浮点数,采用32位二进制数表示,其中1位为符号位,8位为指数位,23位为尾数位;FP16是半精度浮点数,采用16位二进制数表示,其中1位为符号位,5位为指数位,10位为尾数位;INT8是8位整数,采用8位二进制数表示,其中1位为符号位,7位为数值位。

对于浮点数来说,指数位表示该精度可达到的动态范围,而尾数位表示精度。 从FP32=>FP16是一种量化,只不过因为FP32=>FP16几乎是无损的(CUDA中使用__float2half直接进行转换),不需要calibrator去校正、更不需要retrain。并且FP16的精度下降对于大部分任务影响不是很大,甚至有些任务会提升。

1.3 如何量化? 案例

如何将一个浮点数组[-0.61,-0.52,1.62]用int的方式进行描述?以对称量化为例

计算数组中共同的scale ​Scale = (float_max - float_min) / (quant_max - quant_min) ​ = (1.62-(-0.61)) / (127 - (-128)) = 0.0087109 量化操作 0.61 / 0.0087109 = -70.0272072 -0.52 / 0.0087109 = -59.6953242 ==> [-70,-59,185] 取整 1.62 / 0.0087109 = 185.9738947 截断操作 [-70,-59,185] ==> [-70,-59,127] # 因为对称量化的范围在-127到127,185已经超过范围了,所以要进行截断操作 反量化操作 量化前:[-0.61,-0.52,1.62] 量化后:[-0.609763,-0.5139431,1.1062843]

可以看到截断的数值最后反量化与原数值相差较大(1.62与1.1062843)

2. 展-export参数详解

torch.onnx.export()是将PyTorch模型导出为ONNX格式的函数。其参数如下:

model:需要导出为ONNX格式的PyTorch模型args:模型的输入参数,可以是一个tensor或者一个包含多个tensor的元组f:导出的ONNX模型的保存路径或文件对象export_params:是否导出模型参数,默认为Trueverbose:是否打印导出过程信息,默认为Falsedo_constant_folding:是否进行常量折叠优化,默认为Trueinput_names:模型输入节点的名称,默认为[“input”]output_names:模型输出节点的名称,默认为[“output”]dynamic_axes:动态维度opset_version:导出的ONNX版本号,默认为9keep_initializers_as_inputs:是否将初始化器保存为输入节点,默认为Falseoperator_export_type:导出的算子类型,默认为torch.onnx.OperatorExportTypes.ONNX

参考链接:

神经网络量化教程TensorRT量化第一课:量化的定义及意义


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有