LLM量化技术面试成了送命题..

面了小米大模型岗,LLM量化技术成了送命题...

技术微佬 丁师兄大模型 2024年11月19日 20:44 湖北

随着 LLM 的发展和应用,显存降低推理速度提升的需求越来越迫切,目前常用的方式就是对 LLM 参数量化,所谓的量化就是,对 LLM 中的参数做精度压缩(比如从每个参数需要 2/4byte 降低到 0.5/1byte)。

但是如果全量无差别压缩,势必会造成模型效果的降低,如果精准有效的压缩不重要参数,不(少)压缩重要参数是现在量化技术的重点。

整体来说:

GPTQ:是通过 OBS 算法一步步演化而来,主要是通过计算 hessian 矩阵(表示权重对损失的重要程度)来判断权重的重要性,压缩不重要的权重来达到量化的目的,同时算法也增加了批处理和 Cholesky 矩阵分解来提升计算速度和精度。

AWQ:是根据根据激活值大小来判断权重的重要性,选择0.1%~1%的重要权重,对其余权重做量化。

01

GPTQ

GPTQ 来自于 OBQ 的改进OBQ 来自于 OBS,OBS 来自于 OBD 算法,OBD 算法是 1990 年 LeCun 提出的一种剪枝算法,所以下面简单介绍一下这个几个算法,以及这几个算法之间的区别和改进点。

(1)OBD 算法(Optimal Brain Damage)

OBD 算法是利用二阶信息对网络进行重要性评估,剪枝掉对结果影响最小的参数,具体实现步骤如下:

重要性评估:

OBD 首先通过评估各个权重的“重要性”来决定哪些权重可以被剪掉。重要性的评估通常基于 Hessian 矩阵,这个矩阵表示了损失函数在参数空间中的二阶导数。

具体来说,OBD 通过计算每个权重对损失函数的影响,评估其对模型性能的贡献。

二阶导数的信息:

图片

剪枝策略:

OBD 根据各个权重的 Hessian 的值来决定是否剪枝。权重的“重要性”可以用以下公式估算:

图片

剪去不重要的权重:

设定一个阈值,根据权重的重要性得分进行排序,剪去得分最低的若干个权重。此时,通过重新训练微调剩余权重,可以恢复模型的性能。

再训练:

剪除掉不重要的权重后,通常需要对模型进行再训练,以便让剩余的权重重新适应数据。这一过程也是非常重要,能够帮助模型保持或恢复原来的性能。

迭代优化:

OBD 可以进行多轮剪枝和再训练,逐步压缩模型,直到达到满意的性能与大小之间的平衡。

总结

OBD 算法通过评估权重的重要性,基于 Hessian 矩阵的信息实现了高效的剪枝。

这种方法为深度学习模型的压缩和加速提供了有效的解决方案。同时,由于它主要依赖于第二阶导数,因此在某些情况下,计算成本可能相对较高,需要权衡使用。

(2)OBS算法(Optimal Brain Surgeon)

OBS 算法也是根据 hessian 矩阵来做剪枝的,但是与 OBD 的不同是:

基本原理:

OBD 算法是关注的 hessian 矩阵的对角线元素,即单个权重的重要程度,剪枝也是只剪部分权重;

OBS 算法关注的是整个 hessian 矩阵,会剪枝整个神经元(即矩阵的行或列);

计算复杂度:

由于 OBD 算法仅依赖于 Hessian 矩阵的对角元素,因此它的计算成本相对较低。这使得 OBD 在较大的神经网络中更为实用。

OBS 算法需要处理完整的 Hessian 矩阵,这在大型神经网络中可能变得非常耗时和计算密集,因为它涉及矩阵求逆等操作。

精度与效果:

OBS 算法理论上能更精确地识别出哪些权重可以被剪枝,因为它考虑了权重之间的相互作用,而不仅仅是单个权重的影响。这可能导致更高的剪枝效率和更好的模型性能保留。

相比之下,OBD 算法可能在某些情况下过于简化,忽略了权重间的相互依赖性,但这并不意味着它总是次优的,特别是在计算资源有限的情况下。

应用范围:

OBD 算法因其较低的计算需求,在实际应用中更为广泛,尤其是在处理大规模数据集和复杂模型时。

OBS 算法由于其高计算成本,可能更适合于小到中等规模的网络或特定的研究场景,其中精度优化是首要考虑因素。

图片

(3)OBQ 算法(Optimal Brain Quantization)

