pytorch优化之量化

思考:pytorch的eager模式,是怎样支持开发模式支持串行执行断点调试,生产模式支持生成可并发执行代码的,可以拉源码调试分析。这里会涉及到图编程模式、编译原理,执行优化等技术。

什么是量化?

量化是指用于执行计算并以低于浮点精度的位宽存储张量的技术。 量化模型对张量使用整数而不是浮点值执行部分或全部运算。 这允许更紧凑的模型表示,并在许多硬件平台上使用高性能矢量化操作。与典型的 FP32 型号相比,PyTorch 支持 INT8 量化,从而可将模型大小减少 4 倍,并将内存带宽要求减少 4 倍。 与 FP32 计算相比,对 INT8 计算的硬件支持通常快 2 到 4 倍。 量化主要是一种加速推理的技术,并且量化算子仅支持前向传递。量化能够在模型精度几乎不损失的情况下大大降低模型的储存和时间开销。

动态量化能够减少开销的原因:模型执行时间主要由从内存中加载权重而不是计算矩阵乘法来决定

笔者以静态量化举例,在本教程结束时,您将看到 PyTorch 中的量化如何导致模型大小显着减小同时提高速度

 

量化张量

PyTorch 支持每个张量和每个通道非对称线性量化。 每个张量意味着张量内的所有值都以相同的方式缩放。 每通道意味着对于每个尺寸(通常是张量的通道尺寸),张量中的值都按比例缩放并偏移一个不同的值(实际上,比例和偏移成为矢量)。 这样可以在将张量转换为量化值时减少误差。

通过使用以下命令转换浮点张量来执行映射

 

静态量化:这是最常用的量化形式,其中权重是提前量化的,并且基于观察校准过程中模型的行为来预先计算激活张量的比例因子和偏差。 训练后量化通常是在内存带宽和计算节省都很重要的情况下进行的,而 CNN 是典型的用例。 进行训练后量化的一般过程是:

  1. 准备模型: 通过添加 QuantStub 和 DeQuantStub 模块,指定在何处明确量化激活和量化数量。 b。 确保不重复使用模块。 C。 将所有需要重新量化的操作转换为模块

  2. 将诸如 conv + relu 或 conv + batchnorm + relu 之类的保险丝操作融合在一起,以提高模型的准确性和性能。

  3. 指定'97 量化方法的配置,例如选择对称或非对称量化以及 MinMax 或 L2Norm 校准技术。

  4. 使用 torch.quantization.prepare() 插入将在校准期间观察激活张量的模块

  5. 通过对校准数据集进行推断来校准模型

  6. 最后,使用 torch.quantization.convert()方法转换模型本身。 这可以做几件事:它量化权重,计算并存储要在每个激活张量中使用的比例和偏差值,并替换关键运算符的量化实现。

你可能感兴趣的:(Pytorch入门深度学习实战)