【文献阅读】The Efficiency Spectrum of Large Language Models: An Algorithmic Survey

news2025/5/19 20:19:25

这篇文章发表于2024年4月

摘要

大语言模型(LLMs)的快速发展推动了多个领域的变革,重塑了通用人工智能的格局。然而,这些模型不断增长的计算和内存需求带来了巨大挑战,阻碍了学术研究和实际应用。为解决这些问题,人们开发了包括算法和硬件解决方案在内的多种方法来提高大语言模型的效率。本综述全面回顾了旨在提高大语言模型效率的算法进展。与其他通常专注于特定领域(如训练或模型压缩)的综述不同,本文探讨了对大语言模型端到端算法开发至关重要的多维度效率。具体而言,它涵盖了与效率相关的多个主题,包括缩放定律、数据利用、架构创新、训练和微调策略以及推理技术。本文旨在为研究人员和从业者提供有价值的参考,为这一关键研究领域的未来创新奠定基础。我们的相关参考文献库维护在此处。

CCS概念:计算数学;计算机系统组织;软件及其工程;计算理论;应用计算。

附加关键词和短语:大语言模型;人工智能;计算效率;内存效率;数据利用;架构设计;训练;微调;推理;软件。

 1 引言

大语言模型(LLMs)[27, 113, 241, 308, 335]以其拥有数亿甚至数千亿参数的庞大规模为特征[12, 23, 53],已成为人工智能领域的核心焦点。以ChatGPT[201]和Claude[2]等应用为代表,这些模型在多种通用任务中展现出了令人瞩目的能力,如文本摘要[309]、翻译[101]、问答[224],甚至基础编码[33],这在很大程度上归因于它们在自然语言理解方面的专长。尽管其卓越性能背后的确切机制仍不明确[348],但人们普遍认为,其大规模赋予了它们在较小模型中未观察到的涌现能力[286],这被视为迈向通用人工智能(AGI)[4, 24]的关键一步。

图 1. PaLM [53] 在不同规模(80 亿、620 亿、5400 亿)下的能力和性能树 [1]。每个圆形节点代表一种特定能力,其大小表示相应的性能水平 —— 圆圈越大,能力越强。随着模型规模的增加,不仅在现有任务上的性能有所提升,还展现出新的能力。 

虽然大语言模型的大规模对于其能力至关重要(见图1),但这也带来了一个显著的缺点:其部署受到高昂的计算成本和内存需求的严重限制[273, 301, 346, 349]。训练这些模型所需的资源巨大,在资源分配和模型设计方面都带来了挑战。例如,探索不同架构或策略的成本变得高得令人却步[335]。此外,它们的大规模使其不适合边缘设备等资源受限的环境,从而缩小了其应用范围[6]。这种计算负担还将大语言模型的开发局限于拥有丰富资源的大公司[23, 200, 215]。许多关键细节,如数据收集流程和训练方法,仍然是专有的,这阻碍了学术研究,并给小公司带来了挑战。此外,训练这些模型对环境的影响也不容忽视,引发了对碳排放和伦理问题的关注[274, 276, 291]。因此,提高大语言模型的效率越来越受到重视。

受对更高效大语言模型这一迫切需求的推动,本综述旨在全面、及时地阐述这一主题。在本文的背景下,“效率”被定义为在不影响模型性能的前提下对计算和内存资源的优化。我们采用整体方法,探索对大语言模型端到端开发至关重要的多个效率维度。这些维度包括数据利用、架构设计、训练和微调策略以及推理技术,从算法软件的角度涵盖了模型开发的整个流程。虽然已有一些综述关注大语言模型效率的特定方面,如数据[322]、训练[246, 340, 349]、微调[329]或推理[301, 346],但它们往往没有提供全面的视角。其他研究,如[273],对自然语言处理(NLP)的各种效率方面提供了有价值的见解,但大语言模型领域的快速发展需要最新、全面的综述。相比之下,本文旨在更全面、及时地概述有助于开发高效大语言模型的关键方法和技术。

本综述的其余部分组织如下,从算法角度全面理解大语言模型效率的多个方面:
- 第2节“背景”介绍大语言模型的核心概念,并概述评估其效率的相关指标。
- 第3节“预算效率”探讨像缩放定律这样的预测方法在给定资源约束下优化大语言模型性能中的作用。
- 第4节“数据效率”聚焦于优化数据利用的技术,从而在不影响性能的情况下减少资源消耗。
- 第5节“架构效率”回顾创新的架构设计,详细探讨架构对效率的影响。
- 第6节“训练和微调效率”讨论从头开始高效训练大语言模型以及针对特定下游任务微调预训练模型的策略。
- 第7节“推理效率”探索旨在加速推理速度和减少内存占用的模型压缩技术领域。
- 第8节“结论”总结本综述的主要发现,并讨论它们对推进高效大语言模型的更广泛影响。

图2展示了大语言模型效率各个维度的示意图。

 2 背景

在本节中,我们将概述构成大语言模型基础的核心概念,以及用于评估其效率的关键指标。

 2.1 大语言模型的核心概念

语言建模是自然语言处理领域的基石,旨在对单词序列的生成可能性进行建模,并预测后续或缺失词元的概率。在过去几十年里,这一领域发生了显著的演变。最初,它根植于统计语言模型[15, 29, 118, 227, 323],之后重点逐渐转移到预训练神经语言模型[130, 156, 189, 190, 207, 215],最近又发展到大语言模型(LLMs)[27, 113, 241, 308, 335]。虽然大语言模型没有标准化的定义,但它们通常以其庞大的参数规模和非凡的学习能力为特征。在本节中,我们采用[335]中概述的标准,重点关注参数超过10亿的语言模型,并详细讨论其核心概念。

架构基础:大语言模型通常可以分为两种主要范式:编码器 - 解码器模型[149, 151, 175, 207, 217, 233],以BERT[130]为代表;以及仅解码器模型[12, 23, 53, 72, 107, 200, 214 - 216, 235, 269 - 271, 293, 331],如GPT系列[23, 200, 214, 215]。BERT使用掩码语言建模进行训练,使其能够通过预测掩码或缺失词元在上下文理解方面表现出色。另一方面,GPT模型使用自回归建模进行训练,通过预测序列中的后续词元,使其具备强大的生成能力。尽管存在这些差异,但这两种类型的模型通常都依赖于Transformer[275]架构,其自注意力机制尤为值得关注。在自注意力机制中,每个词元被表示为一个键、值和查询。查询衡量其他词元(表示为键)在理解特定词元时的重要性。这些权重应用于值,以创建上下文感知表示。这种机制允许序列中的每个词元同时考虑所有其他词元,便于对顺序数据进行并行处理,并有效捕捉长序列依赖关系。因此,多头注意力层通常堆叠形成大语言模型中的深度网络。如今,像GPT - 4[200]和LLaMa[270, 271]这样的仅解码器模型越来越普遍,但自注意力的核心架构模块在这些变体中始终存在。

训练要点:大语言模型通过在广泛多样的数据集上进行初始预训练阶段来获得通用能力[23, 308]。这些数据集涵盖了广泛的来源,如图书、科学论文、代码和网站[322]。然后,在相对较小的数据集上以监督方式对这些基础知识进行微调,目的是使大语言模型能够遵循人类指令,这一过程称为指令调整[49, 54, 56, 170, 202, 257, 265, 284, 329, 338, 344, 351]。接着,对经过指令微调的大语言模型进行人类反馈强化学习,以进一步使其行为与人类偏好和指令保持一致[271]。在当前的环境中,仅解码器模型已成为标准,特别是因为它们具有卓越的生成能力。这些模型在预训练阶段采用自回归目标,以最大化基于先前上下文预测后续词元的可能性。这种自回归预训练的扩展[107, 126]显著增强了大语言模型的能力,如GPT和PaLM系列模型所示[12, 53]。例如,PaLM[53]在7800亿词元的数据集上进行训练,并使用了540亿参数的Transformer架构。其继任者PaLM - 2[12]进一步推进了这一进展;其最大的变体拥有1.1万亿参数,并在包含1.5万亿词元的更多样化的多语言数据集上进行训练。然而,这种扩展也带来了一系列挑战,需要高效的训练基础设施和优化策略。通常采用专注于数据并行性的分布式训练框架,如DeepSpeed[221]和全分片数据并行(FSDP)[3],或像Gpipe[114]和PipeDream[195]这样的流水线并行性。此外,也会使用像Megatron - LM[197, 250]和SARATHI[5]这样的张量并行技术。还经常采用诸如混合精度训练[65, 194, 235]和量化感知训练[168, 176, 296]等专门技术来简化训练过程。这些方法不仅解决了与大语言模型规模相关的计算挑战,还促进了能力越来越强的模型的开发。

