如何让大语言模型在规格普通的硬件上运行 - 量化技术

近年来,大型语言模型(LLMs)的能力有了飞跃式的发展,使其在越来越多的应用场景中更加友好和适用。然而,随着LLMs的智能和复杂度的增加,其参数数量,即权重和激活值的数量也在增加,这意味着模型的学习和处理数据的能力在不断提升。例如,GPT-3.5拥有约1750亿个参数,而当前最先进的GPT-4则拥有超过1万亿个参数。

然而,模型越大,所需的内存也越多。这意味着只能在具有高规格硬件和足够数量的GPU的设备上运行这些模型——这限制了模型的部署选项,从而影响了基于LLM的解决方案的普及和应用。幸运的是,机器学习研究人员正在开发越来越多的解决方案来应对模型规模不断增长的挑战,其中最突出的解决方案之一就是量化技术

在本篇中,我们将探讨量化的概念,包括其工作原理、重要性和优势,以及量化语言模型的不同技术。

1. 什么是量化以及为什么它很重要?

量化是一种模型压缩技术,它将大型语言模型(LLM)中的权重激活值从高精度的数据表示转换为低精度的数据表示,也就是说,从可以容纳更多信息的数据类型转换为容纳较少信息的数据类型。一个典型的例子是将数据从32位浮点数(FP32)转换为8位或4位整数(INT8或INT4)。

理解量化的一个很好的类比是图像压缩。压缩图像涉及通过移除一些信息(即数据位)来减小其大小。虽然减小图像的大小通常会降低其质量(在可接受的范围内),但这也意味着在给定设备上可以保存更多的图像,同时传输或显示给用户所需的时间和带宽也会减少。同样,量化LLM增加了其可移植性和可部署方式的数量——尽管以可接受的细节或精度为代价。

量化在机器学习中是一个重要过程,因为减少模型每个权重所需的位数会显著减少其总体大小。因此,量化产生的LLM占用更少的内存、需要更少的存储空间、更节能,并且能够更快地进行推理。所有这些优点使得LLM可以在更广泛的设备上运行,包括单个GPU,而不是依赖昂贵的多GPU硬件,甚至在某些情况下可以在CPU上运行。

2. 量化是如何工作的?

从本质上讲,量化过程涉及将存储在高精度值中的权重映射到低精度数据类型。虽然在某些情况下这相对简单,例如将64位或32位浮点数映射到16位浮点数,因为它们共享表示方案,但在其他情况下则更加复杂。例如,将32位浮点值量化为4位整数就比较复杂,因为INT4只能表示16个不同的值,而FP32的范围非常广。

为了实现量化,我们需要找到将FP32权重值范围[最小值, 最大值]映射到INT4空间的最佳方式:一种实现此目的的方法称为仿射量化方案,其公式如下:

x_q = round(x/S + Z)

其中:
x_q – 对应于FP32值x的量化INT4值
S – FP32缩放因子,是一个正的float32值
Z – 零点:对应于FP32空间中的0的INT4值
round – 指将结果值四舍五入到最接近的整数

然而,要找到FP32值范围的==[最小值, 最大值]==,我们必须首先使用一个较小的校准数据集对模型进行校准。可以通过多种方式确定[最小值, 最大值],常见的解决方案是将其设置为观察到的最小和最大值。随后,所有超出此范围的值将被“截断”——即分别映射到最小值和最大值。

话虽如此,这种方法及类似方法的问题在于,离群值(即异常值)可能对缩放产生不成比例的影响:低精度数据类型的完整范围没有得到有效利用——这降低了量化模型的准确性。解决此问题的方法是块内量化,将权重按其值分为64或128的组。例如,每个块分别进行量化,以减轻离群值的影响并提高精度。

需要考虑的一点是,虽然LLM的权重和激活值将被量化以减少其大小,但在推理时会被反量化,因此在前向传播和后向传播期间可以使用高精度数据类型进行必要的计算。这意味着每个块的缩放因子也必须存储。因此,在量化过程中使用的块数越多,精度越高,但必须保存的缩放因子数量也越多。

