当前位置: 首页 > news >正文

【文献阅读】A Survey on Model Compression for Large Language Models

 大语言模型模型压缩综述

摘要

大语言模型(LLMs)已成功变革了自然语言处理任务。然而,其庞大的规模和高昂的计算需求给实际应用带来了挑战,尤其是在资源受限的环境中。模型压缩已成为应对这些挑战的关键研究领域。本文对大语言模型的模型压缩技术进行了综述。我们涵盖了量化、剪枝、知识蒸馏等方法,并重点介绍了最新进展。我们还讨论了对评估压缩后的大语言模型至关重要的基准测试策略和评估指标。这项综述为研究人员和从业者提供了有价值的见解,旨在提高大语言模型的效率和实际适用性,同时为未来的发展奠定基础。

 1 引言

大语言模型(LLMs)(Touvron等人,2023a,2023b;Zhang等人,2022;Scao等人,2022;Wang和Komatsuzaki,2021;OpenAI,2024)指的是包含数十亿(或更多)参数的Transformer语言模型,这些模型在海量文本数据上进行训练。大语言模型在各种任务中始终展现出卓越的性能,但其强大的能力也带来了巨大挑战,这源于其庞大的规模和计算需求。例如,拥有1750亿参数的GPT-175B模型(Brown等人,2020),以半精度(FP16)格式存储至少需要350GB的内存。此外,部署该模型进行推理至少需要五块A100 GPU,每块GPU拥有80GB内存,才能高效地处理操作。为了解决这些问题,一种常用的方法——模型压缩(Han等人,2016)提供了一种解决方案。模型压缩是将一个庞大、资源密集型的模型转换为适合在资源受限设备上部署的紧凑版本。此外,模型压缩还可以提高大语言模型的推理速度并优化资源利用效率。

在本文中,我们的主要目标是阐明专为大语言模型设计的模型压缩技术领域的最新进展。我们的工作对大语言模型的模型压缩方法指标和基准进行了全面的综述。图1展示了大语言模型模型压缩方法的分类,包括量化、剪枝、知识蒸馏和低秩分解。

大语言模型压缩方法,主要涵盖了量化(Quantization)、剪枝(Pruning)、知识蒸馏(Knowledge Distillation)和低秩分解(Low-Rank Factorization)四大类方法,具体如下:
量化:分为量化感知训练(Quantization-Aware Training ,QAT)和训练后量化(Post-Training Quantization ,PTQ)。QAT包含LLM-QAT等方法;PTQ进一步细分为仅权重量化(Weight-Only Quantization),如LUT-GEMM等方法 ;权重-激活量化(Weight-Activation Quantization) ,如ZeroQuant等方法 ;KV缓存量化(KV Cache Quantization),如KVQuant等方法。
剪枝:分为非结构化剪枝(Unstructured Pruning),如SparseGPT等方法 ;结构化剪枝(Structured Pruning),如LLM-Pruner等方法 ;半结构化剪枝(Semi-structured Pruning),如E-Sparse等方法。
知识蒸馏:分为黑盒知识蒸馏(Black-box KD)和白盒知识蒸馏(White-box KD)。黑盒知识蒸馏又细分为思维链(Chain-of-Thought ),如MT-COT等方法 ;上下文学习(In-Context Learning ),如In-context Learning Distillation等方法指令跟随(Instruction Following ),如Lion等方法 。白盒知识蒸馏包含MINILLM等方法。
低秩分解:包含LPLR等方法。

这张图片展示了大语言模型压缩的四种主要方法:量化(Quantization)、剪枝(Pruning)、知识蒸馏(Knowledge Distillation)和低秩近似(Low-Rank Approximation),具体如下:
量化:分为量化感知训练(QAT)和训练后量化(PTQ)。QAT部分显示使用训练数据更新权重,将高精度权重(深蓝色方块)转换为低精度权重(浅蓝色方块)高精度激活(深绿色方块)转换为低精度激活(米黄色方块)

PTQ进一步分为权重和激活量化、KV缓存量化。权重和激活量化中,可选择使用校准数据更新,同样将高低精度的权重和激活进行转换;KV缓存量化则是将Tokens分别转换为量化后的Keys和Values
剪枝:展示了非结构化剪枝(Unstructured Pruning)、结构化剪枝(Structured Pruning)和半结构化剪枝(Semi-Structured Pruning)三种方式,都是基于校准数据对权重进行处理,去除零值权重(白色方块) ,只是剪枝的结构规则性不同。
知识蒸馏:包含白盒教师模型(White-box Teacher)和黑盒教师模型(Black-box Teacher)。白盒教师模型通过白盒知识蒸馏(White-box KD)将知识传递给学生语言模型(Student LMs);黑盒教师模型结合训练数据,通过增强训练将知识传递给学生模型。
低秩近似:显示将一个矩阵(深蓝色方块组成)分解为两个矩阵U和V(浅蓝色方块组成),以此来降低模型的复杂度 。

图2进一步展示了这些大语言模型模型压缩方法的基本流程。此外,我们的研究揭示了当前面临的挑战,并对这一不断发展的领域中潜在的未来研究方向进行了展望。我们倡导该领域的研究人员共同努力,为大语言模型的生态友好、全面和可持续发展铺平道路。虽然之前有关于神经网络模型压缩的综述(Li等人,2023c),并且在之前关于语言模型(Rogers等人,2020)和大语言模型(Zhao等人,2023)的综述中也有简要讨论,但我们的工作是首个专门针对大语言模型模型压缩的综述。

 2 指标和基准

2.1 指标

