大型语言模型推理加速 100 倍的量化方法

加速 100 倍 LLM 推理覆盖

本文主要基于主流的最新研究论文,探索加速量化推理的可行方向。 GPU 硬件和量化算法。在当前量化方案的背景下,让我们深入探讨这个话题。

量化简介

模型量化是一种模型压缩技术,旨在通过调整权重和激活的位宽来减小模型大小。这种减少有助于降低计算负载, GPU 内存 I/O 和占用率,最终减少延迟并提高吞吐量。下图说明了量化如何加速深度学习:

  • 步骤 1:权重和激活存储从内存加载到 MatMul 计算单元中。权重和激活的位宽会显著影响数据传输延迟。
  • 第 2 步:MatMul 计算单元执行矩阵乘法,其中位宽和格式也会影响延迟。
  • 步骤 3:累加器通常具有更高的位宽,以实现高精度求和。求和后,累加器中的值可能会重新量化(输出位宽决定了传输并存储回内存以供下一步处理使用的位数)。
深度学习加速器的示意图

根据不同的量化方案,主要有两种方法:量化感知训练(QAT)和训练后量化(PTQ)。

  • QAT(Quantization-Aware Training),又称在线量化,在训练过程中需要额外的计算工作量。它将量化与反向传播相结合以调整模型权重,确保量化后的模型保持准确性。
  • PTQ(训练后量化)也称为离线量化,涉及使用最少或不使用额外数据来量化预训练模型。此过程包括校准,其中可能涉及缩放模型权重。有两种类型的 PTQ 方法:
  • 后动态量化(PDQ)不依赖于校准数据集。相反,它直接使用量化公式转换每一层。QLoRA(量化感知低秩自适应)采用了这种方法。
  • 后校准量化(PCQ)需要代表性数据集根据模型中每层的输入输出调整量化权重。GPTQ(用于量化的生成预训练变压器)采用了这种方法。

硬件支持

英伟达系列

NV系列卡得益于CUDA生态系统,在支持不同精度和数据类型方面一直保持领先地位。

AMD系列

AMD 的 MI300 系列显卡在某些测试中表现出超越 H100 的性能指标,使其成为下一个有希望的选择。它们还支持 FP8 类型。

除了NVIDIA、AMD系列卡以外,国产卡对FP16、INT8等数据类型的支持也比较好(目前对FP8等数据格式的支持相对欠缺),这里就不一一列举了。

面临的挑战 LLM 量化

首先做一个简单的对比,我们对ResNet18和OPT-13B两个模型都进行了基本的INT量化,发现ResNet18的性能几乎没有受到影响,而OPT-13B则出现了较大的损失。

为什么同样遵循高斯分布的神经网络会表现出如此大的差异?这主要是由于 LLM.

单个 transformer 块,由自注意力模块和线性模块组成。红色连接是 transformer 中存在异常值的有问题的连接。

如上图 transformer 结构中的红色标记所示,transformer 中的量化问题出现在网络中非常特定的部分。在某些全连接模块中,特别是在网络的最后几层,层范数之和存在显著的异常值。简单地删除这些异常值会显著降低网络的准确率,因为它们有特定的用途。这些异常值会迫使下一层级的注意力机制关注文本中一些无意义的 token,比如句子分隔符、句号或逗号,从而导致这些特定的 token 得不到显著的更新。

据该报报道 LLM.int8() 表明激活函数中存在异常值,其绝对值明显较大。而且,这些异常值分布在少数特征中,这些特征被称为涌现特征。众所周知,异常值对模型性能有显著影响,直接丢弃它们并非可行方案。

异常值的存在使得 fp16 的范围非常大,因此在用 int8 表示时,每个数都需要表示很大范围的 fp16,这会产生天然的误差。传统的 CNN 也通过提出校准方法来解决这个问题。具体来说,对 fp16 的值进行统计分析,然后使用 KL 散度等算法丢弃较大的值,从而缩小 int8 需要表示 fp16 的范围,提高准确率。具体丢弃多少,则通过不断迭代 KL 算法来寻找最优范围。