3. 两种类型的大型语言模型量化:PTQ 和 QAT

虽然有多种量化技术,但总的来说,LLM 量化分为两类:

训练后量化(PTQ)

训练后量化指的是在大型语言模型已经训练完成后进行量化的技术。PTQ 比 QAT 更容易实现,因为它需要的训练数据更少且速度更快。然而,由于权重值精度的丧失,它也可能导致模型准确性的降低。

量化感知训练(QAT)

量化感知训练指的是在数据上进行微调时考虑量化的方法。与 PTQ 技术相比,QAT 在训练阶段集成了权重转换过程,即校准、范围估计、截断、舍入等。这通常会导致更优的模型性能,但计算需求更高。

4. 量化大型语言模型的优缺点

优点

模型更小:通过减少权重的大小,量化生成的模型更小。这使得它们可以在各种情况下部署,例如在硬件性能较低的设备上,并降低存储成本。

扩展性增强:量化模型的内存占用较小,这也使得它们的扩展性更强。由于量化模型对硬件的要求较低,组织可以更灵活地增加IT基础设施以适应它们的使用。

推理速度更快:权重使用的位宽较低,以及由此产生的较低内存带宽需求,使计算更加高效。

缺点

准确性降低:毫无疑问,量化的最大缺点是输出的准确性可能降低。将模型的权重转换为低精度可能会降低其性能——而且量化技术越“激进”,即转换数据类型的位宽越低,例如4位、3位等,准确性降低的风险就越大。

5. 不同的LLM量化技术

现在我们已经讨论了量化是什么以及它的好处,让我们来看看不同的量化方法及其工作原理。

QLoRA

Low-Rank Adaptation(LoRA)是一种参数高效微调 Parameter-Efficient Fine-Tuning(PEFT)技术,通过冻结基础LLM的权重并微调一小部分额外的权重(称为适配器 adapters),减少进一步训练基础LLM的内存需求。Quantized Low-Rank Adaptation(QLoRA)更进一步,将基础LLM中的原始权重量化为4位:减少LLM的内存需求,使其在单个GPU上运行成为可能。

QLoRA通过两个关键机制进行量化:4位NormalFloat(NF4)数据类型和双重量化。

NF4:一种用于机器学习的4位数据类型,将每个权重归一化为-1到1之间的值,与传统的4位浮点数相比,可以更准确地表示低精度权重值。然而,虽然NF4用于存储量化权重,QLoRA在前向和后向传播过程中使用另一种数据类型,即brainfloat16(BFloat16),这也是专为机器学习设计的。

双重量化(DQ):一种为了额外节省内存而对量化常量进行再次量化的过程。QLoRA将权重以64为一组进行量化,虽然这便于精确的4位量化,但还必须考虑每个组的缩放因子——这增加了所需的内存。DQ通过对每个组的缩放因子进行第二轮量化来解决这个问题。32位缩放因子被编译成256的块并量化为8位。因此,先前每个组的32位缩放因子为每个权重增加了0.5位,而DQ将其降至仅0.127位。尽管看似微不足道,但在例如65B LLM中,结合起来可以节省3 GB的内存。

PRILoRA

Pruned and Rank-Increasing Low-Rank Adaptation(PRILoRA)是一种最近由研究人员提出的微调技术,旨在通过引入两个额外的机制来提高LoRA的效率:ranks的线性分布和基于重要性的A权重剪枝。

回到low-rank分解的概念,LoRA通过结合两个矩阵来实现微调:W,包含整个模型的权重,和AB,表示通过训练额外权重(即适配器)对模型所做的所有更改。AB矩阵可以分解成两个更小的low-rank矩阵A和B,因此称为low-rank分解。然而,在LoRA中,low-rank r在所有LLM层中是相同的,而PRILoRA则线性增加每层的rank。例如,开发PRILoRA的研究人员从r = 4开始,并在最终层增加到r = 12——在所有层中产生了平均rank为8。

