LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

文章汇总

总体来看像是一种带权重的残差,但解决的如何高效问题的事情。
相比模型的全微调,作者提出固定预训练模型参数不变,在原本权重矩阵旁路添加低秩矩阵的乘积作为可训练参数,用以模拟参数的变化量。

模型架构

image.png
h = W 0 x + △ W x = W 0 x + B A x , B ∈ R d × r , A ∈ R r × k , r ≪ m i n ( d , k ) h=W_0x+\triangle Wx=W_0x+BAx,B\in \mathbb{R}^{d\times r},A\in \mathbb{R}^{r\times k},r \ll min(d,k) h=W0x+Wx=W0x+BAx,BRd×r,ARr×k,rmin(d,k)
可以从中看出来 B ∈ R d × r , A ∈ R r × k B\in\mathbb{R}^{d\times r},A\in \mathbb{R}^{r\times k} BRd×r,ARr×k分别是列满秩和行满秩。
因此 r a n k ( A ) = r a n k ( B ) = r , r ≪ m i n ( d , k ) rank(A)=rank(B)=r,r \ll min(d,k) rank(A)=rank(B)=r,rmin(d,k)
优点:
1:只优化注入的小得多的低秩矩阵,并且降低了过拟合的风险。
2:推理时可以将原权重与训练后权重合并,即 W = W 0 + B A W=W_0+BA W=W0+BA,因此在推理时不存在额外的开销。
3:当我们需要切换到另一个下游任务时,我们可以通过减去 B A BA BA然后添加不同的 B ′ A ′ B'A' BA来恢复 W 0 W_0 W0,这是一个内存开销很小的快速操作。

LoRA在transformer上的应用

image.png
为了简单和参数效率,我们将研究限制为仅适应下游任务的注意力权重,并冻结MLP模块(因此它们不接受下游任务的训练)

摘要

自然语言处理的一个重要范例是对一般领域数据进行大规模预训练,并适应特定的任务或领域。当我们预训练更大的模型时,重新训练所有模型参数的完全微调变得不太可行。以GPT-3 175B为例,部署独立的微调模型实例,每个实例都有175B参数,这是非常昂贵的。我们提出了低秩自适应(Low-Rank Adaptation, LoRA),它冻结了预训练的模型权重,并将可训练的秩分解矩阵注入到Transformer架构的每一层,从而大大减少了下游任务的可训练参数的数量。与经过Adam微调的GPT-3 175B相比,LoRA可以将可训练参数的数量减少10,000倍,GPU内存需求减少3倍。在RoBERTa、DeBERTa、GPT-2和GPT-3上,LoRA在模型质量方面的表现与调优相当或更好,尽管具有更少的可训练参数、更高的训练吞吐量,并且与适配器不同,没有额外的推理延迟。我们还对语言模型适应中的等级缺陷进行了实证研究,从而揭示了LoRA的有效性。我们发布了一个包来促进LoRA与PyTorch模型的集成,并在https://github.com/microsoft/LoRA上为RoBERTa、DeBERTa和GPT-2提供我们的实现和模型检查点。

1介绍

