Pytorch量化(torch.quantization)

本文探讨了深度学习中的量化技术,如何通过使用INT8减少模型体积和内存需求,提升计算速度。介绍了PyTorch支持的动态、静态量化和量化感知训练方法,以及一个使用ConvBnReluModel实例展示模型量化与保存的过程。

      在深度学习中,量化指的是使用更少的bit来存储原本以浮点数存储的tensor,以及使用更少的bit来完成原本以浮点数完成的计算。这么做的好处主要有如下几点:

  • 更少的模型体积,接近4倍的减少;
  • 可以更快的计算,由于更少的内存访问和更快的int8计算,可以快2~4倍。

      一个量化后的模型,其部分或者全部的tensor操作会使用int类型来计算,而不是使用量化之前的float类型。当然,量化还需要底层硬件支持,x86 CPU(支持AVX2)、ARM CPU、Google TPU、Nvidia Volta/Turing/Ampere、Qualcomm DSP这些主流硬件都对量化提

了支持。

      与典型的 FP32 型号相比,PyTorch 支持 INT8 量化,从而可将模型大小减少 4 倍,并将内存带宽要求减少 4 倍。 与 FP32 计算相比,对 INT8 计算的硬件支持通常快 2 到 4 倍。 量化主要是一种加速推理的技术,并且量化算子仅支持前向传递。PyTorch 支持多种方法来量化深度学习模型。 在大多数情况下,该模型在 FP32 中训练,然后将模型转换为 INT8

PyTorch对量化的支持目前有如下三种方式:

  • Post Training Dynamic Quantization,模型训练完毕后的动态量化;
  • Post Training Static Quantization,模型训练完毕后的静态量化;
  • QAT(Quantization Aware Training),模型训练中开启量化。

示例: 模型量化后保存为jit形式


### 关于 PyTorch 中 `torch.quantization` 模块的支持情况 `torch.quantization` 是 PyTorch 提供的一个用于模型量化的模块,主要用于降低模型的存储需求和推理延迟,同时保持较高的精度。该模块支持多种量化方法,包括动态量化、静态量化以及量化感知训练 (QAT)[^1]。 #### 静态量化与动态量化 - **静态量化**:适用于 CNN 和其他具有固定输入大小的网络结构。它需要校准数据集来计算激活值的统计信息(如均值和标准差)。此过程通常涉及插入观察器操作符以收集每层的激活分布[^2]。 - **动态量化**:主要针对 LSTM 或 Transformer 这样的序列模型设计,在运行时自动调整权重和激活值的比例因子。这种方式不需要额外的数据来进行校准[^3]。 无论是哪种类型的量化方式,`torch.quantization` 均可以在 CPU 上执行,并且能够显著减少内存占用并提升性能。这是因为量化后的张量使用较低位宽表示数值(例如 int8 而非 float32),从而减少了乘法累加运算中的算术复杂度[^2]。 以下是利用 `torch.quantization` 对卷积神经网络进行动态量化的简单例子: ```python import torch from torch import nn import torch.nn.functional as F from torch.quantization import quantize_dynamic class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() self.conv1 = nn.Conv2d(1, 6, kernel_size=5) self.pool = nn.MaxPool2d(kernel_size=2, stride=2) self.fc = nn.Linear(6 * 12 * 12, 10) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = x.view(-1, 6 * 12 * 12) x = self.fc(x) return x model = SimpleCNN() model.eval() # 动态量化指定 Conv2d 和 Linear 层 quantized_model = quantize_dynamic(model, {nn.Conv2d, nn.Linear}, dtype=torch.qint8) dummy_input = torch.randn(1, 1, 28, 28) output = quantized_model(dummy_input) print(output) ``` 尽管如此需要注意的是,虽然当前版本的 `torch.quantization` 支持大部分常见架构下的 CPU 推理优化,但对于某些特殊硬件加速功能可能仍需依赖 GPU 或者特定 SDK 的集成解决方案[^3]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值