当前位置: 首页 > 答疑 > 正文

paddleslim 目录1.简介2.paddleS

作者:admin 发布时间:2023-04-05 13:16:40 分类:答疑 浏览:117


  目录

  1.简介

  2.paddleSlim量化步骤

  2.1量化训练API

  2.2示例

  1.简介

  量化训练要解决的问题是将FP32浮点数量化成INT8整数进行存储和计算,通过在训练中建模量化对模型的影响,降低量化误差。

  PaddleSlim使用的是模拟量化训练方案,一般模拟量化需要先对网络计算图进行一定的处理,先在需要量化的算子前插入量化-反量化节点,再经过finetune训练减少量化运算带来的误差,降低量化模型的精度损失。

  2.paddleSlim量化步骤

  构建模型和数据集进行预训练量化训练导出预测模型

  2.1量化训练API

  classpaddleslim.QAT(config=None, weight_preprocess=None, act_preprocess=None, weight_quantize=None, act_quantize=None)

  使用该API可将模型转为模拟量化模型,使用量化训练方法QAT?(Quant Aware Training, QAT)。

  参数:

  config(dict, Optional)?- 量化配置表。 默认为None,表示使用默认配置, 默认配置参考下方文档。weight_preprocess(class, Optional)?- 自定义在对权重做量化之前,对权重进行处理的逻辑。这一接口只用于实验不同量化方法,验证量化训练效果。默认为None, 表示不对权重做任何预处理。act_preprocess(class, Optional)?- 自定义在对激活值做量化之前,对激活值进行处理的逻辑。这一接口只用于实验不同量化方法,验证量化训练效果。默认为None, 表示不对激活值做任何预处理。weight_quantize(class, Optional)?- 自定义对权重量化的方法。这一接口只用于实验不同量化方法,验证量化训练效果。默认为None, 表示使用默认量化方法。act_quantize(class, Optional)?- 自定义对激活值量化的方法。这一接口只用于实验不同量化方法,验证量化训练效果。默认为None, 表示使用默认量化方法。

  ?模型转换为模拟量化的三步:定义模型、配置config、转换为模拟量化模型。

  from paddle.vision.models import mobilenet_v1

  from paddleslim import QAT

  net=mobilenet_v1(pretrained=False)

  # 配置config

  quant_config={

  'activation_preprocess_type': 'PACT',

  'quantizable_layer_type': ['Conv2D', 'Linear'],

  }

  # 模型转换

  quanter=QAT(config=quant_config)

  quanter.quantize(lenet)

  # 打印模型信息

  paddle.summary(net, (1, 3, 224, 224))

  config的配置

  {

  # weight预处理方法,默认为None,代表不进行预处理;当需要使用`PACT`方法时设置为`"PACT"`

  'weight_preprocess_type': None,

  # activation预处理方法,默认为None,代表不进行预处理`

  'activation_preprocess_type': None,

  # weight量化方法, 默认为'channel_wise_abs_max', 此外还支持'channel_wise_abs_max'

  'weight_quantize_type': 'channel_wise_abs_max',

  # activation量化方法, 默认为'moving_average_abs_max', 此外还支持'abs_max'

  'activation_quantize_type': 'moving_average_abs_max',

  # weight量化比特数, 默认为 8

  'weight_bits': 8,

  # activation量化比特数, 默认为 8

  'activation_bits': 8,

  # 'moving_average_abs_max'的滑动平均超参, 默认为0.9

  'moving_rate': 0.9,

  # 需要量化的算子类型

  'quantizable_layer_type': ['Conv2D', 'Linear'],

  }

  2.2示例

  创建模型和数据

  import paddle

  import paddle.vision.models as models

  from paddle.static import InputSpec as Input

  from paddle.vision.datasets import Cifar10

  import paddle.vision.transforms as T

  from paddleslim.dygraph.quant import QAT

  net=models.mobilenet_v1(pretrained=False, scale=1.0, num_classes=10)

  inputs=Input([None, 3, 32, 32], dtype='float32', name='image')

  labels=Input([None, 1], dtype='int64', name='label')

  optmizer=paddle.optimizer.Momentum(learning_rate=1e-1, parameters=net.parameters())

  model=paddle.Model(net, inputs, labels)

  model.prepare(optimizer=optmizer, loss=paddle.nn.CrossEntropyLoss(), metrics=paddle.metric.Accuracy(topk=(1, 5)))

  transform=T.Compose([T.Transpose(), T.Normalize([127.5], [127.5])])

  train_dataset=Cifar10(mode='train', backend='cv2', transform=transform)

  val_dataset=Cifar10(mode='test', backend='cv2', transform=transform)

  预训练?

  model.fit(train_dataset, epochs=5, batch_size=256, verbose=1)

  model.evaluate(val_dataset, batch_size=256, verbose=1)

  评估精度为0.94?

  {'loss': [1.0521829], 'acc': 0.943}

  ?转化为量化模型

  # 当使用普通量化策略时weight_preprocess_type 用默认设置None即可,当需要使用PACT量化策略时,则设置为’PACT’。

  quant_config={

  # weight preprocess type, default is None and no preprocessing is performed.

  'weight_preprocess_type': None,

  # for dygraph quantization, layers of type in quantizable_layer_type will be quantized

  'quantizable_layer_type': ['Conv2D', 'Linear'],

  }

  quanter=QAT(quant_config)

  quanter.quantize(net)

  微调

  # finetune量化模型

  model.fit(train_dataset, epochs=2, batch_size=256, verbose=1)

  model.evaluate(val_dataset, batch_size=256, verbose=1)

  评估精度为0.94,未见明显下降。

  {'loss': [0.9758247], 'acc': 0.9447}

  ?导出的量化模型相比原始FP32模型,模型体积没有明显差别,这是因为量化预测模型中的权重依旧保存为FP32类型。在部署时,使用PaddleLite opt工具转换量化预测模型后,模型体积才会真实减小。

  pytorch的量化:深度学习模型量化(低精度推理)大总结


标签:模型默认


相关推荐

最新推荐

关灯