幸运的是,这些异常值非常具体。它们只出现在某些注意力块中,在这些块中,它们只出现在一个层中,在这些层中,它们只出现在几个输出通道中。这些异常值甚至出现在每个数据点的同一通道中([1,3])。

基于以上结论, LLM.int8()[1]提出了一种混合精度算法。

示意图 LLM.int8()

如上图所示,X 表示每层的激活值,行数与序列长度一致,列数与隐藏层大小一致。图中黄色的柱状图表示异常值,形象的说明了它们的分布规律(第二个结论)。向量量化的含义是,对于不是异常值的列,使用 int8 进行对称量化。由于我们处理的是列,所以在矩阵乘法中,对于 int8 运算,需要从相应的行中提取相应的权重 W。对于黄色的异常值列,行和列都会用于 fp16 运算。最后将两部分的结果相加,相当于直接矩阵乘法。

通过混合量化方法 LLM.int8(),精度和fp32差不多,实验结果数据这里就不贴了。

FP8 和 INT8

为什么特别提到FP8和INT8?这主要是因为最新的 GPU 诸如hopper架构、张量核等架构都支持FP8精度计​​算,因此FP8量化值得探索。

Tensor Core(Hopper)(a)将 1 位分配给范围或精度(b)支持多种累加器和输出类型。

int8 与 fp8 不同,它缺少中间指数,只包含尾数。如下图所示,这种数据表示结构更适合表达均匀分布。

根据 [4],如果分布表现出非常突出的异常值,那么 FP8-E4/FP8-E5 格式会更准确。但是,如果分布表现良好且更接近高斯形状,那么 INT8 或 FP8-E2/FP8-E3 预计会表现更好。

这里我们绘制了几种分布的“准确度位”:倒置和归一化的 RMSE

如上图所示,对于均匀分布,INT8 表现最佳。对于正态分布,FP8-E2 是最佳的,紧随其后的是 INT8。神经网络中的许多分布都是高斯分布,这表明分布的结果是一个高度相关的性能指标。只有当出现异常值时,具有更多指数位的格式才会开始提供更好的结果。最佳量化器基于 Lloyd-Max 量化器,可针对这些分布获得。

对于 ResNet18、MobileNetV2 等网络,其中的层大多呈高斯分布,FP8-E2 和 INT 等格式的性能最佳,而 FP8-E4 和 FP8-E5 等格式的性能明显较差。我们还发现,ViT 和 BERT 等 Transformer 模型在 FP8-E4 上的性能最佳,正是因为 Transformer 中的某些层具有非常大的异常值。具体来说,某些层在层规范化之前的激活中有许多异常值。由于这些异常值显著影响性能,导致裁剪期间出现零错误,因此 FP8-E4 格式的性能最佳,而 FP8-E2/INT8 格式的性能明显较差。

那么,FP8 在 LLM 领域?

结论可能恰恰相反,主要原因如下:

  • 按照电路设计中定点和浮点累加的原理,FP8 MAC单元的效率比INT50单元低180%到8%,如果工作负载受计算限制,这会降低专用芯片的处理速度。
  • 对于大多数网络而言,FP8 的表现比 INT8 差,即使对于具有大量异常值的 Transformer 等结构也是如此,这些问题可以通过混合精度或量化感知训练方法来解决。

总体而言,在纯量化的背景下,FP8-E4 和 FP8-E5 等浮点格式无法在深度学习推理的性能和准确性方面取代 INT8。

那么,FP8形式的优势和定位到底在哪里呢?

首先我们来总结一下FP8格式的优点:

  • FP8 Tensor Cores 比 16 位 Tensor Cores 更快。
  • 减少记忆运动。
  • 如果模型已经在FP8中训练过,部署会更加方便。
  • FP8具有更宽的动态范围。
  • FP8到FP16/FP32/BF16的转换电路可以设计得更加简单直接,不需要INT8/UINT8到FP转换所需的乘法和加法开销。