自然语言处理中的许多应用依赖于将一个大规模的预训练语言模型适应多个下游应用。这种适应通常是通过微调来完成的,微调会更新预训练模型的所有参数。微调的主要缺点是新模型包含与原始模型一样多的参数。由于每隔几个月就会训练更大的模型,对于GPT-2 (Radford等人,b)或RoBERTa large (Liu等人,2019)来说,这仅仅是一个“不便”,而对于具有1750亿个可训练参数的GPT-3 (Brown等人,2020)来说,这是一个关键的部署挑战许多人试图通过调整一些参数或学习外部模块来缓解这种情况。这样,除了每个任务的预训练模型外,我们只需要存储和加载少量的特定于任务的参数,大大提高了部署时的运行效率。然而,现有的技术经常引入推理延迟(Houlsby等人,2019;Rebuffi等人,2017)通过扩展模型深度或减少模型的可用序列长度(Li & Liang, 2021;Lester等人,2021;Hambardzumyan等,2020;Liu et al ., 2021)(第3节)。更重要的是,这些方法往往无法匹配微调基线,从而在效率和模型质量之间做出权衡。
image.png
图1:我们的重新参数化。我们只训练A和B。
我们从Li等人(2018a)那里获得灵感;Aghajanyan等人(2020)的研究表明,学习到的过度参数化模型实际上存在于低内在维上。我们假设模型适应过程中的权重变化也具有较低的“内在秩”,从而提出了低秩适应(low - rank adaptation, LoRA)方法。LoRA允许我们通过优化密集层在适应过程中变化的秩分解矩阵来间接训练神经网络中的一些密集层,同时保持预训练的权值不变,如图1所示。以GPT-3 175B为例,我们展示了即使在全秩(即d)高达12,288时,非常低的秩(即图1中的 r r r可以是1或2)也足够了,这使得LoRA既具有存储效率又具有计算效率。
LoRA具有几个关键优势
•预先训练的模型可以共享,并用于为不同的任务构建许多小型LoRA模块。我们可以通过替换图1中的矩阵A和B来冻结共享模型并有效地切换任务,从而显著降低存储需求和任务切换开销。
•LoRA使训练更有效,并且在使用自适应优化器时将硬件进入门槛降低了3倍,因为我们不需要计算梯度或维护大多数参数的优化器状态。相反,我们只优化注入的小得多的低秩矩阵
•我们简单的线性设计允许我们在部署时将可训练矩阵与冻结权重合并,与完全微调的模型相比,通过构建不会引入推理延迟。
•LoRA与许多先前的方法正交,并且可以与其中许多方法组合,例如前缀调优。我们在附录E中提供了一个例子。
术语和约定
我们经常引用Transformer体系结构,并对其维度使用常规术语。我们将Transformer层的输入和输出维度大小称为 d m o d e l d_{model} dmodel。我们用 W q , W k , W v , W o W_q,W_k,W_v,W_o Wq,Wk,Wv,Wo来指代自关注模块中的查询/键/值/输出投影矩阵。 W W W W 0 W_0 W0为预训练权矩阵, △ W \triangle W W为适应过程中累积的梯度更新。我们用 r r r来表示LoRA模块的秩。我们遵循(Vaswani et al ., 2017;Brown et al ., 2020),并使用Adam (Loshchilov & Hutter, 2019;Kingma & Ba, 2017)进行模型优化,并使用Transformer MLP前馈维度 f f f n = 4 × d m o d e l f_{ffn}=4\times d_{model} fffn=4×dmodel

2 问题陈述