提示工程的多样能力:利用大语言模型在各种任务中的多样性的主要机制之一是通过提示工程[172, 290, 343]。在这种情况下,提示由用户给出的自然语言指令组成,用于指导大语言模型的行为。提示工程的艺术在于精心设计这些指令,以从模型中引出特定且上下文合适的响应。两种突出的技术是少样本[23, 287]和零样本[140]提示。少样本提示为模型提供示例任务和相应的解决方案,而零样本提示仅依赖于任务描述。这种提示形式与上下文学习(ICL)密切相关,这一概念最早在GPT - 3[23]中被观察到,它允许模型在不重新训练的情况下适应新任务。当上下文学习与精心设计的提示相结合时,大语言模型的涌现能力,特别是在处理各种未见任务方面,会显著增强。像思维链(CoT)[283, 287]、思维树(ToT)[178, 299, 310]和思维图(GoT)[19]这样的先进提示策略从人类推理和认知结构中汲取灵感。这些策略使大语言模型能够探索回溯、思维合并和想法消除等新能力,从而提高在算术[203]、常识推理[263]和问答[85]等复杂推理任务中的响应质量。因此,提示工程是放大大语言模型多样性和有效性的关键机制。

 2.2 效率评估指标

评估大语言模型的效率需要一种多方面的方法,考虑各种性能指标。这些指标通常与准确性和多样性的度量一起呈现,以提供对大语言模型整体效率和有效性的全面评估。在接下来的段落中,我们将探讨大语言模型领域中常用于理解效率的关键指标。

参数数量

大语言模型中的参数数量是一个关键因素,它直接影响模型的学习能力和复杂性。这些参数包括权重和偏差等元素,在训练或微调阶段是可学习的。较高的参数数量通常使模型能够掌握更复杂的数据模式,有助于各种涌现能力的发展。然而,这带来了训练和推理时计算需求增加的缺点。此外,参数过多可能导致过拟合,特别是在训练数据稀缺的情况下。为了缓解这一问题,通常会使用正则化和早停等常见技术。

模型大小

模型大小定义为存储整个模型所需的磁盘空间,在训练新的大语言模型或使用预训练模型时,通常是首先要考虑的因素。鉴于超大模型可能无法存储或运行,这个指标对于实际部署尤其重要,特别是在边缘设备等存储受限的环境中。模型大小以千兆字节(GB)或兆字节(MB)等单位表示,受多种因素影响。虽然参数数量起着重要作用,但其他因素,如参数使用的数据类型(例如float16、int8)和特定的架构选择也有影响。除了对存储需求的直接影响外,模型大小还间接反映了训练和推理所需的计算资源。

浮点运算次数(FLOPs)

浮点运算次数(FLOPs)通常用于衡量大语言模型的计算复杂性。这个指标计算诸如加法、减法、乘法和除法等浮点运算的数量,给出在单次前向传递中完成的计算量的估计。虽然FLOPs为计算需求和潜在的能源使用提供了有价值的见解,但它并不是一个完整的度量。其他因素,如系统并行性和架构选择,也在决定模型的整体计算效率方面发挥作用。较高的FLOPs计数通常意味着模型的计算需求更高,这对于在资源有限的环境中部署可能是一个挑战。因此,优化这个指标通常是开发更高效大语言模型的关键重点。

推理时间/每秒词元数

推理时间,也称为延迟或时延,衡量大语言模型在推理阶段处理输入并生成响应所需的时间。与FLOPs不同,FLOPs提供了计算需求的理论估计,而推理时间提供了实际性能的实际衡量。这是因为它是在实际部署设置中进行评估的,考虑了特定的硬件和优化。通常以毫秒(ms)或秒(s)为单位表示,这个指标对于需要快速响应或有严格延迟约束的实时应用至关重要。将推理时间归一化得到每秒词元数,它指的是语言模型在一秒内可以处理(读取、分析、生成等)的词元数量。这是一个关键的性能指标,反映了模型的速度和效率。在快速推理时间/每秒词元数和高泛化能力之间取得平衡是开发高效大语言模型的关键重点。

内存占用

内存占用指的是在推理或训练期间加载和运行模型所需的随机存取内存(RAM)量。这个指标对于理解模型的操作需求至关重要,特别是在边缘设备或内存容量有限的服务器等资源受限的环境中。以MB或GB为单位表示,内存占用不仅包括模型参数,还包括其他运行时必需品,如中间变量和数据结构。较大的内存占用可能会限制模型的可部署性,可能需要诸如模型剪枝或量化等优化技术来减少它。

碳排放

碳排放在大型模型的评估中越来越重要,反映了训练和运行这些模型对环境的影响。这个指标通常以模型生命周期(从训练到推理)中排放的二氧化碳当量千克或吨数来衡量。碳足迹受多种因素影响,包括所用硬件的能源效率、电力来源以及模型训练和运行的持续时间。高碳排放不仅对环境有影响,还可能影响部署大语言模型的社会和伦理考量。因此,人们越来越重视优化模型以提高能源效率,从而减少其碳足迹。这通常通过硬件加速、算法改进,甚至为数据中心选择更环保的能源来实现。

 3 预算效率:缩放定律

 3.1 引言

大语言模型(LLMs)的性能受到多种因素的显著影响,包括训练数据、模型大小、架构、计算资源以及训练方法本身。训练大语言模型需要大量资源,使得传统的通过试错来优化这些因素的方法既不切实际又资源密集。因此,在训练前预测大语言模型的性能不仅有益,而且往往是必要的。这种预测方法有助于更有效地规划和分配资源。例如,考虑一个计算资源有限的场景:如何在模型大小和训练数据之间实现最佳平衡,以达到最小的目标函数值?提前回答这些问题可以显著提高大语言模型训练过程的效率和有效性。

最近对预测大语言模型(LLMs)性能的研究主要集中在理解缩放定律[126]。该定律描述了大语言模型的性能如何受到模型架构、神经模型大小、训练计算能力以及可用数据等因素的影响。缩放定律的概念源于用于预测模型泛化的统计力学方法,其历史可以追溯到20世纪90年代初[10, 17, 96, 240]。在现代深度学习模型的背景下,它的相关性最近得到了重新重视[9, 25, 102 - 104, 107, 126, 192, 226, 254, 266, 268]。本节将深入探讨应用于大语言模型的缩放定律的最新进展和见解,突出这些模型在不同条件下的演变和性能表现。

 3.2 缩放定律

文献[126]对基于Transformer的大语言模型的经验缩放定律进行了全面研究。作者观察到,模型性能(目标函数\(L\))主要取决于三个因素:模型参数数量\(N\)、数据集大小\(D\)以及训练的计算预算。他们证明了模型性能(以目标函数\(L\)衡量)与这些因素之间存在幂律关系。例如,他们发现性能与数据集大小之间183, 186, 349];(ii)结合硬件协同设计的IO感知注意力计算[58, 60, 63, 97, 98, 108]。这两种方法都能减少硬件加载时间,以实现高效的注意力计算。

快速注意力计算

