AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


LLM Quantization :理解 LLM 中模型大小?
发布日期:2024-12-06 09:55:45 浏览次数: 1760 来源:AI零壹白洞


     在当前时代,大型语言模型(LLM)的扩展趋势显著,它们在规模和复杂性上的增长对高效能的模型部署和快速推理提出了更高的要求。与此同时,网络传输的效率和模型的响应时间对于提升用户满意度至关重要。然而,现有的网络条件和模型性能往往不能满足这些需求,这不仅影响了产品的用户体验,也对多个行业的创新和发展构成了限制。因此,人们开始探索边缘计算和量化的潜力,以期通过在数据源附近进行计算来解决这些问题。尽管如此,实现边缘计算的广泛应用仍面临诸多挑战,而实现通用人工智能(AGI)的道路依然漫长且充满未知
    关于模型大小和量化科普 Google 技术也可以分享下, 一文了解 2024 China 谷歌 IO AI 技术点
边缘设备计算
    边缘设备计算(Edge Device Computing)是指在网络的边缘,即靠近数据源的地方进行的计算任务。这种计算模式是边缘计算的一个具体实现,它利用了边缘设备,如智能手机、嵌入式系统、IoT设备、工业控制系统等,利用本地 CPU 来处理数据,而不是将数据发送到远程的云服务器或数据中心。
    模型量化作为一种核心技术,对于解决大型模型的部署挑战具有重要意义。它能够在保持模型性能基本不变的同时,对模型进行有效的压缩。本文旨在深入分析量化技术的原理、探讨不同的量化策略,并研究这些策略在大型语言模型(LLM)中的具体应用和效果。通过量化,期望能够提升模型的运行效率,同时减少对计算资源的需求,进而推动大型语言模型在更多场景下的广泛应用。

本文重点:

  • 科普量化 AI 知识
  • 数学公式推导
什么是量化?

    量化是门技术活,就像是给大型语言模型(LLM)和其他神经网络模型做了一次“瘦身”,让它们变得更加轻巧,运行起来也更加迅速。这个过程就是把模型里那些高精度的数字,比如 32 位的浮点数,变成精度低一些的格式,比如 8 位的整数。这有点像我们平时做预算,把每一笔开销都精确到分,变成了只记到元,虽然会少一些细节,但大体的收支情况还是能把握住的。

     举个更通俗的例子,假设你有一个巨大的照片收藏,每张照片都是超高分辨率的,这就好比是模型中的 32 位浮点数。如果你的硬盘空间不够了,你可能会把这些照片压缩,降低分辨率,变成更小的文件,这就像是量化过程中的 8 位整数。虽然压缩后的照片可能不如原图那么清晰,但主要的内容和感觉还是保留下来了。
    在量化的过程中,就是对模型的权重和激活值做了类似的处理,通过减少它们所占的存储空间,让模型变得更加高效,更容易在不同的设备上运行。这样一来,即使是资源有限的设备,也能享受到大型语言模型带来的智能服务。各位看官可以看下图,量化精度去掉后,变成整数,然后通过算法,还原精度。

(图片来自 medium 上的原图)

为什么要量化?

    举个例子,当前训练或者推理的机器有一定限制,在硬件上匹配不上 NV A100(这卡有价无市,价格大概十几万刀吧 ) 那种豪华套餐卡,如下图,整数是浮点数几何倍数内存下降,如果效果一致情况,必然是下图后者更加划得来。

(图片来自 medium 上的原图)

   以 LLaMA 3.1–70B 模型为例,这是一个具有 70 亿参数的高性能LLM(小编另一篇科普,Meta Llama 3.1 : 开源是人工智能前进的道路),其在推理过程中对内存的需求高达140 GB。这样的资源消耗水平,通常需要依赖多个高端图形处理单元(GPU)来实现有效的运算处理。

    然而,通过应用量化技术,LLaMA 3.1–70B 模型的内存占用得到了显著降低。量化通过减少模型参数的位宽,将内存需求从 140 GB 减少至 35 GB,这一改进使得模型能够在单个 NVIDIA A100 GPU 上高效运行。这一转变不仅展示了量化技术在资源优化方面的潜力,而且也突显了其在促进大型模型普及化方面的关键作用。