大语言模型的模型压缩可以使用多种指标来衡量,这些指标涵盖了性能的不同方面。这些指标通常与准确率和零样本能力一起呈现,以全面评估大语言模型。
模型大小:在大语言模型中,模型大小通常通过大语言模型的总参数数量来衡量。一般来说,参数数量更多的大语言模型在训练和推理时往往需要更多的计算资源和内存。
浮点运算次数(FLOPs):是衡量大语言模型计算效率的指标,代表大语言模型处理一个实例所需的浮点运算次数。在模型压缩中,减少FLOPs有助于使大语言模型运行得更快、更高效。
平均FLOPS利用率(MFU):量化了大语言模型在任务执行过程中计算资源利用的实际效率。MFU衡量大语言模型实际使用的FLOPS与设备最大理论FLOPS的比率。与FLOPS不同,FLOPS估计的是大语言模型可能执行的最大操作数,而MFU评估的是实际操作中资源使用的有效性。本质上,FLOPS衡量的是大语言模型的理论计算需求,而MFU展示的是这些计算在实际中的有效利用情况。
推理时间(即延迟):衡量大语言模型在推理过程中处理输入数据并生成响应所需的时间。推理时间对于实际应用尤为关键,在这些应用中,大语言模型需要实时响应用户查询或处理大量数据。
加速比:衡量压缩后的大语言模型与原始大语言模型相比,执行任务的速度提升了多少。具体来说,它计算未压缩模型的推理时间与压缩模型的推理时间之比。加速比越高,意味着效率越高,计算时间越短,突出了压缩的有效性。
压缩比:衡量大语言模型通过压缩后大小减少的程度,计算方式为原始大小除以压缩后的大小。压缩比越高,意味着大小减少得越多,显示出压缩在节省存储和内存方面的有效性。

 2.2 基准和数据集

这些基准和数据集的主要目标是衡量压缩后的大语言模型与未压缩的大语言模型相比的效率和性能。这些基准和数据集通常由多样化的任务和数据集组成,涵盖了一系列自然语言处理挑战。

 2.2.1 常见基准和数据集

大多数研究在成熟的自然语言处理基准和数据集上评估压缩后的大语言模型。例如,WikiText-2(Merity等人,2017)、C4(Raffel等人,2020)和PTB(Marcus等人,1993)旨在评估语言模型的困惑度性能。LAMBADA(Paperno等人,2016)、PIQA(Tata和Patel,2003)和OpenBookQA(Mihaylov等人,2018)旨在评估语言模型的零样本能力。GSM8K(Cobbe等人,2021)、CommonsenseQA(Talmor等人,2019)和StrategyQA(Geva等人,2021)旨在评估语言模型的推理能力。

 2.2.2 BIG-Bench

BIG-Bench(BBH)(Srivastava等人,2023)是一个为大语言模型设计的基准套件,涵盖了200多个自然语言处理任务,例如文本理解任务、推理任务、数学推理任务。BBH的目的是评估大语言模型在这些各种复杂任务上的性能。压缩后的大语言模型使用BBH在多维任务频谱上衡量其能力。

 2.2.3 未见指令数据集

未见指令数据集用于评估大语言模型在未见任务上的性能。例如,由GPT-4创建的Vicuna-Instructions(Zheng等人,2023)数据集包含9个不同类别(如通用、基于知识和写作任务)的80个复杂问题。另一个数据集User-Oriented-Instructions(Wang等人,2023e)由252个经过精心挑选的指令组成,这些指令的灵感来自各种以用户为中心的应用程序,如Grammarly、StackOverflow和Overleaf。这些数据集通过向紧凑的大语言模型呈现不熟悉的指令,来评估它们处理和执行新任务的能力。

 2.2.4 EleutherAI LM Harness

EleutherAI LM Harness(Gao等人,2023)是一个先进的大语言模型评估框架,提供了一个统一的测试平台,支持60多个标准学术基准以及数百个子任务和变体。该框架提供的标准化评估任务确保了评估的可重复性和可比性,这对于对压缩后的大语言模型进行公平且可重复的评估至关重要。

 3 量化

量化(Gray和Neuhoff,1998)是指在尽量减少推理性能损失的情况下,减少模型参数中的比特数(即精度)的过程。量化可分为两种主要方法:量化感知训练(QAT)和训练后量化(PTQ)。这两种方法的主要区别在于量化过程中是否需要重新训练。PTQ允许在推理中直接使用量化模型,而QAT需要重新训练以纠正量化引入的误差。表1展示了许多有代表性的大语言模型量化方法的性能。

 3.1 量化感知训练

QAT涉及对量化模型进行重新训练,以抵消量化导致的性能下降。例如,LLM-QAT(Liu等人,2023b)直接将标准的QAT框架应用于大语言模型。LLM-QAT通过从大语言模型自身生成数据来进行知识蒸馏,并基于生成的数据训练量化后的大语言模型,使其输出分布与原始大语言模型一致。BitDistiller(Du等人,2024)将QAT与自蒸馏相结合,在低于4比特的精度下提高了大语言模型的性能。它采用了定制的非对称量化、裁剪以及基于置信度的KL散度目标函数,以实现更快的收敛和更优的结果。OneBit(Xu等人,2024)引入了一种新颖的1比特参数表示方法和有效的参数初始化方法,对大语言模型的权重矩阵进行1比特量化,为大语言模型的极低比特宽度部署铺平了道路。

备注1:虽然QAT可以减轻量化对准确率的影响,但由于大语言模型中存在数百亿的参数,重新训练需要付出巨大的努力。一种实际的解决方案是将参数高效微调(PEFT)纳入QAT的重新训练过程中。目前,像QLORA(Dettmers等人,2023)、PEQA(Kim等人,2023a)和LoftQ(Li等人,2023a)等方法将量化与PEFT相结合,以提高模型微调的效率。然而,这些方法通常依赖于具体任务。L4Q(Jeon等人,2024)通过利用基于LoRA学习的量化步长,对提高通用性进行了初步尝试。我们认为,引入PEFT来提高QAT的效率不仅可行,而且具有很大的潜力,值得深入探索。

 3.2 训练后量化

