前言
在 PPQ 中我们提供许多校准方法,这些校准方法将计算出网络的量化参数
让我们调整校准算法来尝试降低误差
code
from typing import Iterable
import torch
import torchvision
from ppq import QuantableOperation, TargetPlatform, graphwise_error_analyse
from ppq.api import quantize_torch_model
from ppq.api.interface import (ENABLE_CUDA_KERNEL, dispatch_graph,
dump_torch_to_onnx, load_onnx_graph, quantize_native_model)
from ppq.api.setting import QuantizationSettingFactory
# ------------------------------------------------------------
# 在 PPQ 中我们提供许多校准方法,这些校准方法将计算出网络的量化参数
# 这个脚本将以随机数据和 mobilenet v2 网络为例向你展示它们的使用方法
# ------------------------------------------------------------
BATCHSIZE = 32
INPUT_SHAPE = [BATCHSIZE, 3, 224, 224]
DEVICE = 'cuda'
PLATFORM = TargetPlatform.TRT_INT8
def load_calibration_dataset() -> Iterable:
# ------------------------------------------------------------
# 让我们从创建 calibration 数据开始做起, PPQ 需要你送入 32 ~ 1024 个样本数据作为校准数据集
# 它们应该尽可能服从真实样本的分布,量化过程如同训练过程一样存在可能的过拟合问题
# 你应当保证校准数据是经过正确预处理的、有代表性的数据,否则量化将会失败;校准数据不需要标签;数据集不能乱序
# ------------------------------------------------------------
return [torch.rand(size=INPUT_SHAPE) for _ in range(32)]
CALIBRATION = load_calibration_dataset()
def collate_fn(batch: torch.Tensor) -> torch.Tensor:
return batch.to(DEVICE)
# ------------------------------------------------------------
# 我们使用 mobilenet v2 作为一个样例模型
# PPQ 将会使用 torch.onnx.export 函数 把 pytorch 的模型转换为 onnx 模型
# 对于复杂的 pytorch 模型而言,你或许需要自己完成 pytorch 模型到 onnx 的转换过程
# ------------------------------------------------------------
model = torchvision.models.mobilenet.mobilenet_v2(pretrained=True)
model = model.to(DEVICE)
# ------------------------------------------------------------
# PPQ 提供 kl, mse, minmax, isotone, percentile(默认) 五种校准方法
# 每一种校准方法还有更多参数可供调整,PPQ 也允许你单独调整某一层的量化校准方法
# 在这里我们首先展示以 QSetting 的方法调整量化校准参数(推荐)
# ------------------------------------------------------------
QSetting = QuantizationSettingFactory.default_setting()
QSetting.quantize_activation_setting.calib_algorithm = 'kl'
QSetting.quantize_parameter_setting.calib_algorithm = 'minmax'
# ------------------------------------------------------------
# 更进一步地,当你选择了某种校准方法,你可以进入 ppq.core.common
# OBSERVER_KL_HIST_BINS, OBSERVER_PERCENTILE, OBSERVER_MSE_HIST_BINS 皆是与校准方法相关的可调整参数
# OBSERVER_KL_HIST_BINS - KL 算法相关的箱子个数&#x