虽然我们的建议与训练目标无关,但我们将重点放在语言建模上,作为我们的激励用例。下面是对语言建模问题的简要描述,特别是在给定特定任务提示的情况下最大化条件概率。
假设我们有一个预训练的自回归语言模型 P Φ ( y ∣ x ) P_\Phi(y|x) PΦ(yx),参数化为 Φ \Phi Φ。例如, P Φ ( y ∣ x ) P_\Phi(y|x) PΦ(yx)可以是通用的多任务学习器,如GPT (Radford等人,b;Brown等人,2020)基于Transformer架构(Vaswani等人,2017)。考虑将此预训练模型应用于下游条件文本生成任务,例如摘要、机器阅读理解(MRC)和自然语言转换为SQL (NL2SQL)。每个下游任务由上下文-目标对的训练数据集表示: Z = { ( x i , y i ) } i = 1 , . . . , N \mathcal{Z}=\{(x_i,y_i)\}_{i=1,...,N} Z={(xi,yi)}i=1,...,N,其中 x i x_i xi y i y_i yi都是令牌序列。例如,在NL2SQL中, x i x_i xi是一个自然语言查询, y i y_i yi是对应的SQL命令;“ x i x_i xi”是文章的内容,“ y i y_i yi”是文章的摘要。
在全微调过程中,将模型初始化为预训练的权值 Φ 0 \Phi_0 Φ0,并通过反复跟随梯度更新为 Φ 0 + △ Φ \Phi_0+\triangle \Phi Φ0+△Φ,以最大化条件语言建模目标:
image.png
完全微调的主要缺点之一是,对于每个下游任务,我们学习一组不同的参数 △ Φ \triangle \Phi △Φ,其维数 ∣ △ Φ ∣ |\triangle \Phi| ∣△Φ∣等于 ∣ Φ 0 ∣ |\Phi_0| Φ0。因此,如果预训练的模型很大(如GPT-3的 ∣ Φ 0 ∣ |\Phi_0| Φ0≈1750亿),存储和部署许多独立的微调模型实例可能是具有挑战性的,如果可行的话。
在本文中,我们采用了一种参数效率更高的方法,其中特定于任务的参数增量 △ Φ = △ Φ ( Θ ) \triangle \Phi=\triangle \Phi(\Theta) △Φ=△Φ(Θ)更小的参数集 Θ \Theta Θ ∣ Θ ∣ ≪ ∣ Φ 0 ∣ |\Theta| \ll |\Phi_0| ∣Θ∣Φ0进一步编码。因此,寻找 △ Φ \triangle \Phi △Φ的任务变成了对 Θ \Theta Θ的优化:
image.png
在随后的章节中,我们建议使用低秩表示来编码 △ Φ \triangle \Phi △Φ,这既节省计算又节省内存。当预训练模型为GPT-3 175B时,可训练参数 ∣ Θ ∣ |\Theta| ∣Θ∣的数量可小至 ∣ Φ 0 ∣ |\Phi_0| Φ0的0.01%。

3.现有的解决方案还不够好吗?

我们着手解决的问题绝不是什么新问题。自从迁移学习开始以来,已经有几十项工作试图使模型适应更具有参数和计算效率。关于一些著名作品的概览,见第6节。以语言建模为例,在有效适应方面有两种突出的策略:添加适配器层(Houlsby等人,2019;Rebuffi et al ., 2017;Pfeiffer等,2021;Ruckl¨e等人,2020)或优化输入层激活的某些形式(Li & Liang, 2021;Lester等人,2021;Hambardzumyan等,2020;Liu et al, 2021)。然而,这两种策略都有其局限性,特别是在大规模和对延迟敏感的生产场景中。

适配器层引入推理延迟

image.png
表1:GPT-2介质中单个正向传递的延迟时间(以毫秒为单位),平均超过100次试验。我们使用的是NVIDIA Quadro RTX8000。“ ∣ Θ ∣ |\Theta| ∣Θ∣”表示适配器层中可训练参数的数量。AdapterL和AdapterH是适配器调优的两个变体,我们将在5.1节中描述。在在线、短序列长度的场景中,适配器层引入的推理延迟可能非常大。详见附录B的完整研究。
适配器有许多变体。我们专注于Houlsby等人(2019)的原始设计,每个Transformer块有两个适配器层,Lin等人(2020)的最新设计,每个块只有一个适配器层,但有一个额外的LayerNorm (Ba等人,2016)。虽然可以通过修剪层或利用多任务设置来减少总体延迟(Ruckl¨e等人,2020;Pfeiffer等人,2021),没有直接的方法绕过适配器层中的额外计算。这似乎不是问题,因为适配器层被设计为具有很少的参数(有时<原始模型的1%),通过具有较小的瓶颈维度,这限制了它们可以添加的flop。然而,大型神经网络依赖于硬件并行性来保持低延迟,适配器层必须按顺序处理。这在批处理大小通常小于1的在线推理设置中会产生差异。在没有模型并行性的通用场景中,例如在单个GPU上运行GPT-2 (Radford et al, b)介质上的推理,我们看到使用适配器时延迟明显增加,即使瓶颈维度非常小(表1)。
当我们需要像Shoeybi等人(2020)那样对模型进行分片时,这个问题会变得更糟;Lepikhin等人(2020),因为额外的深度需要更多的同步GPU操作,如AllReduce和Broadcast,除非我们多次冗余存储适配器参数。