基于这些优势,很明显FP8实际上更适合训练。

参考[5],在不修改学习率、权重衰减等任何超参数的情况下,无论是在预训练任务还是下游任务中,使用FP8训练的模型都与使用BF16高精度训练的模型表现相似。值得注意的是,在GPT-175B模型的训练过程中,与TE方法相比,新提出的FP8混合精度框架在H100上 GPU 平台可以减少17%的训练时间,减少21%的内存使用量。

下游任务的零样本性能。模型采用标准 BF16 混合精度方案或建议的 FP8 低精度方案进行训练

使用FP8格式量化模型进行推理,可以避免QAT或PTQ过程(避免精度降低),同时还能受益于从FP8到FP16等格式的更高转换效率,从而显著提升推理性能。

关于量化的最佳成本效益:

与 exllamav2 项目类似,该项目支持基于 GPTQ 算法的 2、3、4、5、6 和 8 位量化,但对于 LLMs,什么长度和格式在量化方面提供最佳的成本效益?

参考[6],对各种 LLM 架构来确定不同位分配对模型性能的影响:

125M 到 176B 参数 OPT 模型的四个数据集中平均零样本性能的位级缩放定律。当我们将量化精度从 16 位降低到 4 位时,固定模型位的零样本性能稳步提升。在 3 位时,这种关系反转,使 4 位精度达到最佳。

  • 对于给定的零样本性能,4 位精度为几乎所有模型系列和尺寸提供了最佳扩展(4 位精度不会导致模型性能显著下降)。唯一的例外是 BLOOM-176B,其中 3 位性能略好,但并不明显。
  • 4位精度是目前按位计算最有效的精度,同时也表明3位精度的性能还有提升空间,因此4位以下低位精度的研究是一个值得研究的方向。
  • 位级量化研究表明,数据类型和块大小是影响位级量化有效性的关键因素。

综上所述,4bit精度量化是目前性价比最高的方案,那么在4bit数据中,哪种数据类型的量化效果更好呢?