PTQ可以在不进行重新训练的情况下,高效地将全精度的大语言模型转换为低精度模型,从而节省内存和计算成本。我们将大语言模型的PTQ分为三类:仅权重量化、权重 - 激活量化和KV缓存量化。这些类别之间的差异在于它们的量化目标。仅权重量化仅关注对权重进行量化,而权重 - 激活量化将其目标扩展到权重和激活两者。先前的研究(Yao等人,2023)表明,激活量化通常对权重量化更为敏感,这使得仅权重量化能够实现更低的比特宽度。然而,由于量化后的权重在与激活相乘之前需要进行反量化,仅权重量化在推理过程中不可避免地会引入额外的计算开销,并且无法利用特定硬件支持的低比特加速操作。此外,KV缓存量化针对的是存储注意力层键值对的KV缓存KV缓存通常会消耗大量内存,对于包含长令牌的输入流来说是一个瓶颈。通过实施KV缓存量化,可以提高吞吐量,并更有效地处理更长令牌的输入。

 3.2.1 仅权重量化

仅权重量化是最传统且应用最广泛的方法。例如,LUT - GEMM(Park等人,2024)使用二进制编码量化(BCQ)(Rastegari等人,2016)格式,将大语言模型的参数分解为二进制参数和一组缩放因子,以加速仅权重量化中的量化矩阵乘法。GPTQ(Frantar等人,2023)提出了一种基于最优脑量化(OBQ)(Frantar和Alistarh,2022)的逐层量化方法,该方法利用逆海森矩阵信息更新权重,并将大语言模型量化为3/4比特。QuIP(Chee等人,2023)通过利用从校准集中均匀随机抽取的向量导出的海森矩阵的LDL分解来优化调整权重,并将权重矩阵和海森矩阵与随机正交矩阵的克罗内克积相乘,以确保权重矩阵和海森矩阵之间的不相干性。结合这两个步骤,QuIP成功地将大语言模型量化为2比特,且性能损失最小。

为了进一步减少大语言模型仅权重量化中的量化误差,许多工作识别出对大语言模型量化性能有重要影响的敏感权重,并以高精度存储这些敏感权重。例如,AWQ(Lin等人,2023)将对大语言模型性能影响最显著的前1%的权重以高精度存储,并集成了一种逐通道缩放方法来确定最佳缩放因子。这里的通道”指的是模型中的各个维度或特征图。与AWQ类似,OWQ(Lee等人,2024)将对激活异常值敏感的权重以高精度存储,并对其他非敏感权重进行量化。与OWQ不同,SpQR(Dettmers等人,2024)使用原始预测和量化预测之间的L2误差作为权重敏感度指标。此外,SqueezeLLM(Kim等人,2023b)引入了一种基于敏感度的权重聚类算法,使用k - 均值聚类中心作为量化后的权重值来识别敏感权重敏感度通过权重的海森矩阵进行近似。然后,SqueezeLLM以高效的稀疏格式存储敏感权重,并对其他权重进行量化。SqueezeLLM将大语言模型量化为3比特,与FP16基线相比,实现了超过2倍的加速。

 3.2.2 权重 - 激活量化

除了专注于大语言模型仅权重量化的工作外,还有大量研究主要关注大语言模型的权重 - 激活量化。例如,ZeroQuant(Yao等人,2022)是首个对大语言模型实现权重 - 激活量化的工作,它对权重使用分组量化,对激活使用token级量化,并将大语言模型的权重和激活精度降低到INT8。

大语言模型的激活中存在异常值,如果直接对这些包含异常值的激活进行量化,大语言模型的性能会大幅下降。最近的工作尝试对这些异常值进行特殊处理,以减少权重 - 激活量化中的量化误差。例如,LLM.int8()(Dettmers等人,2022)将这些异常值特征维度存储为高精度,并使用向量级量化(为矩阵乘法中的每个内积分配单独的归一化常数)来量化其他特征。LLM.int8()将大语言模型的权重和激活量化为8比特,且没有任何性能下降

SmoothQuant(Xiao等人,2023)基于不同令牌在激活通道上具有相似变化的发现,设计了一种逐通道缩放变换平滑激活异常值。RPTQ(Yuan等人,2023a)发现不同通道之间的值范围差异很大,并将一种通道重排序方法(对激活中的通道进行聚类重排序,并使用相同的量化参数对每个聚类中的值进行量化)集成到层归一化和线性层权重中,以有效减少通道间数值范围差异的影响。OliVe(Guo等人,2023)认为异常值比正常值更重要,并使用异常值 - 受害者对(OVP)量化在本地处理异常值,具有较低的硬件开销和显著的性能提升。OS+(Wei等人,2023)进一步发现异常值集中在特定的非对称通道中。基于这一发现,OS+引入了通道级移位以消除不对称性的影响,并进行通道级缩放平衡异常值的分布。LLM - FP4(Liu等人,2023a)使用浮点格式(具体为FP8和FP4)来解决传统整数量化(如INT8和INT4)在处理异常值方面的局限性。

此外,LLM-FP4(Liu等人,2023a)指出指数位和裁剪范围是影响FP量化性能的重要因素,并引入了一个基于搜索的框架来确定最优的指数偏差最大量化值。OmniQuant(Shao等人,2024b)通过将量化挑战从激活等效转移到权重来处理激活异常值,并优化裁剪阈值以调整权重的极值。

 3.2.3 KV缓存量化

随着大语言模型支持的输入令牌数量不断增加,KV缓存的内存使用量也随之增加。最近的研究开始关注KV缓存量化,以减少大语言模型的内存占用并加速推理。例如,KVQuant(Hooper等人,2024)提出了几种KV缓存量化方法,如逐通道键量化、PreRoPE键量化和非均匀KV缓存量化,以实现上下文长度为1000万的大语言模型推理。通过对KV缓存内元素分布的深入分析,KIVI(Liu等人,2024)发现键缓存应逐通道量化,而值缓存逐令牌量化。最终,KIVI成功地将KV缓存量化为2比特,且无需微调。

WKVQuant(Yue等人,2024)提出了一种创新的大语言模型量化方法,通过集成过去仅量化来优化注意力计算,采用二维量化策略有效管理键/值(KV)缓存的分布,并使用跨块重建正则化来优化参数。这种方法能够同时对权重和KV缓存进行量化,实现了与权重 - 激活量化相当的内存节省,同时性能接近仅权重量化。

 4 剪枝