OBQ 算法是将 OBS 算法把它推广到量化中,其实很好理解,我们常用的量化则是把数值近似到一个接近的值, 而剪枝实际上可以看做把数值直接近似成 0 (某种意义上或许可以称作 1bit 或 0bit 量化),可以理解为一种特殊的量化。

OBQ 的公式:

图片

其中 quant(q) 是把 q 近似到四舍五入位数上。可以看到假如 quant(q) 永远返回零其实就是原版的 OBS。

(4)GPTQ

OBQ 算法的问题在于量化速度太慢,他的复杂度大约是参数矩阵维度的 4 次方,为了解决这个问题 GPTQ 做了如下改进:

取消贪心算法:原先的算法是使用贪心算法,逐个找影响最小的 q 来剪枝/量化,经过观察发现,其实随机的顺序效果也一样好(甚至在大模型上更好)。原算法对 W 进行优化时,逐行计算,每一行挑选 q 的顺序都是不一样的。

批处理:原先的算法中对权重一个个进行单独更新,作者发现瓶颈实际在于 GPU 的内存带宽,而且同一个特征矩阵 W 不同列间的权重更新是不会互相影响的。

因此作者提出了批处理的方法,一次处理多个(如 128 列)列,大幅提升了计算速度。

图片

总结:GPTQ 通过 hessian 矩阵动态调整各个权重的精度,为了提升计算速度取消了贪心算法,增加了批处理和 Cholesky 分解来提升计算速度和精度。

02

AWQ算法

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

上面加黑那句话需要解释两个点:

图片

基于激活值分布挑选重要权重

作者对比了随机挑选、基于权重大小、基于激活值分布三种方案的效果,发现基于激活值分布挑选显著权重是最为合理的方式。

在做基于激活值分布时,作者为了避免方法在实现上过于复杂,在挑选显著权重时,并非在“元素”级别进行挑选,而是在“通道(channel)”级别进行挑选,即权重矩阵的一行作为一个单位。

在计算时,首先将激活值对每一列求绝对值的平均值,然后把平均值较大的一列对应的通道视作显著通道,保留 FP16 精度。

对其他通道进行低比特量化,如下图:

图片

但另一个问题随之而来,如果权重矩阵中有的元素用 FP16 格式存储,有的用 INT4 格式存储,不仅存储时很麻烦,计算时取数也很麻烦,kernel 函数写起来会很抽象。于是,作者想了一个变通的方法——Scaling。

量化时对显著权重进行放大可以降低量化误差

图片

虽然公式 1 和公式 2 在计算过程上是“等价”的,但是带来的精度损失是不一样的。

两种计算方法的误差可以写作公式 3:

图片

图片

因此,作者改变了思路:为了更加 hardware-friendly,我们对所有权重均进行低比特量化,但是,在量化时,对于显著权重乘以较大的 s,相当于降低其量化误差。

同时,对于非显著权重,乘以较小的 s,相当于给予更少的关注。这便是上一节提到的缩放(Scaling)方法。

(1)算法:自动计算缩放(scaling)系数

按照上文的分析,我们需要找到权重矩阵每个通道的缩放系数 s,使得量化误差最小,即最小化公式 4:

图片

这里有个细节作者没有提,通过阅读源码发现,为了防止 s 过大或者过小,作者还进行了一步数据标准化:

图片

图片

(图:llm-awq/awq/quantize/auto_scale.py第129-130行)

图片

图片

(图:llm-awq/awq/quantize/auto_scale.py第123-130行, for循环就是fast grid search算法)

将所有权重矩阵的 s 保存下来,供推理阶段反量化使用。

(2)算法超参数

如下图:

图片

来源:https://zhuanlan.zhihu.com/p/720888766

END