在快速注意力领域,研究人员正在开发创新策略来提高效率。一个主要关注点是注意力分解,其目的是减少在某些情况下通常不必要的注意力计算。当处理冗长的顺序输入时,这种技术特别有用,因为直接的成对注意力计算在计算上会变得非常密集。通过采用注意力分解,计算需求可以显著降低,将二维计算转换为更易于管理的一维格式[8, 50, 183, 319]。此外,这些分解注意力方法旨在辨别并强调相邻位置令牌之间的注意力差异以及它们随时间的变化。这种细致入微的方法确保计算资源集中在数据中最具影响力的元素上。另一种创新方法涉及使用基于频率的技术,如快速傅里叶变换(FFT)和哈希表示。这些技术以一种与硬件能力相匹配的方式对注意力进行建模,使其在实际应用中更高效[62, 261, 350]。它们过滤掉接近零的注意力,并将计算精力集中在最终计算中最重要的部分。这种选择性注意力确保资源不会浪费在处理相对不重要的数据上,进一步优化了模型的整体效率。除了直接计算成对注意力,一些方法[59, 68, 80, 169]探索了在块级别计算注意力的可能性,这使得计算可以并行化,显著提高了效率。例如,Monarch框架[59]及其高级版本Monarch Mixer(M2)[80]采用了一种新颖的策略。它们通过将密集注意力矩阵分解为置换矩阵和块对角矩阵的组合来使其稀疏化。这种分解允许更高效地处理注意力计算。此外,块级自注意力(BST)方法[169, 171]为自注意力和前馈网络引入了块级计算。这种技术旨在降低传统注意力机制通常带来的内存需求。而且,像LongNet[68]这样的一些方法用扩张注意力代替了原始的密集注意力,使得能够处理更长的令牌序列,从而扩展了大语言模型的能力。

与硬件相关的高效注意力

除了在软件层面设计更高效的注意力机制,目前的一个重要关注点已转向在硬件层面优化这些机制。该领域的一个主要挑战是如何有效地利用GPU上的计算资源,如高带宽内存(HBM)和静态随机存取内存(SRAM)。在这方面,最近出现了像FlashAttention[60]及其后继者FlashAttention - 2[58]等进展。FlashAttention从以I/O为中心的角度重新考虑注意力计算。它最小化了HBM和SRAM之间的数据传输,解决了GPU处理中的一个关键瓶颈。这种方法将块级softmax值计算和更新与统计信息集成在一起。这种集成消除了传统上在确定所有注意力值之后才计算softmax函数的要求。在FlashAttention[60]的基础上,FlashAttention - 2[58]进一步优化了工作分区,并减少了非矩阵乘法,利用了GPU对矩阵运算的优化。这些算法是根据硬件考虑而定制的,能够在GPU机器上加速模型。基于FlashAttention,FlashDecoding[63]和FlashDecoding++[108]将键/值分割成更小的块,以便对部分注意力进行并行化,而FlashDecoding++[108]进一步引入了具有统一最大值的异步softmax和具有双缓冲的扁平通用矩阵乘法(GEMM)优化,以及适应硬件资源的启发式数据流,以进一步提高速度。

在提升大语言模型(LLM)系统的探索中,一些研究人员从当前硬件架构中获得了创造性灵感。一个显著的例子是PagedAttention[147],它采用了操作系统中常用的虚拟内存和分页技术,以克服大语言模型中的内存限制。PagedAttention通过模拟虚拟内存系统,引入了一种创新的内存管理方法。它将与请求相关的键值(KV)缓存分割成块,而不是依赖于预先分配的连续内存。这种方法显著减少了内存碎片化,这是传统大语言模型内存分配策略中常见的问题。结果,它使大语言模型能够在有限的内存资源约束下处理更长的序列。

 5.3 高效位置编码

由于大语言模型可能需要处理长序列作为输入,标准Transformer[275]中使用的绝对位置编码(APE)无法满足这一要求。为了提高架构的效率,研究人员正在探索新的位置编码(PE)方法,这些方法可以通过相对位置[47, 48, 162, 212]或旋转位置编码[206, 256]来适应更长的序列。他们还在通过随机位置编码[229]甚至省略位置编码[129]来寻求更具通用性的解决方案。在本节中,我们将讨论其中一些最新进展。

基于加法的相对位置编码

相对位置编码方法利用两个令牌之间的相对位置,而不是单个令牌的绝对位置。其中一些方法对相对位置进行编码,并将编码后的位置添加到后续的注意力中,这被称为基于加法的相对位置编码方法。T5[217]、TISA[288]和FIRE[162]是这种范式的代表。在这些模型中,位置嵌入应用于自注意力机制中查询和键元素之间的交互,这与早期关注单个令牌的绝对位置有所不同。T5[217]中的相对位置编码使用查找表将相对位置差异转换为标量偏差值,并对所有分布外(OOD)序列长度使用相同的嵌入。TISA[288]结合了一个可训练的高斯核,专注于令牌之间的位置差异。另一方面,FIRE[162]通过将令牌之间的索引差除以两个索引中较小的一个,使用归一化位置索引进行渐进插值。与APE相比,相对位置编码(RPE)提供了一种更有效的方式来建模令牌之间的相对距离。这不仅增强了模型对令牌关系的理解,还便于长度外推,这是在语言处理中处理各种复杂序列的关键特征。

带有衰减函数的相对位置编码

另一个趋势是采用使用衰减函数的可训练相对位置编码(RPE)。以ALiBi[212]、KERPLE[47]和Sandwich[48]等模型为代表,这种方法旨在使模型的注意力主要集中在相邻令牌上。这些方法中衰减函数的使用确保了随着令牌之间距离的增加,注意力会逐渐减弱。ALiBi引入了一个线性衰减函数来建模令牌之间的关系,对于捕捉随着距离增加令牌相关性的减弱特别有效。KERPLE[47]使用两种条件正定(CPD)核的变体:对数变体和幂变体。这些复杂的核在RPE计算过程中衰减两个令牌之间的连接,以自适应地建模远处令牌关系重要性的降低。同时,Sandwich[48]采用一系列余弦函数来表示令牌之间的差异。Sandwich利用余弦函数的周期性来捕捉令牌关系中的循环模式。通过减弱远处位置之间的注意力,这些方法确保模型的注意力集中在更直接和上下文相关的令牌上,而不是远离的令牌。

旋转位置编码

除了基于加法的相对位置编码(将编码后的位置添加到注意力计算中),还有一些RPE方法利用旋转矩阵进行位置嵌入[34, 206, 256]。RoPE[256]引入了两个旋转矩阵来旋转查询和键向量。旋转角度与它们的绝对位置成比例,然后被集成到点积注意力机制中。这种方式使RoPE能够基于令牌之间的相对距离生成注意力,而不是直接计算它们的相对差异。然而,RoPE在推广到超出其训练长度的序列时存在局限性。在RoPE的基础上,PI[34]通过位置插值(PI)扩展了其能力。在对适量数据进行微调后,PI显示出处理非常长的上下文窗口的良好能力,解决了RoPE的主要局限性之一。YaRN[206]通过引入NTK感知插值和动态NTK插值进一步推进了这一领域。这种方法有效地解决了在有限数据集上进行微调或不进行微调的场景中高频信息丢失的问题。YaRN的方法显著提高了模型在无需大量微调的情况下扩展上下文大小的能力。这些方法的共同特点是在查询和键向量中使用旋转矩阵,这一技术在Transformer模型中建立更有效的RPE方面已显示出有前景的结果。

其他位置编码

除了相对位置编码(RPE)方法,随机位置编码(Randomized PE)[229]和无位置编码(NoPE)[129]提出了不依赖于对输入查询中令牌连续位置进行建模的方法。有趣的是,它们认为通过包含超出训练分布长度的位置或完全放弃位置编码,模型可以处理具有更长令牌长度的分布外情况,并在下游任务中表现出更强的泛化能力。随机位置编码[229]使用一个大于训练期间遇到的最长序列的数字。它从一系列整数中随机采样,排序后将其用作索引。这种方法使模型在推理时能够泛化到更长的序列,尽管它需要预先知道最大令牌长度。另一方面,无位置编码在自注意力机制中完全放弃了位置编码器。它表明模型的自注意力可以固有地学习句子中令牌之间的RPE。这种省略不仅简化了模型架构,而且在泛化方面显示出有前景的结果,特别是对于查询超出训练分布的句子。

 5.4 稀疏建模