量化方案

    量化针对不同领域模型,有不同套路,这里针对深度学习和神经网络模型领域,分享讲解线性量化和非对称量化与对称量化。
线性量化

    线性量化作为一种在神经网络模型中广泛应用的压缩技术,它通过减少模型参数的表示精度来实现模型尺寸的显著缩减。这种方法特别适用于资源受限的环境,因为它能够在不牺牲太多模型准确度的前提下,提高模型在这些环境下的运行效率。该技术涉及通过四步过程将浮点权重映射到定点值,这里将对下图进行详细介绍。

(图片来自 medium 上的原图)

第一步:确定数据范围
    线性量化的第一步是确定数据中存在的值的范围。这涉及检查值的分布以确定最小值和最大值。 此范围对于确定量化的最佳缩放因子和零点至关重要。也就是图中的 min 和 max。其中 q 是一个整数,范围 -128 - 127,x 是输入的浮点数。
(图片来自 medium 上的原图)
     计算过程:假设输入 x 是 -1.0 到 1.0 之间的数 0.5(最上面的压缩图),保留当前 x。

第 2 步:缩放和零点计算

    在此步骤中,计算缩放因子 ( s ) 和零点 ( z ),以使每个张量的值适合目标整数范围。缩放因子决定量化的粒度,而零点会移动值的范围,以确保量化值以零为中心。目标是找到最佳比例和零点,以最小化量化误差,同时确保值适合目标整数范围。

(图片来自 medium 上的原图)

     计算过程:比例因子 s 用于将输入数据的范围映射到量化值的范围。它计算为 q 的范围 / x 波动范围,那么当前 s = (127 - (-128)) / (1.0 - (-1.0)) = 127.5。零点 z 用于量化尺度上的原点,它将输入数据的零点映射到量化值的一个特定点。它计算为 z = q (min) - round (s * x(min)),其中 round 就是四舍五入,那么当前 z = -128 - round(127.5 * - 1.0) = 0。 

步骤 3:将浮点值量化为低精度整数

    计算出比例和零点后,使用以下公式将浮点值量化为低精度整数。其中  x是原始浮点值,q 是量化整数值,s 是缩放因子,z 是零点。此等式将浮点值映射到一组离散的整数值,从而降低了 LLM 的精度和内存要求。

(图片来自 medium 上的原图)

     计算过程:q = round(127.5 * 0.5+0) = round(63.75) = 64

步骤 4:推理过程中进行去量化,以实现精确计算

    在推理过程中,使用以下公式将量化的整数值反量化回浮点值。其中 x̂ 是重建的浮点值。此反量化步骤可确保推理期间执行的计算精确且准确,同时仍受益于量化模型减少的内存占用和计算要求。

(图片来自 medium 上的原图)

     计算过程:x̂ = (64 - 0) / 127.5 = 0.5

    再讲解一下,来个图例说明了 2 位线性对称量化,其中 4 * 4 权重用作校准数据来确定量化参数,特别是缩放因子 s 和零点 z。

(图片来自 medium 上的原图)

非对称量化与对称量化

    非对称量化根据数据分布调整间隔,可能更有效地使用量化级别。范围不一定以零为中心,并且正负范围可以使用不同的比例因子。例如,在范围为 [0.1, 0.9] 的 8 位非对称量化中,级别从 0 到 255,假设其中 0 对应于 0.1,10 对应于 0.2,20 对应于 0.2 等。这种方法更适合非对称分布的数据,但实现起来更复杂。