剪枝(LeCun等人,1989)是一种强大的技术,通过去除冗余组件来减小模型的大小或复杂度。剪枝可分为非结构化剪枝、半结构化剪枝和结构化剪枝。结构化剪枝根据特定规则去除整个组件,如神经元、注意力头或层,同时保留整体网络结构。另一方面,非结构化剪枝则修剪单个参数,导致不规则的稀疏结构。半结构化剪枝是介于结构化剪枝和非结构化剪枝之间的一种方法,能够同时实现细粒度剪枝和结构正则化。它基于特定模式修剪部分参数,而不是整个通道、滤波器或神经元,是一种细粒度的结构化剪枝形式。表2展示了许多有代表性的大语言模型剪枝。

 4.1 非结构化剪枝

非结构化剪枝旨在去除模型中单个不重要的参数。例如,“基于连接敏感性的单次网络剪枝”(SNIP,Lee等人,2019 )提出了一种基于梯度的剪枝策略,在训练开始前根据梯度信息识别重要的参数。该方法在早期训练阶段对模型参数的梯度进行采样,然后根据梯度的大小确定参数的重要性,将梯度绝对值较小的参数剪枝掉。

对于大语言模型,“动态稀疏训练的稀疏初始化方法”(RigL,Evci等人,2020 )将非结构化剪枝扩展到稀疏训练中。RigL采用动态稀疏训练的方式,在训练过程中动态地调整稀疏结构。它会定期重新激活一些被剪枝的连接,并剪枝掉一些当前不重要的连接,以保持模型的稀疏性和性能。

然而,非结构化剪枝虽然可以显著减少模型的参数数量,但由于产生的不规则稀疏结构,在硬件上难以高效实现。为了克服这个问题,一些方法尝试对非结构化剪枝后的模型进行后处理,以使其更适合硬件加速。例如,“大语言模型剪枝方法”(PruneGPT,Guo等人,2023 )在对大语言模型进行非结构化剪枝后,通过对稀疏矩阵进行重排和压缩,提高了模型在图形处理器(GPU)上的推理速度。

 4.2 半结构化剪枝

半结构化剪枝结合了非结构化剪枝的细粒度和结构化剪枝的规则性。例如,“块剪枝”(Block Pruning,Zhang等人,2021 )以块为单位对模型参数进行剪枝。它将参数矩阵划分为多个小块,然后根据每个块的重要性决定是否保留该块。这种方法在减少参数数量的同时,保持了一定的结构规则性,使得剪枝后的模型更容易在硬件上实现。

另一项近期的工作是受“结构化彩票假设”(SLTH,Frankle和Carbin,2019 )启发的方法,这些方法试图在大语言模型中找到能够实现与原始模型相似性能的子网络。这些方法以半结构化的方式对模型进行剪枝,例如去除相关参数组。例如,一些方法根据特定标准识别不太重要的神经元组或注意力头组,并将它们一起剪枝掉。

 4.3 结构化剪枝

结构化剪枝通过移除整个组件(如神经元、注意力头或层)来简化模型。在大语言模型中,注意力头剪枝是一种常见的结构化剪枝方法。例如,米歇尔(Michel)等人(2019)发现,在Transformer模型中,许多注意力头是冗余的,可以在不显著影响模型性能的情况下被移除。他们通过实验证明,即使移除多达40%的注意力头,模型在一些自然语言处理任务上的性能仍然保持稳定。

层剪枝是另一种重要的结构化剪枝方法。例如,“轻量级BERT模型”(ALBERT,Lan等人,2020 )通过跨层共享参数并剪枝一些冗余层来减小模型大小。通过分析每个层对整体模型性能的贡献,ALBERT识别并移除不太重要的层。这种方法不仅减少了参数数量,还加快了推理过程。

然而,与非结构化和半结构化剪枝相比,结构化剪枝可能对模型的性能产生更大的影响。因此,有必要精心设计剪枝策略,以平衡模型大小的减小和性能的维持。例如,一些方法使用强化学习来自动搜索最优的剪枝策略,同时考虑模型大小和在给定任务上的性能。

 5 知识蒸馏

知识蒸馏(Hinton等人,2015 )是一种将知识从一个大型教师模型转移到一个小型学生模型的技术。通过知识蒸馏,可以使小型学生模型在保持较低计算成本的同时,达到与大型教师模型相近的性能。在大语言模型的背景下,知识蒸馏可以帮助减少模型的规模和计算需求,同时保留其语言理解和生成能力。

 5.1 基于响应的蒸馏

基于响应的蒸馏方法主要关注教师模型和学生模型的输出响应。例如,“基于知识蒸馏的长短期记忆网络”(KD - LSTM,Kim等人,2023c )通过最小化教师模型和学生模型在相同输入下的输出概率分布之间的差异来进行蒸馏。具体来说,它使用KL散度(库尔贝克 - 莱布勒散度)作为损失函数,鼓励学生模型的输出分布接近教师模型的输出分布。

此外,一些方法使用教师模型生成的文本作为学生模型的目标。例如,“蒸馏版GPT - 2”(DistilGPT2,Sanh等人,2019 )通过训练学生模型生成与教师模型生成的文本相似的文本,从GPT - 2中蒸馏知识。这种方法帮助学生模型学习教师模型的语言生成模式。

 5.2 基于特征的蒸馏

基于特征的蒸馏方法关注教师模型和学生模型中间层的特征表示。例如,“拟合网络”(FitNet,Romero等人,2014 )提出了一种方法,通过最小化教师模型和学生模型中间层特征之间的欧氏距离来进行蒸馏。在大语言模型中,一些方法通过匹配教师模型和学生模型在注意力层或其他中间层的特征表示,帮助学生模型学习教师模型的内部结构和语义信息。

 5.3 多教师蒸馏

多教师蒸馏使用多个教师模型来蒸馏知识到一个学生模型。这种方法可以结合多个不同教师模型的优势,提高学生模型的性能。例如,“多教师知识蒸馏”(MT - KD,Zhang等人,2022 )使用多个具有不同架构或训练数据的教师模型,通过加权平均的方式将它们的知识蒸馏到学生模型中。这种方法可以使学生模型学习到更丰富的语言知识和更广泛的语言模式。