在优化Transformer以提高效率的探索中,另一个关键研究领域是在这些基于注意力的架构中集成稀疏建模。这种方法对于降低计算需求至关重要,特别是在具有大量参数的模型中。稀疏建模出现了两个主要方向:专家混合(MoE)[43, 72, 153, 193, 219, 244, 352]和Sparsefinder[272],它们采用了不同的方式。

专家混合(MoE)方法[43, 44, 72, 78, 248, 313]在模型中纳入多个分支或“专家”,每个专家专门处理不同的子任务。在推理时,仅激活这些路径的一个子集,在保持计算效率的同时有可能提高性能。这种设计使像GLaM这样的模型能够显著扩展,尽管总共有超过1.2万亿个参数,但在推理时仅激活990亿个参数。MoE的进一步发展,如稀疏MoE[43],解决了表示崩溃等问题,确保专家更均衡地被激活并实现高效的信息处理。

另一方面,Sparsefinder[272]采取了不同的方法,专注于揭示注意力机制本身的稀疏性。该方法通过注意力方案识别关键模式,这有助于有效地将计算资源分配到模型中最具影响力的区域

 5.5 无注意力

标准注意力机制[275]的一个显著缺点是注意力计算的二次复杂度,这使得它在处理长序列时特别低效。尽管高效/稀疏注意力提供了一些缓解,但它的最坏情况理论复杂度仍然不变。为了解决这个问题,已经提出了各种无注意力方法,提供了避免计算二次注意力矩阵的替代方案[61, 91, 204, 210, 260, 324]。这些方法大致可以分为两类:一类是用循环计算代替注意力机制[204, 260, 324],另一类是对状态空间表示进行离散化[89 - 91, 95, 187, 253]。

值得注意的是,像RWKV[204]、H3[61]、Hyena[210]、RetNet[260]和Mamba[89]这些新方法实现了与标准Transformer相当的性能。RWKV[204]利用循环神经网络(RNNs)简化序列处理,从而降低处理长序列的复杂度。H3[61]基于状态空间模型(SSMs),为数据表示和处理提供了一种高效的替代方案。Hyena[210]作为传统注意力机制的直接替代品,简化了Transformer架构。RetNet[260]引入了多尺度保留模块与前馈网络模块相结合,增强了并行性和递归性,在训练和推理阶段都显著提高了效率。

Mamba[89]包括基于状态空间模型的选择操作以进行压缩,并通过与硬件相关的优化进一步提高效率。我们在表1中对这些方法与输入查询长度为\(n\)的标准Transformer进行了复杂度分析。它概述了每种方法的复杂度扩展情况,为无注意力技术的进展提供了见解。

表1. 当输入长度为n的序列时,Transformer与无注意力方法在推理评估中的时间和内存成本比较。性能栏中“+”号越多,表示模型在域内验证集和其他域外语料库上的困惑度表现越好。

 6 训练和微调效率

 6.1 引言

大语言模型训练和微调技术的发展必须应对数据和模型规模不断增长带来的挑战。本节深入探讨对大语言模型的可扩展训练和微调至关重要的效率方面,突出关键关注领域。

内存效率:大型Transformer模型中参数数量的快速增长,大约每两年增长410倍,这带来了巨大的内存挑战。这种增长速度超过了GPU内存的扩展速度,同期GPU内存仅从16GB增加到80GB,增长了5倍。训练期间的实际内存消耗远远超过了原始参数数量,包括模型状态(参数、梯度、优化器状态),以及中间状态(中间激活、临时缓冲区、内存碎片)。鉴于这些限制,单GPU设置不足以处理整个模型,因此需要像张量并行(TP)和流水线并行(PP)这样的分布式训练方法来进行有效的内存管理。

计算效率:虽然分布式训练在加速大型模型的训练方面具有潜在优势,但它也引入了影响可扩展性的复杂性。一个显著的观察结果是,与单GPU设置相比,在多个GPU上进行训练时,每个GPU的FLOPs会下降。这种下降源于有效利用越来越多计算资源的挑战。因此,在训练过程中,特别是在多GPU设置下,可扩展性成为提高计算效率的关键因素。

通信效率:这方面涉及训练期间不同设备或层之间参数和梯度的交换。在数据并行训练中,像全规约(all - reduce)这样的技术用于在反向传播结束时同步所有设备上的梯度。目标是在广播、规约、全规约和全收集等集体操作中最小化通信数据量。

简而言之,训练和微调大语言模型是一项复杂的挑战,需要全面的方法。一种综合考虑所有这些效率方面的策略对于大语言模型的有效和可扩展训练及微调至关重要。后续部分将详细探讨这些方面。

 6.2 可扩展训练

稳定训练策略

在大语言模型的预训练过程中,确保训练稳定性是效率的关键方面。训练不稳定通常表现为梯度消失或梯度爆炸,这会严重阻碍训练过程。为了减轻这些问题,仔细选择和调整超参数至关重要。一种有效的方法是对批量大小进行策略性调整。例如,像PaLM[53]这样的模型在训练过程中会将批量大小从100万个令牌逐渐增加到400万个令牌。这种逐渐扩展有助于模型在不影响稳定性的情况下适应处理更大数据量的能力。另一个关键超参数是学习率,通常采用热身余弦调度器。该调度器在训练的早期阶段(通常是总训练步骤的0.1%到0.5%)逐渐增加学习率,然后实施余弦衰减策略。这种方法将学习率逐渐降低到其峰值的10%左右,确保在训练过程中平衡快速学习和稳定性。优化器的选择在稳定大语言模型的训练中也起着关键作用。像Adam[135]和AdamW[179]这样的优化器由于其利用过去梯度信息加速收敛的动量特性,是GPT - 3[23]和OPT[331]等模型的常用选择。此外,以GPU内存效率著称的Adafactor[245]优化器被用于PaLMT5[217]等模型。除了超参数调整,实施像权重衰减梯度裁剪这样的稳定策略以防止梯度爆炸也很常见。然而,即使采用了这些措施,训练损失仍可能出现尖峰,这通常受到当前模型状态和正在处理的数据的影响。为了解决这个问题,像PaLM和OPT这样的模型在检测到损失尖峰时,会采用从先前检查点重新开始训练的策略,有效地跳过引发不稳定性的数据。这种方法不仅确保了训练的稳定性,还通过避免长时间的无效训练,提高了计算资源的使用效率。

混合精度训练

在大语言模型预训练领域,混合精度训练成为提高内存和计算效率的关键策略。传统上,神经网络训练涉及以全精度(FP32)格式存储权重、梯度和激活值。然而,对于极其庞大的模型,这种方法可能资源消耗巨大。为了解决这个问题,采用了像FP16INT8这样的低精度格式。这些格式不仅减少了内存使用,还加快了模型内部的通信过程。此外,现代GPU通常比处理FP32更擅长处理FP16计算,这进一步提高了计算速度。

尽管有这些优点,但直接从FP32转换到FP16有时会由于FP16固有的溢出或下溢等问题导致性能下降[116, 342]。为了克服这些挑战,开发了自动混合精度(AMP)[188]方法。AMP在以FP32格式维护权重的主副本的同时,在前向和反向传递中使用FP16进行计算。计算完成后,将权重转换回FP32以更新主权重。这种方法结合了损失缩放技术以保留小梯度值,使得AMP能够在无需大量超参数调整的情况下达到与FP32训练相当的精度。精度降低的进一步进展导致了脑浮点(BF16)[125]的引入,这是一种新颖的半精度格式。BF16通过比FP16分配更多的位给指数部分、更少的位给尾数部分,以覆盖与FP32相同的范围。与FP16下的混合精度相比,BF16已展现出最先进的性能和更高的可靠性。

另一种创新方法是激活压缩训练(ACT)[32],它专注于将多个任务中的激活值平均压缩到2位。ACT在反向传播过程中使用压缩后的激活值计算梯度,这显著减少了激活值的内存需求。这种压缩使得训练时的批量大小可比传统方法大6.6到14倍。总体而言,混合精度训练体现了大语言模型训练领域的不断发展,通过创新技术持续平衡效率和性能。

基于并行性的技术