(图片来自 medium 上的原图)

    对称量化是一种在量化过程中将零点置于量化范围中点的方法,使得正负量化间隔围绕零点对称分布。这种量化策略因其实现简单和计算效率高而被广泛采用。以 8 位对称量化为例,量化级别从 -127 到 127,覆盖了范围 [-0.8, 0.9],其中零点正好位于 0,对应于量化范围的中点(参考前面例子)。对称量化特别适合于那些在零点附近对称分布的权重数据。

    然而,对于分布不对称的数据,对称量化可能无法充分利用整个量化范围,导致表示精度下降。相比之下,非对称量化能够根据数据的实际分布调整量化间隔,从而在数据正负值范围差异显著时,提供更精确的表示。这种灵活性通常有助于在量化后保持模型的性能。在实现 n 位非对称量化时,通常会保留一个特殊的量化级别来表示零点,这通常意味着量化范围的一侧会少一个可用的级别。例如,在 8 位对称量化中,可以表示从 -127 到127 的浮点数,这是因为我们牺牲了一个级别来表示零点。这种量化方法允许将浮点数的范围 [-absmax(x), absmax(x)] 映射到整数范围 [-(2^(n-1)-1), 2^(n-1)-1]。

(图片来自 medium 上的原图)

     计算过程:下图矩阵图中,最大数 x = 2.65。

(图片来自 medium 上的原图)