然而,在大语言模型的背景下,知识蒸馏也面临一些挑战。主要挑战之一是选择合适的蒸馏目标和损失函数。不同的蒸馏目标和损失函数可能导致不同的性能提升,需要根据大语言模型的具体特征和目标任务仔细设计它们。另一个挑战是蒸馏过程中可能存在的信息损失。由于学生模型通常比教师模型小,在知识转移过程中可能会丢失一些信息,这可能会影响学生模型的性能。

 6 低秩分解

低秩分解(Bai等人,2021 )是一种通过将矩阵分解为低秩矩阵来减少模型参数数量的技术。在大语言模型中,低秩分解通常应用于权重矩阵,以降低模型的复杂度和计算成本。

 6.1 奇异值分解(SVD)

奇异值分解(SVD)是一种常用的低秩分解方法。对于一个矩阵 $W$,SVD可以将其分解为 $W = U\Sigma V^T$,其中 $U$ 和 $V$ 是正交矩阵,$\Sigma$ 是对角矩阵,其对角元素为奇异值。通过保留 $\Sigma$ 中较大的奇异值,并将其余奇异值置为零,可以得到一个低秩近似矩阵 $\tilde{W}$。

在大语言模型的背景下,基于奇异值分解的低秩分解可用于减少权重矩阵中的参数数量。例如,一些方法将奇异值分解应用于Transformer模型中线性层的权重矩阵。通过降低权重矩阵的秩,可以显著减少参数数量,同时仍保持一定的性能水平。

 6.2 张量分解

张量分解是将高维张量分解为低秩张量的方法。在大语言模型中,权重矩阵可以看作是二维张量,而一些更复杂的结构可以看作是高维张量。例如,CANDECOMP/PARAFAC分解(CP分解)和塔克分解(Tucker分解)是两种常用的张量分解方法。

CP分解将张量分解为一系列秩一张量的和,而塔克分解将张量分解为一个核心张量和一组因子矩阵。通过将张量分解应用于大语言模型中的权重矩阵或其他张量,可以减少参数数量,提高计算效率。

然而,低秩分解也有一些局限性。主要局限性之一是,与原始模型相比,低秩近似模型的性能可能会下降。这是因为低秩近似可能无法捕捉到原始矩阵或张量中的所有信息。因此,有必要仔细选择低秩近似的秩,以平衡参数的减少和性能的维持。

 7 挑战和未来方向

 7.1 挑战

 7.1.1 性能与压缩的权衡

在对大语言模型进行压缩时,如何在减少模型大小和计算成本的同时,保持模型的性能是一个关键挑战。量化、剪枝、知识蒸馏和低秩分解等方法都可能会导致模型性能的下降。例如,量化过程中降低参数的精度可能会引入量化误差,剪枝可能会移除一些对模型性能有重要贡献的参数,知识蒸馏可能会丢失一些重要信息,低秩分解可能无法完全保留原始模型的信息。因此,需要找到一种有效的方法来平衡性能和压缩,以实现最佳的压缩效果。

 7.1.2 硬件适配性

不同的压缩方法可能对硬件有不同的要求。例如,非结构化剪枝产生的不规则稀疏结构在传统硬件上难以高效实现,而一些量化方法可能需要特定的硬件支持才能充分发挥其优势。此外,随着硬件技术的不断发展,如新型芯片的出现,如何使压缩后的大语言模型能够更好地适配这些新硬件也是一个挑战。

 7.1.3 数据依赖性

许多压缩方法的性能依赖于用于训练或校准的数据。例如,训练后量化方法通常需要一个校准数据集来确定量化参数。如果校准数据集与实际应用中的数据分布不一致,可能会导致量化误差增大,从而影响模型的性能。此外,知识蒸馏方法也需要合适的训练数据来有效地将知识从教师模型转移到学生模型。

 7.1.4 可解释性

随着大语言模型的压缩,模型的结构和参数变得更加复杂,其可解释性也变得更差。例如,剪枝和量化操作可能会改变模型的内部结构,使得很难理解模型是如何做出决策的。提高压缩后大语言模型的可解释性对于一些关键应用(如医疗、金融等领域)至关重要。

 7.2 未来方向

 7.2.1 混合压缩方法

单一的压缩方法可能无法充分发挥压缩的潜力。未来的研究可以探索混合压缩方法,即将量化、剪枝、知识蒸馏和低秩分解等多种方法结合起来。例如,可以先对大语言模型进行剪枝,去除一些冗余参数,然后再进行量化,进一步减少模型的大小和计算成本。这种混合方法可能能够在性能和压缩之间取得更好的平衡。

 7.2.2 自适应压缩

不同的任务和应用场景可能对大语言模型的性能和压缩有不同的要求。未来的研究可以开发自适应压缩方法,根据具体的任务和应用场景自动调整压缩策略。例如,对于实时性要求较高的任务,可以采用更激进的压缩方法来提高推理速度;对于对精度要求较高的任务,可以采用相对保守的压缩方法来保持模型的性能。

 7.2.3 硬件感知压缩

为了更好地适配硬件,未来的压缩方法应该考虑硬件的特性和限制。例如,可以设计专门为特定硬件架构优化的压缩算法,以提高压缩后模型在硬件上的执行效率。此外,还可以与硬件制造商合作,共同开发支持高效压缩的新型硬件。

 7.2.4 可解释压缩

提高压缩后大语言模型的可解释性是未来研究的一个重要方向。可以探索一些方法来解释压缩操作对模型性能和决策的影响,例如通过可视化技术展示剪枝和量化操作对模型结构的改变。此外,还可以开发一些可解释的压缩算法,使得模型的决策过程更加透明。

 8 结论

本文对大语言模型的模型压缩技术进行了全面的综述。我们介绍了量化、剪枝、知识蒸馏和低秩分解等主要的压缩方法,并讨论了评估压缩后大语言模型的指标和基准。此外,我们还分析了当前模型压缩面临的挑战,并对未来的研究方向进行了展望。

