量化感知训练_量化技术及Albert动态量化

量化感知训练_量化技术及Albert动态量化_第1张图片

导读

最近一直在看一些关于模型加速的东西,有关模型加速比较常见的方法是量化,蒸馏和剪枝。三种方法对模型的效果都有一定的损伤。量化主要是对张量使用整数而不是浮点数进行计算,本文我们简单介绍了几种比较常见的量化技术,并对albert进行了动态量化。

量化技术简介

比较常见的几种模型加速的方法有量化,蒸馏,剪枝。蒸馏是2014年Hinton提出的一种模型加速的方法,Student模型模仿Teacher模型。而量化是对张量使用整数而不是浮点数进行计算,与FP32相比Int8的计算的硬件支持通常快2~4倍。量化主要是一种加速推理的技术,并且量化算子仅支持前向传递。

Pytorch提供了三种量化模型的方法,动态量化,静态量化和量化感知训练。

  • 动态量化是最简单的一种量化方式,权重被提前量化,而激活在推理过程中被动态量化。 这用于以下情况:模型执行时间主要由从内存中加载权重而不是计算矩阵乘法来决定。
  • 静态量化是最常见的一种量化方式,权重是提前量化的,并且基于观察校准过程中模型的行为来预先计算激活张量的比例因子和偏差。 训练后量化通常是在内存带宽和计算节省都很重要的情况下进行的。
  • 量化感知训练计算将在 FP32 中进行,但将值取整并四舍五入以模拟 INT8 量化的效果。

今天我们将尝试对Albert进行动态量化。

Albert动态量化

上文我们已经了解过,量化只支持前向传递,因此要进行Albert首先需要对Albert进行预训练。本文采用Weitang Liu的albert_pytorch。接下来就要开始准备量化啦~

1. 准备数据集微调albert

本文我们对文本分类任务进行微调,准备好自己的数据集,

python run_classifier.py --data_dir $dir 
  --model_type mnli 
  --model_name_or_path $path 
  --task_name classify 
  --output_dir $dir 
  --vocab_file $path

2. 量化model

首先我们需要加载预训练model然后进行动态量化:

tokenizer = tokenization_albert.FullTokenizer(vocab_file=args.vocab_file, do_lower_case=args.do_lower_case,spm_model_file=args.spm_model_file)
model =AlbertForSequenceClassification.from_pretrained(args.model_name_or_path,from_tf=bool('.ckpt' in args.model_name_or_path),config=config)
quant_model = torch.quantization.quantize_dynamic(model, {torch.nn.Linear}, dtype = torch.qint8)
model = quant_model
model.to(device)

这样我们就成功了对模型进行了动态量化啦~静态量化和量化感知训练大家可以看pytorch的官网:https://pytorch.apachecn.org/docs/1.4/88.html

3. 效果

对模型量化的结果我们的数据集上进行了评测,模型大小变小了25%左右,inference的速度快了15%但是效果下降了3个点。

目前公开数据集还没有评测,有兴趣的朋友可以一起来交流哦~

你可能感兴趣的:(量化感知训练)