【文献阅读】A Survey Of Resource-Efficient LLM And Multimodal Foundation Models
发表时间:二〇二四年九月二十三日
摘要
大型基础模型,包括大语言模型(LLMs)、视觉Transformer(ViTs)、扩散模型以及基于大语言模型的多模态模型,正在革新整个机器学习的生命周期,从训练到部署都受到影响。然而,这些模型在通用性和性能方面的显著提升,是以大量的硬件资源为代价的。为了以一种可扩展且环境可持续的方式支持这些大型模型的发展,开发资源高效的策略成为了研究重点。本综述深入探讨了此类研究的关键重要性,从算法和系统两个方面进行研究。它综合分析了现有文献中的相关内容,并从中获取了有价值的见解,涵盖了从前沿模型架构、训练/服务算法到实际系统设计与实现等广泛主题。本综述的目的是全面阐述当前方法如何应对大型基础模型带来的资源挑战,并为该领域未来的突破提供潜在的启发。
关键词
基础模型;大语言模型;视觉Transformer;扩散模型;多模态大语言模型;模型压缩;机器学习系统;服务系统;预训练;微调;边缘智能
1 引言
在快速发展的人工智能(AI)领域,一场范式转变正在发生。我们见证着从专门的、碎片化的深度学习模型,向通用的、“一刀切”的基础模型的转变。这些先进的人工智能系统能够在开放世界环境中运行,与开放词汇表和图像像素进行交互,以完成未见的人工智能任务,即具备零样本学习能力。它们的代表包括:(1)像GPT系列[41]这样的大语言模型,几乎可以将每一个自然语言处理任务以提示的形式进行处理;(2)像掩码自编码器[141]这样的视觉Transformer模型,能够处理各种下游视觉任务;(3)像稳定扩散模型[336]这样的潜在扩散模型,可根据任意基于文本的提示生成高质量图像;(4)像CLIP[321]和ImageBind[123]这样的多模态模型,将不同模态的数据映射到相同的潜在空间,广泛用作图像检索/搜索和视觉问答等跨模态任务的骨干网络。这种灵活性和通用性,标志着与早期人工智能时代的重大区别,为人工智能与世界的交互设定了新的标准。
这些基础模型的成功,深深植根于它们的可扩展性:与之前的模型不同,这些模型的准确性和泛化能力,能够随着更多的数据或参数不断提升,而无需改变底层的简单算法和架构。一个令人印象深刻的证据是缩放定律[177]:它描述了基于Transformer的模型性能,如何随着模型规模和数据量的增加而可预测地提高;直到今天,缩放定律仍然成立。这种可扩展性不仅体现在模型规模上,还延伸到它们处理日益复杂任务的能力上,使其成为迈向通用人工智能(AGI)征程中的基石。然而,可扩展性是以巨大的资源需求为代价的。基础模型本质上在训练和部署过程中都非常消耗资源。这些资源不仅包括像GPU和TPU这样的计算处理器,还包括内存、能源和网络带宽。例如,训练LLaMa-2 70B模型需要170万个GPU小时,消耗 \(2.5×10^{12}\)焦耳的能量,估计总排放量为291吨二氧化碳当量。根据Meta AI的研究[416],除了训练之外,数据处理、实验和推理阶段消耗的电量与之相当,甚至更多。最近的一项分析[81]显示,为了满足当前人工智能能力和应用的发展趋势,到2027年,英伟达每年需要交付150万台人工智能服务器。这些服务器在满载运行时,每年至少消耗85.4太瓦时的电力 —— 这比许多国家(如新西兰和奥地利)一年的用电量还要多,如图1所示。由于基础模型在规模和复杂性上不断增长,它们的资源需求往往呈指数级上升,这对其开发和部署构成了重大挑战。
图1:各国与AI的电力消耗对比。数据来源:[81]
大型基础模型巨大的资源占用,也阻碍了其民主化进程。截至2023年底,只有少数主要参与者有能力训练和部署最先进的基础模型,他们因此对公众拥有强大的控制权,并有可能以自己偏好的方式操纵这些模型。与许多轻量级深度神经网络(DNN)不同,这些模型在云端提供服务,而不是在设备上运行[434, 476];这使得数据隐私保护几乎变得不可能。尽管最近智能手机厂商一直在吹嘘在本地运行大型基础模型,并且为设备端大语言模型开发了一些开创性的引擎[121, 11, 10],但展示的模型规模相对较小(例如,小于100亿参数)[266],并且尚未在实际中部署。
因此,大量研究致力于提高这些基础模型的效率。这些努力涵盖了广泛的方法,从优化算法到系统级创新,专注于在不影响性能的前提下减少这些模型的资源占用。本综述旨在深入研究这些研究工作,探索使基础模型更具资源效率的各种策略。我们将研究算法效率的提升、系统优化、数据管理技术,以及资源消耗较低的新型架构的开发。该综述还涵盖了从云端到边缘设备的应用场景,在这些场景中,大型基础模型也备受关注。通过这次探索,我们旨在全面了解基础模型领域中资源高效算法和系统的现状及未来发展方向。
本综述的范围主要由以下几个方面定义。(i)我们仅综述算法和系统创新;我们排除了大量在硬件设计方面的工作,虽然硬件设计同样重要,但已有很好的综述[192, 185]。(ii)本综述中资源的定义主要限于物理资源,包括计算、内存、存储、带宽等;我们排除了训练数据(标签)和隐私,尽管它们也可被视为资源。(iii)我们主要综述发表在顶级计算机科学会议上的论文,即CSRankings中收录的论文。我们还手动从arXiv上挑选了相关且可能具有高影响力的论文。(iv)我们主要综述2020年以后发表的论文,因为人工智能领域创新迅速,旧的知识和方法经常被推翻。
组织结构
图2展示了本综述的组织结构。
- 基础模型概述(第 2 章)
- 语言基础模型(2.1 节)
- 视觉基础模型(2.2 节)
- 多模态基础模型(2.3 节)
- 高效架构(第 3 章)
- 高效注意力机制(3.1 节)
- 稀疏注意力
- 近似注意力
- 无注意力方法
- 动态神经网络(3.2 节)
- 专家混合
- 早退机制
- 扩散模型特定优化(3.3 节)
- 高效采样
- 潜在空间扩散
- 扩散架构变体
- 视觉 Transformer(ViT)特定优化(3.4 节)
- 高效注意力机制(3.1 节)
- 高效算法(第 4 章)
- 预训练算法(4.1 节)
- 训练数据缩减
- 神经架构搜索
- 渐进学习
- 混合精度训练
- 微调算法(4.2 节)
- 加法微调
- 选择性微调
- 重参数化微调
- 推理算法(4.3 节)
- 机会解码
- 输入过滤和压缩
- 键值缓存
- 长上下文优化
- 模型压缩(4.4 节)
- 剪枝
- 知识蒸馏
- 量化
- 低秩分解
- 预训练算法(4.1 节)
- 高效系统(第 5 章)
- 分布式训练(5.1 节)
- 弹性
- 并行性
- 通信
- 存储
- 异构 GPU
- 专家混合(MoE)
- 联邦学习(5.2 节)
- 框架和基准
- 基于参数高效微调(PEFT)的方法
- 模型分解
- 无反向传播方法
- 云端服务(5.3 节)
- 推理加速
- 内存节省
- 新兴平台
- 边缘服务(5.4 节)
- 边缘 - 云协作
- 仅边缘
- 分布式训练(5.1 节)
完全开源
本综述的所有材料均可在以下网址免费获取:https://github.com/UbiquitousLearning/Efficient_Foundation_Model_Survey
2 基础模型概述
2.1 语言基础模型
本节讨论基于文本和基于语音的语言模型,重点介绍它们的关键架构和具有里程碑意义的模型。
2.1.1 模型架构
Transformer流水线。Vaswani等人[388]提出了基于注意力机制的Transformer架构,这是大多数大型基础模型发展的基础元素。如图3所示,该过程首先通过嵌入层将输入单词转换为高维向量。在处理过程中,注意力机制为这些输入向量的不同部分分配不同的权重。注意力计算之后,对输出应用层归一化,以确保激活值的稳定和标准化。随后,每个位置向量通过前馈网络进行变换,引入非线性,使模型能够捕捉复杂的数据模式。通过包含这些组件的多个层,Transformer学习输入数据的层次表示。在最后阶段,最后一个Transformer层的输出被输入到线性层,最终得到预测结果。我们简要概述大型基础模型的关键组件如下:
图3:基础模型的进化轨迹
嵌入
最初,输入单词由分词器转换为一系列标记。常用的分词器,如wordpiece和字节对编码,在这个过程中经常被使用[380]。分词之后,通过学习得到的嵌入层将这些标记转换为向量序列。在这样的序列中,单词的顺序对于语义至关重要。为了解决这个问题,位置编码被融入到嵌入向量中,为其注入位置信息。这种添加对于捕捉输入的顺序性至关重要,确保模型能够准确解释单词顺序和上下文。
注意力
注意力机制在捕捉序列中单词之间的关系方面起着至关重要的作用。注意力的计算可以表示为: \[A(Q, K, V)=\text{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V (1)\] 其中,\((Q)\)、\((K)\)和\((V)\)分别表示查询、键和值,它们分别通过将输入向量与不同的权重矩阵相乘得到,\((d_{k})\)表示这些向量的维度。自注意力是注意力的一种特殊形式,其中查询、键和值都来自同一输入序列,它使模型能够在每个位置关注输入的不同部分。相比之下,多头注意力是自注意力的一种变体,它允许在不同位置同时关注来自不同表示子空间的信息。其他变体,如稀疏注意力[36]和多查询注意力[346],是为了提高效率或适应各种下游任务而设计的。这些变体将在§3.1、§4.3.3和§4.3.4中进一步详细介绍。
编码器 - 解码器架构
标准的Transformer架构由两个主要组件组成:编码器和解码器。编码器通过自注意力机制处理输入序列,使模型能够根据输入序列不同部分的相对重要性为其分配不同的权重。这一特性对于识别输入数据中的复杂模式和依赖关系至关重要。相比之下,解码器负责生成输出序列。解码器利用自注意力机制来理解到目前为止生成的输出之间的关系。此外,解码器还结合了交叉注意力机制,关注输入序列,为输出序列中的每个标记提取相关信息。这部分架构是自回归的,即逐个生成标记。每个标记的生成取决于之前生成的标记,这与编码器的并行处理方式不同。
自回归解码和键值缓存
在自回归解码中,解码器函数 \(F_{Decoder }\) 根据输入标记序列 \(X={x_{1}, x_{2}, ..., x_{i}}\) 推断出一个新的标记 \(x_{i+1}\) 。随后, \(x_{i+1}\) 被添加到 \(X\) 中,用于下一个推理步骤,这就是自回归解码的过程。键值(KV)缓存[76]通过在每个步骤存储注意力机制的中间状态来提高效率。这种方法避免了对先前步骤中已处理标记的重新计算。虽然键值缓存减少了重新计算,但它会引入额外的存储或内存开销,这将在§2.1.3中详细介绍。
2.1.2 代表性模型和下游任务
仅编码器的基础模型
BERT[88]是一种仅编码器的Transformer模型,在预训练期间采用双向掩码语言建模方法。在这种方法中,句子中的随机单词被掩码,模型通过考虑上下文线索来学习预测这些被掩码的单词。对BERT进行微调以适应各种下游任务,在判别任务(如情感分析和文本分类)中取得了最优性能。DistilBERT[340]是BERT的蒸馏版本,模型大小比BERT小40%,速度快60%,但仍保留了BERT 97%的语言理解能力。RoBERTa[256]通过强大的优化技术提高了BERT的效率,包括延长训练时间、增加批次大小和使用更大的数据集。Sentence-BERT[332]对BERT进行了修改,以生成语义有意义的句子嵌入。它采用连体和三元组网络结构,这些嵌入可以使用余弦相似度直接进行比较。该模型已经发展成为广泛使用的句子 - 转换器工具,专门用于句子嵌入。
编码器 - 解码器基础模型
T5[325]采用编码器 - 解码器架构,是一种自监督模型,在C4数据集上进行预训练。该模型引入了一个统一的框架,将各种基于文本的语言问题转换为文本到文本的格式,使其适用于总结、问答等任务。BART[210]在预训练阶段充当去噪自编码器,通过任意噪声函数对文本引入干扰,主要目标是学习重建原始文本。
仅解码器的基础模型
GPT系列[323, 324, 41]采用仅解码器的架构进行无监督训练。GPT-1[323]是该系列的首个模型,具有1.17亿个参数,展示了在各种互联网文本上进行预训练的有效性。GPT - 2[324]是GPT - 1的扩展版本,在包含数百万网页的WebText数据集上进行无监督训练。GPT - 3[41]的模型规模大幅增长,达到1750亿参数,凸显了模型规模扩大的优势,它展现出卓越的零样本学习性能。指令调优[300]通过利用人类反馈进一步提升了模型准确遵循指令的能力,推动了包括LLaMA[383]在内的多个开源基础模型的创建。GLM[95]通过添加2D位置编码并允许以任意顺序预测跨度来改进填空式预训练,在自然语言理解任务上的性能优于BERT和T5。PaLM[70]使用Pathways在6144个TPU v4芯片上进行训练,以进一步探究模型规模对少样本学习的影响。此外,还有许多闭源的生成式大型基础模型,包括GPT - 4 、Claude2和PaLM 2 等。
|模型名称|架构|参数数量|训练方式|训练数据集|典型任务|
表1:具有里程碑意义的语言基础模型及其典型任务
语音基础模型。语音大型基础模型[322, 28, 148]旨在从原始音频信号中提取有意义的表示。Wav2vec 2.0[28]首次展示了从未标记数据中获取强大的语音表示,可以显著提高后续语音相关任务的性能。这些模型通常采用卷积神经网络来提取序列特征,并使用Transformer来捕捉上下文信息。这种方法对各种下游任务有效,包括语音识别和口语理解。例如,HuBERT[148]利用基于Transformer的架构进行语音表示的自监督学习,在960小时的LibriSpeech音频数据集[305]上进行训练。Whisper[322]代表了一种最先进的开源自动语音识别系统,在从网络获取的680,000小时多语言和多任务监督数据的庞大语料库上进行训练。
2.1.3 成本分析
如图4所示,我们分析了大型基础模型主要组件的计算和存储成本 。嵌入组件在存储成本中占很大比例,约为总成本的25%。然而,在推理过程中,嵌入层就像一个查找表,计算成本极低。前馈网络(FFN)层是计算量最大的组件,主要是因为每个FFN块中存在两个全连接层。lm head表示模型的输出层,其形式因任务而异。对于像BERT这样的判别任务,它是一个带有softmax激活函数的分类层,而对于像GPT/T5这样的生成任务,它表现为一个线性层。该组件的大小与词汇表大小直接相关。
图4:不同语言基础模型的权重存储和FLOPs成本(输入序列长度为128)(floating - point operations,即浮点运算数 ,常被用来衡量模型的计算量)
图5:不同token长度下GPT - 2的推理FLOPs
不同token长度下的成本分析
大型基础模型中的注意力机制面临显著的计算瓶颈,主要是由于其与序列长度的二次复杂度。这种复杂度源于对输入序列中每个位置对计算注意力分数,这在处理长序列时带来挑战,并影响训练和推理效率。此外,除了注意力机制,FFN的计算复杂度随输入长度线性增长,但随模型维度呈二次增长。如图5所示,输入序列长度的增加会导致计算需求大幅上升,这归因于注意力机制的二次特性。从定量角度来看,注意力的计算复杂度为\(O(T^{2}D)\),而FFN的计算复杂度为\(O(TD^{2})\),其中\(T\)表示序列长度,\(D\)表示模型的隐藏状态维度[244]。解码器的注意力机制与编码器类似,也随token长度呈二次缩放。这在自回归解码任务中尤为重要,因为每个token的生成依赖于前面的token,加剧了计算需求。在解码器中实现键值缓存可以通过跨不同位置重用键和值向量来大幅降低计算成本。然而,这是以增加内存需求为代价的[199]。假设\(B\)表示批次大小,\(S\)表示序列长度,\(D\)表示隐藏维度大小,\(L\)表示Transformer解码器中的层数,以单精度格式存储键值缓存所需的内存可以计算为\((B\times S\times D\times L\times 2\times 4)\)字节。这个公式考虑了批次、序列和隐藏层的维度,以及解码器中的层数,其中因子2表示缓存中的键和值,因子4表示单精度浮点表示的字节大小。
语音特定考虑因素
在语音处理应用中,CNN编码器块在计算复杂度中起着重要作用。CNN块的初始层需要大量的计算能力,通常比单个Transformer层高出一个数量级。这种增加的需求归因于CNN块固有的卷积运算,其中必须为每个输入token执行大量计算。例如,尽管Transformer的参数数量是wav2vec 2.0模型[28]中CNN块的19倍,但wav2vec 2.0模型的计算负载仅比CNN块高1.8倍[117]。
2.2 视觉基础模型
2.2.1 模型架构
Transformer的发展推动了计算机视觉领域基础模型的出现。视觉Transformer流水线。视觉Transformer(ViT)是最经典的基于Transformer的视觉模型。它受到像BERT这样的自监督预训练自然语言处理模型日益增长的趋势启发,BERT是仅编码器模型。对于输入图像,ViT首先通过卷积嵌入层将图像分割成固定大小的补丁(即token)。例如,一个标准尺寸的RGB图像输入(即3×224×224)将被分割成14×14个大小为16×16像素的补丁。与后续计算密集型的Transformer编码器相比,这种嵌入开销几乎可以忽略不计(例如,小于5%)。此外,为了进行分类,会向token序列中添加一个额外的可学习分类token([CLS])。之后,将位置嵌入添加到每个token中,然后将token输入到标准的Transformer编码器中,图3和§2.1中对此进行了描述。根据具体的下游任务,Transformer编码器生成的隐藏状态最终会被输入到不同的头部,如分类、检测、分割等头部。
2.2.2 代表性模型和下游任务
仅编码器模型
大多数视觉基础模型采用仅编码器架构。ViT[92]是第一项成功在ImageNet上训练Transformer编码器的工作,在参数数量上与BERT相当。它在大规模ImageNet - 21k数据集上进行监督式和自监督式预训练。尽管它展示出具有竞争力的准确性和可扩展性,但与传统的卷积神经网络(CNNs)相比,其对训练数据的需求仍然是一个障碍。为此,DeiT[382]的提出产生了很大影响。DeiT采用蒸馏增强的预训练方法,提高了ViT训练的数据效率。
另一个研究方向是推动自监督ViT预训练的边界。BEiT[33]将预训练目标转变为基于损坏的图像补丁恢复原始视觉token。作者称BEiT是“计算机视觉领域的BERT时刻”。MAE[141]在编码器训练中引入了一个轻量级解码器,用于重建被掩码的补丁。MAE可以有效地掩码掉大部分补丁(甚至高达80%)。因此,编码器的训练可以非常高效,为大型预训练视觉模型的发展铺平了道路。
YOLOS[102]是一个基于ViT构建的目标检测模型(但是是小模型?)。它展示了在中等规模的ImageNet - 1k上预训练的普通ViT,在更具挑战性的COCO目标检测基准测试中的可迁移性。ViTDet[228]使一个普通的、非分层的ViT能够作为目标检测的骨干网络。ViTDet允许对原始ViT架构进行微调以用于目标检测,而无需为MAE风格的预训练重新设计分层骨干网络。Swin Transformer[260]是优化注意力机制的代表性工作。该模型是一个分层ViT,其表示是通过移位窗口计算得到的。DINOv2[297]对一个具有10亿参数的ViT模型进行训练,然后将其蒸馏成一组较小的模型,这些小模型在大多数图像和像素级别的基准测试中,性能优于领先的通用特征,如OpenCLIP。
编码器 - 解码器模型
DETR[49]是早期利用Transformer构建端到端检测管道的尝试。DETR的架构是级联的:它由一个CNN骨干网络和一个编码器 - 解码器Transformer组成。DETR通过监督训练支持目标检测、实例分割和全景分割。DETR的参数数量与Faster - RCNN[334]相当,约为4000万。SegFormer[427]是一个语义分割模型,它将Transformer与轻量级多层感知器(MLP)解码器相结合。LVM[30]通过图像序列建模,采用纯粹的视觉方法实现了对视觉信息的有效学习,无需任何语言数据.
2.2.3 成本分析
由于ViT的架构与BERT对齐,其资源消耗也相似。然而,与像BERT这样的语言模型不同,视觉模型通常具有固定长度的输入。对于标准图像输入,如14×14或16×16的补丁,计算瓶颈在于FFN中的全连接层和注意力层。更多细节请参考§2.1。
2.3 多模态基础模型
多模态目前是基础模型研究中的一个热门研究方向。一个大型基础模型通常在跨模态理解、转换和生成方面表现出强大的能力。一般来说,多模态基础模型的研究有两条主线:一是将不同模态的数据编码到相同的潜在空间,大多采用Transformer编码器;二是生成不同模态的数据,通常使用Transformer解码器。具体而言,多模态生成主要围绕基于文本的图像生成展开,这是一个具有挑战性且现实的机器学习任务,近年来取得了显著进展。这两条研究主线存在融合,例如多模态到多模态(甚至任意到任意)的生成。
2.3.1 关键架构
为了摄取和对齐多模态输入数据,现有模型架构通常由多个编码器组成,每个模态都有自己的一组Transformer编码器。值得注意的是,这些编码器通常是从头开始训练的,利用具有对齐模态和当前模态的配对数据。在接收到来自不同模态的输入后,它们首先将这些数据编码为归一化的、固定维度的嵌入。通过将这些嵌入映射到高维空间并设计损失函数,研究人员旨在最小化不同模态在联合语义空间中的距离。这种方法对齐了不同模态,并增强了它们表示的一致性。
在多模态数据对齐后,现有研究要么(i)重用在纯文本语料库上训练的大语言模型来生成文本;(ii)要么使用扩散模型来生成高质量的图像像素。在第一种情况下,大语言模型模块被设计为基于与文本模态对齐的输入数据进行理解、推理和生成输出。该模块通常采用仅解码器架构。由于在众多大规模语料库数据集上进行了广泛的预训练,大语言模型被赋予了丰富的语义知识。这使得它们能够有效地理解嵌入在文本模态中的数据,并在执行特定任务时以自回归方式生成基于文本的输出。在第二种情况下,扩散模块旨在通过消除输入图像中存在的冗余噪声来生成高质量图像。在训练阶段,模型向图像中引入噪声,将其转换为随机状态。相反,在推理阶段,这个过程被反转,逐渐去除噪声。这种去噪过程对于提高图像清晰度至关重要,能够生成具有高分辨率和细节清晰度的图像。稳定扩散模型在这项技术上取得了显著进展,展示了在生成符合特定文本和图像描述的高质量图像方面的独特能力。除了多模态嵌入输入外,扩散模块主要由两个组件组成:图像编码器/解码器和去噪网络。
图像编码器/解码器
扩散模型是文本到图像生成的最先进方法。编码器将输入图像压缩为低维潜在表示。这种压缩对于降低计算负载和提高模型效率至关重要。解码器则相反,它将潜在表示重构回高分辨率图像。这个过程对于模型生成详细视觉内容的能力至关重要。变分自编码器(VAE)[189]是一种生成模型,用于学习图像的潜在空间。VAE由编码器和解码器组成:编码器负责将图像映射到潜在空间,而解码器负责将潜在空间映射回图像空间。编码器和解码器网络通常由卷积神经层构建。VAE通过最小化重建损失和KL散度损失进行训练。重建损失确保解码器生成的图像与原始图像相似,而KL散度损失确保潜在空间与标准正态分布相似。VAE被用于扩散模型中学习图像的潜在空间。另一种常用于扩散任务的VAE模型变体是VQ - VAE [387],它通过向量量化层学习图像的潜在空间。向量量化层应用向量量化技术,将图像的每个像素量化为最接近的码本向量。通过这种方式,VQ - VAE模型可以更高效地对图像进行编码和解码。
去噪网络
去噪网络通过预测噪声分布并使用采样算法(如DDPM [144]和DDIM [356])逐步去除编码图像中的噪声。最初,在训练阶段,模型向图像中添加噪声,逐渐将它们推向纯随机状态。然后,去噪网络在推理阶段学习反向这个噪声添加过程,一步一步地进行。这种渐进式去噪对于提高最终图像输出的清晰度和质量至关重要。U - Net [337]通常被用作扩散模型中的噪声预测网络,它是一个卷积神经网络模型,由收缩路径和扩展路径组成。收缩路径负责通过将图像映射到高维空间来捕获图像中的上下文信息,而扩展路径通过上采样促进精确的定位。为了保留收缩路径上的信息,扩展路径通过跳跃连接与收缩路径相连。U - Net模型是图像分割任务的常用选择,也被用于扩散模型中预测图像中的噪声。
融合解码器(FD)
此外,FD模块旨在基于图像本身和相关图像提示增强对图像的理解,并根据任务要求生成输出。该模块通常涉及设计一个融合解码器,并在图像和文本数据集上进行预训练,使其能够联合处理图像和文本表示。该模块通常包括设计一个融合解码器,并在图像和文本数据集上进行预训练,使其能够共同处理图像和文本表示。
|年份|模型名称|模型架构|面向任务|参数数量|预训练方法|预训练数据集|测试数据集|
表3:具有里程碑意义的多模态基础模型及其典型任务
2.3.2 代表性模型和下游任务
多编码器基础模型:CLIP [321]、ALBEF [216]和ALIGN [164]是最早提出跨模态对齐的一些工作,旨在通过建立图像和文本之间的联系,从文本中学习更丰富的图像表示。虽然这些模型最初展示了多模态的潜力,但它们的性能受到图像和文本编码器的能力以及图像 - 文本对数据的数量和质量的限制。随后的工作,如ImageBind [123]和LanguageBind [492]进一步扩展了模态对齐。这些模型采用各种中间模态作为对齐模态,有效地将来自不同来源的表示映射到中间模态的特征空间中,从而便于在联合向量空间中进行跨模态转换。然而,在将多模态表示与中间模态对齐时出现了重大挑战,这主要归因于编码器能力的限制。这些限制反过来又影响了模型的整体性能。
编码器 - 解码器基础模型利用嵌入模块进行模态转换,使转换后的模态与生成器兼容。
(1)编码器 - 大型基础模型:PandaGPT [361]利用多个单模态编码器将输入对齐到中间模态。PandaGPT将中间模态输入到大型基础模型中进行生成,然后由目标模态的解码器进一步转换。此外,BLIP - 2 [215]和MiniGPT - 4 [494]专注于文本和图像的跨模态生成,通过设计图像模态编码器并使用Q - Former将这些图像模态与文本模态融合,然后输入到多模态大型基础模型中进行跨模态生成。同时,mPLUG [453]和LLaVA [248]专注于提高模态转换的能力,以增强生成结果的可用性和可靠性。MobileVLM V2 [71]是为资源受限设备设计的高效视觉语言模型,它利用基于CLIP的编码器和基于MobileLLaMA的解码器,在保持快速推理速度的同时实现卓越的性能。此外,Flamingo [19]和LLaMA - Adapter [478]探索了如何以更低的成本调整多模态大型基础模型,从而生成更高质量的多模态输出。PaLM - E [93]和HuggingGPT [349]专注于具身智能,通过使用大型基础模型作为核心组件,将具身数据纳入多模态输入中。这些模型进一步设计智能体来分解任务,并利用生成能力完成复杂任务。
(2)编码器 - 扩散基础模型:稳定扩散 [336]能够通过学习的过程逐渐消除图像中的噪声,生成高质量的图像,从而产生清晰和详细的视觉输出。该模型应用于各种下游任务,如从文本描述生成详细图像(文本到图像生成)、恢复或完成图像的部分内容(图像修复)、修改现有图像的特定方面(图像编辑)以及提高图像的分辨率(图像超分辨率)。稳定扩散在这些领域的适应性使其成为图像处理和生成领域的宝贵工具。一致性模型 [358]的开发是为了提高扩散模型在生成高质量图像、音频和视频方面的效率。这些模型有助于快速的单步生成,克服了传统扩散模型采样速度慢的问题。它们展示了执行零样本数据编辑任务的能力,如图像修复、着色和超分辨率,而无需针对这些任务进行特定的训练。DALL - E [327]主要用于图像生成,展示了根据文本描述创建多样和复杂图像的能力。该模型集成了自然语言理解和计算机视觉的元素,使其能够生成忠实代表广泛文本提示的图像,从简单描述到复杂场景。
除了稳定扩散,还有对“任意到任意”生成模型的显著关注,这些模型旨在将各种类型的输入转换为广泛的输出。CoDi [372]被设计为从不同的输入组合中生成各种输出模态,如语言、图像、视频或音频。它的独特之处在于能够同时生成多种模态,而不受特定输入类型的限制。CoDi在输入和输出空间中对齐模态,从而便于生成训练数据中不存在的组合。NExT - GPT [419]展示了感知输入并在各种模态(包括文本、图像、视频和音频)中生成输出的能力。NExT - GPT将大型基础模型与多模态适配器和扩散模型集成。该系统通过最小的参数变化进行微调,便于经济高效的训练和简单的模态扩展。通过采用模态切换指令调整并利用专门策划的数据集,NExT - GPT增强了跨模态内容生成和理解,目标是对通用模态进行建模。同样,M4 [462]引入了一种可扩展的移动人工智能基础模型,通过采用多模态嵌入和基于Transformer的骨干网络,统一了各种人工智能任务,用于理解和推理文本、图像、音频和运动数据等输入,提高了移动人工智能的效率和可扩展性。
(3)编码器 - FD基础模型:UNITER [64]是最早提出在多模态设置中通用融合图像和文本的工作之一。它旨在通过Transformer组合图像和文本特征以获得联合特征。在此基础上,随后的工作,如FLAVA [354]、CoCa [459]和GLIP [219]更深入地研究了如何使用解码器更好地融合和对齐图像和文本表示,从而增强多模态推理。
此外,SAM [190]和SAM 2 [331]更进一步,利用解码器融合与图像对应的提示嵌入,实现了仅基于文本提示的图像/视频零样本自动分割。
2.3.3 成本分析
多编码器模块:多编码器模块是为模态对齐而设计的专用编码器模块。该模块适应各种模态输入,使用不同的编码器架构有效地将这些输入对齐到统一的语义空间。具体而言,主要的编码器模块包括图像编码器、文本编码器、音频编码器和IMU编码器。如图6(a)所示,编码器模块平均有0.27B个参数,平均占用1.1G内存,处理一个样本的总GFLOPs为65.9。值得注意的是,图像编码器是最消耗资源的组件,有0.63B个参数,占用2.4G内存,处理单个样本时执行167.59 GFLOPs。
解码器模块:在多模态模型中,除了多编码器模块外,还有一个由大型基础模型、扩散模块和FD模块组成的解码器模块。
(1)大型基础模型模块:该模块接收来自不同模态对齐的输入,实现自回归生成。该模块的成本主要取决于大型基础模型参数的大小。如图6(b)所示,以集成的Vicuna - 7B为例,该模型由70亿个参数组成,占用14G内存,处理一个样本的总GFLOPs为312,大大超过了编码器模块的资源需求。
图6 The cost of different modules in multimodal FMs.
(2)扩散模块:该模块接收可选的条件输入并生成高质量图像。由于扩散模型中这些模块的大小各不相同,我们以Stable Diffusion 2.1为代表进行讨论。Stable Diffusion 2.1采用U - Net进行去噪、VAE进行图像编码和解码,并使用CLIP模型作为文本编码器。图7(a)和(e)展示了Stable Diffusion 2.1模型中的FLOPs(floating - point operations,即浮点运算数 ,常被用来衡量模型的计算量)和参数数量百分比。我们以由10个token组成的文本提示为例进行说明。图7(b)和(f)展示了VAE模型中的FLOPs和参数数量百分比。图7(c)和(g)展示了U - Net模型中的FLOPs和参数数量百分比。
图7(d)和(h)展示了CLIP模型中的FLOPs和参数数量百分比。Stable Diffusion 2.1的U - Net以形状为4×96×96的图像潜在表示作为输入,并预测潜在空间中的噪声。该模型在LAION - 5B数据集[344]上进行训练。U - Net有8.65亿个参数,处理一个样本的总FLOPs为759G。Stable Diffusion 2.1集成的VAE将图像编码到潜在空间并进行解码。VAE以分辨率为3×768×768的图像作为输入,并将其编码为4×96×96。VAE与U - Net在相同的数据集上共同训练。VAE有830万个参数,处理一个样本的总FLOPs为4T。Stable Diffusion 2.1使用CLIP [321]模型进行文本编码。CLIP在各种(图像,文本)对数据集上进行训练,如LAION数据集和DataComp数据集[114]。CLIP以句子作为输入,并将每个token编码为大小为1024的隐藏向量。该模型有2.89亿个参数,处理单个token的总FLOPs为2.89亿。
(3)FD模块:由于FD和ViT的结构相似,它们的资源消耗和计算瓶颈也相似。更多详细信息,请参考§2.2。
图7 Parameters and FLOPs of different modules in Stable Diffusion 2.1
3 资源高效架构
模型架构是实现资源高效的大型基础模型的核心,包括注意力机制、解码器及其替代方案。其主要目标是降低计算和内存开销。图8根据大型基础模型的标准核心模块和传统分类方法,直观展示了资源高效架构的分类。资源高效架构包括高效注意力机制、动态神经网络、扩散特定优化和ViT特定优化。
图8:资源高效架构概述
3.1 高效注意力
注意力架构与序列长度相关的二次时间复杂度,在训练和推理过程中带来了重大挑战。以往的研究[107, 244, 185, 90, 390]探索了将这种复杂度降低到线性的方法,或寻找可行的替代方案。图9直观总结了实现高效注意力的多种方法。
图9:高效注意力架构示意图
3.1.1 稀疏注意力
受稀疏化的启发,稀疏注意力[36, 18, 464, 153, 96, 206, 217]旨在构建一个稀疏注意力矩阵。这种方法旨在保留完全二次自注意力方案的经验优势,同时减少内积的数量。例如,Longformer [107]、ETC [244]和BIGBIRD [464]将传统注意力分解为局部窗口注意力和特定任务的全局注意力,有效地将自注意力复杂度降低到线性。
HEPOS [153]引入了按头的位置步长。这一创新使得每个注意力头能够专注于输入序列的特定子集,便于编码器 - 解码器的处理。MATE [96]将注意力转换为多视图格式,有效地处理表格中的行或列。TDANet [217]模仿人类大脑的自上而下的注意力机制,有选择地关注最相关的信息,从而提高语音分离效率。ALBERT [202]通过跨层共享参数,与传统的BERT相比,在保证准确率的同时,参数数量减少了89%。
3.1.2 近似注意力
许多研究[191, 179, 397, 69, 271, 272, 174, 55, 423]探索的近似注意力,涉及对自注意力矩阵的低秩近似和对自注意力机制的创新重构。这些方法避免直接计算N×N矩阵,旨在降低计算复杂度,提高效率,特别是在长序列场景中。Linformer [397]证明了将注意力矩阵有效分解为低秩矩阵的方法。该技术涉及将键和值的长度维度投影到较低维空间,从而显著降低内存复杂度。Reformer [191]利用局部敏感哈希来代替传统的点积注意力。
Katharopoulos等人[179]引入了一种基于核的自注意力方法,利用矩阵乘法的结合性来计算自注意力权重。Polysketchforme [174]采用多项式函数和草图技术来近似softmax注意力输出,为注意力机制的近似提供了新的视角。Mega [272]具有单头门控注意力机制,并结合了指数移动平均。这一添加有效地将与位置感知局部依赖相关的归纳偏差,融入到原本位置无关的注意力机制中。
可变形注意力[423]提出了一种数据感知的、可变形的注意力机制,在ViT架构中有助于提高性能。与传统的密集注意力方法相比,这种方法尤其有益。CrossViT [55]引入了线性交叉注意力,使ViT架构能够有效地处理可变大小的输入token,同时降低计算成本。
3.1.3 无注意力方法
尽管基于注意力的Transformer架构在大型基础模型中占据主导地位,但一些研究[467, 161, 313, 43, 42, 128, 77, 298, 309, 366]提出了创新架构,有望取代传统的Transformer模型。例如,Hyena [313]引入了一种架构,将隐式参数化的长卷积与数据控制的门控交错排列。这种设计为大规模语言模型中的注意力提供了一种次二次的替代方案,从而提高了处理长序列的效率。另一个值得注意的趋势是用状态空间模型(SSMs)替代注意力机制,如[128, 77, 298]中所探索的。
Mamba [127]将选择性的SSMs无缝集成到一个简化的神经网络架构中,消除了注意力和MLP块。该模型比传统Transformer实现了显著的5倍速度提升,并且与序列长度呈线性缩放。Gu等人[119]还对SSM文献进行了全面的重组,使其更具信息性和连贯性。
循环风格的Transformer(RMT)[43, 42]采用基于循环神经网络的架构,用RNN替代注意力以实现线性复杂度。RWKV [309]将Transformer的高效可并行训练与RNN的有效推理能力相结合。RetNet [366]引入了一种架构,用多尺度保留机制替代多头注意力。该架构捕获并保留先前序列步骤的信息,通过不同头使用不同的gamma值来调节保留强度。RetNet不仅在推理时无论序列长度如何都保持恒定的成本,而且在效率上优于带有键值缓存的Transformer模型。此外,在训练过程中,RetNet与标准Transformer相比,展示出25 - 50%的内存节省和7倍的加速。
3.2 动态神经网络
3.2.1 专家混合
Figure 10: Traditional and typical dynamic transformers.图10:传统和典型的动态Transformer
三种不同类型的Transformer架构,分别是传统Transformer、典型的专家混合(MoE)版本Transformer和典型的早退(Early-Exiting)Transformer:
传统Transformer(图a):输入数据(input)进入模型后,首先经过自注意力机制(Self-Attention)模块处理,接着依次通过“Add + Normalize”(残差连接和归一化)模块和密集前馈网络(Dense FFN)模块,如此重复N个模块块(xN blocks)后,最终输出(output)结果。这是经典的Transformer结构,常用于自然语言处理等多种任务。
典型的MoE版本Transformer(图b):其整体结构与传统Transformer类似,但在密集前馈网络(Dense FFN)部分有所不同。这里的Dense FFN被替换为一个专家混合的结构。具体来说,有一个路由器(Router)根据输入数据,从多个专家(Expert,图中显示为多个FFN,即前馈网络)中选择合适的专家进行处理,之后再经过后续的“Add + Normalize”模块,重复N个模块块后输出结果。这种结构可以根据不同的输入动态地选择专家,提高模型的灵活性和效率。
典型的早退Transformer(图c):在传统Transformer结构的基础上,添加了早退分支(Early Exit Branching)。输入数据经过自注意力机制、“Add + Normalize”模块和密集前馈网络模块,每经过一组模块块,就有一个早退分支。这意味着模型在处理过程中可以根据一定条件提前输出结果,而不需要完整地经过所有模块块,有助于在保证一定准确率的情况下,减少计算量和推理时间。
专家混合(MoE),如图10(b)所示,是一种高效且稀疏的方法,用于训练和部署具有大量参数集的大型基础模型。该模型在推理时使用路由稀疏参数。Switch Transformer [104]引入了一种开关路由算法,使模型效率得到提高,计算和通信成本降低。Switch Transformer通过管理多达一万亿个参数(甚至有2048个专家),展示了MoE框架的可扩展性和有效性。GLaM [94]是一个仅解码器的语言模型家族,利用稀疏激活的MoE设计。这种创新方法在大幅降低训练成本的同时,与密集模型相比增加了模型容量。V - MoE [335]提出了ViT的稀疏适应版本,扩展到150亿个参数,在性能上与密集模型相匹配,同时所需的训练时间更少。LIMoE [286]是第一个集成稀疏MoE的多模态模型,在各种任务中显著优于CLIP。Mistral AI推出了Mistral ,这是一个由8个专家组成的MoE模型,每个专家有70亿个参数。该模型的性能优于LLaMA2 - 70B模型[383]。MoEfication [481]将模型转换为具有等效参数的MoE变体。这种技术有条件地利用前馈网络参数的一部分,保持与原始密集模型相当的性能水平。稀疏上采样[193]从密集检查点初始化稀疏激活的MoE。
稀疏上采样使T5 Base、Large、XL和Vision Transformer Base和Large等模型,在SuperGLUE和ImageNet等基准测试中,显著优于它们的密集对应模型,同时仅使用约50%的原始密集预训练成本。FFF [35]将前馈层划分为单独的叶子节点,而不是将整个前馈层复制为一个专家。FFF是前馈网络的对数时间替代方案,比原始前馈层快220倍,比MoE快64倍,精度损失约5%。§5.1将详细介绍应用于MoE模型的系统优化。
3.2.2 早期退出
如图10(c)所示,早期退出优化是一种策略,当模型对预测有高置信度或遇到资源约束时,允许模型提前终止计算过程。He等人[138]研究了对标准Transformer块的修改,旨在在不牺牲性能的情况下获得更简单但高效的架构。该模型涉及去除诸如残差连接、层归一化以及投影和值中的特定参数,同时序列化MLP子块。M4 [461]引入了一个多路径任务执行框架,实现了对基础模型块的弹性微调,以适应不同的训练和推理任务。FREE [27]提出了一个浅 - 深模块,将当前token的解码与先前处理的早期退出token同步。FREE使用自适应阈值估计器来确定合适的早期退出置信度水平。
SkipDecode [83]专为批量推理和键值缓存而设计,通过为批处理中的每个token在每个序列位置建立唯一的退出点,克服了先前的限制。PABEE [491]通过在每一层集成内部分类器,提高了预训练语言模型的效率。当预测在一定步数内稳定时,推理过程停止,有助于在减少层使用的情况下更快地进行预测。DeeBERT [428]通过引入早期退出点提高了BERT的推理效率。DeeBERT允许实例根据置信度水平在中间层终止,有效地降低了计算需求并加速了推理。Bakhtiarnia等人[31]提出了7种不同的早期退出分支架构设计,适用于ViT骨干网络的动态推理。LGViT [431]提出了一个针对通用ViT的早期退出框架,具有多种退出头,如局部感知和全局聚合头,以平衡效率和准确性。这种方法实现了具有竞争力的性能,速度提高了约1.8倍。
3.3 扩散特定优化
通过扩散模型生成图像通常涉及具有多个去噪步骤的迭代过程。最近的研究集中在加速去噪过程并减少图像生成过程中的资源需求,主要分为三类:(1)高效采样;(2)潜在空间扩散;(3)扩散架构变体。
3.3.1 高效采样
为了在保持或提高样本质量的同时增强扩散模型的去噪过程,许多研究[290, 269, 356, 475, 252, 178, 265, 339, 474, 359, 406, 16, 471]致力于改进采样过程。这些研究在架构中强调资源和时间效率。Nichol等人[290]在提高传统DDPM的资源效率方面取得了进展。他们改进的模型不仅在对数似然方面具有竞争力,而且提高了样本质量。这种效率是通过学习反向扩散过程的方差并采用混合训练目标实现的。这种方法导致了更高效的采样,需要更少的前向传递,并在模型容量和计算能力方面展示出更好的可扩展性。DDIM [356]代表了扩散模型在延迟效率方面的重大改进。通过引入一种非马尔可夫、确定性的采样方法,DDIM加速了生成过程,允许在不牺牲样本质量的情况下更快地采样。这种DDPM [144]的常微分方程(ODE)变体在生成过程中有效地在不同噪声水平之间导航,使其成为比传统DDPM更具延迟效率的选择。PNDM [252]提高了DDPM生成高质量样本的效率。该方法将扩散过程视为在流形上求解微分方程,极大地加速了推理过程。这种注重延迟效率的方法,在需要高速采样的场景中,优于现有的加速技术(如DDIMs),同时保持样本保真度。DPM - Solver [265]专注于提高扩散模型的采样效率。该方法使用高阶求解器,利用扩散ODE的半线性结构,实现快速且高质量的样本生成。值得注意的是,DPM - Solver仅用10 - 20个去噪步骤就实现了这一点,突出了样本生成中的延迟效率。ReDi [471]通过检索和重用预计算的扩散轨迹来加速采样。Nirvana [16]引入了一种近似缓存技术,通过重用中间噪声状态,降低文本到图像扩散模型的计算成本和延迟。这在不影响图像质量的情况下,实现了显著的GPU和时间节省。
3.3.2 潜在空间扩散
在传统扩散模型中,操作通常在图像的像素空间内进行。然而,对于高分辨率图像,这种方法由于计算需求大且内存要求高而效率低下。为应对这些挑战,研究人员提出通过变分自编码器(VAEs)[336, 196, 404, 312, 343, 369, 34, 273]将扩散过程转移到潜在空间进行。这种范式在内存效率方面取得了显著进展,使得在减少计算资源的情况下能够生成高分辨率图像。LDM(Latent Diffusion Model,潜在扩散模型)[336],也就是稳定扩散模型,是内存高效图像生成的一个显著例子。通过在由像素数据经VAE得到的潜在空间中执行扩散过程,LDM有效地解决了早期扩散模型中存在的可扩展性问题。这种方法能够高效地合成高分辨率图像,并且通过融入与文本编码器输入交互的交叉注意力层,有助于创建详细的、由文本引导的视觉效果。LD - ZNet [312]利用LDM的内存高效特性进行图像分割任务。通过在LDM的潜在空间中训练分割模型,LD - ZNet显著提高了分割精度,特别是对于人工智能生成的图像。这种方法利用了LDM内部特征中固有的深度语义理解,在真实图像和人工智能生成的图像之间提供了一个细致的桥梁。SALAD [196]引入了一种用于3D形状生成和操作的内存高效方法。它采用基于部分级隐式表示的级联扩散模型,在高维空间中通过两阶段扩散过程进行操作。这种内存高效的设计有助于在无需额外条件训练的情况下,有效地生成和进行3D形状的部分级编辑。Takagi等人[369]提出了一种使用LDM从功能性磁共振成像(fMRI)脑活动重建高分辨率图像的新方法。该方法利用简单的线性映射将fMRI数据投影到LDM的潜在空间中。这种方法不仅实现了从脑活动的高保真图像重建,还从神经科学的角度对LDM的内部机制有了更深入的理解。这些工作都突出了在扩散模型中利用潜在空间的优势,特别是在内存效率方面,与传统的像素空间方法形成了鲜明对比。
3.3.3 扩散架构变体
另一种增强扩散模型的方法是采用更高效的模型架构[231, 106, 32, 143, 267]。这种策略侧重于改进扩散模型的结构框架,以优化其性能。通过实施先进的架构设计,这些模型可以实现更有效的处理能力,同时有可能降低计算复杂度和资源消耗。SnapFusion [231]为移动设备引入了一种优化的文本到图像扩散模型,具有资源高效的网络架构。该模型通过重新设计的网络架构和改进的步骤蒸馏,克服了现有模型的计算和延迟限制。通过在不到2秒的时间内生成高质量的512×512图像,SnapFusion在FID(Frechet Inception Distance)和CLIP分数上超过了稳定扩散模型。值得注意的是,这一成果是在更少的去噪步骤下实现的。ScaleCrafter [143]通过创新且资源高效的网络设计,解决了使用预训练扩散模型生成超高分辨率图像的问题。ScaleCrafter结合了“重新扩张”、“分散卷积”和“噪声阻尼无分类器引导”等技术,在推理过程中动态调整卷积感知场。该模型能够在无需额外训练或优化的情况下生成超高分辨率图像。ERNIE - ViLG [106]引入了一种新颖的文本到图像扩散模型,将细粒度的文本和视觉知识集成到一个高效的网络架构中。通过混合去噪专家机制并扩展到240亿参数,ERNIE - ViLG在MS - COCO上以卓越的零样本FID - 30k分数6.75超越了现有模型。该模型显著提高了图像保真度和文本相关性,巧妙地解决了复杂文本提示中的属性混淆问题。这些贡献都突出了资源高效网络架构在推进扩散模型、扩展其能力以及拓宽其在不同场景中的适用性方面的重要性。
3.4 ViT特定优化
作为Transformer的一种变体,ViT受益于上述的通用优化方法;然而,也存在针对ViT的特定架构优化。LeViT [126]是一种混合神经网络,专为推理时的高效图像分类而设计。LeViT使用更多的卷积层进行嵌入,增强了其处理像素信息的能力。其主要骨干网络采用金字塔架构,在逐步降低特征维度的同时增加注意力头的数量。值得注意的是,该模型引入了一种可学习的、每个头的平移不变注意力偏差,取代了ViT中的位置嵌入。LeViT在ImageNet上实现了令人印象深刻的80%的top - 1准确率,并且在CPU上执行时,与EfficientNet相比,速度提高了5倍[370]。PoolFormer [460]通过强调ViT的成功源于其整体架构设计(称为MetaFormer),提供了有价值的见解。PoolFormer采用了卷积神经网络(CNNs)中常见的简单池化层,并在ImageNet - 1K数据集上实现了82.1%的top - 1准确率。
MobileViT [277]遵循利用CNNs构建更轻量级Transformer架构的理念。通过设计类似卷积的MobileViT块,该模型实现了轻量级和低延迟的实现,特别适合实际的硬件平台。MobileViT的优化不仅考虑了FLOPs(浮点运算次数),还包括对内存访问、并行性和平台特定特性的考量。MobileViT在ImageNet - 1k数据集上以约600万个参数达到了78.4%的top - 1准确率。EfficientFormer [232]设计了一种轻量级的CNN - Transformer混合架构,实现了更高效的设备端推理。其中最快的模型EfficientFormer - L1在ImageNet - 1K上达到了79.2%的top - 1准确率,在iPhone 12(使用CoreML编译)上的推理延迟仅为1.6毫秒。这一性能与MobileNetV2×1.4相当(1.6毫秒,74.7%的top - 1准确率)。EfficientViT [45]引入了一种线性注意力机制,以减轻与非线性注意力中softmax高开销相关的计算成本。在超分辨率领域,EfficientViT与Restormer [465]相比,速度提升高达6.4倍。
图11:资源高效的ViT变体总结
4 资源高效算法
本节重点关注算法层面的资源高效大型基础模型技术。与传统的深度神经网络(DNNs)相比,大型基础模型具有参数规模巨大和自回归推理等新特点。这种差异导致了众多资源高效算法的出现,根据基础模型的生命周期,这些算法可分为预训练、微调、服务算法和模型压缩。
图12:资源高效算法概述
4.1 预训练算法
大型基础模型的预训练依赖大量的计算资源。例如,GPT - 3 - 175B [41]消耗\(3.14\times10^{23}\)次浮点运算,LLaMa - 70B [383]需要\(1.7\times10^{6}\)个GPU小时。因此,优化计算资源的利用对于基础模型的高效预训练至关重要。资源高效的算法可分为训练数据缩减、神经架构搜索、渐进式学习和混合精度训练。
4.1.1 训练数据缩减
大型基础模型的预训练需要数万亿规模的数据集,例如GPT - 3 - 175B需要3000亿个token [41],LLaMa - 2 - 70B需要2万亿个token [383]。更多的数据意味着更多的资源消耗。因此,先前的文献通过两个方面来降低在大量训练数据上的资源成本:文本数据集去重和图像补丁去除。
文本数据集去重[205]表明,训练数据中存在由于近重复示例和长重复子串导致的冗余。减少重复可以在不影响性能的情况下减少训练步骤。图像补丁去除是通过减少输入到模型的补丁数量,或基于修改后的模型架构重新组织图像token来实现的。例如,TRIPS [167]采用补丁选择层来减少图像补丁。该层通过文本引导计算注意力图像token,与之前的预训练视觉语言模型相比,计算资源减少了40%。掩码自编码器(MAE)[141]作为ViT的一种预训练方法被广泛使用。MAE在预训练阶段对图像补丁进行掩码,但高掩码比例会带来显著的计算资源浪费。MixMAE [249]引入了一种在补丁级别混合多个图像的方法,从而避免了引入[MASK]符号的需要。使用可见图像补丁代替[MASK]符号有助于减少训练数据集的大小。COPA [168]引入了一个名为补丁 - 文本对齐的辅助预训练任务。这种补丁级别的对齐策略旨在减少图像补丁中的冗余,补丁序列的减少有助于节省计算资源。PatchDropout [257]引入了补丁丢弃的概念,以提高计算和内存效率。该方法涉及对原始图像补丁的随机采样,有效地缩短了token序列的长度。TPS [408]采用了一种更激进的压缩技术。TPS根据token的重要性将其分类为修剪集和保留集,然后将每个修剪后的token分配给其相关的保留token,而不是丢弃修剪集。
4.1.2 神经架构搜索
神经架构搜索(NAS)是一种自动模型设计算法,用于在无需人工干预的情况下实现最优的模型效率和性能。零样本NAS [14]引入了一种概念,即模型可以在无需实际训练的情况下预测神经网络架构的性能。通过利用先验知识和代理模型进行架构评估,该技术显著降低了计算成本和时间,有助于在最小资源消耗的情况下高效探索复杂的架构空间。ZICO [212]引入了一种零样本NAS代理,在性能上优于传统的NAS代理,包括一次性和多次性NAS方法。值得注意的是,它通过在搜索阶段无需训练模型,减少了计算资源的消耗。PASHA [39]为初始化分配有限的资源,并根据需要增加资源分配。通过动态资源分配,PASHA加快了NAS的速度并有效地管理了计算资源。RankNAS [149]将NAS问题表述为一个排序问题,并进一步将这个排序问题简化为一个二分类问题。此外,该方法使用特征来评估有前景的架构。PreNAS [391]采用了一种无搜索的NAS方法。该方法通过零样本NAS代理确定优选的架构,然后仅对优选的架构进行一次训练。ElasticViT [371]有一种NAS方法,可自动设计计算量少于1×10^{9}FLOPs的轻量级ViT模型。该方法引入了两种子网采样技术来解决梯度冲突问题,从而实现了高准确率和低推理延迟。
4.1.3 渐进式学习
渐进式学习是一种训练策略,它从训练一个小模型开始,然后逐渐增加模型的大小,并继续训练过程。这种方法通过重用前一阶段的计算来优化计算资源的使用。受不同深度模型之间可以共享知识这一观点的启发,stackingBERT [124]引入了一种渐进式堆叠算法。该算法通过依次堆叠较小模型的注意力层来训练大型模型。stackingBERT表明,这种渐进式堆叠方法可以在减少计算资源消耗的情况下,达到与从头开始训练大型模型相似的性能。CompoundGrow [129]认识到渐进式训练算法与NAS之间的相似性。CompoundGrow为BERT引入了一种渐进式训练算法,有助于模型在多个维度上的增长,包括深度、宽度和输入长度。该方法通过使用复合增长算子来减少计算资源的消耗。阶段训练[348]采用一种策略,即首先预训练一个小模型,随后增加模型的深度和宽度,并继续训练过程。使用增长算子将整个训练状态,包括模型参数、优化器状态、学习率调度等,转移到下一个阶段。这种方法重用了前一阶段的计算,有效地减少了训练时间和计算资源需求。知识继承[319]建议使用现有的预训练语言模型作为教师模型,在更大模型的训练过程中提供指导。教师模型提供的补充辅助监督可以有效地提高更大模型的训练速度。LiGO [395]通过一个可训练的参数线性映射,引入小模型参数来初始化大模型。LiGO通过将增长变换分解为宽度和深度维度上的线性算子组合来实现这一点。
4.1.4 混合精度训练
混合精度训练通常使用半精度浮点数据表示,而不是单精度。这种方法显著降低了内存需求,大约将权重、激活值和梯度所需的存储空间减少了一半(以半精度计算)。Mesa [303]提出将激活压缩训练[50]与混合精度训练相结合,进一步减少激活值使用的内存。该方法根据多头自注意力层的分布对激活值进行量化,以最小化近似误差。GACT [255]引入了一种基于每个梯度重要性的动态调整压缩比。这一创新使得在各种模型架构中,包括卷积神经网络、图神经网络和基于Transformer的模型,都能减少计算资源和内存消耗。
4.2 微调算法
高效的微调算法旨在减少使预训练基础模型适应下游任务的工作量。这些技术可分为三类:加法调优、选择性调优和重新参数化调优。
Figure 13: A summary of various fine-tuning algorithms
4.2.1 加法调优
大型基础模型可以通过添加额外参数并针对新任务进行微调,以低成本实现高性能。具体而言,大型基础模型中的这种加法调优过程可分为三个主要类别:适配器调优、提示调优和前缀调优。
适配器调优
适配器调优旨在通过在预训练大型基础模型的特定层(或所有层)引入适配器模块来降低训练成本。在调优过程中,预训练模型的骨干保持冻结状态,适配器模块用于获取特定任务的知识。一些研究[98, 376, 302]专注于为多任务或多模态扩展设计适配器。ADA [98]和MetaTroll [376]致力于逐步扩展预训练Transformer在多个任务上的能力。这种方法有助于减轻学习过程中的灾难性遗忘,同时减少计算开销。ST - Adapter [302]引入了内置的时空推理能力,使预训练模型在跨模态任务中显著减少需要更新的参数数量。其他研究[240, 402, 379, 241]旨在进一步降低微调成本。HiWi [240]表明,涉及添加新参数的PEFT(Parameter - Efficient Fine - Tuning,参数高效微调)方法通常会引入额外的推理延迟。PEFT通过将适配器应用于预训练参数而不是隐藏表示来提高推理速度。AdaMix [402]设计了一种组合机制,将不同适配器的权重合并为每个Transformer层的单个适配器。这一创新显著减少了多个适配器引入的额外存储成本。MEFT [241]通过将LLM修改为其可逆变体来设计一种插入适配器的方法,减少了激活内存,从而提高了微调的内存效率。Residual Adapters [379]解决了非标准语音导致的自动语音识别性能下降问题。该方法涉及设计个性化的残差适配器,有助于减少更新的参数数量。此外,其他研究,如PEMA [182],专注于在模型微调过程中确保数据保密性。这些方法涉及设计提供上下文提示的适配器,使预训练模型能够生成相应的上下文表示。此外,使用渐进展开方法进行调优。
提示调优
提示调优涉及为每个任务设计特定任务的提示,旨在取代传统的对预训练大型基础模型参数的微调。通过调整输入提示,这种方法显著减少了微调所需的资源和时间。一些研究[23, 208, 384]专注于提高多任务设置中提示的高效可扩展性。例如,PromptTuning [208]、ATTEMPT [23]和BioInstruct [384]研究了如何利用混合软提示在不同任务之间高效地转移知识。这些方法通过重用冻结的预训练大模型来降低参数更新成本。此外,一些工作[448, 57]专注于最小化特定任务的提示微调成本。例如,DualPL [448]设计了两个提示,并分别捕获两个任务的相关知识。这种方法解决了对话状态跟踪系统中收集槽位和值的状态标签成本高昂的问题。在机器阅读理解任务中,MPrompt [57]引入了任务特定的多层次提示微调,以增强在不同粒度上对输入语义的理解,同时减少参数更新的数量。此外,DPT [426]解决了由于使用相同初始化导致的提示微调效率低下的问题。该方法探索了初始化提示的分解,在确保提示有效性的同时进一步减少了可训练参数。
前缀调优
前缀调优在大型基础模型的每一层引入一个可训练的、特定任务的前缀部分。这种技术旨在通过限制对该前缀中参数的更新来降低调优成本。一些工作[400, 247, 486, 287, 389]专注于提高特定领域前缀调优的性能。例如,UAPT [400]和Prefix-diffusion [247]解决了图像字幕生成中多样性有限的问题。这些方法从大型基础模型中提取图像特征,并设计前缀以提高性能,同时减少额外的开销。DOP [486]和DAPA [287]专注于抽象摘要中的领域泛化问题。这些方法为每个源领域设计前缀,以提高模型的泛化能力。PIP [389]专注于释义生成中的句法控制,并通过设计解析指示前缀来降低训练成本。此外,其他工作如Prefix Propagation [213]和APT [469]进一步优化前缀调优,以提高其效率和有效性。
4.2.2 选择性调优
选择性调优旨在通过冻结大型基础模型中的大部分参数,并仅选择性地更新一小部分参数,在新任务上保持高性能的同时降低训练成本。一些工作专注于优化选择性调优的性能。例如,SAM [113]探索了可调参数的选择如何影响调优。通过提出二阶近似方法,它调整较少的参数以实现更好的模型性能。SmartFRZ [221]专注于通过引入基于不同网络结构的自适应层冻结技术来提高层冻结的效率。这一创新提高了系统的准确性和训练速度。FiSH-DiP [79]通过引入样本感知的动态稀疏调优策略,探索了在有限数据下进行调优的有效性。这种方法利用样本反馈选择性地调整部分参数,以增强模型在资源受限情况下的泛化能力。此外,一些工作继续专注于特定领域。例如,Token Mixing [259]和VL-PET [151]专注于视觉语言任务,通过调整和选择可训练参数的子集来提高微调效率。SPT [140]强调通过设计敏感性感知参数预算来高效调整视觉参数,实现特定任务的选择性调优。从可持续人工智能计算的角度来看,GreenTrainer [152]通过自适应选择最合适的张量集,以其重要性和反向传播成本为指导,最小化大语言模型微调的FLOPs。与全量微调相比,它取得了显著的成果,实现了高达64%的微调FLOPs减少。
Figure 14: LoRA and its optimization methods.
4.2.3 重新参数化调优
重新参数化调优通过针对比原始广阔训练空间小得多的子空间来适配大型基础模型。这种方法涉及微调低秩矩阵参数,这一技术有效地降低了整体训练成本。现有的大多数研究都围绕通过低秩适配器设计来实现重新参数化调优。例如,EfficientDM [142]、QLoRA [86]、PEQA [183]、QALoRA [441]和LoftQ [233]结合量化技术,在LoRA的基础上进行改进,以提高内存效率。这一共同努力旨在在保持模型性能的同时提高训练效率。GLoRA [51]增强了LoRA的通用性,通过减少参数数量和计算开销,提高了模型的可迁移性、少样本能力和领域泛化能力。PELA [134]从LoRA中获得灵感,设计了一种低秩近似压缩方法。这一创新通过仅更新低秩模型,同时冻结所有骨干参数,提高了微调效率。LongLoRA [66]通过结合移位短注意力来扩展LoRA的能力,实现上下文扩展。这种实现方式在保持模型性能的同时节省了计算成本。此外,LOMO [268]和MeZO [276]优化梯度计算过程,以减少微调过程中梯度张量的内存需求。对于ViT的线性层,LBP-WHT [447]通过基于沃尔什 - 哈达玛变换的低秩反向传播,降低了矩阵乘法的计算成本。这种方法有助于同时提高模型性能。此外,DSEE [62]研究了在预训练模型权重上应用稀疏感知低秩更新的应用。这种方法在确保模型性能提升的同时,大幅减少了推理FLOPs。Dynamic-Pooling [289]机制旨在通过自回归预测来预测推理边界。这种设计引导模型在调优过程中更快地进行重新参数化。
LoRA在微调低秩矩阵A和B时冻结预训练权重矩阵,其秩可低至2。这种方法显著减少了可训练参数的数量,从而减少了训练期间存储梯度值所需的数量。然而,与全量微调相比,LoRA仍然存在性能差距。为了解决这一问题,人们开发了各种方法来提高LoRA的性能,如图14所示,主要分为三种策略:添加可训练参数、改进初始化和优化学习过程。Delta-LoRA [497]旨在通过低秩矩阵A和B的乘积更新预训练权重,从而在不增加额外内存开销的情况下添加可训练参数,以弥合性能差距。另一方面,PiSSA [278]发现LoRA用高斯随机值和零初始化低秩矩阵,导致初始梯度值非常小,收敛速度慢。PiSSA建议对预训练权重矩阵进行奇异值分解(SVD),将具有较小奇异值的矩阵冻结为残差矩阵,并使用最大奇异值初始化可训练的低秩矩阵A和B。这种优化的初始化方法实现了更快的收敛和更好的性能。最后,DoRA [254]和LoRA+ [137]专注于增强学习过程本身,以进一步提高效率和有效性。DoRA观察到LoRA和全量微调具有不同的更新模式。因此,它将预训练权重分解为幅度和方向分量,并微调方向矩阵。这使得更新模式更接近全量微调,从而带来更好的训练结果。LoRA+表明,对矩阵A和B使用相同的学习率对训练并不最优。通过将B的学习率设置得高于A,可以加速收敛并提高微调性能。
4.3 推理算法
4.3.1 机会主义解码
自回归的本质严重阻碍了大型基础模型的推理效率。因此,有大量方法旨在用机会主义非自回归解码替代自回归解码。
推测解码
推测解码涉及使用成本较低的小模型以自回归方式生成序列,然后使用较大模型并行验证每个token。典型的推测解码过程如下。给定一个小模型\(M_{q}\)和一个大模型\(M_{p}\),用\(M_{p}\)以自回归方式解码\(\gamma\)个token。将\(\gamma\)添加到前缀\(\sigma\)中,然后执行\(M_{p}\)的前向传递。比较\(M_{q}\)和\(M_{p}\)在相应token位置的logits,并根据特定标准接受或拒绝这些token。值得注意的是,这个过程确保了完全的准确性,最终的解码结果与仅使用\(M_{p}\)获得的结果相同。Yaniv等人[209]在T5X模型上使用推测解码实现了2 - 3倍的性能提升。同时期的一项工作[54]在700亿参数的Chinchilla模型上也展示了类似的加速效果。SpecTr [368]提出了一种新颖的推测解码策略,通过扩展候选token的数量和改进草稿选择方法来提高算法性能。该方法在实际运行时间上实现了2.13倍的提升,在标准基准测试中比推测解码进一步提高了1.37倍。ProphetNet [443]引入了一种序列建模架构,用于预测未来token,在一定程度上减少了自回归。在草稿阶段,Draft & Verify [470]选择性地跳过某些中间层,而无需依赖额外的小模型,使其更易于插拔使用。在Llama - 2上的测试表明,这种方法实现了1.73倍的加速。Medusa [47]是另一种为非自回归解码设计的解码架构,不需要额外的辅助模型。它通过预训练多个头来预测不同的时间步,同时预测多个token,然后同时验证这些token。Look-ahead decoding [112]在不需要草稿模型或数据存储的情况下加速大型基础模型的推理。这种方法相对于每个解码步骤使用的log(FLOPs)线性减少解码步骤的数量。此外,还有基于推测解码构建的推理系统,包括SpecInfer [280],它在云端使用多个草稿模型,以及部署在边缘的LLMCad [429]。
查找解码
另一种方法是在解码过程中在文本语料库中搜索模式,以替代自回归生成。例如,推测当前解码的内容可能对应于文本语料库中的一个序列,然后并行进行验证。通过在推理服务器上预计算并存储频繁出现的文本段的注意力状态,Prompt Cache [122]可以在这些段出现在用户提示中时高效地重用它们。这种方法在不修改模型参数的情况下,在保持输出准确性的同时,实现了基于GPU的推理8倍的性能提升和基于CPU的推理60倍的性能提升。在推理阶段,LLMA [445]利用外部文本验证潜在的推理结果,并集成了一个触发机制来确定何时进行解码以及何时进行引用。增加的计算并行性使LLMA在大型基础模型上实现了超过2倍的加速,在许多实际场景中(如搜索引擎和多轮对话),生成结果与贪婪解码相同,这些场景的特点是上下文引用与输出之间有大量重叠。此外,还有研究致力于为大型基础模型提供可并行化的解码提示,从而减轻自回归解码的影响。例如,受人类思维和写作认知过程的启发,Skeleton-of-Thoughts [292]首先引导大型基础模型生成答案的框架。随后,该方法使用并行API调用或批量解码来同时为生成的框架中的每个点填充细节。
4.3.2 输入过滤和压缩
提示压缩
通过压缩输入到模型的提示可以有效地减少计算量。LLMLingua [169]从粗到细的角度引入了一种提示压缩方法。该方法结合了预算控制器以在高压缩率下保持语义完整性,一种基于token级的迭代压缩算法以改进对压缩内容之间相互依赖关系的建模,以及一种基于指令调整的方法来对齐语言模型之间的分布。LLMLingua可以实现高达20倍的压缩,同时性能损失最小。Jiang等人[413]研究了在保持语义的同时压缩大型基础模型自然语言的可行性、适用性和潜力。EntropyRank [385]提出了一种无监督方法,用于从文本数据中提取关键词和关键短语。该方法利用预训练的大型语言模型,并结合香农信息最大化。
LLMZip [386]使用LLaMA - 7B来压缩自然语言。实验结果表明,LLMZip优于包括BSC、ZPAQ和paq8h在内的前沿文本压缩方法。AutoCompressors [68]利用大型基础模型将自然语言压缩为紧凑的摘要向量。这些向量随后可以作为软提示供大型基础模型使用。ICAE [119]利用大型基础模型的能力将广泛的上下文压缩为简洁的内存槽。这些内存槽可直接被大型基础模型用于各种目的。Nugget 2D [317]引入了一种专门用于处理长上下文的提示压缩方法。CoT-Max [154]是一种上下文修剪器,旨在增强大型基础模型的思维链(Chain-of-Thought)能力。
token修剪
研究还探索了对Transformer输入序列的修剪,通常涉及在推理过程中逐步删除不太重要的token。PoWER-BERT [125]提出直接学习token修剪配置。Length-Adaptive Transformer [181]扩展了这一想法,引入了LengthDrop技术,即使用各种token修剪配置训练模型,然后进行进化搜索。TR-BERT [452]将token修剪表述为一个多步token选择问题,并通过强化学习来解决它。
对于ViT,也有一些动态token修剪方法。DynamicViT [328]根据重要性分数对冗余token进行分层修剪。AdaViT [279]和A-Vit [455]采用自适应token减少机制,并为不同的图像选择不同的token。AdaViT根据输入动态确定补丁、自注意力头和Transformer块的使用。A-Vit在推理时丢弃视觉Transformer中的token,根据输入图像的复杂度调整token保留。
SPViT [195]设计了一种自适应实例级token选择器,并引入了一种软修剪技术。PuMer [48]在大型视觉语言模型的推理过程中合并相似的文本和视觉token。Mini-Gemini [230]使用双编码器处理高分辨率图像和低分辨率图像嵌入,而不增加视觉token的数量。LLaVA-UHD [439]也能够处理任意宽高比的高分辨率图像:它利用模块化视觉编码将原始分辨率图像划分为较小的可变大小切片。这些图像token将通过压缩模块进一步压缩,并带有一个空间模式来告知大语言模型切片的位置。
4.3.3 键值缓存
优化基于自回归解码器模型推理过程中的键值缓存内存是一个关键方面。将键值缓存量化为激活值。一种策略是将键值缓存视为激活值,并应用量化技术进行低精度压缩。主要挑战来自于键值缓存中大量极端异常值引入的量化误差。
在图12中,我们展示了键值缓存量化的关键方法。这些方法的详细介绍将在§4.4作为权重 - 激活联合量化的一部分给出。内存高效的稀疏注意力。另一种方法是利用稀疏注意力。然而,值得注意的是,大多数主要针对降低计算复杂度设计的稀疏注意力[36, 464],不一定会导致键值缓存内存消耗的减少。这是因为要实现键值缓存的内存减少,需要更严格的稀疏模式。具体来说,被稀疏化的token在后续步骤中不应被动态访问。为了解决这个问题,H2O [482]引入了一种为优化内存效率而设计的键值缓存逐出策略。该策略使用注意力分数来识别和选择当前状态下最不重要的键值缓存token进行逐出。与强大的基线相比,H2O展示了高达1.9倍的延迟减少和29倍的吞吐量增加。Dynamic Context Pruning [22]在预训练阶段学习一种内存高效的键值缓存逐出策略。这种方法已证明能够实现高达2倍的推理吞吐量增加,甚至更多的内存节省。Scissorhands [263]提出了一种用于大型基础模型推理的高效算法,该算法使用紧凑的键值缓存。这种创新方法显著减少了键值缓存推理内存的使用,在保持模型质量的同时实现了高达5倍的减少。通过使用地标token来划分token块,Landmark Attention [285]优化了键值缓存存储。这种方法允许将大部分键值缓存存储在较慢但容量更大的内存中,从而在不影响性能的情况下减少了内存需求。DeepSeek-V2 [82]提出了一种多头潜在注意力(MLA)方法,将分组查询注意力(GQA)改进为具有更强能力的潜在表示。它通过一个在推理时可被吸收到\(W_{k}\)和\(W_{V}\)的矩阵,将GQA的K和V重新投影到高维形式。FastGen [118]识别各种头的注意力稀疏模式,并通过轻量级注意力分析为每个头确定最合适的模式。
块级键值缓存管理
vLLM [199]采用了操作系统中分页内存的概念,将容易出现内存碎片化的键值缓存作为块进行管理。这种基于块的注意力机制的计算结果与标准注意力机制相同。我们将在§5.3中详细阐述其细节。虽然vLLM通过运行时重新分配显著减少了键值缓存内存消耗,但实践者必须重写注意力内核或重用vLLM的内核,这两种方式都会导致性能下降。为了解决这个问题,vAttention [315]直接依赖操作系统/ CUDA在物理内存上进行重新分配。与vLLM相比,它进一步将端到端服务吞吐量提高了1.29倍。在移动设备上,LMS [456]提出了一种细粒度的键值缓存管理方法,该方法机会性地压缩键值缓存块,并协调交换和重新计算以管理它们。它确保了LMS提出的设备端大语言模型即服务(LLMaaS)愿景中的快速上下文切换。
其他方法
Mooncake [318]提出了一种预填充 - 解码分离系统。其核心是通过缓存和重用相似内容来优化请求的繁重键值缓存。CacheGen [258]将键值缓存视为数据流,并通过标记增量值和算术编码对该流进行编码。InfiniGen [207]通过奇异值分解(SVD)压缩键值缓存,并预取关键的键值对。CachedAttention [116]使用HBM交换来缓存多轮对话的键值缓存。
4.3.4 长上下文
为了有效地处理长序列,Transformer需要调整其位置编码,以增强捕获长距离信息的能力。解决这一挑战的重要工作包括[316, 367, 56, 61, 38, 310, 220, 493]。这些工作是使Transformer能够处理长上下文和高分辨率输入的前提条件。由于注意力机制的二次计算成本,人们提出了各种资源高效的优化方法来处理长输入。这些优化方法包括循环结构和注意力优化。
循环结构
Transformer-XL [74]引入了段级循环机制,可保持时间连贯性而不会中断。这一创新使得评估速度比普通Transformer快1800多倍。RMT [43]在遵循Transformer-XL概念的基础上,通过在输入或输出序列中引入特殊的记忆令牌,将记忆机制集成到Transformer模型中,且无需进行修改。块循环Transformer [157]采用循环单元,在训练期间处理令牌块而非单个令牌,这种方法利用了块内的并行计算,有效利用了加速器硬件。Memformer [418]在保持线性计算复杂度和恒定内存空间复杂度的同时,实现了理论上无限的时间范围记忆。
注意力优化
LM-Infinite [135]引入了Λ形注意力机制,以高效处理长上下文。该机制具有O(n)的时间和空间复杂度,在ArXiv和OpenWebText2数据集上,对于长达128k令牌的序列,LM-Infinite在文本生成中始终保持流畅性和高质量。StreamingLLM [425]使在有限长度注意力窗口上训练的大型基础模型能够推广到无限流解码,且无需任何微调。PCW [330]将长上下文分割成块或“窗口”,限制注意力机制仅在每个窗口内操作,并在窗口之间重用位置嵌入。LongNet [89]引入了扩张注意力机制,随着距离的增加,指数级地扩大注意力范围。这一创新使LongNet能够有效地扩展Transformer,使其能够处理长达10亿令牌的序列。SLED(SLiding-Encoder and Decoder的缩写)[160]重新利用并充分利用经过充分验证的短文本预训练语言模型。尽管SLED与比其大50倍的专业模型竞争时表现出色,但它不需要专门且昂贵的预训练步骤。
4.4 模型压缩
模型压缩是指旨在在不显著降低性能的情况下减小模型大小的一系列技术。本综述研究了大型基础模型的四种主要模型压缩类别:剪枝、知识蒸馏、量化和低秩分解,如图15所示。
图15:大语言模型的模型压缩技术
4.4.1 剪枝
剪枝技术是从神经网络中删除冗余或非必要的连接、神经元或层。其主要目标是减小模型大小,从而降低计算和存储成本,同时保持模型的准确性。结构化剪枝和非结构化剪枝旨在在推理过程中减少权重,而不修改稀疏性。相比之下,上下文剪枝在推理期间根据模型的稀疏性动态选择激活的神经元或层。
结构化剪枝
结构化剪枝通过消除整个结构组件(如连续参数组或层次结构)来压缩大型基础模型。这些结构组件的示例包括模型权重的通道或块。结构化剪枝通常与微调相结合,以减轻准确性损失。LLM-Pruner [270]是一种与任务无关的结构化剪枝算法,它使用少量数据评估耦合结构权重的重要性。该方法根据梯度信息选择性地删除非必要的模型结构。LLM-Pruner结合LoRA在剪枝后恢复模型的准确性。LoRAPrune [472]是另一种基于LoRA的结构化剪枝方法,利用LoRA的权重和梯度进行重要性估计。该方法迭代地消除多余的通道和注意力头,与LLM-Pruner相比取得了更好的结果。Lagunas等人[200]通过合并可变大小的块改进了结构化剪枝技术。这种集成在微调期间应用于移动剪枝框架内,导致删除整个模型组件,如注意力头。结果是,剪枝后的模型比原始BERT模型速度提高2.4倍,大小减小74%。
结构化剪枝也应用于大型基础模型的训练中。Sheared LLaMA [422]采用端到端的方法删除通道,涵盖层、注意力头、中间层和隐藏层。这个过程动态加载批次,并根据不同领域的损失为每个训练批次改变模型结构。Sheared LLaMA展示了将LLaMA2-7B模型剪枝到13亿参数的能力。AdaPrune [156]使用可转置掩码加速神经网络训练,在推理和训练期间的矩阵乘法中实现2倍的加速,且准确性损失最小,并且AdaPrune允许在不同的结构约束之间无缝转换。GUM [342]考虑神经元特异性,通过基于网络组件的全局移动性和局部唯一性分数进行剪枝。这种方法旨在同时最大化敏感性和唯一性,有效地减少大型基础模型权重中的冗余参数。PLATON [473]通过采用重要性估计的上置信界来处理模型剪枝过程中重要性分数的不确定性。这种方法确保了训练的稳定性,并提高了泛化能力。
结构化剪枝通常与量化技术结合用于模型压缩。DJPQ [403]将神经网络压缩视为一个统一的基于梯度的优化问题。DJPQ将基于变分信息瓶颈的结构化剪枝和混合位精度量化集成到一个可微损失函数中。SpAtten [392]代表了一种用于自然语言处理中高效注意力计算的算法 - 架构协同设计方法。该方法利用令牌和头的稀疏性以及量化技术。通过采用新颖的级联令牌和头剪枝以及渐进式量化,SpAtten实现了DRAM访问的显著减少,从而在各种加速器和GPU上实现了令人瞩目的加速和节能效果。
也有大量专门针对结构化剪枝的研究。Block-Skim [131]通过使用自注意力权重选择性地处理重要上下文,优化提取式问答Transformer,通过在较低层早期剪枝不必要的位置来实现。类似地,DepGraph [101]引入了一种用于各种架构的全自动通用结构剪枝方法。该方法解决了结构耦合的挑战,并使用基于范数的准则在各种模型上持续实现性能改进。
非结构化剪枝
与结构化剪枝不同,非结构化剪枝不考虑模型的固有结构。通常,它会删除权重低于阈值的神经元,从而降低计算负载以压缩模型。在部署非结构化剪枝时,需要专门的技术来实现模型存储压缩。SparseGPT [109]是一种一次性剪枝算法,无需重新训练。SparseGPT将剪枝框架视为一个广义的稀疏回归问题,并使用近似稀疏回归求解器来解决它。SparseGPT在像1750亿参数的大型GPT模型上实现了60%的非结构化剪枝。Wanda [363]利用在大型基础模型中出现的大幅值特征的观察结果。Wanda通过按输出修剪具有最小幅值乘以相应输入激活的权重来引入稀疏性。UPop [352]是一个通用的视觉语言Transformer压缩框架,它包含两个关键组件:(1)在连续优化空间中从原始模型统一搜索多模态子网,这使得能够在可压缩模态和结构之间自动分配剪枝比率;(2)逐步搜索和重新训练子网,保持搜索和重新训练之间的收敛以实现更高的压缩比。SSI是一种在图像编辑期间优化深度生成模型的技术,通过选择性地计算编辑区域来实现。利用原始图像的缓存特征图,SSI最小化冗余计算,从而为各种生成模型(如条件GAN和扩散模型)带来显著的加速。SIGE [352]旨在将计算减少转化为标准硬件上的延迟减少,在对模型进行极少修改的情况下,为像DDPM、稳定扩散和GauGAN这样的模型实现显著的加速。
上下文剪枝
与结构化剪枝和非结构化剪枝不同,上下文剪枝动态选择每一层的稀疏状态,使其对硬件优化友好。Deja Vu [264]使用前一层的激活动态预测下一层的稀疏性。它确定MLP块的哪些神经元和注意力块的哪些头需要保留。为了减轻这种预测器的开销,Deja Vu异步预测下一层。PowerInfer [360]利用激活的稀疏性动态预测下一层的热激活神经元,并在GPU上计算它们,而其他冷激活神经元在CPU上计算。与llama.cpp [121]相比,PowerInfer实现了高达11倍的加速,使400亿参数的模型能够在个人计算机上每秒输出10个令牌。PowerInfer-2 [442]通过使用多态神经元引擎将PowerInfer扩展到智能手机上。它根据神经元激活和神经元集群级流水线技术动态调整计算,通过将激活的神经元分组为集群有效地优化稀疏计算,从而显著减少开销。Song等人[357]在小语言模型中使用基于梯度的归因分数并对层间依赖进行校正,实现了精确的稀疏激活。
4.4.2 知识蒸馏
知识蒸馏(KD)是将知识从复杂的、大型的模型(即教师模型)转移到相应的简单模型(即学生模型)以进行模型压缩的方法。一般来说,根据是否考虑教师模型的内部结构,将KD应用于大型基础模型有两种方式:黑盒知识蒸馏和白盒知识蒸馏。
黑盒知识蒸馏
假设教师的大型基础模型的内部结构不可见,这种方法使用大型基础模型的API生成的提示 - 响应对来微调学生模型。其目标是使学生模型具备教师模型的能力。对于大型基础模型,由于参数数量的增加而获得的洞察力有助于实现强大的泛化能力。因此,可以利用上下文学习(ICL)[91]、思维链(CoT)[407]和指令跟随(IF)[300]等技术,使学生模型全面学习大型基础模型的能力。
ICL蒸馏通过将上下文学习目标与传统语言建模目标相结合,将少样本学习和语言模型能力从教师模型转移到学生模型。在Meta-ICL [284]和Metal-ICL [63]中,语言模型在各种任务上使用上下文学习目标进行元训练。这个过程使它们能够通过上下文学习对未见任务进行微调。多任务ICT [155]引入了上下文学习蒸馏的概念,使用ICL目标和来自目标任务的示例对模型进行微调。该方法使用上下文学习对这些任务进行预测。虽然多任务ICT在性能上优于Meta-ICT,但它需要更多的多任务学习以及大型基础模型生成的解释。
IF可以增强模型的零样本能力,其中任务描述作为模型微调的指令。Lion [173]是一种对抗性蒸馏架构,它促使大型基础模型识别具有挑战性的指令,并为学生模型创建新的复杂指令,从而增强学生模型的能力。LaMini-LM [417]是为资源密集型语言模型设计的,它开发了一个广泛的指令集,包括现有的和新生成的指令,用于微调学生模型。
CoT在提示中引入中间推理步骤,引导语言模型逐步解决复杂的推理任务。黑盒知识蒸馏可以利用这种方法将知识从大型基础模型转移到较小的学生模型。Fu等人[111]通过用从大语言模型教师那里蒸馏出的CoT指导较小的模型,增强了它们的数学推理能力。Distilling Step-by-Step [147]在多任务框架中使用CoT从大型基础模型中提取推理依据,为在多任务环境中训练较小的模型提供额外指导。Fine-tune-CoT [145]使用零样本CoT提示技术,通过随机采样从大型基础模型生成多个推理解决方案,以指导学生模型的训练。SOCRATIC CoT [353]训练一个问题分解器和一个子问题求解器作为蒸馏模型。分解器将原始问题分解为一系列由求解器解决的子问题。DISCO [67]使用大型基础模型生成扰动,由专门的教师模型过滤这些扰动,将高质量的反事实数据蒸馏到学生模型中。SCOTT [394]从一个大得多的教师模型中学习一个小的、自洽的CoT模型。SCOTT使用教师生成的推理依据,以反事实推理目标训练学生语言模型,防止学生忽略这些推理依据。SCoTD [218]引入了一种称为符号CoT蒸馏的方法,涉及使用未标记的数据实例从大语言模型中提取CoT推理依据。然后训练一个较小的模型来预测采样的推理依据和相关标签。CoT Prompting [274]通过知识蒸馏探索这种推理能力向较小模型的可转移性,在模型和数据集大小之间的推理能力上找到平衡。PaD [495]通过蒸馏大型基础模型获得推理任务的专用小模型。PaD使用程序辅助推理强化专用模型,并通过自动错误检查帮助它们克服错误的推理步骤。
白盒知识蒸馏
与黑盒知识蒸馏相比,白盒知识蒸馏不仅可以访问教师模型的输出结果,还可以访问其结构和中间结果。因此,白盒知识蒸馏可以更好地利用教师模型的结构,使较小的学生模型能够复制和学习较大教师模型的能力。
Timiryasov等人[378]在包含1000万个单词的具有发展合理性的BabyLM数据集上,训练了一个由GPT-2和小型LLaMA模型组成的集成模型。随后,他们将其蒸馏成一个具有5800万个参数的小型LLaMA模型,该模型在性能上超过了其教师模型以及一个未经过蒸馏训练的类似模型。MiniLLM [130]从生成性较大语言模型中蒸馏出较小的语言模型。这种方法用反向Kullback-Leibler散度(KLD)目标替换了标准KD方法中的前向KLD目标,反向KLD更适合于生成性语言模型的KD,以防止学生模型高估教师分布的低概率区域。MiniLLM随后推导出一种有效的优化方法来学习这个目标。GKD [15]不是仅依赖于一组固定的输出序列,而是使用自我生成的输出序列训练学生模型。这是通过利用教师对这些自我生成序列的反馈来实现的。与监督式KD方法不同,GKD还提供了在学生和教师模型之间使用替代损失函数的灵活性。这种灵活性在学生模型缺乏模仿教师分布的表达能力的情况下非常有价值。KPTD [301]包括两个阶段:转移集生成和在转移集上的蒸馏。在第一阶段,KPTD通过提示语言模型从实体定义生成延续来生成转移集。随后,KPTD更新模型参数,使学生的分布与基于转移集的教师分布对齐。TED [237]使用任务感知过滤器在每一层对齐学生和教师的隐藏表示。这些过滤器旨在从隐藏表示中选择与任务相关的知识。通过将重点缩小到特定任务的信息,TED旨在缩小两个模型之间的知识差距,提高学生在目标任务上的性能。MixKD [238]是一个与数据无关的蒸馏框架,它结合了mixup,这是一种简单而有效的数据增强技术。在MixKD中,鼓励学生模型不仅从原始训练示例中学习,还模仿教师在示例对的线性插值上的行为。这种额外的训练策略旨在增强所得模型的泛化能力。DIME-FM [365]是一种用于将知识从大型视觉基础模型转移到较小的定制基础模型的方法。这是通过使用相对少量的廉价、未配对的图像和句子来实现的,值得注意的是,它不依赖于公共或较小规模的数据集。该方法在配对数据可能有限或不可用的场景中提供了一种有效的知识转移方式。Li等人[227]从视觉和语言模态的角度提出了两个原则,以增强学生的分布外泛化能力:通过更好地模仿教师的视觉表示空间,并仔细促进与教师在视觉 - 语言对齐方面的更好一致性;通过用信息丰富且细粒度的语义属性丰富教师的语言表示,以有效区分不同标签。
4.4.3 量化
量化是一种成熟的模型压缩方法,用于减轻存储和计算需求。这种方法涉及将最初以传统高精度浮点格式表示的权重和激活值,转换为低比特高精度或整数表示。
公式(2)展示了将32位浮点张量\(X^{FP 32}\)转换为N位整数张量\(X^{Int N}\)的典型过程。公式(3)展示了反量化过程。符号\(FP32\)表示缩放因子。
\[\begin{aligned} X^{Int N} & = quantize \left(N, X^{FP 32}\right) \\ & =Round\left(\frac{2^{N}}{absmax\left(X^{FP 32}\right)} × X^{FP 32}\right) \\ & =Round\left(c^{FP 32} × X^{FP 32}\right) \end{aligned}\]
\[X^{FP 32}= dequantize \left(c^{FP 32}, X^{Int N}\right)=\frac{X^{Int N}}{c^{FP 32}} (3)\]
在实际应用中,反量化过程并不普遍。深度神经网络(DNN)引擎经常利用加速器的整数计算能力,直接对量化后的权重和激活值执行矩阵乘法,从而加速计算。例如,ggml [120]和英特尔的Transformer扩展[347, 159]利用CPU的单指令多数据(SIMD)指令集来执行整数矩阵乘法。类似地,bitsandbytes [85, 84]和QNN [1]已经为GPU和NPU实现了相应的整数矩阵乘法。
根据量化过程的时间,量化可以分为训练后量化(PTQ)和量化感知训练(QAT)。
量化感知训练
QAT是指以一种使模型参数适应量化引入的低精度的方式来训练量化模型。这个过程的主要目标是减轻由于量化而导致的精度损失。LLM-QAT通过利用预训练模型通过无数据蒸馏生成样本来解决大语言模型训练数据获取的问题。同时,它对权重、激活值和键值缓存进行量化,从而提高训练吞吐量。LLM-QAT展示了生成具有4位精度的精确量化大语言模型的能力。QuantGPT [373]通过在自回归预训练期间纳入来自全精度教师模型的对比蒸馏,并将logit信息蒸馏到量化的学生模型中实现了这一点。BitNet [393]开创了1位语言模型的QAT,使用1位权重和激活值训练语言模型。EfficientQAT [60]是一种用于压缩大语言模型的新颖量化技术。它由两个连续阶段组成:所有参数的块级训练(Block-AP),该阶段通过块级重建对每个Transformer块中的所有参数顺序进行量化感知训练,以在不训练整个大语言模型的情况下保持效率;第二阶段,量化参数的端到端训练(E2E-QP),使用量化模型进行初始化,然后仅对量化参数(步长)进行端到端训练,通过固定量化骨干网络和减少可训练参数数量来提高效率。
由于大型模型中的参数数量通常达到数十亿甚至数百亿,QAT的训练成本仍然相当可观。一方面,大型基础模型的QAT通常与知识蒸馏相结合以降低训练成本,如LLM-QAT和QuantGPT等方法所示。另一方面,量化经常用于大型模型的微调过程中,如PEQA [420]、LoftQ [233]和QLoRA [86]中详细描述的那样,具体内容见§4.2.3。
训练后量化
PTQ将训练好的全精度模型转换为低精度模型,而无需重新训练。PTQ的优点是在不改变模型结构或无需重新训练的情况下压缩模型,从而降低模型的存储和计算成本。由于其部署成本低,PTQ也是模型压缩中最易于部署和广泛应用的技术。然而,与QAT和蒸馏不同,PTQ缺乏通过训练调整精度的反馈回路。与PTQ相关的研究通常侧重于在压缩模型时有效地保留权重/激活值中的相关信息。
PTQ可以分为两类:仅权重量化和权重-激活联合量化。
仅权重量化仅对大型基础模型的权重进行量化。在大型基础模型的权重量化中,有两种主要方法来减轻量化误差。
第一类方法涉及识别对准确性有显著贡献的权重中的异常值和重要权重,并对这些异常值进行特殊处理。例如,SpQR [87]识别异常值权重并以高精度保留它们,同时对其余权重进行量化。LLM.int8() [85]采用矢量化量化和混合精度分解来处理异常值,以实现高效推理。LLM.int8()在矩阵乘法中使用8位量化,有效地减少了推理期间的GPU内存使用。AWQ [243]通过保护模型中前1%的重要权重并利用每通道缩放来确定最佳缩放因子,从而减少量化误差。OWQ [203]的分析表明,异常激活会放大量化误差,它采用混合精度量化方案,对受激活异常值影响较大的权重应用更高精度的量化。SqueezeLLM [184]观察到某些权重决定了最终模型的量化性能,并提出了一种非均匀量化方法来最小化这些敏感权重的量化误差。SqueezeLLM通过利用损失的二阶海森信息来识别量化敏感权重,并将量化点放置在这些敏感权重附近来实现这一点。
第二类量化减少方法基于更新权重的二阶信息。GPTQ [110]采用层wise量化与OBQ [108]相结合,利用逆海森信息来更新权重。GPTQ将每个权重的比特宽度降低到3或4位,允许对具有1750亿参数的GPT模型进行量化,同时最小化精度损失。QuIP [53]使用自适应舍入过程,最小化用于量化的二阶代理目标。QuIP使用随机正交矩阵对权重和海森矩阵进行有效的预处理和后处理,以确保权重和海森矩阵不相关,从而实现大型基础模型的2位量化。
同时,某些量化方法在压缩模型的同时可以实现计算加速。例如,llama.cpp [121]采用K-quant方法。K-quant量化使用大小为16×8的块进行量化,每个块总共包含16行。与QLoRA [86]的二次量化类似,为了进一步减少资源消耗,还有一个额外的FP16二次量化参数用于量化16个主要量化参数。llama.cpp表明,使用K-quant量化进行模型推理比使用原始FP16模型的推理速度大约快3 - 4倍。
权重-激活联合量化对大型基础模型的权重和激活值都进行量化。与权重量化类似,识别和处理权重和激活值中的异常值也有助于减少量化误差。SmoothQuant [424]利用不同token的通道激活之间的相似性,并使用每通道缩放变换对权重和激活值进行量化。RPTQ [463]认识到不同通道之间存在显著的范围差异,对通道进行重新排序以进行量化,并将其集成到层归一化和线性层权重中。OliVe [132]采用异常值-受害者对(OVP)量化并对异常值进行局部处理。Outlier Suppression+ [409]在Outlier Suppression [410]的基础上进行改进,发现有害的异常值主要集中在特定通道中呈现不对称分布。考虑到异常值的不对称性和来自下一层权重的量化误差,该方法进行通道级的平移和缩放操作。QLLM [250]通过自适应通道重组方法解决激活异常值的问题,并利用校准数据减轻量化引起的信息损失。LLM-FP4 [449]将权重量化为4位浮点数,提出每通道激活量化,并重新参数化额外的缩放因子作为权重的指数偏差。LLM-FP4成功地将LLaMA-13B中的权重和激活值都量化为仅4位,并且与全精度模型相比,精度损失仅为8.4%。ZeroQuant [451]结合层wise知识蒸馏和优化的量化支持来实现8位量化。ZeroQuant-V2 [450]引入低秩补偿(LoRC)进行进一步优化。ZeroQuant-FP [421]支持FP4/FP8量化,与相应比特精度的整数量化相比,实现了卓越的性能。FlexRound [204]通过最小化量化值与全精度值之间的误差来更新权重和激活值的量化尺度。ATOM [488]通过使用低比特运算符显著提高服务吞吐量,并通过低比特量化大幅减少内存消耗。ATOM在4位权重-激活量化下,与FP16相比,端到端吞吐量提高了高达7.73倍,与INT8量化相比提高了2.53倍,同时保持相同的延迟目标。I-LLM [150]是一种用于大语言模型的新颖的仅整数完全量化PTQ框架。它开发了完全平滑块重建(FSBR)来平滑激活值和权重的通道间变化。它还引入了动态仅整数矩阵乘法(DI-MatMul)来减轻由于token间变化引起的性能下降,并实现了完全整数矩阵乘法的动态量化。此外,它设计了DI-ClippedSoftmax、DI-Exp和DI-Normalization,通过位移动高效执行非线性操作,同时保持准确性。
基于旋转的方法
为了有效地量化异常值,最近的研究采用了一种不同的方法,并揭示了一个有趣的特性:将权重矩阵乘以随机旋转矩阵可以有效地减少异常值并提高量化能力。直观地说,由于随机旋转的统计特性,这种变换导致权重或激活值项的分布没有异常值。由于旋转矩阵可以从单位映射成对构建,并且可以集成到附近的权重中而不改变整体网络输出(这一特性称为旋转不变性),变换后的权重或激活值可以以较低的重建误差进行量化,而不会产生额外的推理开销。SpinQuant [262]通过使用Cayley SGD [214](一种用于优化正交矩阵的有效技术)来优化旋转矩阵,以最小化量化网络的最终损失,同时固定权重参数。这种优化不会改变全精度网络的输出,但会改进中间激活值和权重,使其更易于量化。QuaRot [24]有两个阶段。第一阶段操作模型权重(全精度),并在模型的前向传递中插入两个额外的Hadamard操作。第二阶段默认使用GPTQ对权重进行量化,并使用简单的舍入到最近值的方案对激活值进行实时量化。
在基础模型(如ViT和BERT)的骨干网络方面也有广泛的量化研究。例如,BinaryBERT [294]和I-BERT [29]在低精度量化下为BERT实现了更高的准确性。Wang等人[401]利用操作符融合[293]、PTQ技术和结构化剪枝[200]来降低内存成本。他们还减少了DeiT-Tiny [381]的计算操作数量。Q-ViT [229]、I-ViT [236]和OFQ [253]在低精度量化下也为ViT实现了高准确性。Q-Diffusion [226]压缩噪声估计网络以加快扩散模型的生成过程。
4.4.4 低秩分解
低秩分解(LoRD)通过将给定的权重矩阵分解为两个或更多较小的矩阵来近似大型基础模型中的权重矩阵。对于一个\(m\times n\)的权重矩阵\(W\),分解表示为\(W = UV\),其中\(U\)是一个\(m\times k\)的矩阵,\(V\)是一个\(k\times n\)的矩阵,\(k\)远小于\(m\)和\(n\)。\(U\)和\(V\)的乘积近似原始权重矩阵,显著减少了参数数量和计算开销。
如§4.2.3所述,低秩分解已广泛应用于大型基础模型的微调方法中,如LoRA。LoRD在实现显著压缩能力的同时对性能影响最小,突出了其在大型基础模型压缩中的潜力[180]。为了降低支撑大型基础模型的高维token嵌入的维度,TensorGPT [438]提出了一种基于张量列车分解(TTD)的方法,其中每个token嵌入被视为一个矩阵乘积态(MPS),可以以分布式方式高效计算。通过TensorGPT,嵌入层的压缩率可高达38.40倍。LoSparse [234]采用低秩近似来压缩相干且有表现力的元素。该方法使用迭代训练来评估列神经元在剪枝过程中的重要性得分,展示了优于传统迭代剪枝技术的性能。Saha等人[338]通过随机低秩和低精度分解来压缩矩阵,实现了高达每矩阵坐标一位的激进压缩比,同时超过或保持了传统压缩技术的性能。ViTALiTy [80]是一个算法 - 硬件协同设计的框架,用于提高ViT的推理效率。它使用一阶泰勒注意力来近似点积softmax操作,利用行均值中心化作为低秩组件来线性化注意力块的成本。
5 资源高效系统
训练和服务系统是实际应用中大型基础模型的关键。本节从四个方面研究支持资源高效的大型基础模型的系统研究:(1)分布式训练;(2)联邦学习;(3)云端服务;(4)边缘服务。图16概述了资源高效系统的分类,表5总结了该领域广泛使用的开源框架。
值得注意的是,由于大语言模型的成功及其巨大的参数规模,本节介绍的大多数系统和技术都是专门为大语言模型设计的。

图16:资源高效系统概述
|框架|描述|云|边缘|训练|推理|

5.1 分布式训练
分布式训练系统是训练大型基础模型的基础,涵盖预训练和微调阶段。预训练相较于其他大型基础模型训练过程,计算和通信需求更为密集,需要大量资源。微调则广泛用于将通用模型转化为特定用例的专用模型。鉴于大型基础模型的大规模和新的执行模式,为其设计资源高效的系统已成为研究热点。我们将优化分布式训练系统的技术进行分类,涵盖弹性、并行性、通信、存储和异构GPU等方面。此外,专家混合(MoE)已成为训练超大型模型的一种趋势,针对此也有多种专门的方法,这些将在本小节末尾详细介绍。
5.1.1 弹性
大型基础模型训练规模和时长的增加导致失败率上升,凸显了弹性训练的重要性[412]。大型基础模型的容错方法主要有四种形式。第一,Varuna和Gemini [25, 405]通过实施检查点来重启训练,从而实现弹性训练。Varuna [25]专为在低带宽网络、频繁抢占的商用集群中训练而设计,具有用户友好的特性。而Gemini [405]通过内存中的检查点加快了故障恢复速度。第二,Bamboo [375]利用冗余计算,即一个节点为自身和邻居节点执行计算。Bamboo避免了恢复过程中的开销,但在训练期间引入了额外的计算开销。第三,激活检查点技术[480, 197],该技术避免存储激活值,在需要时重新计算,处于检查点和冗余计算两种方法之间。第四种方法是部分层恢复,如Oobleck [162]所示。在发生故障时,受影响的流水线可以使用其他副本的部分层进行恢复,与使用整个检查点相比,这种方法的开销更小。
5.1.2 并行性
并行性在分布式训练中起着关键作用,尤其对于大型基础模型。训练大型基础模型通常采用三种并行方式。数据并行(DP)是将数据分布到不同的工作节点,以扩展分布式训练。DeepSpeed ZeRO [326]通过分割模型状态来优化内存使用。模型并行(MP)则是在层内(张量并行 [288])或层间(流水线并行 [201, 299])对模型进行分区。张量并行(TP)可以提高训练速度,但会带来更多的通信开销。流水线并行(PP)通过填充空闲时间来提高GPU利用率。广度优先流水线并行 [201]设计了循环放置和广度优先调度,以实现高GPU利用率和低成本。PipeFisher [299]为空闲时间分配额外工作,以进一步提升效率。Mobius [105]专为微调设计,采用新颖的PP方案和异构内存管理。序列并行(SP)[223, 197]是针对长序列训练的趋势而设计的,当训练一个句子超出单个工作节点的内存容量时,SP将长序列划分为多个块,并分配到不同的工作节点上。在实际应用中,这些并行方式通常结合使用。Galvatron [282]可以自动确定最有效的混合并行策略。
5.1.3 通信
大型基础模型的大规模和复杂并行性导致了显著的通信开销。我们将通信优化分为两类:直接减少通信时间和隐藏通信。一些研究探索了并行感知的通信压缩 [355]和异构感知的流量减少 [480]。现有工作通常通过统一计算和通信的抽象 [163]、分解原始通信集合 [396]或设计新颖的流水线调度 [496],将通信与计算重叠进行。
5.1.4 存储
大型基础模型需要大量的存储资源,例如用于存储模型状态的GPU内存、用于模型分析的主机内存以及用于数据集和检查点的磁盘空间。为了提高效率,人们提出了各种方法来缓解存储限制。卸载是减少GPU内存压力的常用方法。ZeRO-Offload [333]将数据和计算卸载到CPU,以便在单个GPU上训练大型模型。而FlashNeuron [26]则将选择性数据卸载到固态硬盘(SSD),以提高吞吐量。此外,Behemoth [187]用高容量、低性能的NAND闪存取代低容量、高性能的高带宽内存(HBM),以实现大型基础模型的数据并行训练。
5.1.5 异构GPU
对于大多数人和企业来说,在专用的高性能GPU集群上进行训练是不可行的。而且,即使在专用的GPU集群中,异构GPU也普遍存在。因此,一些研究尝试在异构GPU上训练大型基础模型。Hetpipe [307]利用低性能GPU和波同步并行技术来加速训练,并在异构GPU之间同步参数。Whale [165]引入了一种硬件感知的负载均衡算法,以加快训练速度。
5.1.6 MoE
MoE是扩展深度神经网络模型的一种有效方法。优化MoE训练系统的目标主要是提高效率和可扩展性。现有工作主要针对MoE训练中的动态相关机制、并行性和通信进行优化。MegaBlocks [115]利用稀疏原语来处理动态路由和负载不均衡的计算。Brainstorm [72]是一个通过抽象动态性和基于配置文件的优化来处理动态深度神经网络的框架。FlexMoE [291]专注于动态专家管理和设备放置问题。此外,Tutel [158]设计了动态自适应并行和流水线策略。SmartMoE [466]通过结合离线和在线机制,优化并行策略以实现高效的MoE训练。Janus [251]将通信从以专家为中心的范式转变为以数据为中心的范式,以加快MoE训练中的通信速度。
5.2 联邦学习
数据是大型基础模型的基础。联邦学习(FL)已成为使用来自多个源的数据训练基础模型的主要方法,同时确保数据隐私 [136, 446, 175]。鉴于此,人们投入了大量精力开发专门针对基础模型的高效联邦学习系统 [176, 224]。最近的一些研究声称,大语言模型预训练的未来在于联邦学习 [341, 171]。如图16所示,我们将现有的联邦大语言模型系统分为四个主要类别:框架与基准、基于参数高效微调(PEFT)的方法、模型分解和零阶优化。
5.2.1 框架与基准
在基础模型的联邦学习框架和基准开发方面已经取得了显著进展。这些开源的联邦学习框架通常与基础模型集成,提供一套API,以促进各种高效的联邦学习算法。例如,Flower [3, 37]支持在树莓派5上对OpenAI的Whisper进行联邦微调。FedML [139, 242]推出了FedLLM版本,与DeepSpeed [329]等流行的机器学习平台兼容。FATE [100]旨在通过参数高效微调方法提高FedLLM的训练效率。
Federatedscope-llm [198]提供了一个用于在联邦环境中微调大型基础模型的综合包,涵盖了广泛的PEFT算法和各种加速/资源高效的操作符。FedIT [469]通过指令调优开发了一个联邦GPT,简化了新算法的集成,以利用边缘设备上的各种指令。Gao等人 [117]研究了将自监督学习与联邦学习相结合,重点是使用wav2vec 2.0 [28]进行语音表示。Woisetschläger等人 [414]评估了现有边缘计算系统在联邦学习中对大型基础模型的支持能力和潜力,并概述了提高边缘计算效率的步骤。Zhao等人 [485]提出将隐私保护技术(包括联邦学习、差分隐私和基于模拟器的调优)与参数高效微调(PEFT)技术结合使用,以在不损害数据隐私的情况下优化大型基础模型。
5.2.2 基于PEFT的方法
参数高效微调(PEFT)是一种为特定下游任务定制大型基础模型的策略。该过程包括冻结大型基础模型的骨干,并仅更新一小部分额外参数。PEFT旨在减少训练时间和通信成本,这是联邦学习中的一个关键挑战。FedAdapter [45]提出逐步修改适配器配置,以有效地确定最有效的设置。FeS [44]将仅偏差提示学习与伪标记相结合,采用结构化课程,在最小的数据标记情况下实现了较高的准确率。FP-FL [170]引入了软标签增强的联邦调优,结合LoRA调优,以减少计算和通信开销。FedPrompt [484]探索了提示学习的额外优势,特别是其允许更大的差分隐私预算的潜力。FedPepTAO [52]提出了一种有效的部分提示调优方法,并进行自适应优化,在非独立同分布(non-IID)数据分布的情况下提高了性能和效率。Malaviya等人 [275]分析了不同非IID场景和不同客户端比例下各种PEFT方法的有效性。Petals [40]促进了大型模型的协作微调,使多个用户能够通过互联网整合资源并应用参数高效调优方法,如适配器或提示微调。
5.2.3 模型分解
将大型基础模型分解为几个子模型是实现实际联邦学习的一种简单而有效的方法。FedBFPT [399]采用一种策略,即仅在客户端训练BERT的部分层,参与训练的层数逐渐增加。FedOBD [65]采取了一种创新方法,将大规模模型分解为语义块,使联邦学习参与者能够选择性地上传量化块到联邦学习服务器进行聚合。FedBERT [377]引入了一种联邦分割学习方法。在这个框架中,服务器为所有客户端更新Transformer层,而客户端在本地训练嵌入层和头部层。FedPerfix [362]探索了ViT模型中部分个性化的具体情况。他们进行实证评估,以衡量每种层类型对数据分布的敏感性。基于自注意力层和分类头是ViT中最敏感组件的见解,FedPerfix使用插件来促进从聚合模型到单个客户端的信息传递,以实现个性化。SplitLoRA [245]为基于分割学习的大语言模型参数高效微调提供了一个开源基准,为推进联邦大语言模型微调的研究工作奠定了基础。
5.2.4 无反向传播方法
虽然反向传播(BP)仍然是大型基础模型的标准训练范式,但它在联邦学习中的应用具有挑战性,主要是因为在边缘设备上计算成本高且内存开销大。零阶优化是一种替代优化方法,它仅基于函数值进行操作,不需要显式访问基于BP的梯度信息。本质上,它在不依赖反向传播的情况下优化大型基础模型。FwdLLM [433]是一项开创性的工作,将零阶优化集成到联邦学习中。该方法使用前向梯度作为无偏梯度估计。然而,为每个参数获得精确的梯度估计需要大量的扰动。为了解决这个问题,FwdLLM结合了PEFT方法,仅更新基础模型的内在维度。FwdLLM使得在标准移动设备上进行十亿规模大语言模型(如LLaMA)的联邦训练成为可能。FedKSeed [320]引入了一种新颖的策略,通过使用梯度累加器来避免前向梯度传输。该方法分阶段存储标量梯度信息,并根据初始模型参数在本地计算最新的梯度。Fed-BBPT [246]采用黑盒调优方法,在本地生成高质量的指令,而无需存储整个预训练模型。BBTv2 [364]虽然不是专门为联邦学习设计的,但它提出了一种无梯度的分治算法,将基础模型分解为低维子空间。
5.3 云端服务
大型基础模型已广泛应用于许多实际场景,如搜索引擎、聊天机器人和编程工具。由于这些应用吸引了大量用户并产生了大量请求,基础模型的服务系统需要高效运行以满足用户需求。为此,人们提出了许多基础模型服务系统,以在不牺牲模型准确性的情况下提高服务效率。在本节中,基础模型主要指大语言模型。
与基础模型训练过程不同,基础模型服务过程呈现出自回归模式。具体来说,在处理请求时,大语言模型会逐个生成token,直到生成一个特殊的EOS(序列结束)token。每个token生成迭代都将所有先前的token(包括输入token和先前生成的输出token)作为输入。
为了减少迭代之间的冗余计算,LightSeq [398]提出了键值缓存(KV cache)来缓存基础模型的中间状态,以减少冗余计算。具体来说,LightSeq缓存大语言模型中注意力层的键值对。因此,大语言模型的生成过程分为两个阶段:预填充阶段和解码阶段。预填充阶段处理请求的所有输入token,并将中间状态存储在KV缓存中。随后的解码阶段仅需要处理与新生成的token相关的计算,并相应地更新KV缓存。我们将现有的基础模型服务系统优化分为三类:计算优化、内存优化和在新兴部署平台上的基础模型服务。
5.3.1 推理加速
为了在单个加速器上加速计算,内核优化是一种常见的方法。为基础模型训练设计的FlashAttention [76]和FlashAttention-2 [75]可以简单地用于加速预填充阶段。然而,由于解码阶段的独特特性,Flash-Decoding [78]提出了一种特定的NVIDIA CUDA内核来加速解码阶段。FlashDecoding++ [146]通过优化解码阶段的softmax操作和平坦通用矩阵乘法(flat GEMM)操作,进一步提高了Flash-Decoding的性能,并提供了对AMD GPU的支持。DeepSpeed-Inference [21]、ByteTransformer [468]和谷歌的PaLM服务系统 [314]也针对小批量场景优化了GPU/TPU,这种场景在基础模型服务中很常见,但在基础模型训练中很少见。当将基础模型推理扩展到大量GPU时,许多工作 [21, 314]利用各种并行策略的组合,如数据并行、流水线并行、张量并行和专家并行。这些工作在多个现代加速器(如GPU/TPU)上高效地提供基础模型推理服务。
请求批处理和调度是另一组提高请求处理计算效率的方法。鉴于基础模型的自回归性质,各种请求可能具有不同长度的输入token和输出token。仅仅通过填充将不同长度的请求批处理在一起,会导致基础模型服务系统在填充的token上消耗计算资源。为了解决这个问题,Orca [458]提出了选择性批处理和迭代级调度,以迭代为粒度对不同长度的请求进行批处理,以增加最大批大小。通过这些技术,提前完成的请求可以在不等待后期完成请求的情况下返回给用户,新到达的请求可以在一次迭代完成后立即执行。许多工作也改进了请求批处理的调度。Punica [58]进一步提出了一种分组通用矩阵乘法(GEMM)内核,以对针对不同LoRA模型的请求进行批处理。FlexGen [351]提出了一种请求调度算法,以减轻卸载对单GPU上对延迟不敏感的基础模型服务性能的影响。FastServe [415]提出了迭代级抢占式调度和主动KV缓存交换,以减轻队头阻塞对分布式基础模型服务性能的影响。SARATHI [17]和DeepSpeed-FastGen [2]将预填充阶段的计算拆分为小块,并将这些小块与解码阶段进行调度,以减轻预填充阶段对大型基础模型服务性能的影响。Splitwise [308]根据预填充阶段和解码阶段不同的计算和内存需求,将它们拆分到不同的机器上。
5.3.2 内存节省
大语言模型在服务过程中消耗大量内存。为了减少大语言模型服务的内存消耗,许多工作提出了各种内存管理技术。对于大语言模型的参数和激活值,当GPU内存不足时,DeepSpeed-Inference [21]和FlexGen [351]将激活值或模型参数卸载到动态随机存取存储器(DRAM)或非易失性内存(NVMe)中。
KV缓存是大语言模型服务中的另一个重要内存组件。为了减少KV缓存的内存消耗,vLLM [199]采用了块级按需内存分配机制,仅在需要时为中间状态分配内存。vLLM还提出了一种新的操作符Paged Attention,以支持在使用这种内存分配机制时的注意力操作。S-LoRA [350]将这一想法扩展到统一分页,以同时管理多个LoRA适配器。SGLang [490]进一步向用户公开提示编程原语,借助RadixAttention在所有请求之间实现更复杂的KV缓存管理。
5.3.3 新兴平台
典型的基础模型服务系统通常部署在配备大量同质高性能服务器的数据中心。由于这些高性能服务器的稀缺性和成本,也有一些基础模型服务系统专门为其他部署平台设计。SpotServe [281]尝试在抢占式实例(spot instances)上提供基础模型服务,这些实例是低成本但不可靠的云实例。SpotServe动态调整其并行策略,以适应抢占式实例抢占的影响。对于在异构GPU上的基础模型服务,HexGen [172]使用进化算法在异构GPU上搜索高性能的基础模型放置和并行策略。
5.4 边缘服务
随着数据隐私问题日益受到关注,以及对响应延迟的严格要求,在移动设备上本地运行大型基础模型(即设备端推理)最近引起了学术界和工业界的关注。因此,许多设备端推理优化技术应运而生。
5.4.1 边缘 - 云协作
解决移动设备资源稀缺问题的一种常见策略是通过强大的边缘/云服务器协作来加速密集型推理。例如,EdgeFM [444]查询大型基础模型,并根据特定的边缘模型定制知识和架构进行适配,使动态边缘模型能够确保低延迟,同时与原始大型基础模型的准确性接近。
5.4.2 仅边缘
另一个主要研究方向是直接优化设备端推理。近期有一项针对设备端语言模型的研究[432] 。我们将主要技术总结如下:
设备端MoE模型
提出在推理时仅执行路由稀疏参数的设备端MoE模型,这可以减少计算量(详见§3.2)。EdgeMoe [454]发现推理过程中专家需动态加载到内存的问题。为解决该问题,此方法提出按专家调整比特宽度,在可接受的精度损失下减小专家参数大小,节省参数加载时间。专家管理功能可预测未来将激活的专家,以便EdgeMoe进行预加载,减少I/O开销。PC-MoE [194]基于专家激活具有时间局部性这一关键观察,提出参数委员会机制,智能维护使用中的关键专家子集,以降低资源消耗。
内存优化
由于大型基础模型通常依赖大量参数,而设备端内存资源稀缺(例如8GB),在设备上进行大型基础模型推理面临 “内存墙” 挑战。为解决此问题,LLMCad [429]利用推测解码[209],可将大部分工作负载卸载到较小的内存驻留草稿模型。LLMCad进一步提出令牌树生成和验证、自适应回退策略以及推测生成流水线,以减少验证次数,并在验证过程中利用空闲处理器提高生成速度。PowerInfer [360]依赖大型基础模型的运行时稀疏性,即只有热神经元在不同输入中持续激活。为此,PowerInfer将热激活神经元预加载到GPU以实现快速访问,而冷激活神经元在CPU上计算,从而显著降低GPU内存需求和CPU - GPU数据传输量。PowerInfer-2 [442]专注于智能手机上的大型基础模型。它利用基于神经元集群的计算和分段神经元缓存,将热神经元预加载到内存以实现快速访问,冷神经元按需加载,从而减少内存使用并最小化I/O瓶颈.
I/O优化
由于参数大小的增长速度快于边缘设备内存的增长速度,从磁盘动态加载参数到内存不可避免。STI [133]发现加载参数的时间远长于计算时间。为解决此问题,STI提出在加载过程中根据参数重要性动态调整权重比特宽度,在最大推理精度下最小化加载开销。Large FMs in a flash [20]通过对闪存存储进行细粒度管理,减少从闪存传输到内存的数据量,并以更大、更连续的块读取数据,解决了这一问题。
内核优化
计算资源在设备上同样至关重要且有限。先前的研究[483]实现了首个基于32位整数的视觉Transformer边缘内核,并采用训练后仅整数量化技术加速推理过程。该方法还为Transformer中的激活和归一化操作引入范围约束量化技术,以在数据范围和推理精度之间进行权衡。mllmNPU [430]利用移动NPU实现快速的大语言模型预填充。它解决了大语言模型推理与NPU设计之间的一些固有语义差距。
大语言模型作为系统服务
近期出现了将单个强大的大语言模型(或基础模型)部署到移动设备操作系统中的趋势,即大语言模型即服务(LLMaaS)。由于大语言模型具有世界知识和上下文学习能力,这种范式完全可行。由于内存中仅需一个大语言模型权重实例,可防止设备内存被特定应用模型耗尽。通过统一的模型架构和操作符集,大语言模型服务可以更好地利用系统级调度增强功能(如批处理或优先级队列)和硬件加速器(如GPU、DSP或NPU)。行业示例包括谷歌的Android AICore,这是集成在Android操作系统中的设备端大语言模型服务,被GBoard智能回复和Pixel语音记录器等应用使用。苹果和英特尔的产品中也可观察到类似的范式。LMS [456]在移动设备上提供了这样的大语言模型即服务,并给出了具体的系统设计,如应用级API和有状态调用方法。ELMS [457]进一步指出了这种范式中的一个关键挑战,即如何弹性化单个大语言模型以满足第三方应用所需的各种服务水平目标(SLOs)。
6 结论与未来方向
本综述全面、系统地概述了近期关于资源高效的大型基础模型的文献。我们首先介绍了流行基础模型(包括大型、视觉和多模态模型)的初步背景和成本分析。然后深入探讨了模型架构、算法和系统设计,以实现更具资源效率的大型基础模型生命周期。未来,该领域的研究将继续(甚至更加)至关重要,因为缩放定律保证了随着模型越来越大,人工智能将更强大,前景广阔。这类研究也是高度跨学科的,涉及多个计算机科学领域,如机器学习、自然语言处理/计算机视觉/语音、网络、云计算、边缘计算等。
资源高效的大型基础模型的研究机会非常多,特别是在以下方面:
(1) 云边混合部署:为了实现无处不在、保护隐私且高可用的通用智能,许多基础模型最终将下沉到靠近用户的设备上[437, 434, 435, 477]。已经有初步尝试将LLaMA - 7B部署到智能手机和个人电脑上。杀手级应用包括个人助理/智能体[235, 411]、多模态信息检索[211]等。未来,基础模型能够在设备上运行的规模和速度将成为硬件供应商商业模式中的关键竞争力。
(2) 利用模型稀疏性:随着模型规模增大,对于给定任务,模型的激活比例会变小。最近的文献[264]发现,即使是密集训练的非MoE模型在运行时也表现出激活稀疏性,可利用这一特性减少推理时间和内存占用。我们认为,利用模型和激活稀疏性将是实现可持续模型规模扩展的有前途的方向。可能会出现比MoE更高效的稀疏架构。
(3) 大型基础模型即服务:在云和设备上,大型基础模型正在统一深度神经网络生态系统[461]。最终,它将成为一种通用服务,就像如今的网络和数据库一样被调用。一方面,这为硬件 - 算法协同设计和优化提供了机会;另一方面,它在系统和基础设施设计中对调度、负载平衡以及安全与隔离提出了新的挑战。
(4) 将智能体作为整体系统进行优化:未来,基础模型(尤其是大语言模型)将作为构建智能体的关键组件[235, 411]。其效率不应仅在单个大语言模型服务中考虑;相反,算法和系统设计需要适应特定的智能体工作流程。例如,一个智能体系统可能需要多个基础模型协同工作,它们之间存在内在的逻辑依赖。在这个过程中,为每个任务选择合适的基础模型,并在给定的硬件资源上进行调度以最大化智能体性能,其设计空间巨大。
(5) 实用的隐私保护基础模型:随着上传到云端用于基础模型处理的用户数据量不断增加,隐私问题的严重性也相应升级。现有方法包括联邦学习、同态加密和分离学习。虽然这些方法在理论上可行,但仍然面临显著的性能挑战,阻碍了它们在实际中的大规模部署。一个有前途的方向是开发专门为大型基础模型设计的创新隐私保护技术,或改进现有方法,以有效地平衡隐私和性能。
(6) 理解缩放定律:缩放定律推动了大型基础模型的成功,但它似乎也是轻量级基础模型的一个基本限制——小规模模型不太可能比大规模模型具有更高的智能水平。理解缩放定律背后的机制和理论将有助于解释(并有望突破)这一限制。同时,设计具有更好甚至最优缩放性能的新型模型架构将是一个值得深入研究的方向。
相关文章:
【文献阅读】A Survey Of Resource-Efficient LLM And Multimodal Foundation Models
发表时间:二〇二四年九月二十三日 摘要 大型基础模型,包括大语言模型(LLMs)、视觉Transformer(ViTs)、扩散模型以及基于大语言模型的多模态模型,正在革新整个机器学习的生命周期,…...
mysql 全方位安装教程
下载 MySQL 【官网下载地址】 注意要选择较大的哪个安装包,小的安装包是一个安装器。 我们不用登录,直接下载 直接运行下载好的安装包 MySQL如果是 安装包安装, 可以图形化界面自主配置 如果是压缩包解压, 可以配置 配置文件, 可以解压安装到指定的…...
【Linux】Linux的进程控制
目录 1. 学习思维导图 2.进程创建(fork) 2.1 fork创建进程失败 3.进程终止 3.1 进程退出情况 3.1.1main函数 3.1.2 退出码 3.2 exit/_exit函数 1. exit() 函数 2. _exit() 函数 4.进程等待 4.1 实现进程等待的方法 wait/waitpid方法 区别&a…...
金融支付行业技术侧重点
1. 合规问题 第三方支付系统的平稳运营,严格遵循《非银行支付机构监督管理条例》的各项条款是基础与前提,其中第十八条的规定堪称重中之重,是支付机构必须牢牢把握的关键准则。 第十八条明确指出,非银行支付机构需构建起必要且独…...
Django模型管理器/QuerySet 常见的方法
模型管理器/QuerySet 常见的方法 get([**kwargs]) 方法 用途:获取满足条件的唯一对象。参数:关键字参数,指定查询条件。返回值:模型对象。异常:如果找到多个对象或未找到对象,将分别抛出 MultipleObjects…...
QT播放视频保持视频宽高比消除黑边
QT播放视频保持视频宽高比消除黑边 1、问题 在播放视频的时候,由于框架的大小发生变化,导致视频出现黑边很不好看。 因此需要像一种方法消除黑边 2、处理 1、读取视频的宽高比 2、设置视频的Widget的大小固定,Widget的宽高比和视频宽高比…...
在Ubuntu中,某个文件的右下角有一把锁的标志是什么意思?
在Ubuntu中,某个文件的右下角有一把锁的标志是什么意思? 在 Ubuntu(或其他基于 GNOME 文件管理器的 Linux 发行版)中,文件或文件夹的右下角出现一把“锁”标志,通常表示 你当前的用户没有该文件/文件夹的写…...
聊聊Java的SPI机制
个人自建博客地址 什么是SPI呢? SPI全称Service Provider Interface,翻译过来就是服务提供者接口。调用方提供接口声明,服务提供方对接口进行实现,提供服务的一种机制,服务提供方往往是第三方或者是外部扩展。 下面…...
【 实战案例篇三】【某金融信息系统项目管理案例分析】
大家好,今天咱们来聊聊金融行业的信息系统项目管理。这个话题听起来可能有点专业,但别担心,我会尽量用大白话给大家讲清楚。金融行业的信息系统项目管理,说白了就是如何高效地管理那些复杂的IT项目,确保它们按时、按预算、按质量完成。咱们今天不仅会聊到一些理论,还会通…...
go并发编程
https://www.bilibili.com/video/BV16A4y1f7EX sync包工具 Mutex:同一时间只有一个goroutine持有锁,其它申请该锁的goroutine会被阻塞。RWMutex:允许多个协程同时读取共享数据,但写入时需要独占锁。WaitGroup:等待一组…...
使用Python开发以太坊智能合约:轻松入门与深度探索
使用Python开发以太坊智能合约:轻松入门与深度探索 随着区块链技术的快速发展,以太坊作为最为成熟和广泛使用的智能合约平台,成为了开发去中心化应用(DApp)的核心工具。智能合约不仅是区块链技术的基础,更…...
Python从0到100(八十九):Resnet、LSTM、Shufflenet、CNN四种网络分析及对比
前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…...
密码学(哈希函数)
4.1 Hash函数与数据完整性 数据完整性: 检测传输消息(加密或未加密)的修改。 密码学Hash函数: 构建某些数据的简短“指纹”;如果数据被篡改,则该指纹(以高概率)不再有效。Hash函数…...
设计模式Python版 备忘录模式
文章目录 前言一、备忘录模式二、备忘录模式示例1三、备忘录模式示例2 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式:…...
CES Asia 2025聚焦量子计算,多领域进展引关注
作为亚洲地区极具影响力的科技盛会,CES Asia 2025第七届亚洲消费电子技术贸易展(赛逸展)将在首都北京举办。本届展会以“创新、智能、互联”为主题,将全方位展示全球消费科技领域的最新成果与发展趋势。其中,量子计算作…...
MySQL索引深度剖析:从数据结构到实际应用
引言 在数据库系统中,索引是提高查询效率的关键技术之一。MySQL作为最流行的关系型数据库之一,其索引机制尤为重要。本文将剖析MySQL索引的数据结构、分类、创建方式以及实际应用场景,帮助读者更好地理解和应用索引技术。 主体部分 1. MyS…...
【deepseek】本地部署+RAG知识库挂载+对话测试
文章目录 前言一、Deepseek模型下载(以7B为例)二、RAG本地知识库挂载三、创建本地对话脚本四、结果展示 前言 本文主要涵盖Deepseek在ubuntu系统中的部署全流程,包括模型的下载、系统部署、本地文档向量化、向量列表存储、RAG知识库挂载、对话测试等内容 一、Deeps…...
Vue.js 组件开发全面详解及应用案例
Vue.js 的组件化开发是其核心特性之一,使得代码复用、维护和扩展变得更加容易。以下是关于 Vue.js 组件开发的全面解析,并附带一个实际应用案例。 一、组件基础概念 1. 什么是组件? 组件是 Vue 应用的基本构建块,封装了 HTML、C…...
java面试场景问题
还在补充,这几天工作忙,闲了会把答案附上去,也欢迎各位大佬评论区讨论 1.不用分布式锁如何防重复提交 方法 1:基于唯一请求 ID(幂等 Token) 思路:前端生成 一个唯一的 requestId(…...
MySQL数据库基本概念
目录 什么是数据库 从软件角度出发 从网络角度出发 MySQL数据库的client端和sever端进程 mysql的client端进程连接sever端进程 mysql配置文件 MySql存储引擎 MySQL的sql语句的分类 数据库 库的操作 创建数据库 不同校验规则对查询的数据的影响 不区分大小写 区…...
【wiki知识库】07.用户管理后端SpringBoot部分
目录 一、今日目标 二、??SpringBoot部分类的添加 2.1 使用逆向工程新增User模块 2.2 UserQueryParam添加 2.3 UserSaveParam添加 2.4 UserResetPasswordParam添加 2.5 UserQueryVo添加 2.6 SnowFlake工具类 三、??后端新增接口? 3.1 /user/list接口添加 3.2 /…...
千峰React:案例二
完成对html文档还有css的引入,引入一下数据: import { func } from prop-types import ./购物车样式.css import axios from axios import { useImmer } from use-immer import { useEffect } from reactfunction Item() {return (<li classNameacti…...
Junit框架缺点
JUnit 是 Java 生态中最流行的单元测试框架,广泛应用于单元测试和集成测试中。尽管它功能强大且易于使用,但也存在一些缺陷和局限性。以下是 JUnit 的主要缺点: 1. 功能相对固定 问题:JUnit 的核心功能相对固定,缺乏灵…...
计算机毕业设计SpringBoot+Vue.js公司日常考勤系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Python线程池知多少
目录 目标 Python版本 官方文档 概述 线程池 实战 创建线程池的基本语法 批量提交任务 生产者&消费者模型 目标 掌握线程池的基本概念和使用方法。 Python版本 Python 3.9.18 官方文档 concurrent.futures — Launching parallel taskshttps://docs.python.org/3…...
MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 6
从6到12章将会是重中之重,请一定好好看 第06章_索引的数据结构 1.为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教课书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章。MySQL中也是一…...
C++动态与静态转换区别详解
文章目录 前言一、 类型检查的时机二、安全性三、适用场景四、代码示例对比总结 前言 在 C 中,dynamic_cast 和 static_cast 是两种不同的类型转换操作符,主要区别体现在类型检查的时机、安全性和适用场景上。以下是它们的核心区别: 一、 类…...
面向AI 的前端发展及初识大模型
AI带来的开发范式迁移 随着AI的涌现,对前端的发展也有着非常大的影响,总结过去前端的发展路径,目前应该属于又一次的大规模的开发范式迁移阶段。上一个阶段是从jquery到React/Vue/Angular迁移(jquery之前的就不讨论了)…...
Java入门的基础学习
Java的基础语法知识 一 初始Java二 Java数据类型和变量1.字面常量2.数据类型基本数据类型引用数据类型 3.变量整型变量浮点型变量字符型变量布尔型变量 4.类型转化和提升类型转化类型提升 三 运算符1.算数运算符2.关系操作符3.逻辑运算符:&&,||&…...
万字详解 MySQL MGR 高可用集群搭建
文章目录 1、MGR 前置介绍 1.1、什么是 MGR1.2、MGR 优点1.3、MGR 缺点1.4、MGR 适用场景 2、MySQL MGR 搭建流程 2.1、环境准备2.2、搭建流程 2.2.1、配置系统环境2.2.2、安装 MySQL2.2.3、配置启动 MySQL2.2.4、修改密码、设置主从同步2.2.5、安装 MGR 插件 3、MySQL MGR 故…...
脚本无法获取响应主体(原因:CORS Missing Allow Credentials)
背景: 前端的端口号8080,后端8000。需在前端向后端传一个参数,让后端访问数据库去检测此参数是否出现过。涉及跨域请求,一直有这个bug是404文件找不到。 在修改过程当中不小心删除了一段代码,出现了这个bug࿰…...
GD32F450 使用
GB32F450使用 1. 相关知识2. 烧写程序3. SPI3.1 spi基础3.2 spi代码 4. 串口4.1 串口引脚4.2 串口通信代码 问题记录1. 修改晶振频率 注意:GD32F450 总共有三种封装形式,本文所述的相关代码和知识,均为 GD32F450IX 系列。 1. 相关知识 参数配…...
神经网络代码入门解析
神经网络代码入门解析 import torch import matplotlib.pyplot as pltimport randomdef create_data(w, b, data_num): # 数据生成x torch.normal(0, 1, (data_num, len(w)))y torch.matmul(x, w) b # 矩阵相乘再加bnoise torch.normal(0, 0.01, y.shape) # 为y添加噪声…...
Android 数据库查询对比(APN案例)
功能背景 APN 数据通常存储在数据库中,由TelephonyProvider提供。当用户进入APN设置界面时,Activity会启动,AOSP源码通过ContentResolver查询APN数据。关键分析点在于这个查询操作是否在主线程执行,因为主线程上的耗时操作会导致…...
神卓 S500 异地组网设备实现监控视频异地组网的详细步骤
一、设备与环境准备 硬件清单 主设备:神卓 S500 异地组网路由器 1子设备:神卓 S500 或兼容设备 N(需通过官网认证)监控设备:支持 RTSP/ONVIF 协议的 NVR、摄像头网络要求:各网点需稳定联网(推荐…...
golang安装(1.23.6)
1.切换到安装目录 cd /usr/local 2.下载安装包 wget https://go.dev/dl/go1.23.6.linux-amd64.tar.gz 3.解压安装包 sudo tar -C /usr/local -xzf go1.23.6.linux-amd64.tar.gz 4.配置环境变量 vi /etc/profile export PATH$…...
leetcode35.搜索插入位置
题目: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出…...
LeetCode第57题_插入区间
LeetCode 第57题:插入区间 题目描述 给你一个 无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。 难度 中…...
人工智能之数学基础:线性代数中矩阵的运算
本文重点 矩阵的运算在解决线性方程组、描述线性变换等方面发挥着至关重要的作用。通过对矩阵进行各种运算,可以简化问题、揭示问题的本质特征。在实际应用中,我们可以利用矩阵运算来处理图像变换、数据分析、电路网络等问题。深入理解和掌握矩阵的运算,对于学习线性代数以…...
SQL Server 创建用户并授权
创建用户前需要有一个数据库,创建数据库命令如下: CREATE DATABASE [数据库名称]; CREATE DATABASE database1;一、创建登录用户 方式1:SQL命令 命令格式:CREATE LOGIN [用户名] WITH PASSWORD ‘密码’; 例如,创…...
MySQL双主搭建-5.7.35
文章目录 上传并安装MySQL 5.7.35双主复制的配置实例一:172.25.0.19:实例二:172.25.0.20: 配置复制用户在实例 1 (172.25.0.19)上执行:在实例 2 (172.25.0.20)上执行&…...
RNN实现精神分裂症患者诊断(pytorch)
RNN理论知识 RNN(Recurrent Neural Network,循环神经网络) 是一种 专门用于处理序列数据(如时间序列、文本、语音、视频等)的神经网络。与普通的前馈神经网络(如 MLP、CNN)不同,RNN…...
Python中字符串的常用操作
一、r原样输出 在 Python 中,字符串前加 r(即 r"string" 或 rstring)表示创建一个原始字符串(raw string)。下面详细介绍原始字符串的特点、使用场景及与普通字符串的对比。 特点 忽略转义字符࿱…...
uniapp 本地数据库多端适配实例(根据运行环境自动选择适配器)
项目有个需求,需要生成app和小程序,app支持离线数据库,如果当前没有网络提醒用户开启离线模式,所以就随便搞了下,具体的思路就是: 一个接口和多个实现类(类似后端的模板设计模式)&am…...
Spring Cloud Gateway 整合Spring Security
做了一个Spring Cloud项目,网关采用 Spring Cloud Gateway,想要用 Spring Security 进行权限校验,由于 Spring Cloud Gateway 采用 webflux ,所以平时用的 mvc 配置是无效的,本文实现了 webflu 下的登陆校验。 1. Sec…...
【异地访问本地DeepSeek】Flask+内网穿透,轻松实现本地DeepSeek的远程访问
写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言依赖Flask构建本地网页访问LM Studio 开启网址访问DeepSeek 调用模板Flask 访问本…...
Windows对比MacOS
Windows对比MacOS 文章目录 Windows对比MacOS1-环境变量1-Windows添加环境变量示例步骤 1:打开环境变量设置窗口步骤 2:添加系统环境变量 2-Mac 系统添加环境变量示例步骤 1:打开终端步骤 2:编辑环境变量配置文件步骤 3࿱…...
React实现无缝滚动轮播图
实现效果: 由于是演示代码,我是直接写在了App.tsx里面在 文件位置如下: App.tsx代码如下: import { useState, useEffect, useCallback, useRef } from "react"; import { ImageContainer } from "./view/ImageC…...
Ubuntu20.04确认cuda和cudnn已经安装成功
当我们通过官网安装cuda和cudnn时,终端执行完命令后我们仍不能确定是否已经安装成功。接下来教大家用几句命令测试。 cuda 检测版本号 nvcc -V如果输出如下,则安装成功。 可以看到版本号是11.2 cudnn检测版本号 有两种命令:如果你的cudn…...
sqlilab 46 关(布尔、时间盲注)
sqlilabs 46关(布尔、时间盲注) 46关有变化了,需要我们输入sort,那我们就从sort1开始 递增测试: 发现测试到sort4就出现报错: 我们查看源码: 从图中可看出:用户输入的sort值被用于查…...