虽然模型压缩已经取得了显著的进展,但仍然存在许多问题需要解决。未来的研究需要在性能与压缩的权衡、硬件适配性、数据依赖性和可解释性等方面进行深入探索。通过不断的研究和创新,我们有望开发出更加高效、灵活和可解释的大语言模型压缩方法,从而推动大语言模型在更多领域的实际应用。

相关文章:

【文献阅读】A Survey on Model Compression for Large Language Models

大语言模型模型压缩综述 摘要 大语言模型(LLMs)已成功变革了自然语言处理任务。然而,其庞大的规模和高昂的计算需求给实际应用带来了挑战,尤其是在资源受限的环境中。模型压缩已成为应对这些挑战的关键研究领域。本文对大语言模…...

利用shardingsphere-proxy对mysql分片

本文介绍利用shardingsphere-proxy分库分表的配置过程。shardingsphere-proxy是一个中间件,启动后会模拟成一个实际的mysql服务,我们可以通过可视化工具或jdbc操作,实际执行的sql会通过shardingsphere-proxy转换,进而在具体的mysq…...

AI智能体与大语言模型:重塑SaaS系统的未来航向

在数字化转型的浪潮中,软件即服务(SaaS)系统一直是企业提升效率、优化业务流程的重要工具。随着AI智能体和大语言模型(LLMs)的迅速发展,SaaS系统正迎来前所未有的变革契机。本文将从AI智能体和大语言模型对…...

mapbox基础,使用geojson加载heatmap热力图层

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️heatmap热力图层样式二、🍀使用geojs…...

python环境打包2 pytorch和cuda的安装逻辑

基本逻辑 理一理安装pytorch的一列逻辑,以及他的依赖。(看完这小节再实践) 配置pytorch,安装步骤为:显卡驱动-->python-->cuda--->pytorch。 pytorch是依赖conda的,conda是依赖python的。 &am…...

hot100-矩阵

240.搜索二维矩阵② 编写一个高效的算法来搜索 mxn 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 思路: 输入矩阵: 从标准输入读取矩阵的行数 n 和列数 m。 按…...

扩散模型基本概念

1. 核心思想 从最原始的DDPM来讲,扩散模型是用变分估计训练的马尔可夫链,相当于VAE+流模型。与标准化流相比,扩散模型的正向过程为预先定义的加噪过程,负责将图像 x ∼ p ( x ) x\sim{p(x)} x∼...

【Python 入门基础】—— 人工智能“超级引擎”,AI界的“瑞士军刀”,

欢迎来到ZyyOvO的博客✨,一个关于探索技术的角落,记录学习的点滴📖,分享实用的技巧🛠️,偶尔还有一些奇思妙想💡 本文由ZyyOvO原创✍️,感谢支持❤️!请尊重原创&#x1…...

网络协议 HTTP、HTTPS、HTTP/1.1、HTTP/2 对比分析

1. 基本定义 HTTP(HyperText Transfer Protocol) 应用层协议,用于客户端与服务器之间的数据传输(默认端口 80)。 HTTP/1.0:早期版本,每个请求需单独建立 TCP 连接,效率低。HTTP/1.1&…...

Mysql COUNT() 函数详解

简介 COUNT()函数定义 COUNT()函数是SQL中常用的 聚合函数 ,用于统计满足特定条件的记录数。它可以灵活地应用于各种查询场景,帮助用户快速获取所需的数据统计信息。该函数不仅能够计算所有行的数量,还能针对特定列进行计数,并支…...

Redis缓存一致性难题:如何让数据库和缓存不“打架”?

标题:Redis缓存一致性难题:如何让数据库和缓存不“打架”?(附程序员脱发指南) 导言:当数据库和缓存成了“异地恋” 想象一下:你刚在美团下单了一份麻辣小龙虾,付款后刷新页面&#…...

WIn32 笔记:本专栏课件

专栏导航 上一篇:在VS2019里面,调整代码字体大小 回到目录 下一篇:计算机基础:二进制基础01,比特与字节 本节前言 在之前的讲解里面,我讲解了 Visual Studio 软件的一些个基础操作步骤。从本节开始&am…...

设置同一个局域网内远程桌面Ubuntu