直接优化提示是很困难的

另一个方向,如前缀调优(Li & Liang, 2021),面临着不同的挑战。我们观察到前缀调优很难优化,其性能在可训练参数中呈非单调变化,证实了原论文的类似观察结果。更根本的是,为自适应保留一部分序列长度必然会减少用于处理下游任务的序列长度,我们怀疑与其他方法相比,这使得调整提示的性能降低。我们把对任务执行的研究推迟到第5节。

4.我们的方法

我们描述了LoRA的简单设计及其实际效益。这里概述的原则适用于深度学习模型中的任何密集层,尽管在我们的实验中,我们只关注Transformer语言模型中的某些权重,作为激励用例。

4.1低秩参数化更新矩阵

神经网络包含许多执行矩阵乘法的密集层。这些层中的权矩阵通常是全秩的。当适应一个特定的任务时,Aghajanyan等人(2020)表明,预训练的语言模型具有较低的“内在维度”,尽管随机投影到较小的子空间,但仍然可以有效地学习。受此启发,我们假设权重的更新在适应过程中也具有较低的“内在秩”。对于预训练的权重矩阵 W 0 ∈ R d × k W_0\in \mathbb{R}^{d\times k} W0Rd×k,我们通过用低秩分解 W 0 + △ W = W 0 + B A W_0+\triangle W=W_0+BA W0+W=W0+BA来约束其更新,其中 B ∈ R d × r , A ∈ R r × k B\in \mathbb{R}^{d\times r},A\in \mathbb{R}^{r\times k} BRd×r,ARr×k,秩 r ≪ m i n ( d , k ) r \ll min(d,k) rmin(d,k)。在训练过程中, W 0 W_0 W0被冻结,不接受梯度更新,而 A A A B B B包含可训练参数。注意, W 0 W_0 W0 △ W = B A \triangle W= BA W=BA都用相同的输入相乘,它们各自的输出向量按坐标求和。当 h = W 0 x h=W_0x h=W0x时,修正后的正向传递收益率为:
h = W 0 x + △ W x = W 0 x + B A x h=W_0x+\triangle Wx=W_0x+BAx h=W0x+Wx=W0x+BAx
我们在图1中说明了我们的重新参数化。我们对 A A A使用随机高斯初始化,对 B B B使用零初始化,因此 △ W = B A \triangle W=BA W=BA在训练开始时为零。然后,我们将 △ W x \triangle W x Wx乘以 α r \frac{\alpha}{r} rα,其中 α \alpha α r r r中的常数。当使用Adam进行优化时,如果我们适当地缩放初始化,则调整 α \alpha α与调整学习率大致相同。因此,我们简单地将 α \alpha α设置为我们尝试的第一个 r r r,而不调整它。当我们改变 r r r时,这种缩放有助于减少重新调整超参数的需要(Yang & Hu, 2021)。
全微调的推广。更一般的微调形式允许训练预训练参数的子集。LoRA更进一步,在适应过程中不要求权重矩阵的累积梯度更新具有全秩。这意味着当将LoRA应用于所有权重矩阵并训练所有偏差时,通过将LoRA秩 r r r设置为预训练的权重矩阵的秩,我们大致恢复了完全微调的表达性。换句话说,当我们增加可训练参数的数量时,训练LoRA大致收敛于训练原始模型,而基于适配器的方法收敛于MLP,基于前缀的方法收敛于不能接受长输入序列的模型。
**没有额外的推理延迟。当部署到生产环境中时,我们可以显式地计算和存储 W = W 0 + B A W=W_0+BA W=W0+BA,并像往常一样执行推理。注意 W 0 W_0 W0 B A BA BA都在 R d × k \mathbb{R}^{d\times k} Rd×k中。当我们需要切换到另一个下游任务时,我们可以通过减去 B A BA BA然后添加不同的 B ′ A ′ B'A' BA来恢复 W 0 W_0 W0,这是一个内存开销很小的快速操作。**至关重要的是,这保证在推理期间,与通过构造进行微调的模型相比,我们不会引入任何额外的延迟。