大语言模型训练中的并行性是一种将计算负载分布到多个加速器(如GPU或TPU)上的策略。这种方法对于管理大语言模型训练所需的大量数据和复杂计算至关重要,有助于开发更先进、能力更强的模型。在本节中,将讨论各种并行训练模式。

数据并行(DP):数据并行[76, 160, 163, 300]是一种简单而有效的分布式训练形式。在这种方法中,数据集被划分为较小的子集,然后在多个加速器上并行处理。模型在这些设备上进行复制,每个副本在各自的子集上独立执行前向和反向计算。DP的一个关键方面是在每个训练步骤结束时同步梯度。每个设备上计算的梯度被平均,得到代表整个批次的梯度。这个过程确保了尽管是并行处理,但模型在所有数据子集上的学习是一致的。DP尤其以其最大化GPU利用率的能力而闻名。然而,它需要高带宽互连来有效处理设备之间的通信需求。通过利用DP,训练大规模大语言模型变得更加可行,能够实现更快的开发周期并探索更复杂的模型架构。 

模型并行(MP):模型并行是DP的替代方法,侧重于将模型本身分布到多个加速器上。这种方法对于处理参数数量多、规模大的模型特别有用,尤其是当单个GPU无法存储整个模型时。模型并行可以进一步分为两种类型:张量并行(TP)和流水线并行(PP)。 

   张量并行(TP)[243, 250, 303]是一种层内模型并行形式。它涉及将单个层的张量划分到多个加速器上,允许训练比单个GPU内存容量更大的模型。Megatron - LM[250]是这种方法的一个显著例子,它提供了对Transformer参数(如MLP层、自注意力层和输出嵌入层)的不同组件进行切片的策略。这种切片可以水平或垂直进行。最初,TP主要关注二维矩阵的划分,但现在已经发展到包括多维划分。像Colossal - AI[20, 278, 302]这样的框架已经将TP扩展到更高维度,并引入了序列并行[142, 161]来处理序列数据。虽然TP在内存使用方面效率较高,但它需要高互连带宽来实现有效的层间通信。

    流水线并行(PP)[114, 120, 133, 143, 195 - 197, 306]是一种层间模型并行形式。它涉及将模型的层以流水线配置划分到多个加速器上。每个加速器负责计算不同的层,然后将其输出传递给下一个加速器,就像装配线一样。这种设置允许对前向和反向传递进行顺序但并发的处理。当模型的一个部分处理一部分数据时,其他部分可以同时处理不同的数据部分。PP的效率关键在于其保持模型所有部分都处于活动和高效状态的能力,尽管这需要仔细的调度以最小化GPU的空闲时间。Gpipe[114]是最早提出的PP方案之一,它将PP与小批量划分相结合。它将大型模型划分到多个GPU上,并将输入小批量处理为更小的微批量。这种方法允许高效训练非常大的模型。Gpipe还使用一种称为重计算[42]的策略,通过在反向传播期间重新计算激活值而不是存储它们来减少内存使用。然而,由于在反向计算期间需要缓存激活值,Gpipe仍然存在内存效率问题。PipeDream[99, 195]通过其一前向一后向(1F1B)策略进一步改进了PP方法。这种方法允许微批量在前向传递后立即进行反向传播,使流水线的早期阶段能够更快地开始其反向计算。PipeDream还使用不同版本的权重进行异步梯度更新,并优化流水线阶段的内存分配以实现更高效的处理。BPipe[133]引入了一种在整个流水线中平衡内存使用的技术。它利用后面阶段的空闲内存来支持前面阶段,与Megatron - LM相比,显著加快了像GPT - 3 96B和GPT - 3 134B这样的大型模型的训练速度,提速1.25到2.17倍。TeraPipe[?]解决了训练具有长序列长度的大型模型时的挑战,长序列长度可能导致更小的微批量和流水线中更多的空闲时间。在Transformer架构中,一些层的计算不依赖于未来的隐藏状态。TeraPipe利用这一事实,通过划分输入序列实现并行处理。它使用动态规划在令牌之间的最佳点有效地分割序列,提高了并行处理的效率。

自动化并行:自动化并行已成为扩展现代大语言模型的关键方法,它结合了多种并行方法以实现最佳性能。像DeepSpeed[221]、Megatron - LM[250]和Colossal - AI[302]这样的系统采用了3D并行方法,涉及将训练数据均匀分布到工作节点上,手动划分模型,并在每个流水线阶段分配层。然而,这种手动编排并行类型的方式很复杂,并且不容易适应不同的模型和计算环境。

为了简化这个过程,正在开发自动化并行化解决方案。这些解决方案旨在加快模型部署并确保对不同模型的适应性。随着模型和计算集群的增长,并行配置的复杂性也在增加。Tofu[281]使用动态规划算法来优化数据流图划分,以应对这一挑战。Dapple[76]专注于通过最优划分策略最小化流水线延迟。然而,由于不同并行策略之间的复杂交互,这些解决方案目前仅限于将数据并行与仅一种模型并行类型相结合。Alpa[337]采取了更全面的方法,将数据、模型和流水线并行组织成层次结构。它使用整数线性规划来制定模型并行计划,使用动态规划来制定流水线并行计划。在训练GPT模型时,Alpa与Megatron - LM等专业系统相当,证明了其在处理复杂并行化挑战方面的有效性。FlexFlow[120]扩展了3D并行的概念,提出了一种在不同维度(样本、操作、属性、参数)上划分操作输出张量的方法。计算图中的每个操作都被分配一个特定的并行配置。为了找到最佳的并行策略,FlexFlow使用一个执行模拟器来预测在给定设备拓扑上运行操作符图所需的时间。然后,它使用马尔可夫链蒙特卡罗采样系统地搜索最优策略,同时考虑操作符图和设备拓扑。

内存优化

在训练规模不断增大的大语言模型时,存储模型参数、梯度和优化状态所需的内存显著增加。在DP中,这个问题尤为严重,因为每个GPU传统上都存储模型参数的完整副本,导致大量内存冗余。高效的内存优化策略对于在有限的硬件资源上训练更大的模型至关重要,它可以平衡训练基础设施不同组件之间的内存负载。

ZeRO[220]通过在GPU之间划分内存负载来解决数据并行中的内存冗余问题。与每个GPU存储整个模型参数、梯度和优化器状态不同,ZeRO将这些元素进行划分,使每个GPU仅持有部分数据。其余数据可以根据需要从其他GPU检索。这种方法包括三个关键策略:参数划分、梯度划分和优化器状态划分,每个策略都针对模型内存需求的特定方面。在ZeRO的基础上,ZeRO offload[223]扩展了这些概念,允许利用CPU和GPU的能力进行训练,将一些计算和存储卸载到CPU以减轻GPU的内存负担。然而,这种卸载会增加CPU和GPU之间的通信,如果管理不当,可能会成为瓶颈。该策略将训练过程视为一个数据流图,将不同的计算节点分配到不同的设备上。前向和反向过程由GPU处理,而参数更新和精度转换由CPU管理。这种方法旨在最小化CPU计算并减少通信开销,确保在训练过程中高效使用CPU和GPU资源。

结合这些进展,像DeepSpeed[221]这样的系统提供了不同级别的内存优化。第一阶段是ZeRO - DP(数据并行),它仅通过在GPU之间划分优化器状态来优化内存。第二阶段是ZeRO - R(归约和划分),通过划分梯度和优化器状态进一步减少内存使用。第三阶段是ZeRO - Infinity,它将内存优化扩展到GPU可用内存之外,利用CPU和NVMe内存来支持训练极其大型的模型。

 6.3 可扩展微调

在大量多样的数据集上训练的大语言模型已经展示出了卓越的通用问题解决能力。然而,通过有针对性的适配,它们在特定领域或任务中的性能可以显著提升。近年来,出现了一系列技术来促进这一适配过程。本节将讨论两种对预训练大语言模型进行高效适配的主要方法:(i)参数高效微调,包括整合适配器层或微调预训练模型的现有参数;(ii)通过提示工程整合任务特定上下文。这些方法是使大语言模型适应特定应用的关键策略,确保它们在各种自然语言处理任务中的通用性和有效性。

参数高效微调(PEFT)

