【LLM国产化】量化技术在MindIE中的应用

目前,由于大模型参数量显著激增,从而导致模型变得越来越大。因此,需要一些大模型压缩技术来降低模型部署的成本,并提升模型的推理性能。而模型量化作为模型压缩领域的研究热点之一,获得了广泛的应用。目前主要有的推理框架vLLM、TensorRT-LLM、LMDeploy都提供了针对大模型的量化方案。而本文将介绍量化技术在MindIE推理框架中的应用。

而来自MIT HAN Lab 的 SmoothQuant 和 AWQ 无疑是其中的佼佼者,同时, AWQ 还获得了 MLSys 2024年最佳论文奖。此外,像GPTQ也获得了广泛关注。目前,三者广泛应用于TensorRT-LLM、vLLM、LMDeploy等LLM推理框架中,MindIE 框架中一些量化方法也是基于其思想进行实现。下面对这三篇论文的核心思想进行简要概述。

SmoothQuant

SmoothQuant (论文:SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models)是一种同时确保准确率且推理高效的训练后量化 (PTQ) 方法,可实现 8 比特权重、8 比特激活 (W8A8) 量化。

针对大模型而言,权重很容易量化,对于激活值,由于异常值的存在,导致激活则较难量化。作者对比了 per-channel、per-token、per-tensor 激活量化方案。在这几种不同的激活量化方案中。per-tensor量化是最高效的实现方式。但只有逐通道量化(per-channel)保留了精度,但它与 INT8 GEMM Kernel不兼容。即per-channel量化不能很好地映射到硬件加速的GEMM内核(硬件不能高效执行,从而增加了计算时间)。

为了进行 vector-wise quantization 以有效利用 INT8 GEMM 内核,我们只能使用外部维度(即激活的维度 T 和 权重的维度 )的缩放因子,不能使用内部维度(即通道内维度 )。因此,先前的工作对激活都采用了per-token量化,但并不能降低激活的难度。

SmoothQuant 引入平滑因子s来平滑激活异常值,通过数学上等效的变换将量化难度从激活转移到权重上。

于是 SmoothQuant 提出了一种数学上等价的逐通道缩放变换(per-channel scaling transformation),引入平滑因子s来平滑激活异常值,通过数学上等效的变换将量化难度从激活转移到权重上,从而使模型易于量化,保持精度的同时,还能够保证推理提升推理速度。

根据量化方式不同,作者提出三种策略 O1、O2、O3,其计算延迟依次降低。SmoothQuant的O1和O2级成功地保持了浮点精度,而O3级(per-tensor static)使平均精度下降了0.8%,可能是因为静态收集的统计数据与真实评估样本的激活统计数据之间的差异。

更加详细的介绍可参考之前的文章:大模型量化技术原理:SmoothQuant

AWQ

AWQ(AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration)方法源于“权重对于LLM的性能并不同等重要”的观察,存在约(0.1%-1%)显著权重对大模型性能影响太大,通过跳过这1%的重要权重(salient weight)不进行量化,可以大大减少量化误差。

具体如下图所示,左边的(a)使用RTN量化误差较大,中间的(b)通过保留1%的重要权重不量化,量化误差明显降低。但是该方法采用混合精度计算并不是硬件高效的方式。右边则是使用AWQ进行激活感知的仅权重(即W4A16)量化方法,通过逐通道缩放以保护显著权重来减少量化误差,这种方法不存在硬件效率低下的问题。

在这里插入图片描述

尽管我们只做了权重量化,但要找到显著的权重通道,我们应该根据激活分布而不是权重分布,与较大激活幅度(activation magnitudes)相对应的权重通道更加突出,因为它们处理了更重要的特征。

对于原始的RTN量化,。

作者通过对显著权重引入一个s,进行公式的等价变化。即将 w 与 s (s>1)相乘, 然后,再用 x 除以 s。具体如下:

最终发现与原始的量化误差比值为 。给定 和 , 显著权重 w 的相对误差较小。

为了同时考虑显著权重和非显著权重,作者选择自动搜索每个输入通道最佳缩放因子,使某一层量化后的输出差最小。从形式上看,希望优化以下目标:

由于量化函数不可微,我们无法直接用梯度反向传播来优化问题。有一些技术依赖于近似梯度,但我们发现它仍然存在收敛不稳定的问题。

为了使这一过程更加稳定,我们通过分析影响缩放因子选择的因数,为最佳缩放比例定义了一个搜索空间。

其中,s仅与激活的大小有关,是激活的平均幅值(每个通道),这里仅使用单个超参数α来平衡显著通道和非显著通道的保护。我们可以通过在 [0, 1] 区间内进行快速网格搜索(grid search)来找到最佳的 α(0 表示我们不进行缩放;1 对应于最激进的缩放)。

此外,作者还通过应用权重剪裁来进一步最小化 MSE 误差,因为剪裁权重可以进一步帮助减少 中的 ;从而减少量化误差。

更加详细的介绍可参考之前的文章:大模型量化技术原理:AWQ、AutoAWQ

GPTQ