其次,PRILoRA在微调过程中每40步对A矩阵进行剪枝,消除最低的,即最不重要的权重。通过使用重要性矩阵来确定最低权重,该矩阵存储了每层的权重临时幅度和与输入相关的统计数据。以这种方式剪枝A矩阵减少了需要处理的权重数量,从而减少了微调LLM所需的时间和微调模型的内存需求。

尽管仍在研究中,PRILoRA在研究人员进行的基准测试中显示出了非常令人鼓舞的结果。这包括在8个评估数据集中有6个优于全量微调方法,同时在所有数据集中都取得了比LoRA更好的结果。

GPTQ

GPTQ(通用预训练Transformer量化 General Pre-Trained Transformer Quantization)是一种量化技术,旨在减少模型的大小,使其能够在单个GPU上运行。GPTQ通过一种逐层量化的方法工作:这种方法一次量化模型的一层,目的是发现最小化输出误差(即原始全精度层和量化层输出之间的均方误差(MSE))的量化权重。

首先,所有模型的权重被转换成一个矩阵,通过一种称为懒惰批更新 lazy batch updating的过程一次处理128列的批次。此过程包括批量量化权重,计算MSE,并将权重更新为减少MSE的值。在处理校准批次后,矩阵中的所有剩余权重根据初始批次的MSE进行更新——然后所有单独的层重新组合以生成量化模型。

GPTQ采用混合INT4/FP16量化方法,其中4位整数用于量化权重,激活值保持在更高精度的float16数据类型中。随后,在推理过程中,模型的权重实时反量化,以便计算在float16中进行。

GGML/GGUF

GGML

GGML(据说是以其创建者命名为Georgi Gerganov Machine Learning,或GPT-Generated Model Language)是一个基于C语言的机器学习库,旨在对Llama模型进行量化,使其能够在CPU上运行。更具体地说,该库允许你将量化后的模型保存为GGML二进制格式,从而可以在更广泛的硬件上执行。

GGML通过称为k-quant系统的过程来量化模型,该系统根据所选的量化方法使用不同位宽的值表示。首先,模型的权重被分成32个一组,每个组都有一个基于最大权重值(即最高梯度幅度)的缩放因子。

根据选择的量化方法,最重要的权重会被量化为高精度数据类型,而其余的权重则被分配为低精度类型。例如,q2_k量化方法将最大的权重转换为4位整数,其余权重转换为2位整数。或者,q5_0和q8_0量化方法分别将所有权重转换为5位和8位整数表示。你可以通过查看此代码库中的模型卡来查看GGML的全量化方法范围。

GGUF

GGUF(GPT-Generated Unified Format)是GGML的后继者,旨在解决其局限性——最显著的是使非Llama模型的量化成为可能。GGUF也是可扩展的:允许集成新功能,同时保持与旧LLM的兼容性。

然而,要运行GGML或GGUF模型,你需要使用一个名为llama.cpp的C/C++库——该库也是由GGML的创建者Georgi Gerganov开发的。llama.cpp能够读取以.GGML或.GGUF格式保存的模型,并使其能够在CPU设备上运行,而不是需要GPU。

AWQ

传统上,模型的权重量化时不考虑它们在推理过程中处理的数据。与之相反,激活感知权重量化 Activation-Aware Weight Quantization(AWQ)考虑了模型的激活,即输入数据中最显著的特征及其在推理过程中如何分布。通过根据输入的特定特性调整模型权重的精度,可以最大限度地减少量化引起的准确性损失。

AWQ的第一阶段是使用一个校准数据子集来收集模型的激活统计数据,即在推理过程中被激活的权重。这些被称为显著权重,通常占总权重的不到1%。为了提高准确性,显著权重在量化过程中会被跳过,保持为FP16数据类型。与此同时,其余的权重被量化为INT3或INT4,以减少LLM其余部分的内存需求。

6. 小结

量化是LLM领域的重要组成部分。通过压缩语言模型的大小,像QLoRA和GPTQ这样的量化技术有助于提高LLM的采用率。摆脱了全精度模型巨大内存需求的限制,组织、AI研究人员和个人都有更多的机会去尝试快速增长的各种LLM。

  • 12
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值