预训练大语言模型的巨大规模使得为下游任务或应用领域对整个模型进行全面微调既昂贵又不切实际。为了避免直接对完整的大语言模型进行微调,出现了一系列参数高效的调优方法。这些方法专注于通过调整或引入少量可训练参数来优化大语言模型,同时保持大部分或所有原始预训练参数不变。这些方法通常能取得不错的性能,并且与全参数微调相比,显著减少了可训练参数的数量。它们在内存和计算效率方面都有所提升,为使大语言模型适应特定任务提供了更实际的解决方案。

部分参微调

一种简单而有效的适配大语言模型的方法是部分参数微调,即仅对预训练参数的选定部分进行微调,其余部分保持不变。这种方法已得到广泛验证。例如,文献[144, 150]仅对最后几层进行微调,就达到了全模型微调性能的90%。Xie等人在文献[297]中根据隐藏状态的可变性选择部分层进行微调,尤其适用于分类任务。此外,BitFit[320]提出了一种替代策略,仅调整基于Transformer的大语言模型中的偏差项,也取得了有竞争力的性能。这些例子强调了部分参数微调作为一种资源高效的方式,使大语言模型能够适应各种应用的潜力。然而,这些方法通常缺乏指导如何选择特定参数子集进行进一步微调的详细原则。

 模型 - 适配器微调

为了解决选择特定参数进行微调的问题,引入了适配器微调技术,该技术涉及在预训练模型中添加额外的小规模可学习模块,即适配器[109]。这种方法保持了预训练模型的完整性,但在预训练大语言模型的一个或多个模块中嵌入适配器块。这些适配器通常采用紧凑的瓶颈层形式,例如由一个具有非线性函数和少量隐藏层神经元的两层MLP(多层感知器)组成。适配器可以与Transformer架构的注意力层和前馈层串联[109]或并联[209]集成,也可以在Transformer架构之外集成[205]。为了进一步提高适配器的可重用性和通用性,开发了AdapterHub[208]。这个框架允许动态集成预训练的适配器,以适应各种任务和大语言模型。尽管使用适配器加速了微调过程并减少了存储需求,但它确实通过在每个Transformer层增加深度或宽度来修改计算图。正如研究[228]中所观察到的,这种修改会导致推理延迟略有增加,推理速度大约慢4 - 6%。

 参数 - 适配器微调

另一种相关方法是直接在模型参数中添加适配器。将预训练网络参数表示为\(\theta\),这类技术将模型参数扩展为\(\theta+\Delta \theta\),其中\(\theta\)保持固定,\(\Delta \theta\)通过低秩近似学习得到。diff - pruning[94]就是这种技术的一个实现,它在微调过程中通过添加稀疏促进正则化来学习任务特定的稀疏参数\(\Delta \theta\)。LoRA[111]为每个线性层学习低秩变换。具体来说,LoRA将权重矩阵重新参数化为\(\theta+\Delta \theta ≈\theta+BA\),其中预训练权重矩阵\(\theta\)固定,而低秩矩阵\(B\)和\(A\)是可学习的。在LoRA中,所有权重矩阵的每个低秩子矩阵都共享一个恒定的内在秩,而没有考虑不同模块之间的重要性差异。AdaLoRA[328]通过根据重要性分数动态分配参数预算给权重矩阵来解决这一限制。它为更关键的增量矩阵分配更高的秩,以捕获更详细的任务特定信息,同时降低不太重要矩阵的秩以避免过拟合并节省计算资源。SoRA[69]引入了一个可优化的门,使用近端梯度法动态调整增量矩阵的秩。在QLoRA[66]中,预训练模型首先被量化为4位。随后,添加一组可学习的低秩适配器权重,并通过对量化权重的反向传播梯度进行微调。QLoRA即使使用16位、8位或4位的适配器,也能达到与16位全参数微调相当的性能。

数据高效微调

数据高效微调是指为下游任务更新有限的提示参数,而不是对预训练的大语言模型进行微调。它通常通过提示调优来实现,在提示调优中,预训练模型的权重保持固定,仅调整添加的提示令牌。这种方法能够更高效地使用数据,并且随着模型参数规模的增加,往往能带来性能的提升。

提示调优

提示调优是一种用于在有监督的下游任务中提升大语言模型性能的技术。它将下游任务构建为一个掩码语言问题,并将原始token输入转换为一个模板,对某些token进行掩码处理,让大语言模型来完成。通过修改可调整的模板嵌入,提示调优旨在通过减少预训练任务和特定下游任务之间的分布差异来提高下游任务的性能。这种方法还使大语言模型能够进行少样本甚至零样本学习,在监督数据有限的场景中特别有用,因为它可以生成新的提示模板。

传统方法需要手动设计提示模板和 verbalizers,这往往导致效果敏感且不稳定。然而,提示学习的最新进展带来了提示构建的自动化和优化。AutoPrompt[249]引入了一种基于梯度的方法来自动搜索有效的模板。LMBFF[83]通过在离散提示空间中搜索标签词并使用基于T5的模板生成方法,提供了一种更高效的自动提示生成解决方案。为了解决离散优化的挑战,Prefix - Tuning[165]推荐参数化提示,即仅对提示进行微调,而大语言模型保持不变。P - tuning[174]突破了模板必须由自然语言组成的传统限制,将模板构建转化为一个连续参数优化问题。CP - tuning[304]主张使用对比学习来自动学习嵌入的分布,以替代手动设计verbalizer。UPT[280]引入了提示 - 选项 - verbalizer范式,促进跨多种自然语言处理任务的联合提示学习,并鼓励大语言模型获取任务不变的提示知识。

 7 推理效率

 7.1 引言

大语言模型(LLMs)中庞大的参数数量给在云服务和资源受限设备上的部署带来了巨大挑战,导致推理支持的维护成本高昂。因此,加速推理已成为一个紧迫的问题,受到了工业界和学术界的广泛关注。一种常见的方法是构建性能与完整模型相当的紧凑模型,相关方法大致可分为四类:剪枝、知识蒸馏、量化和低秩分解。剪枝技术旨在识别和消除深度神经网络(DNNs)算子中的冗余,从而创建更精简的版本。知识蒸馏涉及将更大、更复杂的“教师”模型的知识转移到更小、更高效的“学生”模型中,有助于在缩小模型规模的同时保持高性能。量化通过使用更少的比特表示大语言模型中的浮点数,降低了计算负载和存储需求。低秩分解通过低秩矩阵近似大语言模型中的重权重矩阵,进一步节省计算资源。值得注意的是,其中一些方法需要专门的计算库和硬件,才能实现实际的资源节省和加速。

 7.2 剪枝

剪枝技术旨在识别大语言模型算子内部的冗余。现有的剪枝技术大致可分为非结构化剪枝、半结构化剪枝和结构化剪枝。

非结构化剪枝

非结构化剪枝产生细粒度的稀疏性,其中零元素随机分布在可训练参数中[35, 38, 70, 71, 117, 146, 234, 242, 259, 294, 333]。这些非结构化剪枝方法表明,大语言模型可以在单次剪枝中至少达到50%的稀疏度,且(不)经过重新训练,精度损失最小。同时,较大的大语言模型在非结构化剪枝方式下更具可压缩性。尽管非结构化剪枝在理论上可以带来推理加速,但由于稀疏操作中的连续性问题,这种加速在实际中并不容易体现。加速具有高细粒度稀疏性的深度神经网络通常需要专门设计的软件和硬件支持。存在一些计算库,如FSCNN[119],在足够高的非结构化稀疏度下,其性能优于标准的深度神经网络运行时,但在很大程度上尚未扩展到Transformer架构。
 半结构化剪枝:为了缓解非结构化剪枝的问题,最近提出了半结构化剪枝,其中以N:M稀疏性为示例[339]。N:M稀疏性介于非结构化剪枝和结构化剪枝之间,即每M个连续元素中恰好包含N个非零元素。英伟达[51]推出了安培张量核心GPU架构(例如A100 GPU),并提出了2:4细粒度结构化稀疏性方案,使得稀疏神经网络在推理时能够在该硬件上加速。该方案对允许的稀疏模式施加了约束:对于每四个连续的权重数组,修剪其中两个,得到一个50%稀疏的网络。权重矩阵的这种规则结构使得可以有效地压缩它,并通过仅对非零权重进行操作来减少内存存储和带宽需求。重要的是,英伟达目前仅考虑2:4的比例,其他比例尚未实现加速。