量化策略

    有几种策略可以将量化应用于深度学习模型的不同组件,每种策略都有其自己的优点和用例。

  • 权重:减少模型大小和内存占用

  • 激活:节省内存,尤其是与权重量化结合时

  • KV Cache:加速处理长序列的模型的序列生成(KV Cache 在量化策略中可能指的是对 Transformer 模型中自注意力机制使用的键和值的缓存进行量化,以优化模型的内存和计算效率

  • 梯度:减少大规模训练中的通信开销,并可能加速训练

LLM 量化的类型:

    LLM 量化主要包括两种方法:QAT 和 PTQ。

(图片来自 medium 上的原图)

QAT(量化感知训练)

    QAT 是一种将权重转换纳入 LLM 训练过程的技术。通过在训练期间模拟较低的精度,模型可以学会适应量化噪声,从而提高性能。尽管 QAT 提供了出色的结果,尤其是在较低精度水平下,但由于需要重新训练模型,因此阻碍了其广泛采用。此外,QAT 计算量大且成本高昂,尤其是对于大型模型而言。尽管如此,它的优势使其成为优化 LLM 和在资源有限的设备上实现高效部署的关键方法。

PTQ(训练后量化)

    PTQ 不需要重新训练模型,而量化则直接应用于预训练模型。它更简单、更快速,非常适合快速部署。PTQ 分析权重分布、确定量化参数并将权重转换为较低精度。虽然它快速且节省资源,但它可能会略微降低模型性能,尤其是在较小的模型或具有异常值的模型中。

     白话讲解下:QAT 和 PTQ 在上图区别对比。
    QAT 是一种在模型训练过程中就考虑到量化的方法。想象一下,你正在训练一个模型,就像在教一个学生学习。在QAT中,你在教学过程中就告诉学生,将来他只能记住有限的信息(比如,只能记住整数,不能记住小数)。这样,学生在学习和记忆信息时就会尽量适应这种限制。
  • 训练时量化:在模型训练的时候,权重和激活值会被模拟量化,也就是说,它们会被暂时转换成整数形式,然后再转换回浮点数进行计算。

  • 调整模型:通过这种方式,模型在学习过程中会逐渐适应量化,从而在真正量化后保持较好的性能。

  • 需要训练数据:QAT需要原始的训练数据,因为它本质上还是一个训练过程。

    PTQ 是一种在模型训练完成后进行量化的方法。这就像是你有一个已经训练好的模型,现在你想要让它在资源受限的设备上运行,比如手机。你不需要重新训练模型,只需要对模型的权重进行量化。

  • 训练后量化:在模型训练完成后,你直接对模型的权重进行量化,通常是将32位浮点数转换为8位整数。

  • 校准:为了确保量化后的模型性能不会太差,你需要通过一些样本数据来校准量化的参数,这个过程不需要大量的训练数据,只需要少量的代表性数据。

  • 快速部署:PTQ的优点是快速,你不需要重新训练模型,只需要进行一次量化过程,就可以将模型部署到新的平台上。

    总之简单说,一个在训练过程中就考虑量化,另一个需要在训练完后量化。

LLM 中应用的具体量化技术

    这里分享下 GPTQ、GGML、NF4 和 bitsandbytes 几种方案。
GPTQ

   Generative Pre-trained Transformer Quantization 是一项针对大型语言模型的先进训练后量化技术。该技术通过显著降低模型权重的位宽至 3 至 4 位,同时保持模型性能,实现了高效的模型压缩。GPTQ 引入了一种创新的一次性权重量化方法,并结合 Cholesky 分解以提高计算效率。如下图,白色部分正在量化,因为它们还未进行量化的权重矩阵或块。这些权重保持在全精度状态,即它们还没有被转换成低精度的表示形式。最终会变成蓝色部分,这些已经带有量化的权重。

    下图是一个递归过程,这个过程在每个块内进行:当前正在量化的白色中间列,其周围的权重(蓝色部分)会在量化步骤结束时进行更新。这种方法允许算法在保持较高精度的同时,对大型模型进行有效的量化。简而言之,这个过程利用 Cholesky 算法,就像是在做一个大型的拼图游戏,每次处理一部分拼图块,同时调整周围的块以确保整体的准确性。

    这种技术能够在数小时内完成对如 GPT-3(拥有1750亿参数)这样的大规模模型的量化过程,与现有基线方法相比,压缩比提升了两倍以上。

(图片来自附录文献上的原图)

    GPTQ 的优化重点在于减少内存带宽需求,这对于提升模型的推理速度至关重要。此外,该技术还实现了一种量化顺序启发式方法,以最小化量化过程中的误差。通过AutoGPTQ 工具,研究者和开发者能够将 LLM 量化至 8 位、4 位、3 位甚至2 位的精度。在实际应用中,对LLM(如LLaMA3-8B)进行量化可以显著降低其内存占用。以LLaMA3-8B 为例,原始模型包含 803 亿参数,以 16 位 bfloat16 格式表示。理论上,将这些参数量化为 4 位可以使得模型大小减少至原来的四分之一。然而,由于 GPTQ 方法主要针对模型的线性层,特别是注意力机制和多层感知机(MLP)模块,而词汇表嵌入,作为模型参数的重要组成部分,在量化过程中保持不变,因此实际的尺寸减小幅度并不如理论预期。
    具体到 LLAMA3-8B 模型,经过 4 位量化后,模型的大小降至 5.74 GB,相较于原始16 位模型的 16.07 GB,仍然实现了显著的内存使用量减少。这不仅意味着模型的部署和运行效率得到提升,而且也使得模型更易于在资源受限的环境中应用。通过GPTQ技术,LLM的量化为实现更广泛的实际应用提供了可能性,尤其是在边缘计算和移动设备上。
from transformers import AutoModelForCausalLM, AutoTokenizerfrom optimum.gptq import GPTQQuantizerimport torchmodel_path = 'meta-llama/Meta-Llama-3-8B'b = 4quant_path = 'Meta-Llama-3-8B-gptq-'+str(b)+'bit'
tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=True)model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.float16, device_map="auto")
quantizer = GPTQQuantizer(bits=b, dataset="c4", model_seqlen = 2048)quantized_model = quantizer.quantize_model(model, tokenizer)
quantized_model.save_pretrained("./"+quant_path, safetensors=True)tokenizer.save_pretrained("./"+quant_path)