4.2 LoRA在transformer上的应用

image.png
原则上,我们可以将LoRA应用于神经网络中权矩阵的任何子集,以减少可训练参数的数量。在Transformer体系结构中,自关注模块 ( W q , W k , W v , W o ) (W_q,W_k,W_v,W_o) (Wq,Wk,Wv,Wo)和2个在MLP模块。我们将 W q W_q Wq(或 W k , W v W_k,W_v Wk,Wv)视为维度 d m o d e l × d m o d e l d_{model}\times d_{model} dmodel×dmodel的单个矩阵,尽管输出维度通常被分割成注意头。为了简单和参数效率,我们将研究限制为仅适应下游任务的注意力权重,并冻结MLP模块(因此它们不接受下游任务的训练)。在7.1节中,我们进一步研究了在Transformer中适应不同类型的注意力权重矩阵的影响。我们把适应MLP层、LayerNorm层和偏差的实证调查留给未来的工作。
实际的好处和局限性
最大的好处来自内存和存储使用的减少。对于亚当训练的大型Transformer,如果 r ≪ d m o d e l r \ll d_{model} rdmodel ,我们将VRAM使用量减少2/3,因为我们不需要存储冻结参数的优化器状态。在GPT-3 175B上,我们将训练期间的VRAM消耗从1.2TB减少到350GB。当 r = 4 r=4 r=4并且只调整查询和值投影矩阵时,检查点大小减少了大约10,000倍(从350GB减少到35MB)4。这使我们能够使用更少的gpu进行训练,并避免I/O瓶颈。另一个好处是,我们可以在部署时以低得多的成本在任务之间切换,只需交换LoRA权重,而不是所有参数。这允许创建许多定制模型,这些模型可以在将预训练的权重存储在VRAM中的机器上动态交换。我们还观察到,在GPT-3 175B的训练过程中,与完全微调相比,速度提高了25%,因为我们不需要计算绝大多数参数的梯度。
LoRA也有其局限性。例如,如果选择将 A A A B B B吸收到 W W W中以消除额外的推理延迟,则在单个前向传递中批量处理具有不同 A A A B B B的不同任务的输入是不直接的。尽管对于延迟不重要的场景,可以不合并权重并动态选择用于批量示例的LoRA模块。

5 实证实验

在扩展到GPT-3 175B (Brown等人,2020)之前,我们评估了LoRA在RoBERTa (Liu等人,2019)、DeBERTa (He等人,2021)和GPT-2 (Radford等人,b)上的下游任务性能。我们的实验涵盖了广泛的任务,从自然语言理解(NLU)到生成(NLG)。具体来说,我们对RoBERTa和DeBERTa的GLUE (Wang et al ., 2019)基准进行了评估。我们遵循Li & Liang(2021)在GPT-2上的设置进行直接比较,并添加了WikiSQL (Zhong等人,2017)(NL到SQL查询)和SAMSum (Gliwa等人,2019)(对话摘要)在GPT-3上进行大规模实验。有关我们使用的数据集的更多细节,请参阅附录C。我们使用NVIDIA Tesla V100进行所有实验。
image.png
image.png

8 结论与未来工作

就所需的硬件和为不同任务托管独立实例的存储/切换成本而言,对庞大的语言模型进行微调是非常昂贵的。我们提出LoRA,一种有效的自适应策略,既不引入推理延迟,也不减少输入序列长度,同时保持高模型质量。重要的是,通过共享绝大多数模型参数,它允许在作为服务部署时快速切换任务。虽然我们关注的是Transformer语言模型,但所提出的原则通常适用于任何具有密集层的神经网络。
未来的工作有很多方向。1) LoRA可以与其他有效的自适应方法相结合,有可能提供正交改进。2)微调或LoRA背后的机制尚不清楚——**如何将预训练期间学习到的特征转化为下游任务?我们相信LoRA比全微调更容易回答这个问题。**3)我们主要依靠启发式方法来选择应用LoRA的权重矩阵。有没有更有原则的方法?4)最后, △ W \triangle W W的rank-deficient表明 W W W也可能是rank-deficient,这也可以作为未来作品的灵感来源。

