1. 量化的定义以及好处
量化(Quantization)是指将高精度浮点数表示为低精度整数的过程,从而提高神经网络的效率和性能。在能够接受一定的精度损失的情况下,可以有以下的好处:
-
减小内存占用
- 模型大小减少:通过量化,我们可以将32位浮点数转换为较低位宽的数(例如8位整数)。这可以显著减少模型的大小,使其更容易在内存受限的设备上部署。
- 减少带宽需求:模型大小的减少也意味着在下载或传输模型时需要的带宽减少。
-
加速计算
- 特定硬件加速:很多硬件(例如Jetson)对低位宽的操作更有优势,因此量化模型可以更好地利用这些硬件特性。
- 并行化:低位运算可以允许更高的并行度,从而进一步加速计算。
-
减小功耗和延迟
- 减少计算复杂性:较低位宽的运算通常需要较少的计算资源,这意味着功耗可以降低。
- 实时应用:在需要低延迟的场景(如自动驾驶或增强现实应用)中,量化可以帮助模型更快地做出预测。
-
部署灵活性:由于量化模型更小、更快,它们可以更容易地部署在各种设备上,包括但不限于智能手机、IoT设备和边缘计算设备。
-
提高能效比:在很多场景下,能效比(性能与功耗的比值)是一个关键指标。通过减少内存和计算需求,量化可以显著提高神经网络的能效比。
-
降低部署成本:使用小型、低功耗的硬件部署量化模型可以降低整体部署成本。
需要注意的是,虽然量化带来了很多好处,但也可能导致模型精度的损失。因此,在使用量化之前,建议进行详细的评估和测试,以确保模型的效果满足特定应用的需求。
2. 从ResNet看数据类型的传递
2.1 从torch里面导出一个ResNet-50模型
import torch
import torchvision.models as models
model = models.resnet50()
input = torch.randn(1, 3, 224, 224)
torch.onnx.export(model, input, "resnet50.onnx")

可以看出来,没有量化的模型是直接从输出一直传递FP32的数据类型到output,如下图

3. 浮点数到整数的量化中遇到的问题
PS. -128~127: int8(signed int8) 0-255: uint8(unsigned char)
1. 原始浮点数组
[-0.61, -0.52, 1.62]
2. 计算量化尺度(scale)
公式:
scale=float_max−float_minquant_max−quant_min \text{scale} = \frac{\text{float\_max} - \text{float\_min}}{\text{quant\_max} - \text{quant\_min}} scale=quant_max−quant_minfloat_max−float_min
插入数值:
scale=1.62−(−0.61)127−(−128)=0.00874509 \text{scale} = \frac{1.62 - (-0.61)}{127 - (-128)} = 0.00874509 \ scale=

本文介绍了量化的定义及好处,包括减小内存占用、加速计算、降低功耗等。以ResNet - 50模型为例展示数据类型传递,还阐述了浮点数到整数量化中遇到的问题,并给出非对称量化和对称量化的解决方法及计算示例。
最低0.47元/天 解锁文章
1645

被折叠的 条评论
为什么被折叠?