Cholesky

    用白话来说,就像是把一个大的数学问题(特别是涉及到矩阵的运算)拆分成更小、更容易解决的部分的一种方法。想象一下,你有一个由许多小方块组成的复杂拼图,每个小方块上都有数字,你需要找到一种方法来排列这些方块,使得每一行和每一列的数字之和满足一定的规则。在数学中,矩阵可以被看作是一个由数字排列成的表格。Cholesky 分解专门针对的是所谓的“正定矩阵”,这是一类具有特殊性质的矩阵,比如所有的行和列的数字之和都是正数。

    假设你有一个大型的建筑项目,需要计算建筑的稳定性。这个稳定性可以通过解决一个复杂的数学方程来确定,这个方程可以表示为一个矩阵 A。如果 A 是正定的( 数学矩阵中专有名词,可以去查,有 n 多条件,这里不多解释),你可以使用 Cholesky 分解来简化问题。

  • 步骤 1:将矩阵 A 分解为两个下三角矩阵 L 和 LT。

  • 步骤 2:解决两个更简单的问题,即 L 和 LT 相关的计算。

  • 步骤 3:通过这两个更简单的问题的解,你可以得到原始问题的答案。

MLP 

    Multilayer Perceptron 多层感知机是一种基础的前馈神经网络,它由至少三层节点组成:一个输入层、一个或多个隐藏层以及一个输出层。每层由多个神经元(或节点)组成,这些神经元可以对输入数据进行加权求和,并通过一个非线性激活函数来产生输出。

GGML/GGUF

   GGML(由 Georgi Gerganov 开发)是一个用 C 语言编写的库,它为机器学习应用提供了一套强大的工具和功能,特别是在支持 LLM 的构建和部署方面。GGML 的设计重点在于提供深度学习所需的基础构件,如张量,这些是进行复杂数学运算和模型训练的核心元素。

    GGML 的一个显著特点是它支持一种新型的二进制格式,最初为分布 LLM 而设计,并且已经发展成为 GGUF(Generalized Gaussian Unit File)格式。GGUF 格式在设计上具有前瞻性,它允许未来的功能扩展而不影响与旧版本的兼容性。这种格式通过将所有相关的元数据整合到单一文件中,使得管理特殊令牌、RoPE(Rotary Positional Encoding)缩放参数等关键信息变得更加高效和便捷。这样的设计不仅简化了模型的部署流程,也使得模型的更新和维护变得更加容易。
    此外,GGML 与 llama.cpp 库的结合使用,提供了一种在 CPU 上高效执行 Llama 模型推理的方法。llama.cpp 是由同一开发者创建的,它提供了一种成本效益高的方式,可以在不依赖于高性能 GPU 的情况下进行模型推理。最近,llama.cpp的性能得到了进一步的提升,通过将部分计算任务转移到 GPU 上,从而在处理大型语言模型时实现了更快的速度和更优的内存管理。这种协同工作的方式不仅提高了模型的运行效率,也为开发者提供了更大的灵活性和便利性。
(图片来自 huggingface 上的原图)
     如上图 GGUF 说明:
    文件头(Header)前 16 个字节包含了文件的基本信息,前 4 个字节是GGUF 的版本号,当前版本是 3,接下来的 4 个字节是 GGUF 的魔数(magic number, 一度怀疑是 Java 那帮老头搞的),这是一个特定的数字序列,用于识别文件类型,这里是 0x47 0x47 0x55 0x46,对应字符 GGUF,再接下来的 8 个字节是 tensor_count,表示文件中存储的张量数量,用 64 位无符号整数表示。
    张量信息(Tensors Info)包括:名称(name)、维度数量(n_dimensions)、维度(dimensions)、类型(type)、偏移量(offset)、元数据(Metadata):元数据部分包含了关于模型的额外信息,以键值对的形式存储,数量由 metadata_kv_count 指定。
    Metadata 包含模型架构、名称、上下文长度等信息,以及分词器的配置和特殊令牌的映射。

