当前位置:   article > 正文

EfficientAI Lab: 大模型AWQ量化_awq 详解

awq 详解

实验简介

本次实验开始,我们将接触大模型LLM!

这里使用的模型介绍可以参考:https://huggingface.co/facebook/opt-1.3b

这是一个LLM大模型。而本次使用的压缩方法来自Activation-aware Weight Quantization

https://arxiv.org/pdf/2306.00978.pdf

本次实验做完感觉还是很有收获的,对于AWQ这一目前比较流行的模型量化方法算是梳理清楚流程了。

AWQ理论介绍

简介

AWQ(Activation-aware Weight Quantization)的核心是基于通道级别的尺度缩放(channel-wise scaling),来保护显著权重。而值得注意的是,是通过观察“activation”,而不是权重,来选择缩放的大小。此外,该方法不需要进行反向传播和重构,部署容易。

The astronomical model size raises the hardware barrier for serving (memory size) and slows down token generation (memory bandwidth). LLM sizes and computation are increasing exponentially, while memory bandwidth is increasing slowly. This gap is a major bottleneck for LLMs. In this lab, we will explore the use of an novel quantization algorithm (AWQ) to reduce memory footprint of LLMs and achieve accelerations for inference.

We will implement AWQ (activation aware weight only quantization) for 4 bit weight-only quantization.

左图表达Round-to-nearest方法的策略和效果,PPL非常高(不好);中间的图表示作者的key observation,那就是保留一部分权重;右图表本文的策略,那就是根据channel级别的activation大小选择缩放。

核心思想一: 保留1%的显著权重

基于实验发现,保留通道级别的大权重没有显著帮助,但是保留大activation对应的大通道权重,却有很有效的提升。这其实有点反直觉,但是,作者提出的观点就是大activation对应的权重保持精度可以更有效的保持这些特征的精度。

但是,这样的不同精度的参数的保留在硬件上很难实现。

核心思想二:基于activation选择缩放大小

这里对应的核心观察是,将大activation对应的模型权重和激活值对应缩放后,误差在某些情况(S取不同的数值)会比之前小。作者发现,s取2时,PPL最小。

相比于核心思想一,目前的方法,支持对于全部参数都进行量化,但是缺点是,我们该如何选择s?

这里,作者选择优化一个简单的损失函数。

这里选择使用穷举法寻找最优解。

搜索空间对应如下,a从0,1进行等距搜索。

从实验效果来看确实不错。

Efficient AI Lab 4介绍

首先回顾一下computation intensity的概念:

The computational intensity of an algorithm is q = f / m, where f is # of basic operations (e.g. floating-‐point adds and multiplies) and m is # of words moved between fast and slow memory.

然后,分析结论是目前大模型的computation intensity太大了。

数据集和模型准备

这里涉及到Hugging face的模型和数据的下载,

因为众所周知的原因,这一步比较麻烦,对应的策略是直接在官网下载模型和数据集。然后放置到服务器合适的位置上。

代码如下

  1. testenc = load_dataset('wikitext__wikitext-2-raw-v1', cache_dir = "~//wikitext__wikitext-2-raw-v1", split='test')
  2. dataset = load_dataset("pile-val-backup",cache_dir = "/home/radmin/hcx/tinyml/pile-val-backup",split="validation")
  3. torch.cuda.empty_cache()
  4. model = AutoModelForCausalLM.from_pretrained(model_path, device_map="auto")
  5. pseudo_quantize_model_weight(model, w_bit=3, q_group_size=128)

这样折腾下来,这个问题也算是完美的解决了。

实验背景

然后,评估了一下原始模型的大小和perplexity。(perlexity是啥,下面简单介绍了一下,这个数值越小越好)

Intuitively, perplexity means to be surprised. We measure how much the model is surprised by seeing new data. The lower the perplexity, the better the training is.

Perplexity is calculated as exponent of the loss obtained from the model. In the above example, we can see that the perplexity of our example model with regards to the phrase “beautiful scenery” is 9.97. The formula for perplexity is the exponent of mean of log likelihood of all the words in an input sequence.

这里,需要记录的比较重要的参数是:

model perplexity 14.47, model size: 5043.73MB

 从nvidia-smi中可以看出,模型占用了17G的显存。

然后,又介绍了两个概念。uniform quantization 和 peseudo-quantization

对于大模型进行这种操作后,模型大小虽然大大降低。但是model perplexity大大增加。这不是我们希望的,因为我们希望model perplexity保持稳定(较小的数值)

接下来,作者提出了一种改进思路, 保留一部分显著权重的精度。

 

然后,作者提供了显著权重的认证方式,那就是加载标定数据集,并获取activation outliers。然后,避免对应的参数被量化失去精度。

按照作者的思路,执行后, 模型的perplexity确实显著减少。

值得注意的是,对于权重的缩放参数,在s=2的时候效果最好,3,4对应的效果慢慢下降。对应的原因作者在论文里也解释了,对应下列公式,原因就是缩放尺度增加后,delta也可能增加,从而影响量化效果(按照我的理解)。

然后,作者想通过穷举的方式,来决定S。

这里从代码部分有些地方不太明白,比如下面的部分,会scales经过最后一行处理,会又inf出现,这一步的目的是什么呢?

  1. scales_ =s_x.pow(ratio)
  2. # why?
  3. scales_ = scales_ / (scales_.max() * scales_.min()).sqrt().view(1, -1)

这一步目前的实现还是有问题。现在精度为19.07。目标精度为17.92

总结

这篇论文提出的方法目前看来简洁而有效,并且有对应的数学推导。

实验最后一部分对于scale的操作有点不太理解。希望之后能够在工程上尝试使用它。

参考文献

huggingface之datasets将数据集下载到本地_快去写论文的博客-CSDN博客

https://medium.com/@priyankads/perplexity-of-language-models-41160427ed72

https://arxiv.org/pdf/2306.00978.pdf

 https://huggingface.co/facebook/opt-1.3b

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/360271
推荐阅读
相关标签
  

闽ICP备14008679号