大模型量化之AWQ原理和应用

本文将介绍如下内容:

  • 一、什么是 AWQ
  • 二、AWQ 核心原理
  • 三、搭建 AWQ 环境
  • 四、大模型量化转换
  • 五、量化后模型测试

一、什么是 AWQ

AWQ(Activation-aware Weight Quantization)量化是一种基于激活值分布(activation distribution)挑选显著权重(salient weight)进行量化的方法,其不依赖于任何反向传播或重建,因此可以很好地保持LLM在不同领域和模式上的泛化能力,而不会过拟合到校准集,属训练后量化(Post-Training Quantization, PTQ)大类。

二、AWQ 核心论述

1、核心观点1:权重并不同等重要,仅有小部分显著权重对推理结果影响较大

作者指出,模型的权重并不同等重要,仅有0.1%~1%的小部分显著权重对模型输出精度影响较大。 因此如果能有办法只对0.1%~1%这一小部分权重保持原来的精度(FP16),对其他权重进行低比特量化,就可以在保持精度几乎不变的情况下,大幅降低模型内存占用,并提升推理速度。这就涉及到一个问题,如何鉴别显著权重,常用的方法有三种:

  • 随机挑选:听天由命,随机选出0.1%~1%的权重作为显著权重,当然这种方法很不科学。
  • 基于权重分布挑选:对权重矩阵(比如自注意力中的 W q , W k , W v W_q, W_k, W_v Wq,Wk,Wv )中的元素按绝对值大小由大到小排序,绝对值越大越显著,选择前0.1%~1%的元素作为显著权重。
  • 基于激活值分布挑选: 作者用“激活值”一词很具有迷惑性,查阅了很多blog都没太确定其具体含义,阅读源码后确定,激活值就是与权重矩阵作matmul运算的输入值,比如自注意力机制中,计算 Q = W q X , K = W k X , V = W v X , O = W o [ softmax ( K Q ⊤ ) V ] Q = W_q X, K = W_k X, V = W_v X, O = W_o \left[ \text{softmax}(K Q^\top) V \right] Q=WqX,K=WkX,V=WvX,O=Wo[softmax(KQ)V] X X X 就是 W q , W k , W v W_q, W_k, W_v Wq,Wk,Wv的激活值, [ softmax ( K Q ⊤ ) V ] \left[ \text{softmax}(K Q^\top) V \right] [softmax(KQ)V] W o W_o Wo 的激活值。按激活值绝对值大小由大到小排序,绝对值越大越显著,选择前0.1%~1%的元素作为显著权重。

作者分别对三种方法进行了实验,将PPL(越小越好)作为评估指标,发现:

  • 随机挑选显著权重(random列)的方式与对所有权重进行低比特量化(RTN列)的性能差不多,预料之内;
  • 基于权重分布挑选(base on W列)的方式与随机挑选(random列)差不多,这是打破常规认知的,因为很多量化方法都是基于该方式挑选显著权重;
  • 基于激活值分布挑选(based on act.列)的方式相比FP16几乎没有精度损失,是重大发现。
    在这里插入图片描述

因此,基于激活值分布挑选显著权重是最为合理的方式。只要把这部分权重保持FP16精度,对其他权重进行低比特量化,就可以在保持精度几乎不变的情况下,大幅降低模型内存占用,并提升推理速度。

这里还有一个细节,作者为了避免方法在实现上过于复杂,在挑选显著权重时,并非在“元素”级别进行挑选,而是在“通道(channel)”级别进行挑选,即权重矩阵的一行作为一个单位。在计算时,首先将激活值对每一列求绝对值的平均值,然后把平均值较大的一列对应的通道视作显著通道,保留FP16精度。对其他通道进行低比特量化,如下图:
在这里插入图片描述
但另一个问题随之而来,如果权重矩阵中有的元素用FP16格式存储,有的用INT4格式存储,不仅存储时很麻烦, 计算时取数也很麻烦,kernel函数写起来会很抽象。于是,作者想了一个变通的方法——Scaling。

2、核心观点2:量化时对显著权重进行放大可以降低量化误差

考虑一个权重矩阵 w w w,线性运算可以写作 y = w x y = wx y=wx。对权重矩阵进行量化后,可以写作 y = Q ( w ) x y = Q(w)x y=Q(w)x量化函数 ⋆ ^\star Q ( ⋅ ) Q(\cdot) Q() 定义为公式1:

  • Q ( w ) = Δ ⋅ Round ( w Δ ) , Δ = max ⁡ ( ∣ w ∣ ) 2 N − 1 , Q(w) = \Delta \cdot \text{Round} \left( \frac{w}{\Delta} \right), \quad \Delta = \frac{\max (|w|)}{2^{N-1}}, \quad Q(w)=Δ
在Hugging Face Transformers库中,使用AWD-QAModel(即Abridged Wasserstein Distance Quantization Model)通常涉及到将预训练的大型语言模型进行量化,以便于部署到资源有限的设备上,如手机或嵌入式系统。AWD量化是通过Quantization-Aware Training (QAT) 过程实现的,它允许模型在训练过程中就考虑到量化的影响。 以下是使用Hugging Face Transformers进行AWD量化模型的基本步骤: 1. **安装依赖**: 首先,你需要安装`transformers`库及其相关的量化工具包,例如`transformers quantization`。可以使用pip安装: ``` pip install transformers[quantization] ``` 2. **加载模型**: 导入需要的模块并加载预训练的模型,比如BERT、GPT-2等: ```python from transformers import AutoTokenizer, AutoModelForSequenceClassification, is_apex_available, AWDQConfig model_name = "bert-base-uncased" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForSequenceClassification.from_pretrained(model_name) ``` 3. **量化配置**: 创建一个AWD量化配置对象: ```python config = AWDQConfig(model=model) ``` 4. **准备数据**: 将数据转换成模型接受的格式,并分割成小批次,这对于量化过程很重要。 5. **量化训练**: 使用`Trainer` API进行量化训练,这会自动在训练过程中应用量化技巧: ```python trainer = Trainer( model=model, args=..., data_collator=..., train_dataset=..., eval_dataset=..., # 可选 tokenizer=tokenizer, config=config, compute_metrics=..., ) trainer.train() ``` 6. **保存量化模型**: 训练完成后,你可以保存量化后的模型: ```python trainer.save_model("path/to/save/awd_quantized_model") ``` 7. **部署**: 现在可以将这个量化模型用于推理任务,相比未量化模型,它的内存占用更小,速度更快。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值