Rotary Positional Encoding(RoPE)

    指的是一种特殊的位置编码方法,它通过旋转变换来编码位置信息。这种编码方式可能涉及到将输入向量在高维空间中进行旋转,以模拟序列中元素的顺序关系。想象你在玩一个拼图游戏,每个拼图块都有一个特定的位置,你需要记住每个块应该放在哪里。在深度学习模型中,RoPE就像是给你一个特殊的工具,帮助你记住每个拼图块的位置。这个工具不是简单地告诉你每个块应该放在哪个格子里,而是通过旋转拼图块来表示它应该放在序列中的哪个位置。

NF4

    NF4 量化技术通常会与双量化(double-quantization)技术结合使用,这是一种量化策略,它首先将数据量化到一个中间表示,然后再从该中间表示量化到最终的低精度格式,以此来实现更高的压缩率。此外,NF4 在 QLoRA(Quantized Low-Rank Adaptation)中也得到了应用,这是一种用于高效微调 LLM 的方法。
    NF4 的实现提供了与 INT4 量化相似的压缩比,但在整个量化过程中,它能够更好地保持模型的准确度。这意味着,尽管模型的权重被量化到了较低的位宽,但模型在执行任务时的性能下降却是有限的。这种量化方法对于在资源受限的环境中部署大型神经网络模型具有重要意义,它使得这些模型能够在保持较高性能的同时,减少对存储和计算资源的需求。

    关于 QLoRA,低秩请看这篇文章中间推导, 一文了解 2024 China 谷歌 IO AI 技术点

Bitsandbytes 

   Hugging Face 的 Transformers 库,作为一个在自然语言处理领域内广受好评的工具集,极大地简化了预训练语言模型的运用。该库通过与 Bitsandbytes 库的紧密结合,进一步降低了模型量化的门槛,使得用户可以以极低的编程复杂度来构建和优化模型。Bitsandbytes 库作为一个 Python 接口,为 CUDA 自定义函数提供了便捷的封装,使得开发者能够轻松地利用 GPU 加速量化过程。它包括了一系列高效的工具,如 8 位优化器、矩阵乘法(如下图,通过 LLM.int8() 方法实现)以及 8 位和 4 位量化功能。这些工具共同构成了一个强大的量化解决方案,使得LLM 能够即时量化,而无需经历重新训练或调整模型结构的复杂过程。

(图片来自 medium 上的原图)

要将模型量化为 4 位,请使用以下代码:

AutoModelForCausalLM.from_pretrained(model_path, device_map="auto", load_in_4bit=True)

    与 GPTQ 相比,Bitsandbytes 在 4 位量化方面提供了更好的结果,这要归功于它使用的 NormalFloat4 数据类型,该类型优于 GPTQ 的 INT4。但是,使用 bitsandbytes 有两个明显的缺点:

  • 有限的量化支持:Bitsandbytes 仅支持量化为 8 位和 4 位,这可能会限制其适用性。

  • 推理速度较慢:使用 bitsandbytes 量化的模型的推理速度可能较慢,这可能会影响某些应用程序的性能。

    尽管存在这些限制,bitsandbytes 仍然提供了一种方便有效的方法来减少 LLaMA 3 等大型 LLM 的内存占用。

     总结回顾下,这些量化技术代表了应对压缩 LLM 挑战的不同方法。GPTQ 提供了一种高效的后训练方法,GGML 为量化模型提供了一种通用格式,NF4 引入了一种用于平衡压缩的专用数据类型,bitsandbytes 提供了一个用于实现各种量化策略的综合库。

结论
    模型量化是一种强大的技术,可使大型语言模型更易于访问和高效。通过了解各种量化方法及其应用,研究人员和从业者可以优化 LLM,以便在资源受限的设备上部署,而不会造成显著的性能损失。随着人工智能领域的不断发展,量化将在实现对最先进语言模型小众化,节能并且能在边缘设备上运行。


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询