量化方法怎么选?如何评估量化后的大模型LLM?

如果想深入了解量化的基本概念和如何用代码实现请参考:用python代码深入浅出量化概念(https://zhuanlan.zhihu.com/p/696986233)

文章总结

本文都是针对PTQ如何选择和应用量化技术的建议:

  1. 评估量化对各种NLP任务的影响

  2. 评估量化对不同LLMs的影响

  3. 不同的Tensor类型对量化的影响

  4. 不同的量化方法对模型的影响

根据实验结果的几个关键见解如下:

  1. 模型越大,对仅权重和KV缓存量化的容忍度越高,而对激活量化的容忍度较低。

  2. 利用专家混合(MoE)技术增加模型大小并不一定增强模型对量化的容忍度。

  3. 对于大多数NLP任务,将大多数LLM家族量化为W4、W4A8、KV4和W8KV4,性能损失可以忽略不计(<2%)。在一定的内存预算下,使用量化到W3的较大模型可以获得更优性能。

  4. 在四种突出能力(即上下文学习、指令遵循、多步推理和自校准)中,自校准和多步推理能力对量化更敏感。对于小于13B的LLMs,推荐使用W8、W8A8和KV8量化。

  5. 对于伦理任务,小型模型对量化的敏感性更高。仅权重量化会增强模型对敏感信息的判断,而KV缓存量化则有相反的效果。

  6. LLMs在处理长文本(>4k)时,对仅权重和KV缓存量化的敏感性高于短文本(<4k),尤其是对KV缓存量化。在大多数情况下,W4、W4A8和KV8可以在长上下文任务中保持性能。

  7. 最先进的量化方法,如SmoothQuant和AWQ,在量化造成的性能损失适中时,可以有效提升性能。然而,当使用极低位宽时,AWQ和SmoothQuant无法恢复完全损坏的性能。

统计分析工具

三种张量统计方法用于分析评估结果

  1. 最大绝对值(AbsMax)显示动态范围。

  2. 标准差(Std)σ反映数据值偏离平均值的程度。较小的标准差表明张量更适合量化。

  3. 峰度(kurtosis)总结了某个张量的异常值情况,其中n是张量中的数据点数,μ是张量的平均值。高峰度表明分布具有重尾,表明异常值的可能性更高。相反,低峰度表明轻尾,表明分布中的异常值较少。

峰度公式:

=1𝑛∑𝑖=1𝑛(𝑥𝑖−𝜇𝑏)4

量化类型

三种不同类型的量化:

  1. 仅权重量化:只量化每个线性层的权重张量W。

  2. 权重-激活量化:量化每个线性层的输入激活X和权重张量W。

  3. KV缓存量化:量化每个自注意力块中的键张量K和值张量V。

为了简化,我们使用W、A和KV后跟一个正整数来表示对权重、激活和KV缓存的量化到特定位宽。例如,W4A8表示将权重量化到4位,激活量化到8位。

量化对不同LLMs的影响

  1. 当位宽高于W4、W4A8和KV4时,量化LLMs的相对排名通常与FP16 LLMs的排名一致。

  2. 与增加宽度和深度不同,利用专家混合(MoE)技术增加模型大小并不一定增强模型对量化的容忍度。

图2

如图2所示,FP16 Mixtral-8x7B MoE模型的性能与LLaMA2-70B相似。然而,Mixtral-8x7B对仅权重和KV缓存量化的敏感性比LLaMA2-70B更高。相反,Mixtral-8x7B对量化的敏感性更接近于同一模型家族中较小的LLaMA2-7B和Mistral-7B。

3. OPT模型对Weight-only 和 Weight-Activation的量化非常敏感,不适合量化.

量化对不同Tensor类型的影响

  1. 模型参数越多对权重量化的容忍度越高

  2. KV cache的量化和权重量化的现象一致

  3. 模型越大对激活量化的容忍度反而越低

一般来说,在大多数任务上,大部分LLMs可以通过W4或KV4量化保持其性能。当将LLMs量化到W3或KV3时,所有模型家族中小型模型的性能都会明显下降。此外,对于W2或KV2,大多数模型都会经历显著的性能损失

对于权重-激活量化,W4A8 LLMs代表了可以达到良好性能的前沿。W4A4量化将严重影响LLMs的效果。在具有大批量大小和长文本的实际应用中,一种常见做法是同时量化权重和KV缓存。对于短文本任务,W8KV4几乎无损失。对于长文本任务,W8KV8是更好的选择。

量化对不同任务的影响

我们没有观察到量化在不同语言中的不同影响。我们在CHID和Winogrande数据集上评估了各种量化LLMs,这些数据集分别是中文和英文的完形填空任务。尽管不同LLMs在这些任务上的表现各异,但量化引起的性能损失趋势相当相似。

  1. W4, W4A8和KV4的量化几乎不影响效果

  2. 在内存限定时,推荐使用大模型W3的量化

  3. 当模型出现饱和(效果不随模型增大而变好)建议使用小模型+高位宽的量化

不同量化方法对模型效果的影响

使用极低位宽(如W2或W4A4)时,使用最先进的量化方法将性能恢复到与FP16 LLMs相似的水平是具有挑战性的。

AWQ可以提高量化LLMs的性能。此外,模型越大,其性能越接近FP16基线。然而,在W2量化的情况下,量化的LLMs完全失去了它们的能力,AWQ无法恢复损坏的性能。权重-激活量化也观察到了类似的结果。虽然SmoothQuant可以部分恢复W4A4量化的性能,但性能仍然显著低于FP16基线。

为了使极低位宽量化(如W2、W4A4和KV2)有效,需要进一步研究量化方案或量化感知训练(QAT)方法。

量化对涌现能力的影响

能力涌现包含:

  1. In-Context Learning

  2. Instruction-Following

  3. Multi-Step Reasoning:多步推理

  4. Self-Calibration:自我校准

量化对不同任务影响

结论

在四种突出能力中,多步推理和自我校准能力对量化的容忍度明显低于指令遵循和上下文学习能力,尤其是对于小型LLMs。

一般来说,**对于较小的模型(<13B),W8或KV8更适合维持多步推理和自我校准能力。对于较大的模型(>13B),W4或KV4更适合维持所有四种突出能力。**此外,对于大多数LLMs,W4A8不会导致显著的性能损失,但W4A4会导致所有模型完全失去突出能力。

量化对对话任务的影响

使用两轮的MT-bench评估量化后的LLMs对话的质量。我们使用GPT-4为每个生成的对话生成单一答案评分(GPT-4分数),分数范围从1到10。

**对话能力对KV缓存量化的容忍度高于权重量化。**大多数LLM家族可以量化为W8、W4A8和KV4,而不会造成GPT-4分数的显著损失(<0.2)。

在具体的失败模式方面,我们观察到:

  1. 使用W3和KV3量化时,大多数LLMs开始重复一些句子。

  2. 使用W2、KV2和W4A4时,大多数LLMs失去了对话能力,生成无意义的符号或重复一些单词。

  3. 只有少数LLMs,如ChatGLM3-6B、Falcon-40B和Falcon-180B,在KV2量化下仍能生成连贯的句子,尽管大多数句子缺乏有意义的内容。

在MT-Bench中,第二轮对话的GPT-4分数一致低于第一轮。然而,量化对大多数LLMs中的两轮对话没有影响。一个例外是,当将KV缓存从KV8量化到KV3时,LLaMA2-13B在第二轮对话的GPT-4分数显著下降了1.19,而第一轮对话的GPT-4分数仅下降了0.31。

对于对话任务,当使用极低的位宽,如W2或W4A4时,使用最先进的量化方法达到与FP16 LLMs相似的性能水平仍然具有挑战性。

在未来,值得研究量化对超过两轮的对话的影响。量化在经过几轮对话后是否会有更显著的效果尚未可知。

量化对Long-Context任务的影响

长文本(>4k)对仅权重和KV缓存量化的敏感性高于短文本(<4k)。对于仅权重量化,长文本的性能损失显著大于短文本。图5(a)显示,当量化到W3时,Mixtral-8x7B和Vicuna-7B模型在较长文本上的准确率损失更为显著。

图5

对于权重-激活量化,量化模型在长文本上的性能退化并不比短文本大,如图5(b)所示。实际上,我们可以将大多数LLM家族量化到W4和W4A8,除了LongChat(基于LLaMA的)家族(16K),它只能被量化到W8和W8A8。

对于长上下文任务,大多数LLMs对KV缓存量化的敏感性高于仅权重量化和权重-激活量化。

在相同的位宽下,使用KV缓存量化的LLMs的性能明显低于仅权重量化的性能,如图5(a, c)所示。在LongChat(基于LLaMA的)家族中,即使是KV8量化也会导致长文本上的显著性能退化。对于Vicuna(基于LLaMA2的)和ChatGLM家族(32K),KV8量化几乎无损,而在使用KV4时长文本上的性能退化才会发生。Mistral家族显示出对KV缓存量化的最高容忍度,这与短文本不同。对于Mistral家族,KV4仍然是无损的。

量化对模型处理不同位置信息的能力的影响各不相同。

在我们的评估中,我们将含有16K Token的长文本分为十个区间,每个区间内的信息均匀分布。如图5(d, f)所示,对于Mixtral-8x7B,仅权重和KV缓存量化对中间位置带来更显著的损失,同一模型家族中的Mistral-7B也出现了类似的结果,如附录中的图27所示。对于其他家族,在大多数情况下,量化在不同位置的效果是一致的。一个例外是图5(f)所示,其中KV4量化的Vicuna-7B在文本开头显示出更显著的效果。

如何系统的去学习大模型LLM ?

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料 包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来

所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包

量化一个LLM(大型语言模型)的过程主要涉及两个步骤:参数量化和模型压缩。这里以深度学习框架如TensorFlow或PyTorch为例[^1]: 1. **参数量化**: - **量化类型**: 可能包括整数量化(如INT8/INT4)、固定点量化(FP16/FP8)或者混合精度量化(比如BERT采用的混合精度)。 ```python from tensorflow.keras.layers import QuantizeLayer # 对权重或激活层进行量化 quantizer = QuantizeLayer(input_range=(-128, 127), output_range=(0, 255)) quantized_weight = quantizer(model.get_layer('your_layer').kernel) ``` 2. **模型压缩**: - **剪枝**: 删除对模型性能影响较小但占内存较大的参数。 ```python from tensorflow_model_optimization.sparsity import keras as sparsity pruning_params = {'pruning_schedule': sparsity.PolynomialDecay(initial_sparsity=0.50, final_sparsity=0.90, begin_step=0, end_step=end_step)} model = sparsity.prune_low_magnitude(model, **pruning_params) ``` - **知识蒸馏**: 使用一个已经训练好的教师模型指导学生模型的学习,从而达到减小模型规模的目的。 ```python teacher_model = load_pretrained_large_model() student_model = create_small_model() distiller = tf.keras.Model(student_model.input, [student_model.output, teacher_model.output]) ``` 3. **评估与微调**: 完成量化和压缩后,通常需要重新训练或微调模型以适应量化后的特性。 请注意,实际操作可能因使用的库和工具而异,上述代码片段仅作为概念示例。在实施时,请查阅相关文档或库的具体教程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值