<think>好的,我现在需要回答用户关于大型语言模型(LLM量化技术和方法的问题。首先,我要理解量化LLM中的作用。量化主要是为了减少模型的内存占用和计算开销,这对在资源受限的设备上部署模型尤为重要。 接下来,我需要回忆常见的量化方法。记得有后训练量化(PTQ)和量化感知训练(QAT)两种主要类型。PTQ是在训练后对模型权重进行量化,而QAT则在训练过程中模拟量化效果,可能提高精度。需要详细说明这两种方法的区别和各自的优缺点。 然后,混合精度量化也是一个重要点。不同层对量化的敏感度不同,混合精度可以在敏感层使用更高精度,其他层使用低精度,平衡效率和精度。动态量化可能在推理时调整精度,这也需要解释清楚。 还有,权重量化与激活量化的区别。权重和激活值可能需要不同的处理方式,例如激活值在推理时动态生量化方法可能需要更细致的设计。 此外,具体的量化算法如GPTQ、LLM.int8()、SmoothQuant等,用户可能想了解这些方法的特点和应用场景。需要简要介绍每个算法的核心思想,例如GPTQ是针对transformer模型的优化方法,LLM.int8()处理大模型中的异常值问题,SmoothQuant则通过数学变换平衡权重和激活的量化难度。 量化带来的挑战也不能忽视。精度损失、异常值处理、硬件兼容性都是关键问题。例如,异常值可能导致量化误差增大,需要特别处理。硬件方面,不同硬件对低精度计算的支持不同,影响实际部署效果。 用户可能需要知道最新的研究进展,引用提供的参考资料中的相关内容。比如引用[1]提到的Efficient-LLMs-Survey,可以提到该综述中涵盖的高效LLM技术,包括量化方法。引用[3]提到的CacheGen技术,可以说明量化与其他上下文压缩技术的互补性。 最后,生相关问题时要覆盖量化方法、挑战、应用场景以及与其他技术的结合,确保问题具有针对性和扩展性,帮助用户深入理解主题。 需要确保回答结构清晰,符合用户要求的格式,正确使用LaTeX,并在适当位置添加引用标识。检查是否有遗漏的重要点,比如量化后的模型评估指标,或者实际应用中的案例,但根据现有信息可能无法详细展开。保持语言简洁,技术细节准确,避免错误。</think>### 大型语言模型(LLM量化技术详解 量化是通过降低模型参数的数值精度(例如从32位浮点数到8位整数)来压缩模型规模并加速推理的技术。以下是关键方法和技术细节: #### 1. **后训练量化(Post-Training Quantization, PTQ)** - **原理**:在模型训练完后直接对权重和激活值进行量化,无需重新训练。 - **步骤**: 1. 校准:通过少量数据统计激活值的动态范围,确定量化参数(如缩放因子和零点)。 2. 量化:将浮点权重转换为低精度整数,例如$W_{int8} = \text{round}(W_{float32}/s) + z$,其中$s$为缩放因子,$z$为零点[^1]。 - **优点**:实现简单,计算本低。 - **缺点**:精度损失可能较大,尤其是对异常值敏感的模型。 #### 2. **量化感知训练(Quantization-Aware Training, QAT)** - **原理**:在训练过程中模拟量化过程,使模型适应低精度表示。 - **实现**: - 在前向传播中插入伪量化操作,模拟量化噪声。 - 反向传播时使用直通估计器(Straight-Through Estimator)绕过量化操作的不可导性[^2]。 - **优点**:相比PTQ,精度损失更小。 - **缺点**:需要重新训练,计算本高。 #### 3. **混合精度量化** - **动态混合精度**:根据输入数据动态调整不同层的量化精度(例如对注意力机制使用8位,其他层使用4位)[^3]。 - **静态混合精度**:通过敏感度分析,预先为不同层分配不同精度。 #### 4. **权重量化与激活量化** - **权重量化**:仅压缩模型权重,适用于存储受限场景。 - **激活量化**:同时量化推理时的中间激活值,可减少计算带宽需求,但对硬件支持要求更高。 #### 5. **代表性算法** - **GPTQ**:基于二阶泰勒展开的权重量化方法,专为Transformer模型优化,支持单次推理实现高压缩比。 - **LLM.int8()**:通过分离异常值(使用16位表示)和主要特征(8位量化),在低精度下保持模型性能[^2]。 - **SmoothQuant**:通过数学变换将激活值的量化难度转移至权重,平衡两者的量化误差。 #### 6. **挑战与解决方案** - **异常值处理**:LLM的激活值中常存在大幅值异常值。解决方法包括: - 分层缩放(Layer-wise Scaling) - 异常值隔离(如LLM.int8()) - **硬件兼容性**:需结合特定硬件(如支持INT4/INT8的GPU)设计量化策略。 - **精度-效率权衡**:通过敏感度分析选择量化层,或引入稀疏化与量化结合的技术。 $$ \text{量化误差} = \frac{1}{N} \sum_{i=1}^{N} |W_i - \hat{W}_i| $$ 其中$W_i$为原始权重,$\hat{W}_i$为量化后权重。 #### 7. **与其他技术的结合** - **模型蒸馏**:先通过蒸馏压缩模型规模,再应用量化。 - **上下文压缩**:如CacheGen可与量化协同减少带宽占用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值