参考资料

论文下载(2021年)

https://arxiv.org/abs/2106.09685v2

代码地址

https://github.com/microsoft/LoRA

参考资料

《大规模语言模型从理论到实践》张奇 桂韬 郑锐 ⻩萱菁 著

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】 进程信号的发生

送给大家一句话&#xff1a; 何必向不值得的人证明什么&#xff0c;生活得更好&#xff0c;乃是为你自己。 -- 亦舒 进程信号的发生 1 何为信号2 信号概念的基础储备3 信号产生kill系统调用alarm系统调用异常core term Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢…

8086汇编 add指令学习

ADD&#xff0c;是Intel x86平台的汇编加法指令&#xff0c;MEM代指操作数为内存或寄存器&#xff0c;REG代指操作数为寄存器&#xff0c;IMM代指立即数&#xff0c;SEG代指操作数为段寄存器。 形式和示例如下&#xff1b; ADD MEM8,REG8 ADD DS:[BXSI],AL ADD MEM16,R…

20240615在WIN11下的串口调试助手的下载安装以及使用

20240615在WIN11下的串口调试助手的下载安装以及使用 2024/6/15 18:06 百度&#xff1a;串口调试助手 blob:https://apps.microsoft.com/df934d29-fd7a-4873-bb6b-a4ab5a7934c9 串口调试助手 Installer.exe 收发的LOG&#xff1a; rootok3588:/# ./uart_test /dev/ttyS0 11520…

MySQL数据操作与查询- 连接查询

一、引入 1、为什么需要使用连接查询&#xff1f; 查询信息的来源如果来自多张表&#xff0c;则必须对这些表进行连接查询。 2、连接查询的分类 内连接和外连接。 二、内连接 1、概述 将两张表的记录组合在一起&#xff0c;产生一个新的结果。 &#xff08;1&#xff09…

docker desktop for mac os如何使用本地代理

在macbook上弄了个代理&#xff0c;然后按照网上所说的去配代理 然后测试下 docker pull busybox 结果无反应&#xff0c;超时。我去&#xff01;&#xff01;&#xff01; 鼓捣了半天&#xff0c;看了docker官网&#xff0c;问了chatgpt &#xff0c;按照它们所说的试了下也没…

PCL 基于八叉树的去噪滤波

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示1、滤波前2、滤波后本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、原理概述 使用八叉树对点云进行噪点删除的滤波方法实现。 …

C学习自学笔记-会陆续完善对应章节编程经典例子

C学习笔记 0>C语言概述 为什么学习C语言 1&#xff09;C的起源和发展------了解即可 B语言、C语言、C语言的产生地&#xff1a;都出自 美国贝尔实验室 2&#xff09;C的特点 优点&#xff1a;代码量小、速度快、功能强大 缺点&#xff1a;危险性高、开发周期长、可移植性…

UI学习--分栏控制器

UI学习 分栏控制器基础概念用法 分栏控制器高级高级属性 总结 分栏控制器基础 概念 分栏控制器可以理解为一个容器&#xff0c;可以容纳多个子视图控制器&#xff0c;并通过选项卡的方式进行切换。每个选项卡都与一个特定的视图控制器相关联&#xff0c;当用户点击不同的选项…

JUC并发编程第十三章——读写锁、邮戳锁

本章路线总纲 无锁——>独占锁——>读写锁——>邮戳锁 1 关于锁的面试题 你知道Java里面有那些锁你说说你用过的锁&#xff0c;锁饥饿问题是什么&#xff1f;有没有比读写锁更快的锁StampedLock知道吗&#xff1f;&#xff08;邮戳锁/票据锁&#xff09;ReentrantR…

「动态规划」如何求乘积最大子数组?

