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

参考资料

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3 中实现 验证码发送 刷新不变倒计时

今天实现一个倒计时的功能 在平常开发前端的功能的时候 不管是 移动端还是web端 我们都会有注册 登录 中的发送验证码功能 实现绑定以及注册功能。今天我主要分享一下当前的验证码实现原理。 有两种做法(我目前认为以及看到的) ① 做一个简单的倒计时 ② 实时监测倒计时 刷…

Web的UI自动化基础知识

目录 1 Web自动化入门基础1.1 自动化知识以及工具1.2 主流web自动化测试工具1.3 入门案例 2 使用工具的API2.1 元素定位2.1.1 id选择器2.1.2 name2.1.3 class_name选择器2.1.4 tag_name选择器2.1.5 link_text选择器2.1.6 partial_link_text选择器2.1.7 xpath选择器2.1.8 CSS选择…

使用python绘制三维直方图

使用python绘制三维直方图 三维直方图定义特点 效果代码 三维直方图 维直方图&#xff08;3D直方图&#xff09;是一种用于展示三维数据分布情况的图表。它扩展了二维直方图的概念&#xff0c;通过在三维空间中绘制柱体来表示数据在三个维度&#xff08;X、Y、Z&#xff09;上…

Excel中多条件判断公式怎么写?

在Excel里&#xff0c;这种情况下的公式怎么写呢&#xff1f; 本题有两个判断条件&#xff0c;按照题设&#xff0c;用IF函数就可以了&#xff0c;这样查看公式时逻辑比较直观&#xff1a; IF(A2>80%, 4, IF(A2>30%, 8*(A2-30%),0)) 用IF函数写公式&#xff0c;特别是当…

Spring配置那些事

一、引言 配置是一个项目中不那么起眼&#xff0c;但却有非常重要的东西。在工程项目中&#xff0c;我们一般会将可修改、易变、不确定的值作为配置项&#xff0c;在配置文件/配置中心中设置。 比方说&#xff0c;不同环境有不同的数据库地址、不同的线程池大小等&#xff0c…

XSKY 在金融行业:新一代分布式核心信创存储解决方案

近日&#xff0c;国家金融监督管理总局印发了《关于银行业保险业做好金融“五篇大文章”的指导意见》&#xff0c;在数字金融领域提出明确目标&#xff0c;要求银行业保险业数字化转型成效明显&#xff0c;数字化经营管理体系基本建成&#xff0c;数字化服务广泛普及&#xff0…

opencv-python(八)

import cv2 import numpy as npheight 160 width 280 image np.zeros((height, width),np.uint8) cv2.imshow(image,image) cv2.waitKeyEx(0) cv2.destroyAllWindows() 二维数组代表一幅灰度图像。 import cv2 import numpy as npheight 160 width 280 image np.zeros((he…

为何云原生是未来?企业IT架构的颠覆与重构(上)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是云原生 2、云原生的背景和起源 背景 起源 关…

ROS机器人小车建模仿真与SLAM

文章目录 一、URDF二、创建小车模型1.创建功能包2.导入依赖3.创建urdf,launch文件&#xff1a;4.可视化 三、添加雷达1.xacro文件2.集成和修改launch3.添加摄像头和雷达 三.GAZEBO仿真四、orbslam2kitti1.下载2.安装编译ORB_SLAM23.运行Kitee数据集 一、URDF ​ URDF&#xff…

Java 集合框架:LinkedList 的介绍、使用、原理与源码解析

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 014 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

Guitar Pro 8软件安装包下载

简介&#xff1a; Guitar Pro吉他软件为帮助所有吉他爱好者学习、绘谱、创作而设计——包含吉他的现有指法及音色&#xff0c; Guitar Pro能了解各类线谱&#xff0c;看谱练吉他&#xff0c;对谱听示范&#xff0c;记录初创声音。 在做弹拨乐器的滑音、倚音、推弦、揉弦、泛…

python图像处理库-PIL(Pillow)

PIL库全称为Python Imaging Library&#xff0c;即Python图像处理库&#xff0c;是一个在Python中用于处理图像的非常流行的库。 一、PIL介绍 这个库提供了广泛的文件格式支持、高效的内部表示以及相当强大的图像处理功能。 核心图像库旨在快速访问存储在几种基本像素格式中的数…

Excel报表

(Apache POI) 入门案例 P164 使用POI需要导入下面2个坐标&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId> </dependency> <dependency><groupId>org.apache.poi</groupId>&…

Python基础教程(二十三):JSON数据解析

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

LabVIEW常用的加密硬件

LabVIEW在工程和科学领域中广泛应用&#xff0c;其中数据保护和程序安全尤为重要。为了确保数据的安全性和完整性&#xff0c;常用的加密硬件设备包括TPM&#xff08;可信平台模块&#xff09;、HSM&#xff08;硬件安全模块&#xff09;和专用加密芯片。本文将推荐几款常用的加…

部署大模型LLM

在autodl上部署大模型 windows运行太麻烦&#xff0c;环境是最大问题。 选择云上服务器【西北B区 / 514机】 cpp (c c plus plus) 纯 C/C 实现&#xff0c;无需外部依赖。针对使用 ARM NEON、Accelerate 和 Metal 框架的 Apple 芯片进行了优化。支持适用于 x86 架构的 AVX、…

猎食者优化算法 Python代码免费获取

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类算法的家人&#xff0c;可关注我的VX公众号&#xff1a;python算法小当家&#xff0c;不定期会有很多免费代码分享~ 猎食者优化算法 Python代码免费获取 猎食者优化算法(hunter–…

基于GTX的64B66B编码IP生成(高速收发器二十)

点击进入高速收发器系列文章导航界面 1、配置GTX IP 相关参数 前文讲解了64B66B编码解码原理&#xff0c;以及GTX IP实现64B66B编解码的相关信号组成&#xff0c;本文生成64B66B编码的GTX IP。 首先如下图所示&#xff0c;需要对GTX共享逻辑进行设置&#xff0c;为了便于扩展&a…

什么是微前端

什么是微前端&#xff1f; 微前端 这个名词&#xff0c;第一次被提出还是在2016年底&#xff0c;那是在 ThoughtWorks Technology Radar。这个概念将微服务这个被广泛应用于服务端的技术范式扩展到前端领域。现代的前端应用的发展趋势正在变得越来越富功能化&#xff0c;富交互…

RPG游戏完整指南

环境&#xff1a;unity2021urp 本教程教大家如何使用Unity创建一个RPG游戏&#xff0c;玩家可以在城镇场景中进行导航并寻找战斗&#xff0c;并在战斗中遇到不同类型的敌人。玩家可以向敌人施加不同的动作&#xff0c;如&#xff1a;常规攻击和撤离。这会是一个十分有趣的体验。…