结构化剪枝

结构化剪枝会移除整个神经元、通道或其他有意义的结构,从而保留剩余深度神经网络的功能,使其便于高效计算[37, 41]。先前的结构化剪枝方法需要手动干预来确定移除的结构,这很不方便。最近的工作,如OTO[37, 39, 40]和torch - pruning[77],提出了依赖图分析来自动找出可以移除的结构。然而,它们在大语言模型上的应用面临重大挑战,这是由于大规模计算资源的需求以及预训练和指令微调数据集的训练数据不可用[23]。因此,大语言模型上的结构化剪枝范式在很大程度上可分为有限资源或全资源下的剪枝。对于有限资源设置,LLM - Pruner[181]提供了模块化的重要性得分计算器来对移除结构进行排序。重要性得分通常基于完整的梯度计算,对于完整模型来说,这可能是资源密集型的。随后会进行一个使用有限指令微调数据的快速训练后阶段,以在一定程度上恢复丢失的知识。LoRAPrune[327]在剪枝阶段使用低秩适配器(LoRA)[111]来减少资源需求,但与完整的大语言模型相比,仍然面临显著的性能下降。为了更有效地恢复和保留知识,最近在有限资源设置中提出了LoRAShear[36]。LoRAShear利用一种名为LoRA半空间投影梯度(LHSPG)的新型结构稀疏优化器进行渐进式结构化剪枝和知识转移。与仅使用指令微调数据的先前工作不同,LoRAShear应用了多阶段知识恢复机制,以有效缩小完整模型和压缩模型之间的性能差距。对于全资源设置,Sheared - LLaMA[295]对原始大语言模型进行结构化剪枝,创建出性能优于同等规模从头训练的大语言模型的紧凑模型。然而,它需要大量的GPU算力和数据资源,这对于普通用户来说可能不可行。与在结构上修剪中小规模深度神经网络相对成熟的领域相比,大语言模型上的结构化剪枝仍处于早期阶段,有待进一步探索。

 7.3 知识蒸馏

知识蒸馏的概念是利用来自更大、能力更强的“教师”模型的监督信号来训练紧凑的“学生”模型。这种方法通常会使学生模型的性能超过类似规模但未经过这种指导训练的模型[105]。知识蒸馏大致可分为基于响应的知识蒸馏、基于特征的知识蒸馏和基于关系的知识蒸馏[88]。基于响应的知识聚焦于教师模型的最终输出层。其假设是学生模型将学习模仿教师模型的预测[14, 105]。训练有素的教师模型还在其中间层捕获数据的基于特征的知识,这对于深度神经网络尤为重要[225, 318]。捕获特征图之间关系的知识也可用于训练学生模型,这被称为基于关系的知识蒸馏[314]。自然语言处理领域的早期研究主要集中在特定任务模型的蒸馏上[134]。后来,更多的研究转向了对预训练模型的蒸馏,这些预训练模型随后可以针对特定的下游任务进行微调[123, 173, 233]。最近,出现了针对大语言模型的蒸馏方法[11, 30, 46, 92, 110, 122, 159, 230, 282, 292, 325]。当前大语言模型知识蒸馏方法的一个主要关注点在于如何生成和利用具有挑战性的(指令性)样本[46, 122, 292],以便更有效地将知识从教师模型转移到学生模型,这与第4节中的数据欠采样方法有一些重叠。思维链提示通常用于蒸馏方法[110, 159]中来完成数据生成。然而,当前大语言模型的知识蒸馏方法缺乏标准化的目标函数,该函数通常是特定任务的,需要进行调整。此外,最近采用学生生成输出来减轻训练和推理之间差异的策略导致了计算成本的大幅增加。为了解决这些挑战,最近引入了DistiLLM[138],它由两个关键组件组成。(i)具有适度偏斜值的偏斜Kullback - Leibler(KL)散度损失,与其他替代方法(包括广义Jensen - Shannon散度)相比,它提供了更稳定的梯度和更低的近似误差。(ii)一种自适应离策略技术,旨在提高使用学生生成输出的效率和有效性。

 7.4 量化

量化方法可以根据是否需要重新训练进行划分[86]。量化感知训练(QAT)要求对模型进行重新训练,调整其权重以在量化后恢复精度[16, 131, 247, 332]。相比之下,训练后量化(PTQ)在不进行任何重新训练的情况下实现量化[26, 164, 199, 312, 317]。虽然QAT通常能产生更高的精度,但由于重新训练的成本过高,并且通常无法访问原始训练数据和处理基础设施,因此对于大语言模型(LLMs)来说往往不切实际。因此,大多数关于大语言模型量化的研究都倾向于PTQ技术。

从另一个角度来看,量化方法大致可分为均匀量化和非均匀量化[86]。像SPQR[67]、GPTQ[79]以及其他一些工作[115, 131]中探索的均匀量化,是将权重范围划分为大小相等的区间。这种方法因其能够通过允许以量化精度而不是全精度进行算术运算来加速计算而受到欢迎。此外,在大语言模型中经常观察到权重分布不均匀的情况,此时均匀量化可能不是最优选择。相比之下,非均匀量化为这些挑战提供了解决方案。正如在SqueezeLLM[132]中所研究的,这种方法非均匀地分配量化区间,提供了更大的灵活性,并且在处理非均匀权重分布时可能具有更好的性能。

与结构化剪枝相比,量化需要特定的硬件来实现低比特精度的实际优势,以降低内存成本和加速推理。对于大语言模型,由于缺乏训练数据或计算资源,在高压缩比下,结构化剪枝通常难以有效地恢复丢失的知识。然而,量化通常可以有效地保持大语言模型的性能。因此,目前量化在大语言模型压缩中更受欢迎且更为成熟。这与中小模型规模的场景形成鲜明对比,在该场景中,结构化剪枝和量化通常(联合)使用[37, 307]。

 7.5 低秩分解

深度神经网络中的权重矩阵通常是低秩的,这表明模型权重存在冗余[231, 341, 347]。因此,一个自然的想法是将权重矩阵分解为两个或更多较小的矩阵,以节省参数。在大语言模型中,权重矩阵存在于包括自注意力层和MLP层的线性层以及嵌入层中。已有研究对这些权重矩阵进行分解,以节省参数数量并加速推理。
 线性层分解:多线性注意力[182]使用块项张量(BTT)分解[64]来分解多头注意力。奇异值分解(SVD)[64]也常用,并且通常分两个阶段进行。第一阶段进行分解,第二阶段通过知识蒸馏对低秩权重进行微调[198]。此外,作为BTT和SVD的替代方法,Kronecker分解保留矩阵的秩,并且在压缩BERT和GPT - 2时已显示出改进[73, 262]。
 嵌入层分解:ALBERT[148]对嵌入层进行分解,嵌入层是模型参数的最大消耗者之一。由于Transformer的能力主要来自其上下文学习能力,因此令牌嵌入层中的参数效率不高。通过分解嵌入矩阵来减少这些参数在直观上是合理的。自注意力分解嵌入(SAFE)[222]研究了在Transformer中通过在线性投影的基础上添加一个小的自注意力层来共享权重的方法,以实现比其他方法更好的性能。LightFormer[180]更有效地利用了训练良好的Transformer的参数知识,并通过对嵌入层的分解加速了模型的收敛。

 8 结论