152. 乘积最大子数组https://leetcode.cn/problems/maximum-product-subarray/description/ 给你一个整数数组nums&#xff0c;请你找出数组中乘积最大的非空连续子数组&#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该子数组所对应的乘积。测试用例的…

WebGL学习【焕新计划】

WebGL基础 在正式进入webgl之前&#xff0c;我想有必要简单了解一下渲染管线&#xff0c;毕竟它贯穿webgl学习的整个过程。 渲染管线流程图&#xff1a; webgl着色器简单语法&#xff1a; 在GLSL&#xff08;OpenGL Shading Language&#xff09;中&#xff0c;常见的变量类…

企业化运维(4)_tomcat

###1.配置tomcat### 可以将tomcat部署在server2主机&#xff0c;与nginx主服务器分开&#xff0c;便于进行交互存储。 下载安装jdk与tomcat&#xff0c;并开启服务&#xff0c;便可以在浏览器进行访问。 [rootserver3 ~]# rpm -ivh jdk-8u121-linux-x64.rpm [rootserver3 ~]#…

Mybatis-Plus多种批量插入方案对比

背景 六月某日上线了一个日报表任务&#xff0c;因是第一次上线&#xff0c;故需要为历史所有日期都初始化一次报表数据 在执行过程中发现新增特别的慢&#xff1a;插入十万条左右的数据&#xff0c;SQL执行耗费高达三分多钟 因很早就听闻过mybatis-plus的[伪]批量新增的问题&…

万事开头难——Java实现俄罗斯小方块【第一步】

目录 技术实现&#xff1a; 1.初始化游戏窗口&#xff1b; 1.1 什么是窗口&#xff1a; 1.2 Swing 1.3 JFrame创建窗口&#xff1a; 1.3.1创建窗口的逻辑 1.3.2.设置简单的页面 1.3.3.优化 1.3.4.设置标题 1.4 创建游戏窗口 技术实现&#xff1a; 1.初始化游戏窗口&am…

【CT】LeetCode手撕—20. 有效的括号

题目 原题连接&#xff1a;20. 有效的括号 1- 思路 模式识别 模式1&#xff1a;括号左右匹配 ——> 借助栈来实现 ——> Deque<Character> deque new LinkedList<>()模式2&#xff1a;顺序匹配 ——> 用 if 判断 具体思路 1.遇到左括号 直接入栈相应…

ARM32开发--电源管理单元

知不足而奋进 望远山而前行 目录 文章目录 前言 学习目标 学习内容 PMU 电源域 VDD/VDDA域 备份域 1.2V域 省电模式 睡眠模式 深度睡眠模式 待机模式 几种模式总结 WFI和WFE指令 案例需求 模式初始化 源码 总结 前言 在嵌入式系统中&#xff0c;有效的电池管…

【AI基础】第六步:纯天然保姆喂饭级-安装并运行qwen2-7b

整体步骤类似于 【AI基础】第五步&#xff1a;纯天然保姆喂饭级-安装并运行chatglm3-6b-CSDN博客。 此系列文章列表&#xff1a; 【AI基础】概览 【AI基础】第一步&#xff1a;安装python开发环境-windows篇_下载安装ai环境python 【AI基础】第一步&#xff1a;安装python开发环…

面试题 17.05. 字母与数字

链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a;把字母看成1&#xff0c;把数字看为-1&#xff0c;将题目变为求的和为0的最长连续子数组 class Solution { public:vector<string> findLongestSubarray(vector<string>& array) …

MySQL查询练习题1.平均工资2.查询各部门的总薪水3.查询总薪水排名第二的部门4.查询姓名重复的员工信息5.查询各部门薪水大于900的男性员工的平均薪水

创建一个员工表emp&#xff0c;包含字段&#xff1a;姓名name&#xff0c;性别sex&#xff0c;部门depart&#xff0c;工资salary create table emp(name varchar(30) not null,sex varchar(30) not null,depart int not null,salary int not null); 插入数据打印为 mysql>…

Windows Server 2008 r2 IIS .NET

Windows Server 2008 r2 IIS .NET