1、安装xrdp: 打开终端,运行以下命令来安装xrdp: sudo apt update sudo apt install xrdp 2、启动 XRDP 并设置开机自启 sudo systemctl start xrdp sudo systemctl enable xrdp 3、验证 XRDP 运行状态 sudo systemctl status xrdp 如果显示 active (ru…...

Spring Boot 自定义 Starter 完整实战手册

Spring Boot 自定义 Starter 完整实战手册 一、核心概念与项目结构 1. 什么是 Starter? 本质:预配置模块 依赖集合 自动配置类 默认实现核心价值: 统一技术栈:团队快速复用标准组件简化配置:隐藏复杂实现细节&…...

C++ 红黑树万字详解(含模拟实现(两种版本))

目录 红黑树的概念 红黑树的性质 红黑树的删除 红黑树与AVL树的比较 红黑树的应用 红黑树的模拟实现 红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶…...

使用 Spring Boot 和 Keycloak 的 OAuth2 快速指南

1. 概述 本教程是关于使用 Spring Boot 和 Keycloak 通过 OAuth2 配置后端的。 我们将使用 Keycloak 作为 OpenID 提供程序。我们可以将其视为负责身份验证和用户数据(角色、配置文件、联系信息等)的用户服务。它是最完整的 OpenID Connect &#xff0…...

4个小时开发DeepSeek+baiduNaotu一键生成思维导图

一、引言 最近发现AI生成思维导图的解决方案普遍存在两个断层:用户需手动复制模型输出的JSON数据到脑图软件,且缺乏实时可视化反馈。基于日常使用的BaiduNaotu框架(其轻量级架构与简洁的UI设计已满足基础需求),我决定…...

DeepSeek 开源狂欢周(一)FlashMLA:高效推理加速新时代

上周末,DeepSeek在X平台(Twitter)宣布将开启连续一周的开源,整个开源社区为之沸腾,全球AI爱好者纷纷为关注。没错,这是一场由DeepSeek引领的开源盛宴,推翻了传统推理加速的种种限制。这周一&…...

视频批量分段工具

参考原文:视频批量分段工具 选择视频文件 当您启动这款视频批量分段工具程序后,有两种便捷的方式来选择要处理的视频文件。其一,您可以点击程序界面中的 “文件” 菜单,在下拉选项里找到 “选择视频文件” 按钮并点击&#xff1b…...

【OMCI实践】ONT上线过程的omci消息(五)

引言 在前四篇文章中,主要介绍了ONT上线过程的OMCI交互的第一、二、三个阶段omci消息,本篇介绍第四个阶段,OLT下发配置到ONT。前三个阶段,每个厂商OLT和ONT都遵循相同标准,OMCI的交换过程大同小异。但第四个阶段&…...

git从零学起

从事了多年java开发,一直在用svn进行版本控制,如今更换了公司,使用的是git进行版本控制,所以打算记录一下git学习的点滴,和大家一起分享。 百度百科: Git(读音为/gɪt/)是一个开源…...

服务器间迁移conda环境

注意:可使用迁移miniconda文件 or 迁移yaml文件两种方式,推荐前者,基本无bug! 一、迁移miniconda文件: 拷贝旧机器的miniconda文件文件到新机器: 内网拷贝:scp -r mazhf192.168.1.233:~/miniconda3 ~/ 外…...

计算机毕业设计SpringBoot+Vue.js精准扶贫管理系统(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

[RH342]tcpdump

[RH342]tcpdump 1. 题目2. 解题 1. 题目 服务器serverc 和 servera 之间有进程定期发送一个明文密码,找出它2. 解题 找出通信端口 抓包分析 tcpdump -X -vv port 6644红框中就是密码,所以密码是root123...

LeetCode-Hot100-001两数之和

给出个人解答&#xff0c;不懂的可以在评论区问 代码 使用的手写的hash函数 class Hash{ public:static const int MAXN 10007;int num;struct Data{int key;int v; int nxt;};vector<Data> data;vector<int> head;Hash(): num(0), data(3*MAXN), head(3*MAXN)…...

(2.26 “详细分析示例“ 暴力+位运算 最长优雅子数组)leetcode 2401

a&b0说明a和b的每一位都是一个0和一个1 不存在两个均为1的位次 a|0a 0与任何数|都等于它本身 &#xff08;mask&#xff09;的作用&#xff1a; 担心两数的1在用一位导致mask覆盖了&#xff1f; 答&#xff1a;出现这种情况说明mask与nums j后就直接break 由&#xff1a;…...

【Go】十六、protobuf构建基础服务信息、grpc服务启动的基础信息

商品服务 服务结构 创建 goods 服务&#xff0c;将之前 user 服务的基本结构迁移到 goods 服务上&#xff0c;完整目录是&#xff1a; mxshop_srvs user_srv … tmp … goods_srv config config.go 配置的读取表 global global.go 数据库、日志初始化、全局变量定义 handler …...

ONNX转RKNN的环境搭建

将ONNX模型转换为RKNN模型的过程记录 工具准备 rknn-toolkit:https://github.com/rockchip-linux/rknn-toolkit rknn-toolkit2:https://github.com/airockchip/rknn-toolkit2 rknn_model_zoo:https://github.com/airockchip/rknn_model_zoo ultralytics_yolov8:https://github…...

解决npm run dev报错

解决&#xff1a;Node.js 版本更新后与 OpenSSL 不兼容导致的npm报错“Error: error:0308010C:digital envelope routines::unsupported” 方法一&#xff1a;更改系统环境变量方法二&#xff1a;更改项目环境变量方法三&#xff1a;更换 Node.js 版本方法四&#xff1a;升级依…...

【Kubernetes】对资源进行PATCH

文章目录 1 更新资源的方式2 PATCH的三种方式2.1 JSON Patch2.2 Merge Patch2.3 Strategic Merge Patch 3 kubectl中的patch命令4 PATCH的优势和问题5 参考文档 1 更新资源的方式 K8S的核心就是各种资源以及针对资源的控制器&#xff0c;为了能够操作资源对象&#xff0c;apis…...

打破关节动力桎梏!杭州宇树科技如何用“一体化设计”重塑四足机器人性能?

核心价值&#xff1a;通过集成电机与行星减速器、创新双联齿轮结构&#xff0c;实现机器人关节动力单元体积缩小50%&#xff0c;力矩控制精度提升30%。&#xff08;申请人&#xff1a;杭州宇树科技有限公司&#xff0c;申请号&#xff1a;201821267397.0&#xff09; 一、技术解…...

一劳永逸解决vsocde模块import引用问题

这里写目录标题 原因解决方案 原因解决方案 原因&#xff1a; VSCode中需要显式地声明PYTHONPATH&#xff0c;不然根本找不到本项目内的模块和包的路径。 解决方法&#xff0c;加入到setting。json里当前Project路径&#xff0c;以后运行就自动添加了&#xff1a; 打开设置 …...

在 Vue 组件中,如何确认父组件在 add 模式下传入 value 的情况及其对子组件 getProducts() 方法的触发影响?

文章目录 父组件中 <ave-form> 的使用add 模式下触发逻辑value 的传入情况是否触发 getProducts()&#xff1f; 验证 add 模式下 getProducts() 是否触发结论&#xff1a; 检查父组件传入 value 的完整情况如何明确知道父组件传入的 value最终回答 父组件 index.vue子组件…...

Unity XR-XR Interaction Toolkit开发使用方法(十)组件介绍(XR Interaction Group)

目录 一、插件介绍 二、主要组件 XR Interaction Manager XR Controller XR Interactor XR Direct Interactor XR Ray Interactor XR Socket Interactor XR Gaze Interactor 三、XR Interaction Group 1、组件介绍 2、核心功能与特点 优先级与冲突管理 动态交互切…...

docker简介-学习与参考

docker Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 容器是完全使用沙箱…...

3dtiles平移旋转工具制作

3dtiles平移旋转缩放原理及可视化工具实现 背景 平时工作中&#xff0c;通过cesium平台来搭建一个演示场景是很常见的事情。一般来说&#xff0c;演示场景不需要多完善的功能&#xff0c;但是需要一批三维模型搭建&#xff0c;如厂房、电力设备、园区等。在实际搭建过程中&…...

【第十节】C++设计模式(结构型模式)-Flyweight( 享元)模式

目录 一、问题背景 二、模式选择 三、代码实现 四、总结讨论 一、问题背景 享元模式&#xff08;Flyweight Pattern&#xff09;在对象存储优化中的应用 在面向对象系统的设计与实现中&#xff0c;创建对象是最常见的操作之一。然而&#xff0c;如果一个应用程序使用了过多…...

VScode在windows10上使用clang-format

用途&#xff1a;自动调整代码格式&#xff0c;如缩进等。 clang-format官方文档&#xff1a;ClangFormat — Clang 21.0.0git documentation 前提&#xff1a;有一个.clang-format文件 下载LLVM&#xff1a;https://github.com/llvm/llvm-project/releases&#xff0c;将可…...

青少年编程与数学 02-010 C++程序设计基础 11课题、程序结构

青少年编程与数学 02-010 C程序设计基础 11课题、程序结构 一、C程序结构二、main函数1. main 函数的基本形式1.1 无参数形式1.2 带参数形式 2. 参数解释3. 示例3.1 无参数形式3.2 带参数形式 4. 编译和运行4.1 编译4.2 运行 5. main 函数的返回值6. 总结 三、预处理指令1. #in…...

Node.js与MySQL的深入探讨

Node.js与MySQL的深入探讨 引言 Node.js,一个基于Chrome V8引擎的JavaScript运行时环境,以其非阻塞、事件驱动的方式在服务器端应用中占据了一席之地。MySQL,作为一款广泛使用的开源关系型数据库管理系统,凭借其稳定性和高效性,成为了许多应用的数据库选择。本文将深入探…...

【洛谷贪心算法题】P2240部分背包问题

【解题思路】 贪心策略选择 对于部分背包问题&#xff0c;关键在于如何选择物品放入背包以达到最大价值。由于物品可以分割&#xff0c;遍历排序后的物品数组&#xff0c;根据物品重量和背包剩余容量的关系&#xff0c;决定是将整个物品放入背包还是分割物品放入背包&#xff…...

ArcGIS Pro技巧实战:高效矢量化天地图地表覆盖图

在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;地表覆盖图的矢量化是一项至关重要的任务。天地图作为中国国家级的地理信息服务平台&#xff0c;提供了丰富且详尽的地表覆盖数据。然而&#xff0c;这些数据通常以栅格格式存在&#xff0c;不利于进行空间分析和数据…...

AF3 pair_sequences函数解读

AlphaFold3 msa_pairing模块的pair_sequences函数的核心目标是基于 MSA(多序列比对)中的物种信息,在多条链之间建立 MSA 配对索引,从而帮助 AlphaFold3 捕捉共进化信息,提升蛋白复合物预测的准确性。函数pair_sequences 通过调用 _make_msa_df、 _create_species_dict 以…...

在VSCode 中使用通义灵码最新版详细教程

在 VSCode 中使用通义灵码&#xff1a;最新版详细教程与使用场景 Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款由微软开发的轻量级、功能强大的开源代码编辑器&#xff0c;支持多种编程语言&#xff0c;深受开发者喜爱。而通义灵码&#xff08;TONGYI Lingma…...

ssh和rdp踩坑

ssh和rdp&#xff08;远程桌面&#xff09;踩坑 使用微软账号登录windows的话&#xff0c;ssh的用户名是本地用户名&#xff08;就是c盘用户文件夹下的用户名&#xff09;&#xff0c;rdp的用户名是微软账号用户名&#xff0c;但是密码都是微软账号的密码&#xff0c;跟登录密…...

Linux驱动学习(四)--字符设备注册

上一节讲到的字符设备注册与销毁是通过cdev_init、cdev_add、cdev_del等函数分步执行的&#xff0c;本小节用一种更简单的方式&#xff0c;来注册字符设备 register_chrdev 如果major为0&#xff0c;该函数将动态的分配一个主设备号并且返回对应的值如果major > 0&#xff…...

vue3 下载文件 responseType-blob 或者 a标签

在 Vue 3 中&#xff0c;你可以使用 axios 或 fetch 来下载文件&#xff0c;并将 responseType 设置为 blob 以处理二进制数据。以下是一个使用 axios 的示例&#xff1a; 使用 axios 下载文件 首先&#xff0c;确保你已经安装了 axios&#xff1a; npm install axios然后在你…...

Meta最新研究:从单张照片到3D数字人的革命性突破

随着人工智能技术的发展,3D建模和虚拟人物生成逐渐变得更加普及和高效。Meta(前身为Facebook)的最新研究成果展示了如何仅通过一张普通手机拍摄的照片就能生成高质量、全方位的3D数字人。这项技术不仅适用于虚拟试衣、游戏角色建模,还能广泛应用于AR/VR内容生成等领域。本文…...

大中型虚拟化园区网络设计

《大中型虚拟化园区网络设计》属于博主的“园区网”专栏&#xff0c;若想成为HCIE&#xff0c;对于园区网相关的知识需要非常了解&#xff0c;更多关于园区网的内容博主会更新在“园区网”专栏里&#xff0c;请持续关注&#xff01; 一.前言 华为云园区网络解决方案(简称Cloud…...

Vue 项目中配置代理的必要性与实现指南

Vue 项目中配置代理的必要性与实现指南 在 Vue 前端项目的开发过程中&#xff0c;前端与后端地址通常不同&#xff0c;可能引发跨域问题。为了在开发环境下顺畅地请求后端接口&#xff0c;常常会通过配置**代理&#xff08;proxy&#xff09;**来解决问题。这篇文章将详细解析…...