总之,大语言模型(LLMs)的发展是通用人工智能领域的一个重要里程碑,为各个领域带来了变革性的变化。然而,这些模型的快速扩展在计算需求和内存要求方面带来了巨大挑战,给学术研究和实际部署都设置了障碍。本综述全面概述了旨在提高大语言模型效率的算法创新,涵盖了截至2023年9月的大部分研究进展。与现有通常专注于训练或模型压缩等孤立方面的综述不同,本综述深入探讨了对大语言模型整体算法开发至关重要的多个效率维度。它涵盖了广泛的与效率相关的主题,包括缩放定律、数据利用、架构设计以及训练、微调与推理策略。这里呈现的见解和分析旨在为该领域的研究人员和从业者提供有价值的总结。通过奠定当前知识和方法的坚实基础,本文为大语言模型效率这一关键研究领域的未来突破和持续创新奠定了基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2310306.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenGL ES -> GLSurfaceView纹理贴图

贴图 XML文件 <?xml version"1.0" encoding"utf-8"?> <com.example.myapplication.MyGLSurfaceViewxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height…

DE2115实现4位全加器和3-8译码器(FPGA)

一、配置环境 1、Quartus 18.1安装教程 软件&#xff1a;Quartus版本&#xff1a;Quartus 18.1语言&#xff1a;英文大小&#xff1a;5.78G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09; 下载通道①百度网盘丨64位下载…

【AI大模型】DeepSeek + Kimi 高效制作PPT实战详解

目录 一、前言 二、传统 PPT 制作问题 2.1 传统方式制作 PPT 2.2 AI 大模型辅助制作 PPT 2.3 适用场景对比分析 2.4 最佳实践与推荐 三、DeepSeek Kimi 高效制作PPT操作实践 3.1 Kimi 简介 3.2 DeepSeek Kimi 制作PPT优势 3.2.1 DeepSeek 优势 3.2.2 Kimi 制作PPT优…

run方法执行过程分析

文章目录 run方法核心流程SpringApplicationRunListener监听器监听器的配置与加载SpringApplicationRunListener源码解析实现类EventPublishingRunListener 初始化ApplicationArguments初始化ConfigurableEnvironment获取或创建环境配置环境 打印BannerSpring应用上下文的创建S…

面试-----每日一题

一、字节一面&#xff08;操作系统&#xff09; 什么是死锁&#xff1f;如何处理死锁问题&#xff1f; 死锁是指两个或两个以上的进程在执行过程中&#xff0c;由于竞争资源或者由于彼此通讯而造成的一种阻塞的现象&#xff0c;若无外力作用&#xff0c;它们都将无法推进下去。…

CentOS 7中安装Dify

Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、可观测性功能等&#xff0c;让您可以快速从原型到生产。尤其是我们本地部署DeepSeek等大模型时&#xff0c;会需要用到Dify来帮我们快捷的开发和应用。 大家可以参考学习它的中…

qt-C++笔记之Linux下Qt环境变量设置及与QtCreator的关系

qt-C++笔记之Linux下Qt环境变量设置及与QtCreator的关系 code review! 文章目录 qt-C++笔记之Linux下Qt环境变量设置及与QtCreator的关系一.Qt关键的环境变量1.1.PATH1.2.LD_LIBRARY_PATH1.3.QML2_IMPORT_PATH二.若不手动设置这三个环境变量2.1.PATH 的默认路径2.2.LD_LIBRARY_…

Flutter 学习之旅 之 flutter 使用 carousel_slider 简单实现轮播图效果

Flutter 学习之旅 之 flutter 使用 carousel_slider 简单实现轮播图效果 目录 Flutter 学习之旅 之 flutter 使用 carousel_slider 简单实现轮播图效果 一、简单介绍 二、简单介绍 carousel_slider 三、安装 carousel_slider 四、简单案例实现 五、关键代码 一、简单介…

【JavaScript—前端快速入门】JavaScript 对象与函数

JavaScript 对象 1. JavaScripe 数组 创建数组的方式 使用 new 关键字创建 使用字面量方式创建 [常用] 注意&#xff0c;JavaScipt 不要求数组元素类型都相同&#xff1b; 数组操作 读&#xff1a;使用下标的方式访问数组元素&#xff08;从0开始) 保存代码&#xff0c;打开…

java中的局部变量

文章目录 一、定义二、作用域和作用位置三、声明周期和初始化四、内存管理五、Java内存区域划分六、例子 一、定义 在java中&#xff0c;局部变量指在方法、构造方法、代码块&#xff08;如{}包裹的语句块&#xff09;内部声明的变量 class work {{int a 10;}public work() {i…

(IDE接入DeepSeek)简单了解DeepSeek接入辅助开发与本地部署建议

重点&#xff1a;IDE接入DeepSeek是否收费 收费&#xff01; 本文章主要是为了给小白避雷&#xff0c;目前很多文章告诉大家怎么接入DeepSeek&#xff0c;但是并未告知大家是否收费。如果是想白嫖的&#xff0c;就可以不用去接入了。 一、引言 最近爆火的AI人工智能工具DeepSe…

【算法学习之路】5.贪心算法

贪心算法 前言一.什么是贪心算法二.例题1.合并果子2.跳跳&#xff01;3. 老鼠和奶酪 前言 我会将一些常用的算法以及对应的题单给写完&#xff0c;形成一套完整的算法体系&#xff0c;以及大量的各个难度的题目&#xff0c;目前算法也写了几篇&#xff0c;题单正在更新&#xf…

0x03 http协议和分层架构

HTTP协议 简介 Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则 http协议基于TCP协议&#xff1a;面向连接&#xff0c;安全基于请求-响应模型&#xff1a;一次请求对应一次响应HTTP协议是无状态的协议&#xff…

智能合约安全指南 [特殊字符]️

智能合约安全指南 &#x1f6e1;️ 1. 安全基础 1.1 常见漏洞类型 重入攻击整数溢出权限控制缺陷随机数漏洞前后运行攻击签名重放 1.2 安全开发原则 最小权限原则检查-生效-交互模式状态机安全失败保护机制 2. 重入攻击防护 2.1 基本防护模式 contract ReentrancyGuarde…

【Python项目】基于Python的书籍售卖系统

【Python项目】基于Python的书籍售卖系统 技术简介&#xff1a;采用Python技术、MYSQL数据库等实现。 系统简介&#xff1a;书籍售卖系统是一个基于B/S结构的在线图书销售平台&#xff0c;主要分为前台和后台两部分。前台系统功能模块分为&#xff08;1&#xff09;用户中心模…

【Linux】【网络】UDP打洞-->不同子网下的客户端和服务器通信(未成功版)

【Linux】【网络】UDP打洞–>不同子网下的客户端和服务器通信&#xff08;未成功版&#xff09; 上次说基于UDP的打洞程序改了五版一直没有成功&#xff0c;要写一下问题所在&#xff0c;但是我后续又查询了一些资料&#xff0c;成功实现了&#xff0c;这次先写一下未成功的…

(1)udp双向通信(2)udp实现文件复制(3)udp实现聊天室

一.udp双向通信 1.fork进程实现双向通信 【1】head.h 【2】client客户端 &#xff08;1&#xff09;父进程从键盘获取字符串 &#xff08;2&#xff09;输入quit&#xff0c;发送结束子进程信号 &#xff08;3&#xff09;exit退出父进程 &#xff08;1&#xff09;子进程接受…

c高级第五天

1> 在终端提示输入一个成绩&#xff0c;通过shell判断该成绩的等级 [90,100] : A [80, 90) : B [70, 80) : C [60, 70) : D [0, 60) : 不及格 #!/bin/bash# 提示用户输入成绩 read -p "请输入成绩&#xff08;0-100&#xff09;&#xff1a;" score# 判断成…

【JQuery—前端快速入门】JQuery 操作元素

JQuery 操作元素 1. 获取/修改元素内容 三个简单的获取元素的方法&#xff1a; 这三个方法即可以获取元素的内容&#xff0c;又可以设置元素的内容. 有参数时&#xff0c;就进行元素的值设置&#xff0c;没有参数时&#xff0c;就进行元素内容的获取. 接下来&#xff0c;我们需…

标签的ref属性 vue中为什么不用id标记标签

标签的ref属性 vue中为什么不用id标记标签 假设有一对父子组件&#xff0c;如果父组件和子组件中存在id相同的标签&#xff0c;会产生冲突。通过id获取标签会获取到先加载那个标签。 标签的ref属性的用法 在父组件App中&#xff0c;引入了子组件Person。 并使用ref标记了Pe…