参照[7], LLM-FP4 方法提出了针对大型语言模型的 FP4 量化(LLM以训练后的方式将权重和激活量化为 4 位浮点值。现有的 PTQ 解决方案主要基于整数,并且难以处理 8 位以下的位宽。与整数量化相比,浮点 (FP) 量化更灵活,能够更好地处理长尾或钟形分布,并且已成为许多硬件平台的默认选择。项目参考: https://github.com/nbasyl/LLM-FP4

FP量化的特点之一是其性能很大程度上取决于指数位数和削波范围的选择。 LLM-FP4 通过搜索最优量化参数构建了一个稳健的 FP-PTQ 基线。此外,激活分布中通道间方差较大,而通道内方差较小,这增加了激活量化的难度。为了解决这个问题, LLM-FP4 提出了每通道激活量化,并证明这些额外的比例因子可以重新参数化为权重的指数偏差,而产生的成本可以忽略不计。

LLM-FP4 首次将 LLaMA-13B 中的权重和激活量化为仅 4 位,在常识零样本推理任务上取得了 63.1 的平均分,仅比全样本低 5.8 分,并显著超越了之前的最先进的模型 12.7 个百分点。

具体数据可以参见下图:

使用 LLaMA 模型在常识推理任务上的零样本性能。我们将 E/W/A 分别表示为词嵌入的位宽、模型权重和激活

从上图可以得出以下主要结论:

  • 当激活未量化且词嵌入和权重量化为 4 位时, LLM-FP4(FP类型)比GPTQ(INT类型)等算法略有优势。
  • 当激活量化为 8 位,并且词嵌入和权重量化为 4 位或 8 位时, LLM-FP4(FP类型)的表现与其他算法(INT类型)类似,性能上没有显著差异。
  • 当激活量化为 4 位时, LLM-FP4(FP类型)与其他算法(INT类型)相比显示出明显的改进。

总之,如果激活没有量化为 4 位,那么 FP4 目前相对于 INT4 没有明显的优势。

一些值得注意的量化项目包括

LLaMa 的 GPTQ

  • 使用 GPTQ 量化的模型具有明显的速度优势。简单来说,GPTQ 会单独量化块内的每个参数,并且在每个参数量化之后都会调整块内的其他参数,以弥补量化造成的精度损失。
  • GPTQ 量化需要使用校准数据集对模型进行训练后量化,得到量化后的权重。GPTQ 的概念源于 1990 年 Yann LeCun 提出的 OBD 算法,之后不断改进,出现了 OBS、OBC(OBQ)等方法,GPTQ 是 OBQ 方法的加速版。
  • GPTQ-for-LLaMa 代码库提供了专门针对 LLaMa 的 GPTQ 量化解决方案。建议在以下平台上部署 LLaMa 模型: GPUs.
  • 项目链接: LLaMa 的 GPTQ

骆驼

  • ExLlama 有两个版本,ExLlama 和 ExLlamaV2,作为运行本地 LLM 现代消费级 GPUs.
  • ExLlamaV2 支持与 V4 类似的 1 位 GPTQ 模型,但还引入了新的“EXL2”格式。EXL2 基于与 GPTQ 相同的优化方法,支持 2、3、4、5、6 和 8 位量化,允许在模型内混合量化级别,以实现每个权重 2 到 8 位之间的任意平均比特率。
  • ExLlamaV2 可以对每个线性层应用多个量化级别,产生类似于稀疏量化的效果,其中更重要的权重(列)用更多位进行量化。ExLlama 能够与顺序模型高效配合使用的重映射技术也使这种混合格式几乎不会对性能产生影响。
  • 总体而言,与其他量化方法相比,ExLlama 的推理速度略快一些。
  • 项目链接: 骆驼

GGML

  • GGML 是一个专注于机器学习的 C 语言库,由 Georgi Gerganov 创建,因此缩写为“GG”。该库不仅提供机器学习的基本元素(例如张量),还提供了一种独特的二进制格式,用于分发 LLM.
  • GGML 用 C 语言编写,支持整数量化(4 位、5 位、8 位)和 16 位浮点数。
  • GGML 与 llama.cpp 库无缝协作,确保从业者能够有效地利用 LLM。llama.cpp 库的主要目标是允许在 MacBook 上使用 INT4 量化的 LLaMA 模型。
  • 项目链接: GGML

变压器引擎

Transformer Engine (TE) 是一个旨在加速 NVIDIA 上的 Transformer 模型的库 GPUs,包括在 Hopper 上使用 8 位浮点 (FP8) 精度 GPUs,从而在训练和推理过程中以更低的内存占用率提供更佳性能。TE 为常用的 Transformer 架构提供了一组高度优化的构建块,以及一个可与特定框架代码无缝集成的自动混合精度类 API。此外,TE 还包含一个与框架无关的 C++ API,用于支持 Transformer 中的 FP8,该 API 可与其他深度学习库集成。

主要功能包括:

  • 用于构建支持 FP8 的 Transformer 层的易于使用的模块。
  • Transformer 模型的优化,包括内核融合。
  • NVIDIA Hopper 和 NVIDIA Ada 支持 FP8 GPUs.
  • 针对 NVIDIA Ampere 上的所有精度(FP16、BF16)进行优化 GPU 架构和更高版本。

项目链接: 变压器引擎

为了测试注意力,你可以导入 te.LayerNormLinear 并测量注意力计算的平均时间。

阶段模型结构数据格式RTX 4090RTX 3090Basic AttentionPyTorch Native AttentionFP1692ms183msBasic Attention + TELinear 和 LayerNorm tx 替换FP1696ms不支持Basic Attention + TE 的 LayerNorm 优化TE.LayerNormLinearFP1696ms不支持TE FullTE Full Attention 算法FP1674ms不支持TE Full + FP8FP 前向传播替换FP842ms不支持

测试结论:在 Transformer Engine 中,使用 fp20 时,相对于基本注意力算法,性能提升约 16%。此外,使用 fp54.5 时,性能提升显著,达到 8%,这表明投入时间提升推理性能是值得的。

Bitsandbytes:

Bitsandbytes 是自定义 CUDA 函数的轻量级包装器,专门针对 8 位运算、矩阵乘法(LLM.int8())和量化函数,主要支持 LLM.int8() 量化算法。

bitsandbytes 库支持量化方法,例如分位数、线性和动态量化。它是最简单的方法之一,不需要量化校准数据或校准过程。它可以很容易地与任何包含 torch.nn.Linear 模块的模型一起使用。目前的分析表明,NF4(NormalFloat 数据类型)和 FP4 是同样有效的 4 位量化技术,表现出类似的属性,例如推理速度、内存消耗和生成内容的质量。

NormalFloat 数据类型是一种增强的量化技术,从信息论的角度表示正态分布中权重的最佳表示。它主要用于 QLoRA 方法以 4 位精度微调模型。以下是来自 QLoRA 的一些数据:

对于 125M 至 13B OPT、BLOOM、LLaMA 和 Pythia 模型,堆常见爬行平均不同数据类型的困惑度。

艾梅特

AIMET 是高通为神经网络模型提供的高级模型量化和压缩技术库。它旨在提高推理速度,同时降低计算和内存要求,同时将对准确性的影响降至最低。例如,在高通 Hexagon DSP 上运行的模型可以实现比在高通 Kyro CPU 上运行快 5 到 15 倍的速度。

AIMET是非NVIDIA硬件上量化实现的体现,通常代表硬件厂商提供的基础量化能力,目前尚无单一项目能为不同硬件平台提供通用的量化能力。

在结论

4 位量化是目前性价比最高的量化方案,但优化程度会根据词向量、权重和激活的量化程度而有所不同。除了量化为 4 位的激活之外,大多数场景(包括非量化场景)的性价比更高。因此,低位量化,尤其是通过训练后量化(PTQ)专注于激活,是加速量化的一个有希望的方向。

INT8 是目前最常用的量化方案,相较于 INT8,FP8 在量化场景中无法完全替代 INT8,但更适合模型训练,提供了一种无需量化就能解决推理性能问题的方法。将 FPXNUMX 相关技术与硬件 Tensor Core 结合以最大化推理速度是一个值得探索的新方向。

基于 GPTQ 算法的项目在大型语言模型领域占据主导地位(LLM)。然而,新的数据类型(例如FP4和NF4)、更低的位精度和动态量化为创新和研究提供了机会。

除了 NVIDIA GPUs,新的 GPU和 CPU(例如 AMD、国产 GPUs、高通等厂商的加入带来了新的机遇,如何快速适配量化算法以适应不同的硬件平台,最大化硬件性能是一个新的探索方向。

参考文献

[1]LLM.int8():用于大规模 Transformer 的 8 位矩阵乘法

[2]干扰 Transformer 的异常维度由频率驱动

[3]Smoothquant:针对大型语言模型的准确、高效的训练后量化

[4]FP8 与 INT8 在高效深度学习推理方面的比较

[5]FP8-LM:训练FP8大型语言模型

[6]4 位精度的情况:k 位推理缩放定律

[7]LLM-FP4:4 位浮点量化变压器

[8]GPTQ:生成式预训练 Transformer 的精确训练后量化

[9]理解训练后量化对大型语言模型的影响

[10]QLoRA:量化的有效微调 LLMs

novita.ai 提供稳定的 Diffusion API 和数百个快速且最便宜的 AI 图像生成 API,适用于 10,000 个模型。🎯 最快生成仅需 2 秒,按需付费,每张标准图像最低 0.0015 美元,您可以添加自己的模型并避免 GPU 维护。免费共享开源扩展。

推荐阅读

  1. 稳定扩散 API:综合指南
  2. ChatGLM3:开源聊天 LLMs

探索 Novita 的更多内容

订阅即可将最新帖子发送到您的电子邮箱。

发表评论

滚动到顶部

探索 Novita 的更多内容

立即订阅以继续阅读并访问完整档案。

继续阅读