GPTQ(论文:GPTQ: ACCURATE POST-TRAINING QUANTIZATION FOR GENERATIVE PRE-TRAINED TRANSFORMERS) 是一种仅权重量化方法,其中模型权重被量化为 int4 数值类型,而激活值则保留在 float16。在推理阶段,模型权重被动态地反量化回 float16 并在该数值类型下进行实际的运算;同 OBQ 一样,GPTQ还是从单层量化的角度考虑,希望找到一个量化过的权重,使的新的权重和老的权重之间输出的结果差别最小。

GPTQ 将权重分组(如:128列为一组)为多个子矩阵(block)。对某个 block 内的所有参数逐个量化,每个参数量化后,需要适当调整这个 block 内其他未量化的参数,以弥补量化造成的精度损失。因此,GPTQ 量化需要准备校准数据集。

GPTQ 量化过程如下图所示。首先,使用 Cholesky 分解求解 Hessian 矩阵的逆,然后在给定的步骤中对连续列的块(粗体)进行量化,并在该步骤结束时更新剩余的权重(蓝色)。量化过程在每个块内递归应用,白色中间列表示当前正在被量化。

GPTQ 的创新点如下:

  • 取消贪心算法:OBS 采用贪心策略,先量化对目标影响最小的参数;但 GPTQ 发现直接按顺序做参数量化,对精度影响也不大。这项改进使得参数矩阵每一行的量化可以做并行的矩阵计算(这意味着我们可以独立地对每一行执行量化。即所谓的 per-channel quantization)。对于大模型场景,这项改进使得量化速度快了一个数量级;

  • Lazy Batch-Updates:OBQ 对权重一个个进行单独更新,作者发现性能瓶颈实际在于GPU的内存带宽,而且同一个特征矩阵W不同列间的权重更新是不会互相影响的。因此作者提出了延迟批处理的方法,通过延迟一部分参数的更新,一次处理多个(如:128)列,来缓解带宽的压力,大幅提升了计算速度。

  • Cholesky(乔莱斯基) 分解:用 Cholesky 分解(一种分解矩阵的方法)求海森矩阵的逆,提前计算好所有需要的信息,在增强数值稳定性的同时,后续更新的过程中再计算,进一步减少了计算量。

GPTQ的伪代码如下所示。

更加详细的介绍可参考之前的文章:大模型量化技术原理:GPTQ、LLM.int8()

MindStudio ModelSlim 量化简介

MindIE 推理框架的量化依赖于昇腾模型压缩工具 MindStudio ModelSlim。它是一个以加速为目标、压缩为技术、昇腾为根本的亲和压缩工具。支持训练加速和推理加速,包括模型低秩分解、稀疏训练、训练后量化、量化感知训练等功能,昇腾AI模型开发用户可以灵活调用Python API接口,对模型进行性能调优,并支持导出不同格式模型,在昇腾AI处理器上运行。

MindStudio ModelSlim 支持的产品

当前的模型压缩支持在以下硬件产品中使用。

  • Atlas 推理系列产品(Ascend 310P处理器)。

  • Atlas 训练系列产品。

  • Atlas A2训练系列产品/Atlas 800I A2推理产品。

MindStudio ModelSlim 大模型量化工作流程

关键步骤说明如下:

  1. 用户准备原始模型和校准数据。

  2. 可选:使用离群值抑制功能对LLM模型进行离群值抑制,可参考精度保持策略选择是否启用。

  • 使用AntiOutlierConfig生成离群值抑制配置。

  • 调用AntiOutlier接口,将模型、校准数据等传入,生成抑制器。

  • 调用抑制器的process()方法对原始模型进行离群值抑制。

  1. 使用QuantConfig生成量化配置。

  2. 根据原始模型、量化配置和校准数据,调用Calibrator接口构建量化校准对象。

  3. 调用生成的量化校准对象的run()方法对原始模型进行量化。

  4. 通过调用生成的量化校准对象的save()接口保存量化后的模型,包括模型量化权重和模型相关参数,用于后续量化模型的部署任务。

MindStudio ModelSlim 中的量化类型

昇腾模型压缩工具(MindStudio ModelSlim)支持的量化类型如下:

  • W8A16: Linear权重int8量化,激活值不量化

  • W8A8: Linear权重int8量化,激活值int8量化

  • W8A8S: Linear权重int8稀疏量化,激活值int8量化

  • W4A16: Linear权重int4量化,激活值不量化

  • KV8: kvcache量化,将kvcache量化为8bit …

# https://gitee.com/ascend/msit/blob/master/msmodelslim/msmodelslim/pytorch/llm_ptq/llm_ptq_tools/llm_ptq_utils.py   class QuantType(str, Enum):       UNKNOWN = "UNKNOWN"  # 未被识别的类型       W8A16 = "W8A16"  # W8A16量化,Matmul的weight为8bit,activation为16bit       W4A16 = "W4A16"  # W4A16量化,Matmul的weight为4bit,activation为16bit       W8A8 = "W8A8"  # W8A8量化,Matmul的weight、activation均为8bit       W8A8S = "W8A8S"  # 稀疏量化,Matmul的weight、activation均为8bit,且weight经过稀疏(权重数值分布范围可能小于8bit)       W8A8SC = "W8A8SC"  # 稀疏量化压缩后的权重       FLOAT = &#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值