论文:
《LUT-GEMM: Quantized Matrix Multiplication based on LUTs for Efficient Inference in Large-Scale Generative Language Models》
修改之前的论文标题:
《nuQmm: Quantized MatMul for Efficient Inference of Large-Scale Generative Language Models》
近年来,大型语言模型在各种自然语言处理(NLP
)任务上呈现出 SOTA
的性能。这种 NLP
性能的快速进步在很大程度上得益于自监督学习方法。由于预训练主导了整个训练过程而不需要昂贵的标注过程,训练数据集的规模可以大幅增加。结合效率较高的 sequence-to-sequence
模型架构(如 Transformer
),模型参数数量也显著增加。
之前的研究(《Language models are few-shot learners》
、《Training compute-optimal large language models》
、《Scaling Laws for Neural Language Models》
)报告称:LM
的性能随着模型大小遵循可预测的 power-law scaling
。因此,近年来出现了几种大型生成式语言模型,包括 GPT-3(175B)
、HyperCLOVA(204B)
、Gopher(280B)
、Chinchilla(70B)
、Megatron Turing NLG(530B)
、和 PaLM(540B)
,从而进一步提升 SOTA
性能。然而,数十亿参数的模型由于 GPU
内存大小有限,无法容纳在单个 GPU
上,GPU
内存通常被牺牲以提高带宽(《8-bit Inference with TensorRT》
、《Up or Down? Adaptive Rounding for Post-Training Quantization》
)。为解决这一问题,研究人员提出了模型并行(model parallelism
),通过 GPU-to-GPU
通信将计算分布在多个 GPU
上(《Efficient large-scale language model training on GPU clusters using megatron-LM》
、《Megatron-lm: Training multi-billion parameter language models using model parallelism》
)。如 Figure 1
所示,模型并行将大型 LM
模型的参数分布到多个GPU
上,允许训练/推理期间通过专用通道在 GPU
之间共享信息。
模型并行可以分为张量并行和流水线并行,从而分别提高延迟和吞吐量。但是,这种并行方案需要各种通信原语来同步 GPU
产生的部分输出,如 AllReduce
、Reduce
、Broadcast
和 AllGather
(《Optimized broadcast for deep learning workloads on dense-GPU InfiniBand clusters:MPI or NCCL?》
)。尽管 GPU-specific
的外部通信协议(如 NVLink
)可以减少通信延迟,但GPU
性能的固有 variance
(由各种随机因素引起,如制程 variance
和操作系统条件)仍是另一个性能瓶颈(《Pathways: Asynchronous Distributed Dataflow for ML》
)。此外,由于大型矩阵被分成子矩阵,每个 GPU
面临高纵横比(tall-and-skinny
)的矩阵乘法,资源利用率较低(《Efficient sparse matrix-vector multiplication on CUDA》
、《Biqgemm: matrix multiplication with lookup table for binary-coding-based quantized dnns》
)。因此,模型并行获得的性能提升随 GPU
数量呈亚线性(sublinear
)函数。
为了缓解模型并行相关的挑战,参数量化(parameter quantization
)提供了最小化模型大小的实用解决方案,从而减少推理所需的 GPU
数量,如 Figure 1
所示。在各种量化方案中,均匀量化(uniform quantization
)受青睐,可以利用基于整数的算术单元(integer-based arithmetic units
)。尽管如此,均匀量化实际上被限制在 8-bit
,非线性操作(如 softmax
和 normalization)
)可能产生不精确的结果(《Efficient 8-Bit Quantization of Transformer Neural Machine Language Translation Model》
、《I-bert: Integer-only bert quantization》
)。此外,为了充分利用整数算术单元,实现 activation
的实时量化/逆量化、以及对 activation
分布的精确估计是必要的(《LLM.int8 (): 8-bit Matrix Multiplication for Transformers at Scale》
、《ZeroQuant: Efficient and Affordable Post-Training Quantization for Large-Scale Transformers》
)。近期研究提出了 4-bit weight-only quantization
作为内存压缩方法(《GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers》
、《GLM-130B: An Open Bilingual Pre-trained Model》
),需要实时转换为 full-precision
。尽管这牺牲了使用整数算术的计算优势,但大型语言模型中 weight-only quantization
提供了经验证据,即与同时量化 weights and activations
相比,可以在给定目标准确率下获得明显更高的 weight compression ratio
(GPTQ, GLM-130B
)。各种采用 non-uniform
格式的 weight-only quantization
方法也被提出以提高压缩率(《Biqgemm: matrix multiplication with lookup table for binary-coding-based quantized dnns》
、《AlphaTuning: Quantization-Aware Parameter-Efficient Adaptation o fLarge-Scale Pre-Trained Language Models》
)。
在本文中,我们介绍了 LUT-GEMM kernel
,旨在促进当权重使用 uniform
或 non-uniform
方法量化而保持 full-precision activations
时的 quantized matrix multiplications
。如 Figure 2
所示,LUT-GEMM
有效地解决了之前量化方法中存在的两个问题:
1)
:因 quantized activations
导致的不可避免的准确率降低。
2)
:额外的 dequantization implementation
的需要。
LUT-GEMM
本质上适用于 quantized weights and full-precision activations
,可以在保持所需 precision level
的同时加速推理过程。具体而言,LUT-GEMM
采用 binary-coding quantization: BCQ
格式(《XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks》
),从而利用简单的算术操作。值得注意的是,BCQ
最初是为支持 non-uniform
量化而提出的,需要定制硬件进行 bit-level
操作。在本文中,我们证明了以前的 uniform
量化可以重构为 BCQ
形式,使 LUT-GEMM
能同时支持non-uniform
量化和 uniform
量化格式。因此,LUT-GEMM
能够执行各种 weight-only quantization
方案的矩阵乘法,实现低的inference latency
、以及消除对 activation quantization
的需要。
我们在本工作中的主要贡献包括:
我们证明了 BCQ
能同时表示 uniform and non-uniform weight quantization
。
我们展示了对于 BCQ
格式,LUT-GEMM
可以提供压缩率和延迟之间的广泛 trade-offs
(基于 GPU-specific
的高效硬件利用的方法来实现各种 BCQ
配置)。
对大型语言模型,我们演示 LUT-GEMM
可以显着加速 small quantization bits
的矩阵乘法,同时通过减少 GPU
数量从而大幅节省功耗。因此,LUT-GEMM
实现了低能耗。
假设对 OPT-175B
的权重采用 3-bit BCQ
格式,由单个 GPU
来 serve
,我们的实验结果显示:与 GPTQ
(《GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers》
)结果相比,LUT-GEMM
可以将生成每个 token
的延迟加速 2.1
倍。
大型生成式语言模型,如 GPT-3
,是一种自回归模型,它以 feed-forward
方式使用 previous tokens
来预测 future tokens
。例如,Figure 3
所示,如果提供了 input context
(如 in-context learning
中所做的,参考 《Language models are few-shot learners》
),则可以使用先前所生成的 tokens
来预测 next token
。
采用自注意力机制和并行训练算法的 Transformer
架构在大型生成式语言模型中被广泛使用。多亏了自监督学习和 scaling-law
(《Language models are few-shot learners》
、《Scaling Laws for Neural Language Models》
),可以在增加模型大小时预测交叉熵损失,生成式语言模型中的参数数量也在不断增加。一些超大规模语言模型令人惊讶的定性评估结果(例如 human-like writing
)也推动了模型大小的竞争(《What Changes Can Large-scale Language Models Bring? Intensive Study on HyperCLOVA: Billions-scale Korean Generative Pretrained Transformers》
、《Scaling Language Models: Methods, Analysis & Insights from Training Gopher》
)。
对于大型语言模型,矩阵乘法的处理时间主导了整个 inference latency
,因为与激活函数、normalization layers
等相比,矩阵乘法的时间复杂度更高(《LLM.int8 (): 8-bit Matrix Multiplication for Transformers at Scale》
)。为了验证这一结论,Figure 4
展示了不同大小(OPT 6.7B/13B/30B/66B/175B
)的各种大规模生成式语言模型,在不同 input tokens
数量下的延迟的分解。OPT
模型遵循 Transformer
架构,由相同的层组成。设 hidden size
multi-head attention
和一个 feed-forward network
,包括四个主要的线性计算,其时间复杂度更高(与其他非线性操作相比)。这些操作包括将一个(activation matrix
与下列四个矩阵相乘:
1)
:一个 (key, query, value
。
2)
:一个 (
3)
:一个 (feed-forward sub-layer
。
4)
:一个 (feed-forward sub-layer
。
所有层具有相同的结构,矩阵乘法主导整个推理延迟(《Extremely Low Bit Transformer Quantization for On-Device Neural Machine Translation》
)。Figure 4
是用 A100(80GB)
和 FasterTransformer
(Nvidia
的推理框架)获得的。对于各种规模的语言模型、以及不同的 input token lengths
,矩阵乘法至少占用了 75%
的处理时间(请注意,由于单个 GPU
的内存容量有限,大型语言模型可能需要多个 GPU
,从而增加了通信延迟)。GPU
常被采用从而加速推理,因为 GPU
内嵌了大量算术单元(arithmetic units
),并支持多个线程,这对加速矩阵乘法至关重要(《8-bit Inference with TensorRT》
、《Efficient large-scale language model training on GPU clusters using megatron-LM.》
)。但是,从 GPU
中获取高性能取决于算术强度(arithmetic intensity
),因此 batch size
必须足够大,从而确保从主内存(main memory
)中获得高的 reuse ratio
(《Nvidia tensor core programmability, performance & precision》
)。
张量并行:对于高度并行的计算系统,高内存带宽对于为大量算术单元提供数据从而维持高资源利用率至关重要。因此,GPU
的主内存系统倾向于关注高带宽而不是大容量。相应地,即使提出了崭新的内存架构(如 HBM
,参考 《Zero-infinity: Breaking the gpu memory wall for extreme scale deep learning》
),单个 GPU
的最大内存容量仍然只有几十 GB
(《Evaluating modern gpu interconnect: Pcie, nvlink, nv-sli, nvswitch and gpudirect》
)。这种有限的 GPU
内存容量导致了各种并行思想从而在多个 GPU
上划分大型语言模型(《Efficient large-scale language modeltraining on GPU clusters using megatron-LM》
、《Megatron-lm: Training multi-billion parameter language models using model parallelism》
)。张量并行可以将矩阵乘法划分到多个 GPU
上,从而同时生成更小的子任务。请注意,这种并行会引入额外的同步(synchronization
)开销、和 GPU-to-GPU
通信开销。
内存受限的 Text Generation
:Figure 3
中 summarization
阶段对计算资源有很大需求,权重重用的可能性也很高。因此,在多个 GPU
上采用张量并行可能会有效提高推理性能。相反,Figue 3
中的 generation
阶段由于其自回归特性而呈现受限于内存的工作负载(memory-bound workload
)。因此,增加 GPU
数量且结合张量并行可能不是一个经济有效的解决方案,特别是考虑到 GPU
之间的通信开销。随着 ChatGPT
等服务的日益重要,解决有限内存带宽的问题变得至关重要。不幸的是,通过 hardware advancements
来增加内存带宽通常会遇到物理限制,并与高功耗相关(《Digital integratedcircuits- A design perspective》
、《Cambricon-S: Addressing Irregularity in Sparse Neural Networks through A Cooperative Software/Hardware Approach》
)。因此,关注能够缓解内存瓶颈的模型压缩技术的研究工作势在必行。
各种研究工作致力于通过改进延迟和吞吐量来增强大型且笨重的深度神经网络的 serving
性能。这些工作包括量化、剪枝、知识蒸馏、以及低秩近似。在这些方法中,量化是研究最广泛的领域,它涉及使用更快的、更高效的计算单元,以及减少内存使用。特别是采用 INT8
算子的 uniform quantization
在各种量化格式中研究最充分,目前正被积极应用于大语言模型中(《LLM.int8 (): 8-bit Matrix Multiplication for Transformers at Scale》
、《SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models》
、《ZeroQuant: Efficient and Affordable Post-Training Quantization for Large-Scale Transformers》
)。
与 FP16
相比,当代计算系统中常见的 INT8
算术单元提供了降低延迟(得益于其较低的面积和功耗)和高达 50%
的内存减少。因此,目前的 NVIDIA GPU
采用支持 INT8
操作的 Tensor cores
来加速计算(《Nvidia tensor core programmability, performance & precision》
)。但是,利用 INT8
需要 activation quantization
,这对采用 INT8
单元实现压缩和加速的模型提出了重大挑战。例如,当 scaling factors
离线确定时,由于异常值被近似, activation quantization
可能导致模型准确率大幅下降。为了避免这种准确率下降, token-based dynamic quantization
已成为量化大语言模型的关键技术(《LLM.int8 (): 8-bit Matrix Multiplication for Transformers at Scale》
、《ZeroQuant: Efficient and Affordable Post-Training Quantization for Large-Scale Transformers》
)。LLM.int8()
方法(《LLM.int8 (): 8-bit Matrix Multiplication for Transformers at Scale》
)通过提出分解方法,大部分计算用 INT8
进行,只对有限数量的异常值用 FP16
,解决了大语言模型中异常值系统性出现的问题,从而仅导致语言模型延迟轻微下降。
SmoothQuant
(《SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models》
)采用了更高级的方法,通过数学方法将 activations
中的方差转移到权重中,而权重相对更容易量化; activations
更难量化,因为存在异常值。该技术使得采用 INT8
计算单元(如 W8A8
)高效地计算大语言模型成为可能,即使在对 activations
进行静态量化的情况下。根据 SmoothQuant
的结果,当系统性地出现异常值时,大语言模型的加速可以达到 1.5
倍、GPU
使用量减少 2
倍。然而,应注意的是,要在新的大语言模型中应用 SmoothQuant
,有必要在应用迁移技术之前经验性地观察和验证异常值的出现。
另一方面,如前所述,token generation
过程的自回归特性限制了硬件的最大吞吐量,即使采用 INT8 precision
。因此,需要生成大量 token
的服务(如 chatGPT
),可能不会通过采用 INT8 precision
获得显著的性能改进。
最近的研究关注 generation
步骤的低效率,并相应地提出了利用 W4A16
格式(《GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers》
、《GLM-130B: An Open Bilingual Pre-trained Model》
),即将模型权重压缩为 4-bit
整数而不量化 activations
。鉴于当前计算系统无法加速 W4A16
格式,GPTQ
(《GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers》
)通过首先即时地将权重逆量化为 FP16
格式、然后执行矩阵乘法操作来解决此问题。通过利用 generation
步骤的受限于内存的特点,这种方法可以减少 GPU
的数量并改进 generation latency
,尽管存在逆量化的开销。
在本文中,我们提出了 binary-coding quantization: BCQ
的应用。BCQ
是一种通用的 non-uniform quantization
方案,它包含了 uniform quantization
,正如我们在后面的部分所讨论的。BCQ
首先在 《XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks》
中被提出,作为一种与传统 uniform quantization
方法形成对比的可行方案。当权重向量 BCQ
量化,且 quantization bits
数量为
其中:
scaling factor
。
binary vector
。
的每个元素可以用 1 bit
来表示,因此整个向量只需要n bit
来表示。对于
,它的每个元素需要 个 bit
来表示,因此表示 quantization bits
数量。
注意, scaling factor
scaling factors
。
量化过程大致包括找到 scaling factors
和 binary vectors
以最小化量化误差,即:
其中
上式就是
LUT-GEMM
的核心思想。后面的技巧都是为了加速这个求解过程而设计的。
除非 scaling factors
和 binary vectors
是通过迭代搜索(iterative search
)方法(《Network sketching: exploiting binary structure in deep CNNs》
、《Alternating Multi-bit Quantization for Recurrent Neural Networks》
)、或量化感知训练(quantization-aware training
)获得的(《Extremely Low Bit Transformer Quantization for On-Device Neural Machine Translation》
)。最近,《AlphaTuning: Quantization-Aware Parameter-Efficient Adaptation of Large-Scale Pre-Trained Language Models》
提出了 AlphaTuning
,一种结合 parameter-efficient adaptation
和 BCQ
方案的方法,展示了各种生成式语言模型可以在微调下游数据集的同时实现极端的 low-bit quantization
、甚至低至 1-bit
或 2-bit
。
LUT-GEMM
是为了开发高性能、低能耗的大语言模型推理系统而设计的。为实现此目标,LUT-GEMM
采用了几种创新方法。
首先,我们通过添加 bias
项来扩展常规的 BCQ
方法,这显著增强了表达能力。这个简单的 addition
使得 extended BCQ
格式可以同时表示 non-uniform and uniform quantization
方法,允许我们利用各种量化方法(依赖于具体的 LLM
要求)。
其次,我们进一步 refine
了 BCQ
方案的实现细节,使压缩比(compression ratio
)与量化误差之间的权衡更好地利用语言模型的特点。
最后,由于大多数 non-uniform quantization
方法通常涉及低并行度的复杂操作,并且可能缺乏硬件支持,我们设计了 LUT-GEMM
以高效适配 BCQ
格式。我们提出的 LUT-GEMM kernel
直接利用 BCQ
格式,消除了额外的开销(如 dequantization
)。因此,LUT-GEMM
展示了降低的延迟、和/或减少的语言模型推理所需 GPU
数量,同时本质上适配各种 weight-only quantization
的方法。
非对称的 Binary-Coding Quantization
:常规的 BCQ
方法基本上局限于相对于零点呈现对称的 quantization shape
。BCQ
方法的另一个约束源于其无法表示零值,这是由于其对称量化的特性。为增强 BCQ
的表达能力,我们通过引入 bias
项 BCQ
方法:
因此, 修改后的BCQ
格式可以表示以 asymmetry quantization
,如 Figure 5(a)
所示。
因为
的取值为 {+1, -1}
,因此下图展示为一棵二叉树。假设考虑的第 个元素 :
如果
,则从根节点开始考虑右子树;否则考虑左子树。 假设考虑右子树。如果
,则考虑右子节点;否则考虑左子节点。 以此类推,最终的叶节点代表
的取值。 所有的叶节点代表
的取值空间。
Uniform Quantization
:我们表明,在 BCQ
格式中引入 bias
项使其能表示 uniform quantization
,方法是通过仔细调整 scaling factors
和 bias
项(Figure 5(b)
)。让我们详细说明如何将 asymmetric uniform quantization
转换为具有 bias
项的 symmetric BCQ
。一个 b-bit
的 uniformly quantized weight
scaling factor
然后,
给定 BCQ
格式的 binary weight
则这可以视为 BCQ
的一个特例,其中:
从 Figure 5
中我们可以看到,对于 q-bit
量化,uniform quantization
方法采用单 scaling factor
,而 non-uniform
量化技术需要使用 scaling factors
。因此,由于采用了 extended BCQ
格式,我们提出的 LUT-based
的矩阵乘法方案同时适用于 uniform quantization
和 binary-coding-based non-uniform quantization
方法。
在实践中,常规的 BCQ
方法假设每个权重矩阵的行(甚至整个矩阵)共享一个 scaling factor
,从而支持 CPU
或 GPU
的向量指令 (vector instructions
)(《XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks》
、《Alternating Multi-bit Quantization for Recurrent Neural Networks》
)。但是,随着大型语言模型引入更深的和更宽的模型结构、以及参数数量的不断增加(《Scaling Language Models: Methods, Analysis & Insights from Training Gopher》
、《Megatron-lm: Training multi-billion parameter language models using model parallelism》
),我们认为这种常规的 row-wise BCQ
格式面临各种挑战。
假设选择了一个相对较小的 hidden size
(例如 OPT 350M
的 scaling factors
的 row-wise assignment
可能是合理的,以获得低的量化误差。
另一方面,如果 hidden size
迅速增加(例如 GPT-3 175B
的 scaling factors
从而与更多权重共享,这将更具挑战性。
为实现 low-bit quantization
方案,我们有必要研究 assigning scaling factors
的不同方式,只要这些新的分配方式可以实现。
作为 row-wise quantization
的替代方案,我们提出了 group-wise quantization
,其中一个 scaling factor
可以由任意数量的权重共享。我们提出的新的 BCQ
格式引入了一个新的超参数 group size
,表示要共享一个 scaling factor
的权重数量。在本文中,row-wise quantization
)。由于 hidden size
不影响我们的 group-wise BCQ
格式。
group-wise quantization
的物理意义:对于权重矩阵的给定行,将它拆分为 组。为方便表述,这里令 。因此将 拆分为两组: 。 然后针对每个
,最小化残差: 其中,
scaling factor
在各个分组内部共享。为什么按列进行分组,而不是按行进行分组?论文并未说明原因。
对压缩比(Compression Ratio
)的影响:设 quantization bits
数量。对于给定的 group size
scaling factors
的内存占用为代价来降低量化误差。然后,target quantization error
作为约束来确定 scaling factors
和 binary vectors
的数量作为 trade-off
过程。请注意,如果矩阵宽度足够大, row-wise quantization
的内存占用主要由 binary vectors
的大小决定,因为 scaling factors
的大小通常可以忽略。
与常规方案相比,我们提出的 group-wise BCQ
为满足 target compression ratio
提供了新的大搜索空间。 Figure 6
以两个quantization bits
数量 group size
scaling factors
)时,内存占用也可能很大。
我们采用 BCQ
格式用于 weight quantization
而为 activations
保持 full precision
的量化方案,会导致朴素的矩阵乘法中出现重复的和冗余的部分计算(partial computations
)。为说明这一点,假设给定 binary matrix
activation vector
则计算 scaling factors
相乘)会重复计算 bit-level
的内存访问,这对商用 CPU
和 GPU
来说可能较慢。
为避免 bit-level
的内存访问并高效计算 full-precision activations
和 binary patterns
的所有可能组合。请注意,当大量计算产生的值集中在一个受限集合时,lookup table: LUT
已被广泛用于节省处理时间(《LUT filters for quantized processing of signals》
、《LUT Optimization for Memory-Based Computation》
、《Multiplication Through a Single Look-Up-Table (LUT) in CNN Inference Computation》
)。当从 LUT
中检索一个值要比进行原始计算要快得多时,基于 LUT
的计算尤其合理。BCQ
格式也适合 LUT-based
的方法实现。注意,这里的 BCQ
格式没有 quantizing activations
,其中 quantizing activations
需要大量修改训练代码和模型结构(《Quantization and training of neural networks for efficient integer-arithmetic-only inference》
、《Training and Inference with Integers in Deep Neural Networks》
)。
例如,对 3
个元素 Table 1
所示预先计算 LUT
中。假设 LUT
的子向量长度(因此 Table 1
中 LUT
的 LUT
检索操作所替代;同时,检索的 key
由 binary elements
拼接而成。
为完成partial products
)被累加起来,然后乘以 scaling factors
。当 row dimension
增加时(例如随着生成式 LM
越来越大),LUT
的利用率增加,因为出现了越来越多的冗余计算。
这个
lookup table
的存储会消耗大量资源;同时lookup table
的预先生成需要消耗大量时间。更重要的是,在推断过程中,lookup table
是一次性的消耗品:针对不同的输入需要生成不同的lookup table
。
让我们简要解释一下如何优化 《Biqgemm: matrix multiplication with lookup table for binary-coding-based quantized dnns》
中也有讨论。如果 LUT
的构建成本也会增加 LUT
检索操作取代 FP16 additions
操作。因此,正如 《Biqgemm: matrix multiplication with lookup table for binary-coding-based quantized dnns》
所报告的,存在一个最优的 aligned memory accesses
。在我们的工作中,
除了 LUT-based
的方案(消除冗余计算和 bit-level
内存访问)之外,我们提出的 LUT-GEMM
还需要与 group-wise quantization
配合,从而在给定 GPU
上优化 single-batch operations
的策略如下:
为提高并行度,我们创建尽可能多的线程,同时每个线程都可以执行独立的 LUT
访问。
一个线程所访问的 binary weights
可以共享一个公共 scaling factor
,这样 scaling factors
相关的操作不会降低线程的性能。
如果向线程分配的资源太小,则 LUT
利用率会很低,synchronization
开销会增加。因此,我们需要经验性地优化线程配置。
为了简单起见,我们将提出的 group-wise quantized matrix multiplication
公式化为:
其中:
FP16
的 scaling matrix
。
FP16
的 binary matrix
。
FP16
的长度为 input vector
。
请注意,在实际情况下,由于每 scaling factor
,因此
整体架构:对于 LUT-GEMM
,我们将 LUT
分配给 GPU
的一个线程块(thread block: TB
)。然后,分配给每个 TB
的 TB
内 LUT
的利用率。因此, 2048
是一个实用数字)。请注意,分配给每个 TB
的资源足够小,使得只要 TB
就可以共享一个 scaling factor
。
Figure 7
展示了在 GPU
上实现 LUT-GEMM
的整体方案,其中我们假设 Figure 7
的整个过程迭代
该方案需要硬件级的编程支持,因此读者觉得实践的价值不大。因为换一种硬件(如手机芯片),算法是否仍然可行,是个未知数。
详细实现:
首先,每个 TB
使用分配的部分 LUT
。
然后,TB
中的所有线程可以共享 LUT
(以减少全局内存访问);多个线程可以并行处理
当线程完成检索、以及对 LUT
的值求和之后,获取 scaling factors
(每个线程只获取一次)并将其乘以产生 partial outputs
。
最后,将来自不同 TB
的 partial outputs
累加(通过 atomicAdd
操作,如 Figurer 7
所示)以生成最终输出。
LUT
存储在 GPU
中的共享内存中,共享内存提供高带宽(例如 A100
的 19TB/s
)。因此,LUT
的高内存访问(同时,一次 LUT
访问可以代替多个 FLOPs
)实现了快速的矩阵计算。关于 LUT
内存大小,every 8 hidden dimensions
只需要 1KB
,共享内存大小超过几 MB
(例如 A100 with 192KB per SM
的共享内存大小是 20MB
,一共 108 SMs
),因此整个 LUT
可以安全存储在共享内存中。例如,对于A100
,hidden dimension
最多可达 324,000
,而 GPT-3 175B
的 hidden dimension
为 12,288
。
为研究 LUT-GEMM
对 group size
Figure 8
中,对每个 row-wise
(即,BCQ
格式进行了比较。有趣的是,当 group-wise LUT-GEMM
都与 row-wise LUT-GEMM
一样快。换句话说,合理的大 128
和 256
)可以使 LUT-GEMM
很快,同时 group-wise
可以大幅提高准确率。
为深入理解 Figure 8
中的机制,我们分析了 LUT-GEMM
的内存占用,因为 single-batch operations
主要受限于内存,而延迟与内存占用成正比。设 binary weights
和 scaling factors
的空间复杂度分别为
因此,如果 single-batch operations
下 LUT-GEMM
延迟与内存占用成正比的说法,在(q, g) pair
以及相应的压缩比,并测量了矩阵乘法的延迟,如 Figure 9
所示。
可以注意到,超参数 Figure 9
中的所有可用压缩比中,latency
是压缩比的函数。例如,如果两个不同的 pairs
LUT-GEMM
得到相似的延迟。
在本节中,我们介绍在各种复杂度水平上使用 LUT-GEMM
获得的实验结果,从 single-layer experimental setup
(不考虑 group size
)、到完整的 model level
。
首先,我们在不考虑 group size
的情况下检查 LUT-GEMM
对特定 layer
的影响。
接下来,我们比较张量并行与 LUT-GEMM
,然后研究 group size
的影响。
最后,我们分析 OPT
模型的端到端延迟,以确定 LUT-GEMM
整体对性能的影响。
Table 2
给出了在 OPT-175B
模型的前馈神经网络(Feedforward Neural Network: FFN
)第一层上的延迟测量结果。结果是通过各种 input and weight quantization
方法获得的,包括 FP-FP(baseline)
、INT-INT
、FP-INT
和 FP-BCQ
。所选 kernels
包括:cuBLAS
(用于 FP-FP
或 INT-INT
)、GPTQ
(用于 FP-INT
)、或 LUT-GEMM
(用于 FP-INT
或 FP-BCQ
)。注意,GPTQ kernel
包括 dequantization
过程,然后紧跟着 GEMM
;而 LUT-GEMM
直接接受 row-wise quantized weights
,不需要 dequantization
。
我们可以观察到:
INT8-INT8
(使用 cuBLAS
)实现的延迟相比 FP-FP
仅略有改善,因为 cuBLAS
没有针对 single-batch operations
进行很好的优化。
与 INT8-INT8
量化相比, GPTQ kernel
延迟更低,但由于 dequantization
开销,其速度慢于 LUT-GEMM
。
支持 BCQ
和 INT
量化的所提出的 LUT-GEMM kernel
在考虑的 kernels
中实现了最低延迟。
Table 3
总结了使用 cuBLAS
(具有张量并行)或 LUT-GEMM
(具有一个 GPU
)执行的矩阵乘法的分析结果。使用 nvidia-smi
工具收集了 GPU
功率和其他指标。同样,一个 8192
和 12288
。这个操作与我们对 GPT-3 175B
的研究相关,其 hidden size
为 12288
。我们对 LUT-GEMM
包含 BCQ
格式的 quantization-aware training
,一些文献报告对 Transformer
的 2-bit
量化是可行的(《Extremely Low Bit Transformer Quantization for On-Device Neural Machine Translation》
)。我们注意到:
cuBLAS
中张量并行使用额外的GPU
会显著降低 GPU
利用率、内存利用率、以及 computation latency ratios
。如通信延迟占比的增加所示,这种利用率的降低表明一些 GPU
可能暂时闲置,直到所有 GPU
都被同步。相应地,张量并行可以获得的加速程度远小于 GPU
的数量。因此,使用更多 GPU
的 cuBLAS
会增加矩阵乘法的能耗。
另一方面,LUT-GEMM
(具有一个 GPU
)可以提供高速加速(这是张量并行无法实现的),同时保持高的 GPU/memory
利用率。因此,LUT-GEMM
通过结合低延迟和减少 GPU
数量,极大地节省了矩阵乘法的能耗。例如,当 cuBLAS
,LUT-GEMM
(GPU
)实现了 4.8
倍的能耗降低、以及 6.0
倍的加速。
为研究 group-wise BCQ
从而扩大 compression
的搜索空间的能力,我们在三个公开可用的 pre-trained OPT
模型上进行了实验。具体而言,我们在 pre-trained OPT
模型上应用 post-training quantization
(使用 《Alternating Multi-bit Quantization for Recurrent Neural Networks》
中介绍的 iterative solver
),同时调整 quantized model
在 LAMBADA
数据集上进行评估,找到压缩比和准确率之间的关系。Figure 10
显示了尝试各种 Figure 10
可以观察到:
与传统的 row-wise quantization
相比,group-wise BCQ
提供了新的最优配置(见附录中的 Figure 11
从而查看更广泛的结果)。因此,为了实现最佳压缩比(或最小的准确率退化),有必要同时探索不同的
注意,对于 OPT-13B
和 OPT-30B
,正如我们讨论的大型语言模型的 row-wise quantization
的局限性,小的
总之,对每个模型,
现在,我们评估保持 full precision activations
并采用 quantized weights
下,各种 OPT
模型的 single-batch size
端到端的推理延迟。Table 4
展示了使用 round-to-nearest: RTN
方法进行均匀量化时,end-to-end latency per token
和困惑度。注意,延迟测量是在 FasterTransformer
框架内进行的。我们利用不同数量的 GPU
来获得 model parallelism
可以实现的潜在加速增益。从 Table 4
的观察我们可以得出以下结论:
1)
:减小group size
(RTN
量化方案,代价是延迟略有增加。
2)
:增加 GPU
数量(即,并行度增加)并不能显著降低延迟,因为存在各种开销,如 GPU-to-GPU
通信成本,如 Figure 4
所述。值得一提的是,在 LUT-GEMM
的 case
中(其中矩阵乘法被加速),相较 cuBLAS
, GPU-to-GPU
相对通信开销更加突出。因此,对于 LUT-GEMM
,模型并行似乎不太有效。换言之,对于高性能的矩阵乘法引擎,通信开销更加突出。
以 OPT-30B
模型为例,使用 FP16
权重可以在单个 GPU
上执行端到端推理。但是,对于具有 FP16
权重的 OPT-66B
模型,由于模型大小超过单个 GPU
的内存容量( A100
为 80GB
),必须使用模型并行技术。然而,当 OPT-66B
模型的权重被量化到 3-bit
或 4-bit
时,这被证明是可行的(《GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers》
),推理可以容纳在单个 GPU
上。假设采用 3-bit
量化、以及用 LUT-GEMM
,可以对 OPT-30B
(使用 1
个 GPU
)实现 2.43
倍的加速、对 OPT-66B
(使用 2
个 GPU
)实现 2.25
倍的加速。请注意,我们在 Table 4
中展示 LUT-GEMM
性能的方法依赖于 basic post-training quantization
,而大语言模型有更高级的量化方法。例如,在构建 pre-trained
模型后进行微调,如 ChatGPT
中所展示的,更有效的量化技术如 AlphaTuning
(《AlphaTuning: Quantization-Aware Parameter-Efficient Adaptation of Large-Scale Pre-Trained Language Models》
)甚至可以实现 2-bit
量化。当与先进的量化方法相结合以减少 quantization bits
时,LUT-GEMM
的效用进一步增强。附录 A.1
中提供了额外的评估结果。
Table 5
比较了在 FasterTransformer
框架中生成 OPT-175B
的一个 token
的端到端延迟。我们评估了三种不同的实现:
1)
:原始 FP16 cuBLAS
。
2)
:集成了 FP16 cuBLAS
(使用 GPTQ
的 library
)的 dequantization
(从 3-bit
)。
3)
:假设 uniform quantization
的 LUT-GEMM
。
通过只关注前面讨论的四个特定矩阵乘法,LUT-GEMM
展示了它降低所需 GPU
数量的能力,同时随着 GPU
的增加从而降低延迟。对于具有 FP16
的 OPT-175B
,运行推理至少需要 8
个 GPU
。但是,应用 BCQ
格式进行量化后,LUT-GEMM
能够只使用单个 GPU
执行推理,同时保持可比的整体延迟。值得注意的是,当比较相同的 3-bit
量化场景时(weight-only
和row-wise
),使用 LUT-GEMM
的 latency for token generation
比 GPTQ
库降低了 2.1
倍。这种显著的延迟减少主要归因于 LUT-GEMM
可以直接接受 quantized weights
的能力,从而消除了 dequantization
的需要。
让我们证明 LUT-GEMM
的灵活特性(归因于 extended BCQ
格式)可以加速现有的 uniform quantization
方法。Table 6
显示了使用 GPTQ
方法在各种 OPT-175B
的困惑度。该 Table
还显示了 LUT-GEMM
(不包括 FP16
)实现的相应延迟(per generated token
)。结果清楚地表明:随着 LUT-GEMM
提供了更低的延迟,尽管过小的
总之,通过集成 LUT-GEMM
和 GPTQ
,以可接受的困惑度增加为代价,可以将运行 OPT-175B
推理所需的 GPU
数量从 8
个降低到 1
个,同时保持高性能。值得强调的是,如果包含 dequantization
,则无法实现这样的性能改进。
如前所述,生成式语言模型推理由两个阶段组成:使用 input context
的 summarization
、以及 generation
,如 Figure 3
所示。这些阶段需要不同的 batch size
。summarization
允许并行处理多个 tokens
,而generation
由于其自回归特性是 single-batch operation
。因此,生成式语言模型的推理需要平衡:受限于计算(高并行的上下文处理)和受限于内存(低并行的 generation
)。
我们提出的推理策略涉及存储 quantized weights
(使用 extended BCQ
)。然后这些权重:
1)
:在上下文处理(context processing
)阶段 dequantized
从而执行 full-precision cuBLAS
的矩阵乘法。
2)
:并在 generation
阶段作为 LUT-GEMM
的输入。
请注意,即使在上下文处理过程中,weight quantization
对有效的内存使用也是必不可少的。此外,由于 weight reuse ratio
很高,context processing
阶段的 dequantization latency
相比 generation
阶段较低。因此,LUT-GEMM
是 generation
阶段的理想方法,因为 generation
阶段通常主导整体推理延迟,因为需要生成更多的 tokens
(生成式语言模型的常见要求)。
论文:
《The case for 4-bit precision: k-bit Inference Scaling Laws》
大型语言模型(LLM
)广泛用于 zero/few-shot inference
,但由于其庞大的内存占用(175B
参数的模型高达 352GB GPU
内存)和高延迟,这些模型使用起来具有挑战性。然而,内存和延迟主要由模型的参数中的比特总数决定。因此,如果我们通过量化来减少 model bits
,我们可以期望模型的延迟会相应地减少,可能以任务准确率为代价(《Gptq: Accurate post-training quantization for generative pretrained transformers》
、《nuqmm: Quantized matmul for efficient inference of large-scale generative language models》
、 《Zeroquant: Efficient and affordable post-training quantization for large-scale transformers》
)。
由于我们可以将训练好的模型的参数量化到任意 bit-precision
,这引出了一个问题:给定当前的 base
方法从而用于 model quantization
,为了在准确率和 total model bits
之间取得最佳 trade-off
,应该使用多少比特?例如,如果我们有一个 4-bit
精度的 60B
参数模型、以及一个 8-bit
精度的 30B
参数模型,哪个模型的准确率会更高?为了研究这种 trade-offs
,采用 scaling laws
(《Scaling laws for neural language models》
、《Scaling laws for autoregressive generative modeling》
) 的角度是很有帮助的,它们评估变量的基本趋势从而推广单个数据点。
在本文中,我们研究了 zero-shot quantization
的 bit-level inference scaling laws
,以确定在给定模型 total bits
数量的情况下,什么精度可以最大化 zero-shot accuracy
。我们的主要发现是:在所有测试的模型规模和模型族中,4-bit
参数都可以为固定数量的 model bits
提供最佳性能。
我们研究了五个不同的模型族,OPT
、Pythia/NeoX
、GPT-2
、BLOOM
和 BLOOMZ
,参数范围从 19M
到 176B
不等,精度范围从 3-bit
到 16-bit
。此外,我们运行了超过 35,000
个 zero-shot experiments
,以测试量化精度的许多最近研究的进步,包括底层数据类型和 quantization block size
。我们发现,将精度稳步从 16-bit
降低到 4-bit
可以在固定数量的 model bits
下提高 zero-shot
性能;而在 3-bit
时,zero-shot
性能会下降。这种关系贯穿了所有被研究的模型,并且在从 19M
参数扩展到 176B
参数时没有改变,这使得 4-bit
量化在所有测试案例中都是通用的最佳选择。
此外,我们分析了哪些量化方法可以改进 bit-level scaling
、而哪些量化方法会降级(degrade
) bit-level scaling
。我们发现,在 6-bit
到 8-bit
精度下,我们测试的所有量化方法都无法改进 scaling behavior
。对于 4-bit
精度,数据类型和小的quantization block size
是增强 bit-level scaling
趋势的最佳方法。我们发现 quantile quantization
数据类型和浮点数据类型是最有效的,而整数类型和 dynamic exponent
数据类型通常产生较差的 scaling
趋势。对于大多数 4-bit
模型,在我们的研究中,64
到 128
之间的 block size
是最佳的。
根据我们的结果,我们可以对使用 zero-shot quantized models
进行推理提出直接的建议:始终使用 4-bit
模型、以及小的 block size
、以及浮点数据类型。如果需要在 total model bits
和预测性能之间进行 trade-off
,保持 4-bit
精度但改变模型的参数数量。
尽管早期的工作已经表明,通过使用 outlier-dependent quantization
可以显着提高 quantized models
的预测性能(《LLM.int8(): 8-bit matrix multiplication for transformers at scale》
、《Smoothquant: Accurate and efficient post-training quantization for large language models》
),但我们发现这对于 bit-level scaling
并不有效。具体而言,我们分析了 3-bit OPT and Pythia
模型的不稳定性,并表明尽管这些模型可以通过 outlier-dependent quantization
(我们称之为 proxy quantization
)来稳定,但与 4-bit
精度相比,这并没有改进 bit-level scaling
。另一方面,我们强调 one-shot quantization
方法,即该方法通过 a single mini-batch of data
来优化 quantization
,潜在地可以扩展到 4-bit level
以下。总体而言,这些发现表明,改进 zero-shot bit-level scaling laws
的最有希望的方向是开发新的数据类型和技术,这些技术可以用高精度来量化异常值而不需要大量的 additional bits
。我们还强调了 one-shot quantization
方法的潜力,作为一种实现 low-bit transformers
的方法,如果与我们的见解相结合。
相关工作:
大型语言模型的量化:最相关的工作是针对具有十亿级以上参数的大型语言模型的量化。与小型模型相比,LLM
量化具有一些独特的挑战,例如出现的异常值、以及针对 LLM
的 optimized low-bit inference
。方法之间的一个主要区分因素是: zero-shot quantization
方法(它直接量化一个模型而不需要任何额外信息),以及 one-shot quantization
方法(它需要 a mini-batch of data
进行量化)。虽然 one-shot
方法更加准确,例如 GPTQ
通过 a mini-batch of data
来优化量化期间的 rounding
(《Gptq: Accurate post-training quantization for generative pretrained transformers》
),但它们也更复杂,可能需要几个小时的优化才能使用模型。另一方面,zero-shot
方法的优点是它们可以立即使用,这使它们很容易使用,但 zero-shot
量化方法在更低的精度下通常会失败。
量化方法:与我们的工作相关的另一个方面是量化方法,可以分为几类。例如,存在与 blocking and grouping
相关的方法、 centering
相关的方法、通过聚类找到 learned data types
的方法、或 direct codebook optimization
的方法。虽然我们的工作研究了 grouping and blocking
,但我们只研究了一种通过整个 input tensor
的分位数(quantiles
)对相似权重进行分组的数据类型(《8-bit optimizers via block-wise quantization》
)。虽然我们没有深入研究 learned data types
,但我们是第一项工作来展示这些对改进 LLM
的 bit-level scaling
是至关重要的。
Scaling Laws for Inference
:早期关于 scaling laws
的工作强调了研究变量随规模变化的重要性,因为规模是模型性能的最佳预测指标之一(《Scaling laws for neural language models》
、《A constructive prediction of the generalization error across scales》
、《Deep learning scaling is predictable, empirically》
)。特别是对于推理,已经有工作研究了 4-bit
与 16-bit
模型的 zero-shot
性能的 scaling
趋势(《Glm-130b:An open bilingual pre-trained model》
)。我们研究了从 3-bit
到 16-bit
的精度,并分解了改善 scaling
的因素。
《Efficiently scaling transformer inference》
的工作查看了 production setting
(其中 large batch size
很常见)中的 scaling inference
。虽然他们只对量化进行了基本研究,但他们分解了导致更好 model FLOPS utilization: MFU
的因素。由于减少模型的 bit-precision
可以提高 MFU
,这与我们研究 bit-level scaling
的方法类似。主要区别在于:我们改变模型的 bit-width
,并研究消费者和小型组织常见的 small batch size
。
对于 LLM
,减少模型的 bits
数量与推理延迟( inference latency
)直接相关,这一点可能并不直观。接下来将阐述这种关系的背景知识。之后,我们将介绍quantization
的数据类型和方法。
尽管我们的工作的主要目标是为大型语言模型找到 model bits
和 zero-shot accuracy
之间的最佳 trade-offs
,但 total model bits
也与inference latency
密切相关。整体的计算延迟(从计算开始到结束的时间)主要由两个因素决定:
(1)
:从主内存(mainn memory
)加载数据到缓存和寄存器需要多长时间。
(2)
:执行计算需要多长时间。
例如,对于现代硬件(如 GPU
),加载一个 number
通常需要比用那个 number
进行算术运算花费 100
倍以上的时间(《Dissecting the nvidia turing t4 gpu via microbenchmarking》
、《A not so simple matter of software》
)。因此,减少从主内存加载数据的时间通常是加速整体计算延迟(overall computation latency
)的最佳方法。这种减少主要可以通过 caching
、以及更低精度的 numbers
来实现。
如果两个矩阵都不完全适合设备的 L1
缓存,caching
可以将矩阵乘法的总延迟减少 10
倍或更多(《Dissecting the nvidia turing t4 gpu via microbenchmarking》
)。在矩阵乘法中,batched input
,global memory
)进行多次加载,可以被缓存。
如果 L1
缓存,则不可能进行重用,因为 RTX 3090 or RTX 4090 GPU
,这发生在 inference batch size
低于 60 or 200
时。因此,在这些 batch size
以下,caching
是无效的,inference latency
完全由从加载
因此,在 mini-batch
适合 L1
缓存的情况下,可以通过使用较小的 lower bit-precision per parameter
)从而来减少推理延迟。例如,除了为 quantization
改善 rounding
的算法创新之外,《Gptq:Accurate post-training quantization for generative pretrained transformers》
还为 “ 16-bit
浮点输入且 3-bit
整数型权重” 开发了 inference CUDA kernels
,与“ 16-bit
浮点输入且 16-bit
浮点权重” 相比,这为 OPT-175B
带来了高达 4.46
倍的 inference latency
改善,接近 5.33
倍的 model bits
减少。因此,对于 small inference batch sizes
,total model bits
的减少与 inference latency
高度相关。我们在附录 E
中提供了 roofline model
和初步的 unoptimized implementations
的数据。
这里我们简要概述被研究的的数据类型。有关这些数据类型的完整规范,请参见附录 A
。我们使用四种不同的数据类型:
对于整数类型和浮点数据类型,使用 IEEE
标准。我们的浮点数据类型具有 exponent bias
,其中 exponent bits
。
我们还使用分位数量化(quantile quantization
),这是一种无损最大熵量化数据类型(lossy maximum entropy quantization data type
)(《8-bit optimizers via block-wise quantization》
),其中每个 quantization bin
包含相等数量的值。这确保每个 bit pattern
出现的频率相等。
quantile quantization
可以被定义为:
其中:
quantile function
,它是累计分布函数的逆函数
bit
数量;bin
,quantile quantization
的第 value
。
我们使用 SRAM Quantiles
算法来估计 input tensor
的经验累计分布函数来逼近 input tensor
的 quantiles
。
最后,我们使用动态指数量化(dynamic exponent quantization
)(《8-bit approximations for parallelism in deep learning》
),它使用 indicator bit
将 exponent bit region
和 linear quantization region
分开。通过移动 indicator bit
,exponent
可以在不同的值之间变化。这种数据类型对于数值变化跨越多个数量级的张量具有较低的量化误差。
量化精度(quantization precision
)在一定程度上取决于是否所有 quantization bins
被均匀地使用。例如,4-bit
数据类型有 16
个 bins
,但如果平均只使用了 8
个 bins
,那么就相当于 3-bit
数据类型。因此,帮助增加数据类型中所有 quantization bins
的平均使用率的方法可以增加量化精度。在这一小节中,我们介绍了 blocking
。blocking/grouping
方法将张量分割成更小的 blocks
,并独立地对每个 block
进行量化。这有助于将异常值限制在特定的 blocks
中,从而增加其他 blocks
使用的 bins
的平均数量,进而提高平均的量化精度。
Blocking/Grouping
:blocking
和 grouping
是相似的概念。
在 grouping
中,我们沿着某个维度将张量细分为 group
)分配其自己的归一化常数 absolute maximum
)。
在 blocking
中,我们将张量看作是一个一维的数值序列,并将这个序列划分为大小为 blocks
。
在我们的工作中,我们使用 blocking
,因为与 grouping
不同,它提供了 additional bits per parameter
的指标,独立于 hidden dimension
。例如,使用 16-bit normalization constants
和 block size 64
意味着,我们每 64
个参数有额外的 16 bits
,或者说使用 block-wise quantization
的每个参数增加了 16/64=0.25 bit
的成本;这对于每个模型都是成立的,与 hidden dimension
无关。对于 grouping
,确切的成本将取决于每个模型的 hidden dimension
大小。
对于 block-wise quantization
,我们使用 《8-bit optimizers via block-wise quantization》
的符号,其中定义了:具有 k bits
的 block-wise quantization
、block-size
blocks
。
如果并且我们用索引 block
在 block-wise quantization
可以通过找到 quantization map
的值的最小距离来定义:
其中:
block
,
大型语言模型中出现的异常值特征会导致大的量化误差和严重的性能退化。尽管已经证明使用 16-bit
输入和 8-bit
权重就足以避免这种破坏(《Glm-130b:An open bilingual pre-trained model 》
),但如果我们使用 16-bit
输入和低于 8-bit
精度的权重,异常值特征是否仍会导致性能退化还不清楚。
为此,我们通过 proxy quantization
开发了 outlier-dependent quantization
,其中我们对与 outlier feature dimensions
对应的权重进行更高精度的量化,以测试权重需要多少精度。一个重大挑战是,每个模型具有不同数量的异常值特征,异常值部分地取决于每个 zero-shot task
不同的输入。因此,我们寻求一个 model-independent
的方法,该方法在所有模型和任务上都具有恒定的内存占用。
在初步实验中,我们注意到 《LLM.int8(): 8-bit matrix multiplication for transformers at scale》
开发的准则(即,用阈值来衡量 hidden states
从而检测异常值特征)是不可靠的,因为它取决于 hidden state
的标准差。这会引起问题,因为对于诸如 OPT
之类的模型,hidden state
的标准差在后面的层中增加,这会导致检测到太多的异常值。这也已经得到 《Glm-130b: An open bilingual pre-trained model》
的注意。通过检查 OPT
模型中的这种异常情况,我们发现检测 outlier dimensions
的更好测量是: previous layer
中每个 hidden unit
权重的标准差。产生异常值的 hidden unit
权重的标准差,要比其他维度的标准差高出 20
倍。我们在附录 D
中提供了标准差与异常值大小之间关系的相关性分析的进一步数据。
由于神经网络的全连接特性,每一个
hidden unit
会与多个下一层的hidden unit
相连接。因此,每个hidden unit
对应了多个权重。
有了这一见解,我们开发了所谓的 proxy quantization
。proxy quantization
与输入无关,因此与任务无关,因为它使用每个层 hidden unit
权重的标准差作为哪些维度具有异常值特征的代理。例如,给定一个具有 FFN
和注意力投影层)的transformer
,权重矩阵 hidden units
)。对于第
其中:
上式的物理含义为:寻找
如果 16-bit
;否则为 k-bit
。
第
层的输入为: 。假设原始输入 的方差很小,那么:如果 的第 列方差较大,则第 层的第 列的方差也较大。
配置:
在我们的实验中,我们使用 16-bit inputs
和 k-bit quantized parameters
,16-bit baseline
( 16-bit
浮点数)。
为了衡量 k-bit quantization
方法的推理性能,我们使用 The Pile
的 CommonCrawl
子集上的困惑度指标,以及 EleutherAI LM Evaluation harness
上的平均 zero-shot
性能。具体而言,对于 zero-shot setting
,我们在 GPT-2 setting
下使用 EleutherAI LM eval harness
,在 LAMBADA
、Winogrande
、HellaSwag
和 PiQA
等任务。
选择这些特定的 zero-shot
任务主要是由于前人的工作。但是,在我们的评估中,我们发现困惑度是一个更好的指标,因为每个样本的 continuous value
导致 less noisy evaluations
。这也得到了 《Gptq: Accurate post-training quantization for generative pretrained transformers》
的注意。例如,当使用困惑度来评估数据类型时,quantile quantization
是最佳的数据类型。然而,当我们使用 zero-shot accuracy
作为评估指标时,由于 zero-shot accuracy
存在更多噪声,浮点数据类型有时会较好。
此外,我们发现在超过 35,000
次 zero-shot experiments
中,CommonCrawl
困惑度与 zero-shot performance
之间的皮尔逊相关系数为 -0.94
。这突出表明:困惑度用于评估已经足够,且更可取。
一个严重的缺点是困惑度难以解释。因此,为了清楚起见,我们在论文主体中使用了 zero-shot accuracy
,但鼓励读者使用附录中的困惑度指标进行复现和比较。由于困惑度评估非常可靠,我们可以通过评估 a small number of samples
的困惑度来复制我们的工作,这使得构建 scaling laws
的计算量不那么大。
Scaling Laws
:我们试图将 power laws
拟合我们的数据,但我们发现关于参数数量和 bit-precision
的双变量幂函数(bivariate power function
)的拟合效果很差。但是,当我们拟合线性插值来表示 scaling curves
时,我们发现不同 bit-precisions
几乎是平行的,这表明不同精度的 scaling
趋势可以由一个 base function
、以及每个 bit-precision
的偏移量来准确表示。因此,我们选择使用线性插值来表示 scaling
趋势。
主要结果如 Figure 2
所示,其中描绘了在 Lambada
、PiQA
、HellaSwag
和 Winogrande
任务上的平均 zero-shot accuracy
,给定 OPT
、BLOOM
、Pythia
和 GPT-2
的 total number of bits
,但是参数精度从 3-bit
到 16-bit
。我们得出以下观察:
对于给定的 zero-shot
性能,4-bit
精度对于几乎所有模型族和模型规模都提供了最佳的 scaling
。唯一的例外是 BLOOM-176B
,其中 3-bit
略好但不明显。
scaling curves
几乎是平行的,这表明 bit-level scaling
在很大程度上与 scale
无关。3-bit
量化是一个例外。
即,
Bit-level Inference Scaling Law
与bit
无关。
对于 3-bit
推理,Pythia
和 OPT
不稳定,其中最大的 Pythia/OPT
模型的性能接近随机的准确率。
这个实验的量化是采用类似于
LLM.int8()
的方式进行的,其中高精度量化的权重矩阵列的集合为:
鉴于 Figure 2
中的 main scaling results
,一个重要的后续问题是我们如何进一步改进 scaling
趋势。为此,我们运行了超过35,000
次 zero-shot
实验,以测试 quantization precision
的许多最近研究进展,包括基础数据类型、quantization block size
、以及 outlier-dependent quantization
。
这些方法通常以少量 additional bits
为代价来改进量化误差。例如:
block size = 64
且使用 16-bit quantization constant
,意味着每 64
个参数增加 16
个 additional bits
(或每个参数增加 16/64 = 0.25 bit
)。
outlier-dependent quantization
以 16-bit
精度存储 top p
的权重向量,从而将每个参数的 bits
增加 0.24 bits per parameter
。
6-bit precision
到 8-bit precision
没有改善 scaling
:我们将所有可能的量化方法(数据类型、blocking
)与 6-bit
到 8-bit
量化组合,我们发现这些方法都没有改进 bit-level scaling
(参见附录 C.3
)。对于 6-bit
到 8-bit
精度,模型参数似乎有足够的精度,与 16-bit
权重相比,不会造成明显的性能降低。因此,scaling behavior
只能通过其它方法使用低于 6-bit
的精度(而不是提高 quantization precision
)来改进。
small block size
改善了 scaling
:对于 3-bit
至 5-bit
精度,我们确实看到各种量化方法在 scaling
上的改进。 Figure 3
显示,对于 4-bit Pythia
模型,使用 small block size
可以实现可观的 bit-level scaling
改进。为了给出这一 improvement
的视角:从 block size = 1024
降低到 block size = 64
增加了 0.24 bits per parameter
,但 zero-shot accuracy
的改进几乎与从 4-bit
提升到 5-bit
一样大。因此,对于 4-bit precision
,使用 small block size
增加了几个 extra bits
从而提高了 zero-shot accuracy
。
除了 Pythia
之外,GPT-2
模型也有很大程度的改进。BLOOM
、BLOOMZ
和 OPT
模型有明显改进,但与 Pythia
和 GPT-2
相比,改善的幅度较小,(参见附录 C.2
)。这种关系可能起源于 emergent outlier features
。
对于 5-bit
模型,使用 small block size
的改进很小但仍然显著。 small block size
可显著改进 3-bit
的scaling
,但仍无法与 4-bit precision
的 scaling
相竞争。
数据类型改善了scaling
:从 Figure 3
中可以看出,数据类型改善了 4-bit Pythia
的 scaling
趋势。具体而言,quantile quantization
和浮点数据类型提供了比整数类型和 dynamic exponent quantization
更好的 scaling
。
我们发现:
quantile quantization
通常是所有模型、scales
、精度中最好的数据类型(参见附录 C.5
)。
浮点数据类型似乎优于整数类型,只有少数例外:整数类型对于 5-bit
优于浮点类型。这似乎是因为浮点数据类型高度依赖指数位和小数位之间的平衡,根据特定的 bit precision
,浮点数据类型可以更好或更差。
outlier-dependent quantization
提高了稳定性,但没有提高 scaling
:最后,我们注意到了 OPT
和 Pythia
中的 3-bit
不稳定性,并将其与 emergent outlier features
相关联(《LLM.int8(): 8-bit matrix multiplication for transformers at scale》
、《Smoothquant: Accurate and efficient post-training quantization for large language models》
)。如果我们使用 proxy quantization
将 2%
最重要的异常维度量化为16-bit
而不是 3-bit
,我们可以提高 3-bit Pythia and OPT
模型的稳定性和整体 scaling
。这在 Figure 4(left)
的 OPT
中显示。然而,尽管有这一改进,4-bit precision
仍然提供了更好的scaling
。对于 4-bit precision
,Figure 4(right)
所示的 outlier-dependent quantization
在 scaling
上没有好处,这意味着尽管使用 proxy quantization
时 3-bit precision
有可观的改进,但 4-bit precision
仍是最佳的。因此,似乎异值常特征不需要超过 4-bit precision
的权重就可以提供最佳的 bit-level scaling
。
我们提出以下建议:
默认使用 4-bit quantization
进行 LLM
推理,因为它在 total model bits
和 zero-shot accuracy
之间提供了最佳 trade-offs
。
使用 128
或更小的 block size
来稳定 4-bit quantization
并提高 zero-shot
性能。
使用浮点类型或 quantile quantization
数据类型。在某些情况下,整数类型可能更可取,从而改进 inference latency
(依赖于实现和硬件支持)。
需要高于 4-bit precision
的一个场景是:当 GPU
具有足够的内存来容纳更高的 bit precision
而不是容纳更大的模型时。例如,48 GB GPU
有足够的内存以 5-bit precision
使用 66B
参数模型,但不能以 4-bit
容纳 175B
参数模型。因此,如果需要最大化 zero-shot accuracy
,则对于这种场景,5-bit precision
且 66B
参数模型是可取的。
未来工作的有希望方向:
我们的结果表明当前 4-bit precision
在 bit-level
是最有效率的,但我们也展示了 3-bit scaling
可以明显地被改进。因此,一个有希望的研究方向是关注 4-bit
以下的 low-bit precisions
并改善它们的 scaling
趋势。已经证明 one-shot quantization
(例如使用输入样本优化 quantization
的 GPTQ
)在 low-bit precisions
更有效(《Gptq: Accurate post-training quantization for generative pretrained transformers》
)。Table 1
显示,与 zero-shot 3-bit Float
相比,2-bit GPTQ with blocking
可以获得更好的性能。这突出表明 one-shot
方法对于 low-bit precisions
非常有希望。
另一方面,Figure 5
也表明,与 3-bit Float with a blocksize of 64
相比,3-bit GPTQ without blocking
的 scaling
更差;而 4-bit GPTQ without blocking
与 4-bit Float with a blocksize of 64
的scaling
相似。从这些结果可以看出,我们从 zero-shot scaling laws
中获得的见解可以传递到 one-shot quantization
方法。这表明 zero-shot quantization research
非常适合于分离和理解 quantization scaling
中的各个因素,而 one-shot
方法可以最大化性能。相比之下,当前的 one-shot
方法研究起来非常昂贵。例如,仅对 OPT-175B
和 BLOOM-176B
模型重复我们的 scaling experiments
,估计需要 5120 GPU days
的计算。因此,zero-shot quantization scaling insights
和 one-shot quantization methods
的组合可能产生最佳的未来方法。
我们工作中未解决的一个挑战是数据类型也应该能在硬件级别上高效地使用。例如,尽管 quantile quantization
数据类型展示最佳的 scaling
趋势,但它需要一个小的 lookup table
,这在高度并行的 setup
中很难实现,因为并行内存访问(parallel memory access
)通常会由于序列化而导致性能较差。这个问题可以通过设计新的数据类型来解决,其中这个数据类型既具有 bit-level scaling
效率、又具有硬件效率。解决这个问题的另一种方法是硬件设计:我们能设计什么硬件来高效地使用 quantile quantization
等数据类型?
block-size
和 outlier-dependent quantization
都可以改进异常值的 quantization precision
。虽然 outlier-dependent quantization
在 scaling
上没有改进,但是有理由表明:存在 unknown quantization
方法可以帮助处理异常值,并同时改进 scaling
趋势。因此,未来研究的另一个重点应该集中在最大限度地保留异常值信息,但是最小化使用 additional bits
。
局限性:
尽管我们运行了超过 35,000
次实验,但一个主要局限性是我们没有考虑某些类别的量化方法。例如,存在一些量化方法,其中数据类型使用额外的输入数据进行优化、或数据类型仅从模型的权重进行优化。仅从权重进行优化,与我们研究中最有效的 quantile quantization
类似。因此,这暗示这样的量化方法可以改进 inference
的 scaling
,但我们错过了将其纳入研究的机会。然而,我们的研究是重要一步从而认识到这些方法对于优化 model-bits-accuracy trade-off
的重要性,而这种视角以前不存在。
另一个局限性是缺乏 optimized GPU implementations
。目前还不清楚其他依赖 lookup tables
的数据类型是否能实现明显的加速。然而,我们的 Int/Float
数据类型可以实现高效的实现;即使对于其他数据类型,我们的结果对于未来产生 strong scaling and efficient implementations
的数据类型的开发仍然有用。
虽然我们只通过研究 model-bits-accuracy trade-off
间接地研究了 latency-optimal
视角,但 latency-optimal
视角的一个实际局限性是:low-bit models with 16-bit inputs
可能是 less latency efficient
的,如果这样的模型被部署用于许多用户(《Efficiently scaling transformer inference》
)。给定一个 busy deployed API
,其中每秒处理数千个请求,那么large mini-batch
将不再 fit cache
。这意味着在这种情况下,bit-level scaling laws
与 inference latency
的相关性会越来越小。对于这样的高吞吐量系统,需要建模 low-bit weights and low-bit inputs
的 scaling laws
来研究最佳的 inference latency scaling
。简而言之,我们的 scaling laws
仅对 mini-batch
不适合设备 L1 cache
的 case
有效;除此之外,需要一套新的 scaling laws
。
最后一个局限性是,加载权重矩阵只是 inference latency
优化的一部分。例如,如果不优化 attention operations
,多头注意力可以占据很大一部分推理延迟(《Sparseis enough in scaling transformers》
、《Efficiently scaling transformer inf》
)。然而,模型的整体内存占用仍然被减小,这使得在 GPU
内存有限时,大型语言模型更易于使用。
论文:
《SparseGPT: Massive Language Models Can be Accurately Pruned in One-Shot》
来自 Generative Pretrained Transformer: GPT
家族的大型语言模型(Large Language Models: LLMs
)在广泛的任务中展现出了显著的性能,但由于其巨大的大小和计算成本而难以部署。例如,性能最佳的 GPT-175B
模型拥有 175B
个参数,即使以半精度(FP16
)格式存储也至少需要 320GB
(以 1024
为基数计数)的存储空间,这意味着推理至少需要 5
个 80GB A100 GPU
。因此,通过模型压缩来降低这些成本自然受到了广泛的关注。到目前为止,几乎所有现有的 GPT
压缩方法都集中在量化(《LLM.int8(): 8-bit matrix multiplication for transformers at scale》
、《ZeroQuant: Efficient and affordable post-training quantization for large-scale transformers》
、《Smoothquant: Accurate and efficient post-training quantization for large language models》
、《GPTQ: Accurate post-training compression for generative pretrained transformers》
)上,即降低模型 numerical representation
的精度。
与量化相辅相成的压缩方法是剪枝(pruning
),即移除网络元素,从移除单个权重(非结构化剪枝)到移除更高粒度的结构(如权重矩阵的行或列,即结构化剪枝)。剪枝具有悠久的历史(《Optimal brain damage》
、《Optimal brain surgeon and general network pruning》
),并且在计算机视觉模型、以及较小规模的语言模型中得到了成功的应用(《Sparsity in deep learning: Pruning and growth for efficient inference and training in neural networks》
)。然而,性能最佳的剪枝方法需要对模型进行大量的重新训练以恢复准确率。反过来,这对于 GPT-scale
的模型来说非常昂贵。尽管存在一些准确的 one-shot pruning
方法(《Accelerated sparse neural training: A provable and efficient method to find N:M transposable masks》
、《Optimal Brain Compression: A framework for accurate post-training quantization and pruning》
),即无需重新训练模型就可以进行压缩,但不幸的是,这些方法在应用于数十亿参数的模型时也变得非常昂贵。因此,到目前为止,准确地剪枝数十亿参数模型的工作几乎为空白。
在本文中,我们提出了 SparseGPT
,这是第一种在成百上千亿参数模型规模上高效工作的 accurate one-shot pruning
方法。SparseGPT
的工作原理是将剪枝问题简化为大量的稀疏回归(sparse regression
),然后通过一种新的近似稀疏回归求解器(approximate sparse regression solver
)来解决这些实例。该求解器足够高效,可以在几小时内在最大的公开可用GPT
模型(175B
参数)上单 GPU
执行。同时,SparseGPT
足够准确,在裁剪后仅有微乎其微的准确率下降,无需任何微调。例如,当在最大的公开可用的生成式语言模型(OPT-175B
和 BLOOM-176B
)上执行时,SparseGPT
可以在 one-shot
中诱导(induce
)50-60%
的稀疏度,accuracy loss
很小,无论是从困惑度还是 zero-shot accuracy
来衡量。
我们的实验结果(我们在 Figure 1
和 Figure 2
中提供了概览)得出以下观察。
首先,如 Figure 1
所示,SparseGPT
可以在例如 OPT
家族的 175B
参数变体中诱导高达 60%
的 uniform layer-wise sparsity
,accuracy loss
很小。相比之下,目前已知的可以轻松扩展到这种规模的唯一 one-shot baseline
(Magnitude Pruning
,参考《A simple and effective method for removal of hidden units and weights》
、 《Learning both weights and connections for efficient neural networks》
)只能在稀疏度达到 10%
时保持准确率,而在稀疏率超过 30%
时则完全崩溃。
其次,如 Figure 2
所示,SparseGPT
还能在更严格但对硬件友好的 2:4
和 4:8
半结构化稀疏模式中准确地施加稀疏性(《Accelerating sparse deep neural networks》
);不过对于更小的模型,相对于 dense baseline
,其准确率会有所下降。
一个关键的 positive
发现是,如 Figure 2
所示,更大的模型更容易压缩:在固定的稀疏度下,它们相对于较小的对应模型,损失更少的准确性。(例如,OPT
和 BLOOM
家族中最大的模型可以稀疏化到 50%
而困惑度几乎无增加。)此外,我们的方法允许稀疏度与 weight quantization
技术(《GPTQ: Accurate post-training compression for generative pretrained transformers》
)结合:例如,我们可以在 OPT-175B
上同时诱导 50%
的 weight sparsity
和 4-bit weight quantization
,而困惑度几乎无增加。
一个显著的特点是,SparseGPT
完全是局部的,意味着它仅依赖于 weight updates
,而 weight updates
是为保留每个层的 input-output relationship
而设计的,而 weight updates
是在没有任何 global gradient information
的情况下计算的。因此,我们发现直接在 dense pretrained models
的 “邻域” 中识别这样的 sparse models
是令人惊讶的,其中 sparse models
的输出与 dense model
的输出有极高的相关性。
相关工作:
剪枝的方法:据我们所知,我们是首次研究裁剪大型 GPT
模型的,例如超过 10B
参数的模型。针对这个令人惊讶的 gap
的一个解释是:大多数现有的剪枝方法,例如(《Deep compression: Compressing deep neural networks with pruning, trained quantization and Huffman coding》
、《The state of sparsity in deep neural networks》
、《Well-tuned global magnitude pruning can outperform most bert-pruning methods》
)在剪枝后需要大量的 retraining
从而恢复准确率,而 GPT-scale
的模型无论是训练还是微调通常都需要大量的计算和参数调优(《OPT: Open pre-trained transformer language models》
)。 SparseGPT
是一种 GPT-scale
模型的 post-training
方法,因为它不执行任何微调。到目前为止,post-training pruning
方法只在经典的 CNN
或 BERT-style
模型的规模下进行了研究,这些模型的参数比我们关注的模型少 100-1000
倍。我们在正文部分讨论了这些方法的 scaling
的挑战,以及其与 SparseGPT
的关系。
Post-Training Quantization
:相比之下,对公开的 GPT-scale
模型进行 post-training quantization
有大量工作。具体来说:
ZeroQuant
、LLM.int8()
和 nuQmm
方法研究了对数十亿参数模型进行 round-to-nearest quantization
的可行性,表明通过这种方法可以实现权重的 8-bit quantization
;但由于存在 outlier features
,activation quantization
可能很困难。
《GPTQ: Accurate post-training compression for generative pretrained transformers》
利用近似的二阶信息准确地将权重量化到 2-4 bits
;对于最大的模型,并展示了当与有效的 GPU kernels
相结合时,生成式的 batch-size = 1
的推理可以获得 2-5
倍的加速。
后续工作 《Smoothquant: Accurate and efficient post-training quantization for large language models》
研究了 activation and weight quantization
的联合 8-bits
量化,提出了一种平滑的方案,减少了 activation quantization
的困难,并配合高效的 GPU kernels
。
《Quadapter: Adapter for gpt-2 quantization》
通过 quadapters
(可学习参数的目标是 channel-wise
地缩放 activations
,同时保持其他模型参数不变)来解决量化 activation outliers
的困难。
《The case for 4-bit precision: k-bit inference scaling laws》
研究了模型大小、quantization bits
和不同准确率概念之间的 scaling relationships
,观察到 perplexity scores
与跨任务汇总的 zero-shot accuracy
之间存在高度相关性。
正如我们在正文中所示,SparseGPT
算法可以与 GPTQ
(目前 SOTA
的 weight quantization
算法)结合使用,并且与 activation quantization
方法(Smoothquant
、Quadapter
)兼容。
Post-Training Pruning
:Post-Training Pruning
是一个实际场景,其中我们得到一个经过良好优化的模型 calibration data
),并且必须获得 sparse and/or quantized
版本)。这一 setting
最初在 quantization
的背景下流行,最近也已成功地拓展到剪枝。
Layer-Wise Pruning
:post-training compression
通常通过将 full-model compression
问题拆分为 layer-wise
子问题来完成,其 solution quality
通过如下的方式来衡量:给定输入 uncompressed layer
(权重为 compressed layer
的输出之间的 《Accelerated sparse neural training: A provable and efficient method to find N:M transposable masks》
将此问题表述为:对每个层 target density
),以及可能的 updated weights
其中
然后通过 “拼接” 各个 compressed layers
来获得 overall compressed model
。
Mask Selection & Weight Reconstruction
:上式中 layer-wise pruning
问题的一个关键方面是:掩码 remaining weights
NP-hard
问题。因此,对较大的层(即,参数量较多)进行精确求解是不现实的,这导致所有现有方法都采用近似方法。
一个特别流行的方法是:将问题分解为掩码选择(mask selection
)和权重重构(weight reconstruction
)(《AMC: AutoML for model compression and acceleration on mobile devices》
、《A fast post-training pruning framework for transformers》
、《Accelerated sparse neural training: A provable and efficient method to find N:M transposable masks》
)。具体来说,这意味着:
首先根据一些显著性标准(如权重幅值)(《To prune, or not to prune: exploring the efficacy of pruning for model compression》
)选择一个 pruning mask
然后在保持掩码不变的情况下优化 remaining unpruned weights
。重要的是,一旦掩码固定,上式变为一个易于优化的线性平方误差问题。
Existing Solvers
:
早期工作 (《Hypothesising Neural Nets》
)将迭代线性回归应用于小型网络。
更近期的 AdaPrune
方法(《Accelerated sparse neural training: A provable and efficient method to find N:M transposable masks》
)通过 magnitude-based weight selection
、以及应用 SGD steps
来重构 remaining weights
,在现代模型上为此问题显示了良好的结果。
后续工作表明,通过消除 mask selection
和 weight reconstruction
之间的严格分离,可以进一步改进 pruning accuracy
。
Iterative AdaPrune
(《SPDY: Accurate pruning with speedup guarantees》
)在 gradual steps with re-optimization
中进行剪枝。
OBC
(《Optimal Brain Compression: A framework for accurate post-training quantization and pruning》
)引入了一个贪心求解器(greedy solver
),每次移除一个权重,并在每次迭代后通过有效的闭式方程完全重构 remaining weights
。
扩展到 100B
以上参数的困难:以前的 post-training
技术都是为了准确地压缩最多几亿参数的模型,计算时间在几分钟到几小时。然而,我们的目标是使规模高达 1000
倍的模型稀疏化。
即使是 AdaPrune
这种为理想的 speed/accuracy trade-off
而优化的方法,也需要几个小时才能使仅有 1.3B
参数的模型稀疏化(参见实验部分);如果线性扩展到 175B Transformers
,则需要数百个小时(几周时间)。比 AdaPrune
更准确的方法至少要贵几倍(《SPDY: Accurate pruning with speedup guarantees》
),或者甚至表现出比 linear scaling
更糟的扩展性(《Optimal Brain Compression: A framework for accurate post-training quantization and pruning》
)。
这表明,将现有的 accurate post-training
技术扩展到极大的模型是一项艰巨的任务。因此,我们提出了一种新的基于 careful approximations to closed form equations
的 layer-wise
求解器,SparseGPT
,它可以轻松地扩展到巨大的模型,无论是运行时间还是准确性方面。
SparseGPT
的核心思想与GPTQ
一致:layer-by-layer
地最小化重构误差:其中
为权重矩阵中的某一行。
可以是 quantized weights
、可以是sparsified weights
,甚至可以同时包含稀疏化和量化。
动机:如前所述,对于固定的 pruning mask
mask
中所有权重的最优值,可以通过求解对应于矩阵中每一行 sparse reconstruction
问题来精确地计算(即,采用闭式解)。
一共有
行。
总的时间复杂度为 Transformer
模型,这意味着总运行时间随 hidden dimmension
4
次方扩展;我们需要至少减少一个
Equivalent Iterative Perspective
:为了推导我们的算法,我们首先必须从不同的迭代视角来看待 row-wise weight reconstruction
,使用经典的 OBS update
。对于给定的行,假设损失函数的二次逼近,对于当前权重 OBS update
remaining weights
的最佳调整,从而来补偿移除索引
由于对应于 layer-wise
裁剪 OBS
公式在这种情况下是精确的。因此,optimal weight reconstruction
。此外,给定对应于掩码 optimal sparse reconstruction
OBS
来找到掩码 optimal reconstruction
。因此,这意味着:我们并不是直接地求解 full mask
OBS
应用于逐个裁剪权重 full mask
regression reconstruction
相同的最优解。
表示这样的掩码:裁剪位置 并保留所有其它位置。
Optimal Partial Updates
:应用 OBS
更新 all available parameters
的值(在当前掩码 remaining unpruned weights
的权重会怎样呢?因此,我们仍然可以从误差补偿(error compensation
)中受益,仅使用子集 OBS
的成本。
这样的 partial update
确实可以通过简单地使用对应于 OBS update
,并仅更新 layer-wise
问题的损失函数对于 OBS update
仍然是最优的:对 approximation error
,只是误差补偿可能不那么有效,因为可供调整的权重更少。与此同时,如果 masked Hessians
。
Hessian Synchronization
:接下来,假设输入特征的固定顺序
换句话说,从包含所有索引的 inverse Hessians
《Optimal Brain Compression: A framework for accurate posttraining quantization and pruning》
,通过高斯消元法可以在 updated inverse
其中 inverse Hessians
可以在
一旦某个权重 unpruned weights
以实现最大的误差补偿。这导致以下策略:对于所有的行 inverse Hessians
inverse Hessians
reused
从而在所有行中 remove weight j
(当权重 pruning mask
的一部分时)。该算法的可视化描述见 Figure 4
。
计算复杂度:总成本由三部分组成:
(a)
:计算初始海森矩阵,需要时间 A
)。
(b)
:遍历 inverse Hessian
集合需要时间
(c)
:reconstruction/pruning
本身。后者成本可以用对
总共这些加起来为 Transformer
模型,这简单地是 exact reconstruction
快了整整一个
Weight Freezing Interpretation
:虽然我们将 SparseGPT
算法表示为对 exact reconstruction
的逼近,使用 optimal partial updates
,但这个方案还有另一种有趣的视角。具体来说,考虑一个 exact greedy framework
,它按列压缩权重矩阵,在每一步总是最优地更新所有尚未压缩的权重。乍看之下,SparseGPT
似乎不适合这个框架,因为我们在每列中只压缩一些权重,也只更新一部分未压缩的权重。然而,从原理上讲,“压缩”一个权重最终意味着将其固定为某个特定值,并确保它不会通过某些未来的更新再次 “解压缩”,即固定它。因此,将 column-wise compression
定义为:
即,将不在掩码中的权重置零,并将其余权重固定为当前值,那么我们的算法可以解释为精确的 column-wise
贪心方案。这种视角将允许我们干净地将 sparsification
和 quantization
合并为单个压缩过程。
到目前为止,我们仅关注 weight reconstruction
,即假设固定的 pruning mask
AdaPrune
(《Accelerated sparse neural training: A provable and efficient method to find N:M transposable masks》
),一个简单的选择掩码的选项是:根据 magnitude pruning
(《To prune, or not to prune: exploring the efficacy of pruning for model compression》
)。然而,最近的工作(《OptimalBrain Compression: A framework for accurate posttrainingquantization and pruning》
)表明,剪枝过程中,updates
由于 correlations
显着改变了权重,并且在 mask selection
中考虑这一点可以得到更好的结果。通过在 reconstruction
过程中自适应地选择掩码,可以将这一见解集成到 SparseGPT
中。
一个明显的方法是在压缩列 p%
权重,从而达到整体 p%
稀疏度。这个方法的最大缺点是:稀疏度无法在列之间非均匀分布,施加了额外的不必要结构。这对于拥有少量 highly-sensitive outlier features
(《LLM.int8(): 8-bit matrix multiplication for transformers at scale》
、《Smoothquant: Accurate and efficient post-training quantization for large language models》
)的大型语言模型来说尤其成问题。
我们通过 iterative blocking
来消除这一缺点。更准确地说,我们总是以 pruning mask
(见附录 A
),基于 OBS
的重构误差 block
的 mask
,并执行下一个 non-uniform selection
,特别是还使用了相应的海森矩阵信息,同时也考虑了先前的权重更新。(对于单个列
怎么选择?读者猜测:选择重构误差最小的
的权重。
SparseGPT
也可以容易地适配到诸如流行的 n:m sparsity
格式(《Learning N:M fine-grained structured sparse neural networks from scratch》
、《Accelerated sparse neural training: A provable and efficient method to find N:M transposable masks》
)等半结构化模式,其 2:4 implementation
在 Ampere NVIDIA GPU
上提供了速度提升。具体来说,每连续 block size
mask selection
中强制 zeros-constraint
,选择导致最低误差的
最后,我们注意到,在这个半结构化场景中,较大的 column-sets
之间非均匀地分布。
根据前面讨论的 weight freezing interpretation
,SparseGPT reconstruction
可以转化为最近的量化算法 GPTQ
的 column-wise greedy framework
。这意味着我们还可以继承 GPTQ
的几个算法增强,具体为:
通过 Cholesky
分解来预计算所有相关的 inverse Hessian
信息,从而实现数值稳定性。
应用 lazy batched weight matrix updates
从而提高算法的 compute-to-memory ratio
。
我们的 adaptive mask selection
以及其向 semi-structured pruning
的扩展也与所有这些额外技术兼容。
Algorithm 1
以 fully-developed
的形式呈现了 SparseGPT
算法的 unstructured sparsity
,集成了 GPTQ
的所有相关技术。
Algorithm 1
运行在 GPTQ
的 column-wise greedy framework
中,因此共享如下的计算密集步骤:计算 Cholesky
分解、连续地更新 joint procedure
成为可能。具体来说,所有被 SparseGPT
固定的权重额外地被量化,导致在后续 update step
中补偿以下泛化误差:
其中,quantization grid
上的 nearest value
。关键是,在此方案中,single pass
中几乎没有额外成本就可以联合地执行量化和剪枝。此外,联合执行量化和剪枝意味着后面的 pruning decisions
会受到前期的 quantization rounding
的影响;反之亦然。这与先前的 joint
技术(《Optimal Brain Compression: A framework for accurate post-training quantization and pruning》
)形成对比,后者首先使层稀疏化,然后简单地量化 remaining weights
。
配置:我们在 PyTorch
中实现 SparseGPT
,并使用 HuggingFace Transformers
库来处理模型和数据集。所有剪枝实验都是在具有 80GB
内存的单个 NVIDIA A100 GPU
上进行的。在此设置下,SparseGPT
可以在大约 4
小时内完全稀疏化 175B
参数模型。类似于 ZeroQuant
和 GPTQ
,我们顺序地剪枝 Transformer layers
,这大大减少了内存需求。我们的所有实验都是在 one-shot
操作中进行的,没有微调,与最近关于 GPT-scale
模型 post-training quantization
的工作(GPTQ
、ZeroQuant
、LLM.int8()
)采用了类似的设置。另外,在附录 E
中,我们使用现有工具研究了稀疏模型的实际加速效果。
对于 calibration
数据,我们遵循 《GPTQ: Accurate post-training compression for generative pretrained transformers》
,使用从 C4
数据集的第一个 shard
中随机选择的 128
个 2048-token segments
。这代表了从互联网上爬取的通用文本数据,并确保我们的实验仍然是 zero-shot
的,因为剪枝过程中没有看到特定任务的数据。
模型、数据集和评估:
我们主要使用 OPT
模型系列来研究 scaling
行为,但也考虑了 BLOOM
的 176B
参数版本。尽管我们的重点在于非常大的变体,但我们也在较小的模型上显示了一些结果。
就指标而言,我们主要关注困惑度,已知困惑度是一个具有挑战性的和稳定性的指标,非常适合评估压缩方法的准确性。
我们考虑原始 WikiText2
和 PTB
的测试集、以及 C4
验证数据的子集,这些都是 LLM
压缩的文献中的常用基准。
为了增加解释性,我们还提供了 Lambada
、ARC (Easy and Challenge)
、PIQA
和 StoryCloze
上的 zero-shot accuracy
结果。
我们注意,我们评估的重点在于稀疏模型相对于稠密 baseline
的准确性,而不是绝对数字。不同的预处理可能影响绝对准确性,但对我们的相对论断几乎没有影响。困惑度的计算严格遵循 HuggingFace
描述的过程,使用 full stride
。我们的 zero-shot evaluations
是使用 GPTQ
的实现进行的,后者又基于流行的 EleutherAI-eval harness
。附录 B
中可以找到更多评估细节。所有稠密的和稀疏的结果都是使用完全相同的代码(在补充材料中提供)来计算的,以确保公平比较。
baselines
:
我们与标准的 magnitude pruning baseline
(《To prune, or not to prune: exploring the efficacy of pruning for model compression》
)进行比较,layer-wise
地应用,可扩展到最大模型。
在高达 1B
参数的模型上,我们还与 AdaPrune
进行了比较,后者是现有 accurate post-training pruning
方法中最高效的。为此,我们使用 《SPDY: Accurate pruning with speedup guarantees》
的内存优化重新实现,并进一步调优 AdaPrune
作者提供的超参数。因此,在我们关注的模型上,我们实现了约 3
倍的加速,而不影响解质量。
Pruning vs. Model Size
:我们首先研究 pruning LLMs changes
与模型大小的关系。我们考虑整个 OPT
模型族,并统一地裁剪所有线性层,排除 embedding layer
和 head layer
,这是标准做法(《Movement pruning :Adaptive sparsity by fine-tuning》
、《The Optimal BERT Surgeon: Scalable and accurate second-order pruning for large language models》
),从而达到 50% unstructured sparsity
、full 4:8 or full 2:4 semi-structured sparsity
(2:4
模式是最严格的)。原始 WikiText2
性能指标如Table 1
所示,并在 Figure2
中可视化。PTB
和 C4
的对应结果可以在附录 C
中找到,并且整体显示出非常相似的趋势。
一个直接的发现是:在不同规模上,magnitude-pruned
模型的准确率都崩溃了,通常较大的变体下降得比较小的变体更快。这与较小的视觉模型形成鲜明对比:后者通常可以通过简单的 magnitude selection
来裁剪到 50%
或更高稀疏度,但是损失很小的准确率。这突出了对大型生成式语言模型准确地裁剪的重要性,但也凸显出困惑度是一个非常敏感的指标。
对于 SparseGPT
,趋势非常不同:
即使在 2.7B
参数时,困惑度损失约为 1
点。
在 66B
参数时,损失基本为零。
在最大规模上,甚至相对于 dense baseline
略有准确性提升,然而这似乎与数据集有关(参见附录 C
)。
如预期的那样,相比 magnitude pruning
,AdaPrune
也产生了很大的改进,但不如 SparseGPT
准确。尽管 AdaPrune
的效率很高,但在 350M
模型上运行它大约需要 1.3
小时、在 1.3B
模型上运行它需要 4.3
小时;而 SparseGPT
可以在大致相同的时间内完全稀疏化 66B
和 175B
参数模型, 在相同的单块 A100 GPU
上执行。
总体来说,更大的模型更容易稀疏化的趋势是明显的,我们推测这是由过参数化(overparametrization
)导致的。对这一现象进行详细研究将是一个不错的未来工作方向。
对于 4:8 and 2:4 sparsity
,行为类似,但准确性下降通常更高,因为稀疏模式更受约束(《Accelerated sparse neural training: A provable and efficient method to find N:M transposable masks》
)。尽管如此,在最大规模上,对于 4:8 and 2:4 sparsity
,困惑度分别仅仅增加仅为 0.11
和 0.39
。
超过 100B
参数模型的 Sparsity Scaling
:接下来,我们仔细研究目前最大的公开稠密模型 OPT-175B
和 BLOOM-176B
,并研究SparseGPT
或 magnitude pruning
引起的稀疏度对其性能的影响。结果如 Figure 1
和 Figure 5
所示。
对于 OPT-175B
模型(Figure 1
),magnitude pruning
最多只能达到 10%
的稀疏度,然后发生显著的 accuracy loss
。同时,SparseGPT
可以在类似的 perplexity increase
下达到 60%
的稀疏度。
BLOOM-176B
(Figure 5
)对 magnitude pruning
似乎更有利,允许 30%
的稀疏度而不会重大损失。尽管如此,在类似水平的 perplexity degradation
下,SparseGPT
可以提供 50%
的稀疏度,提高了 1.66
倍。即使在 80%
的稀疏度下,SparseGPT
压缩的模型仍取得合理的困惑度,而 magnitude pruning
分别对 OPT
和 BLOOM
在 40/60%
的稀疏度下就已经导致完全崩溃( 大于 100
的困惑度)。
值得注意的是,SparseGPT
从这些模型中删除了大约 100B
个权重,对准确率的影响很小。
ZeroShot
实验:为补充 perplexity
的评估,我们在几个 zero-shot
任务上提供了结果。已知这些评估相对地 noisy
(《LLM.int8(): 8-bit matrix multiplication for transformers at scale》
),但更具解释性。请参阅 Table 2
。
整体上,类似的趋势保持不变:magnitude-pruned
的模型崩溃到接近随机性能,而 SparseGPT
模型保持接近原始准确率。
然而,如预期的那样,这些数字更加 noisy
:尽管是最受约束的稀疏模式,2:4 pruning
在 Lambada
上似乎实现了明显高于稠密模型的准确率。考虑许多不同任务时,这些效应最终会平均化,这与文献一致。
Joint Sparsification & Quantization
:另一个有趣的研究方向是稀疏性和量化的组合,这将允许组合来自稀疏性的计算加速、以及来自量化的内存节省。具体来说,如果我们压缩模型到 50% sparse + 4-bit weights
,只存储非零权重并使用 bitmask
指示其位置,那么这与3-bit
量化具有相同的总体内存消耗。因此,在 Figure 6
中,我们将 SparseGPT 50% + 4-bit
与目前 SOTA
的GPTQ 3-bit
进行了比较。可以看出:对于 2.7B+
参数的模型,SparseGPT 50% + 4-bit
模型比各自的 GPTQ 3-bit
版本更准确,包括在 175B
模型上的 8.29 vs. 8.68
。
我们还在 OPT-175B
上测试了 2:4 and 4:8 in combination with 4-bit
,分别得到了 8.55
和 8.85
的困惑度,这表明 4-bit
权重量化仅在 semi-structured sparsity
之上带来约 0.1
的困惑度增加。
Sensitivity & Partial N:M Sparsity
:关于 n:m pruning
的一个重要实际问题是,如果 fully sparsified model
不够准确,该怎么办?overall sparsity level
不能简单地统一降低,相反,必须选择 layers
的一个子集进行完全地 n:m-sparsify
。我们现在研究极端大语言模型背景下做出 good selection
的问题:我们假设 OPT-175B/BLOOM-176B
的 layers
中,三分之二的层应裁剪为 2:4 sparsity
,并考虑跳过某种类型的所有层(attention layer
、fully-connected-1 layer
、或者 fully-connected-2 layer
)、或跳过占总层数三分之一的连续层(前面三分之一、中间三分之一、最后三分之一)。结果如 Figure 7
所示。
尽管模型之间的 layer-types
敏感性差异显著,但模型部分方面似乎存在明确的趋势:later layers
比 earlier layers
更敏感;跳过最后三分之一层的模型可以获得最佳准确率。这对实践有非常重要的意义,那就是由于 SparseGPT
的顺序性质(sequential nature
),我们能够生成稀疏性逐渐增加的 2:4 sparsified
模型的一个序列(如 1/2, 2/3, 3/4, ...
),通过在 single pruning pass
中结合两种方式:在前面 SparseGPT
,以及原始模型的最后 model sequences
的准确性如附录 D
所示。
消融研究:
Calibration Data
数量:随着 calibration
样本数量的增加,准确性得到改善。但是当数量超过某个点时,困惑度曲线逐渐变平缓。由于更多的样本数量增加了计算代价和内存代价,因此在实验中我们选择 128
个 calibration
样本。
Hessian Dampening
:整体而言,dampening
参数不太敏感,除非它非常高。我们选择 1%
(即,0.01
)的 dampening
。
Mask Selection Blocksize
:block_size = 1
(对应于 column-wise
)、以及 block_size = 4096 and 8192
(接近 full blocksize
)效果最差。block_size
在 100
附近获得更好的准确性,因此我们选择 block_size = 128
。此外,block_size = 128
也简化了算法的实现,因为它匹配了默认的 lazy weight update batchsize
。
局限性:
我们主要关注 uniform per-layer sparsity
,但 non-uniform distributions
是有前景的未来工作主题。
此外,SparseGPT
目前在非常大的变体上的准确性还不如在最小的和中等大小的变体上。我们认为这可能通过仔细的部分微调或完全微调来解决,这在数十亿参数的模型规模上已经开始成为可能。
最后,虽然我们在本文中研究了 pretrained foundation models
的稀疏化,但我们认为研究诸如指令微调、或具有 reinforcement learning with humanfeedback: RLHF
等额外 post-pretraining
技术如何影响可压缩性也将是一个重要的未来研究领域。