E2VPT: An Effective and Efficient Approach for Visual Prompt Tuning
论文汇总
存在的问题
1.以前的提示微调方法那样只关注修改输入,而应该明确地研究在微调过程中改进自注意机制的潜力,并探索参数效率的极限。
2.探索参数效率的极值来减少可调参数的数量?
解决办法

提示嵌入进行transformer中


提示剪枝
Token-wise Pruning
Token-wise Pruning对prompt生成一个mask, ρ = { ρ 1 , ρ 2 , … , ρ M } , ρ k ∈ { 0 , 1 } \rho=\{\rho_1,\rho_2,\ldots,\rho_M\},\rho_k\in \{0,1\} ρ={ρ1,ρ2,…,ρM},ρk∈{0,1} ( M M M为可视提示符的长度)。 ρ k ∈ { 0 , 1 } \rho_k\in \{0,1\} ρk∈{0,1} 代表第 i i i 个token的重要程度,0代表这个token被丢弃, P ~ k = ρ k ⋅ P k \tilde{P}_k=\rho_k\cdot {P}_k P~k=ρk⋅Pk。
Segment-wise修剪
Segment-wise修剪对Token-wise Pruning之后的Token做进一步的剪枝,具体来说就讲Token-wise Pruning之后的Token分为 R R R 个part,将每个part视为一个整体。每一个part也有一个类似于Token-wise Pruning的 ρ \rho ρ 变量,表示每一个part的Token是否需要被抛弃。
摘要
随着基于transformer的模型的规模不断增长,为新任务微调这些大规模预训练的视觉模型已经变得越来越参数密集。参数高效学习是为了减少微调过程中可调参数的数量。尽管这些方法显示出很好的结果,但与完全微调相比,仍然存在显着的性能差距。为了解决这一挑战,我们提出了一种有效和高效的视觉提示调谐(E2VPT)方法,用于大规模基于变压器的模型自适应。具体来说,我们在自注意层和输入层分别引入了一组可学习的键值提示和视觉提示,以提高模型微调的有效性。此外,我们设计了一个提示剪枝程序,在保持模型性能的同时系统地修剪低重要性提示,大大提高了模型的效率。实证结果表明,我们的方法在两个基准上优于几个最先进的基线,参数使用率相当低(例如,VTAB-1k上的模型参数使用率为0.32%)。我们的代码可在https://github.com/ChengHan111/E2VPT上获得。
1. 介绍
人工智能(AI)的发展不仅应优先考虑性能进步,还应强调可持续部署[64,78,80,87]。尽管人们对视觉相关任务的性能改进有着迷人的追求,但目前模型的规模一直在迅速增加,这导致了能量密集型和计算成本高昂的训练[31,73,92]。基于transformer的架构目前主导着视觉相关模型,如ViT-Huge [12] (632M)和Swin-Large [54] (197M),它们的参数明显多于卷积神经网络(CNN)像ResNet [26] (25M)。从头开始训练如此大的模型存在着数据有限[5,20,75]和低精度下缓慢收敛[37,47]等挑战。克服这些挑战的一个常见范例是预训练-然后微调,它减少了对大量训练数据的需求,并加快了各种视觉任务的处理速度。然而,传统的全调优涉及到为每一个任务存储和部署backbone参数的完整副本[34],计算成本很高,不适合快速模型部署。


图1所示。在预训练之后微调的范式下,$ \text{E}^2 \text{VPT} $(我们的)与其他工作(即部分调谐[91],额外模块[6]和提示调谐[34]方法)。与最先进的微调方法相比,我们的方法获得了可靠的性能提升,并且在采用预训练的ViT-Base/16[12]作为主干的广泛分类任务上具有完全微调的竞争力,参数使用量相当低(见表1)。颜色分别表示VTAB-1k[96]上的结果:Specialized, Natural和Structure。
为了解决这个问题,已经开发了各种方法,可分为三大类(见图1):部分调优、额外模块和提示调优方法。部分调优方法[10,35,58]只对骨干的一部分进行微调,如分类器头部或最后几层,而冻结其他部分。额外的模块方法将可学习的偏置项[6]或额外的适配器[70,98]插入网络以进行适应。提示调谐方法在变压器的输入层添加提示令牌[34,36,94],而不改变或微调主干本身。所有这些方法都是在预训练后微调的模式下运行的,与完全微调相比,这减少了可学习参数的数量[10,35,58,70,98]。
然而,尽管取得了令人鼓舞的结果,但现有的参数高效方法存在两个主要局限性。首先,他们没有仔细检查transformer自关注机制的核心架构,导致完全微调的性能差距很大。其次,它们通常需要对相对大量的参数进行微调以达到合理的性能,而无法探索参数效率的极值。
以上概述的观点引出了两个基本问题:
1:我们如何才能为大规模基于transformer的视觉模型建立快速调整的有效性?
2:我们如何探索参数效率的极值来减少可调参数的数量?
这两个问题是我们工作的基础。直觉是,我们不应该像以前的提示调整方法那样只关注修改输入,而应该明确地研究在微调过程中改进自注意机制的潜力,并探索参数效率的极限。
为了回答问题1,我们讨论并分析了transformer的自关注机制,该机制对于在全局上下文中捕获远程令牌依赖关系至关重要[21,38,49]。除了输入视觉提示外,我们还引入了可学习的键值提示,并将它们集成到自注意层的键值矩阵中。在微调期间,键值提示与输入可视提示一起学习。这种方法有效地利用了设计良好的transformer提示体系结构,从而显著提高了性能。此外,它为电流互感器架构提供了一个通用的即插即用提示模块,其微调解决方案在概念上不同于前面提到的视觉领域的所有技术。
在问题2的激励下,我们提出了一种修剪策略,在保持模型性能的同时进一步减少参数的数量。我们的方法从彩票假设(LTH)中获得灵感[16,102],它假设对于给定的任务,存在一个子网络,该子网络可以匹配原始过参数化网络的测试精度,而不需要不必要的权重[22,23,41,43,44]。在此范例的基础上,我们重新审视了提示调优方法的核心设计,并进一步减少了可学习参数的数量。具体来说,我们的目标是保留对性能有重大贡献的提示令牌,同时在微调期间修剪冗余或不必要的提示令牌。通过修剪这些不必要的提示,我们可以在保持性能的同时显著提高提示调优效率。
为了回答问题1-2,我们提出$ \text{E}^2 \text{VPT} $,即Effective and Efficient Visual Prompt Tuning。e2vpt是一种新颖的提示调优框架,它既具有架构意识,又具有修剪锚定(见图1)。在§2中,我们进行了文献综述并讨论了相关工作。我们提出的方法在§3中提出,在那里我们详细描述了我们如何设计视觉和键值提示,以更少的参数实现卓越的性能。在§4中,我们在各种基准、主干和不同的预训练目标上提出了令人信服的实验结果。具体来说,我们的方法在VTAB-1k上的准确率比完全调优平均提高了5.85%,比VPT平均提高了1.99%[34]。此外,我们的方法使用的可学习参数比现有方法少得多,平均只占VTAB-1k主干参数的0.32%,而VPT平均需要0.68%(见图1)。我们进一步证明并解释了我们的方法比双曲可视化的VPT的优越性。最后,我们在附录中展示了我们的方法在语言领域的强大算法泛化。我们相信这项工作能为相关领域提供有价值的见解。
2. 相关工作
2.1. 视觉Transformers
受transformer在自然语言处理(NLP)中取得的巨大成功的启发[5,11,52,69,79,83],研究人员将transformer架构扩展到各种监督视觉任务,包括图像分类[12,53,54,56],图像分割[46,51,74,82,84,86,100],目标检测[4,7,50,66,93,101]和姿态估计[29,30,48,90])。自监督预训练范式[3,10,24]也得到了探索,并得到了最先进的结果。与卷积神经网络(cnn)相比,transformer因其优越的性能和可扩展性而在视觉相关学科中占据主导地位[27,34]。然而,使transformer适应各种视觉任务所需的大量计算和参数开销也不容忽视[15,33,97]。例如,最近基于transformer的模型,如MViTv2Large [45] (218M)、vitg [95] (1.8B)、SwinV2-G [53] (3.0B)和V-MoE [72] (14.7B),会产生大量的计算成本。因此,我们提出$ \text{E}^2 \text{VPT} $,旨在降低基于transformer的架构的计算成本,同时在预训练-然后微调范式中保持高性能。
2.2. 参数高效微调
高效的模型训练已经引起了视觉界的广泛关注,尤其是随着视觉transformer的兴起[1,8,12,54,85]。然而,尽管这些模型非常有效并被广泛使用,但它们对于实际部署和调整来说往往过于庞大。因此,通常采用预训练-然后微调范式。虽然完全微调确保了强大的性能,但这是一种涉及更新所有网络参数的昂贵方法[27,75]。为了克服这一挑战,研究人员正在探索平衡参数效率和鲁棒性能的替代方案,可大致分为三组:部分调优、额外模块和提示调优方法。
部分调优方法被广泛用于参数高效的微调。这些方法包括冻结大部分主干,只微调一小部分参数,如线性[32]或MLP磁头[9],或主干的几个块/层[24,65,91,99]。虽然这些方法直接且易于实现[10,35,58],但与完全微调相比,它们通常存在很大的性能差距。额外的模块方法设计了额外的可学习的插件架构进行微调。例如,[98]中的工作在冻结原始网络的同时交替引入了一个侧结构。[6,70]中的作品将额外的残余单元插入主干。然而,这些方法的一个缺点是插入的模块通常是针对特定的体系结构定制的,可能无法推广到其他体系结构。
此外,与部分调优方法相比,这些模块通常消耗更多的参数。提示调整或提示[28,42,57,89]最初被提出用于语言领域的快速模型自适应。这些方法将一组可学习的向量添加到主干的输入中,并且仅在微调期间更新这些特定于任务的提示。最近,在视觉领域引入了视觉相关提示[18,34,88],它在输入序列中设计视觉提示,并在完全微调的情况下显示出具有竞争力的性能。然而,目前的方法没有考虑基于transformer的体系结构的内部设计,导致不太有效的提示解决方案。相比之下,我们的方法注意到架构并锚定在修剪上,这在概念上将其与上述方法区分开来。
3. 我们的E2VPT方法
在本节中,我们将介绍E2VPT,这是一种新颖的视觉提示调谐方法,用于有效和高效的大规模基于transformer的模型微调。我们首先在§3.1中定义这个问题和记号。在§3.2中介绍了通过设计视觉和键值提示符进行有效的提示调优,然后在§3.3中介绍了有效的提示修剪。总体框架如图2所示。
3.1. 问题定义
在本节中,我们定义了 E 2 VPT \text{E}^2 \text{VPT} E2VPT 问题并提供了相关符号。假设我们有一个主干视觉transformer器模型 T \textbf{T} T,它在大量数据和任务上进行了预训练。视觉transformer的输入是一系列图像补丁 I = { I 1 , I 2 , … , I m } I=\{I_1,I_2,\ldots,I_m\} I={I1,I2,…,Im},其中 m m m为图像补丁总数。然后用位置编码将每个patch投影到 d d d维嵌入中,即 E = { E j ∣ 1 ≤ j ≤ m } E=\{E_j|1\le j\le m\} E={Ej∣1≤j≤m},其中 E j = Emb ( I j ) E_j=\text{Emb}(I_j) Ej=Emb(Ij)。视觉transformer T \textbf{T} T 由 N N N 个相同的transformer层组成,表示为:

这里的每个transformer层都是多头自关注(MSA)和前馈网络(FFN)的堆栈:

给定一个新的视觉任务,目标是微调一个模型 T ^ \hat{\textbf{T}} T^,在只调整少量参数的情况下,在任务上提供良好的性能。在视觉提示调优的上下文中, T ^ = { T , P } \hat{\textbf{T}}=\{\textbf{T},\textbf{P}\} T^={T,P},其中包括一个冻结的主干 T \textbf{T} T,以及具有很少可调参数的可训练提示 P \textbf{P} P。
3.2. 有效的提示

图2。E2VPT框架概述。在预训练-然后微调范式下,只有transformer输入和主干(§3.2)中的提示在微调过程中更新,而所有其他组件保持冻结。在(d)中,我们进一步在两个粒度级别(即,标记明智和分段明智)上引入修剪(§3.3),以消除倒带期间不利的输入提示。
大多数现有的提示调优方法侧重于通过将一组视觉提示添加到transformer层的输入序列来调优,而没有考虑变压器体系结构的内部设计。然而,为了提高提示调优的有效性并实现最佳的微调性能,我们提出了一种新的方法,在我们的视觉提示调优框架中,除了输入视觉提示( P I \textbf{P}_I PI )外,还包含一组键值提示( P K \textbf{P}_K PK 和 P V \textbf{P}_V PV )。直观地,输入视觉提示被插入到每个编码器层的输入序列中,这些编码器层学习表示新任务。键值提示与自注意模块中的键和值参数矩阵连接在一起,该模块学习从数据中捕获新的注意模式。
视觉提示。视觉提示是一组与输入视觉标记具有相同维度的 d d d 维嵌入向量。它们被附加到每个transformer编码器层的输入序列中,并与所有输入令牌交互。视觉提示的作用与传统提示调优方法中的提示符号类似[34,42],它们学习特定于任务的嵌入,以指导模型在新任务上执行。
正式地,这些视觉提示被定义为 P I = { P I 1 , P I 2 , … , P I N } P_I=\{P^1_I,P^2_I,\ldots,P^N_I\} PI={PI1,PI2,…,PIN},其中 P I i P^i_I PIi 为可学习视觉在第i层编码器中提示, N N N为总层数。然后编码器层表示为:

其中 Z i Z^i Zi 表示由第 i i i层编码器计算的上下文嵌入。不同的颜色分别表示可训练参数和固定参数。对于输入图像patch E E E的嵌入,它们是用主干的冻结Emb投影进行初始化的。
键-值提示。视觉提示对于学习新任务的知识很有用。然而,它们在指导transformer编码器层之间的信息交互方面存在不足。原因是当对新数据进行微调时,图像分布可能与用于预训练骨干模型的图像示例中的图像分布有很大不同。因此,增强模型从微调数据中捕获新信息的能力以及在输入令牌之间进行更有效的关注以学习新模式是至关重要的。
为此,我们提出了一种新的方法,通过引入一组新的键值提示, P K P_K PK 和 P V P_V PV,它们被合并到每个编码器层的注意力模块中(如图2(a)所示)。这些键-值提示是只有几列的小矩阵,但与原始注意力模块中的键和值矩阵共享相同的行数。为了执行新的注意力计算,键和值矩阵分别与相应的 P K P_K PK 和 P V P_V PV 提示符相连接。这个过程定义如下:

其中FFN为前馈网络,MSA为编码器层内的多头注意。 h h h 表示第 h h h 个头。 K ′ K' K′ 和 V ′ V' V′ 是新的键和值嵌入矩阵,定义为:

其中, K K K 和 V V V 表示主干中的原始键矩阵和值矩阵。通过这种方式,键值提示可以帮助指导模型适应新数据。在我们的实现中,我们更进一步,在每个transformer层中启用 P K P_K PK 和 P V P_V PV 提示的参数共享,而不是调整单独的可学习向量。我们的动机是双重的:首先,我们的实验结果表明,在共享提示的情况下,跨实例的微调性能持续提高;其次,使用共享提示向量将可学习transformer部分的参数使用减少了一半,使其更具参数效率。我们在§4.3中提供了关于探索提示位置(即,在 K K K 和 V V V 之前或之后)的讨论。
值得注意的是,查询矩阵 Q Q Q 是自注意机制中的另一个关键元素。然而,不需要对 Q Q Q 进行额外的提示,原因有二:首先,对 Q Q Q 进行提示类似于对 K K K 进行前置以计算每对 Q Q Q 和 K K K 之间的注意分数,因此,对 Q Q Q 和 K K K 都进行提示是不必要的;其次, Q Q Q 的变化会影响注意力图的输出形状,需要对下一层不匹配的维度进行额外的线性投影。在参数高效设计下,这是无法承受的。更多的实验和讨论将在附录中提供。
3.3. 有效的促使
我们的有效提示方法旨在提高微调模型的性能。然而,一个自然的问题出现了:我们能否在不牺牲模型性能的情况下减少可调提示的数量?彩票假设(lottery ticket hypothesis, LTH)[16,102]指出,对于给定的任务,存在一个子网络,在不需要不必要的权重的情况下,可以达到与原始过参数化网络相同的测试性能。在这一假设的推动下,我们进行了一个实验,我们掩盖了不同的视觉提示,发现不同的提示对模型的性能有不同的影响,有些甚至有负面影响。这一观察结果与以往的研究一致[43,57]。
基于我们的发现,我们提出了一种对视觉提示进行快速修剪的方法。这种方法的主要目标是保留最有影响的提示,同时消除冗余或不必要的提示。通过删除不太重要的提示,我们可以在保持性能的同时显著提高提示调优的效率。

为了实现这一目标,我们设计了一个级联修剪策略,该策略在两个粒度级别上运行,即令牌修剪和分段修剪,如图2(d)所示。标记智能修剪最初识别并删除最不重要的视觉提示。在此步骤之后,分段式修剪将每个剩余提示划分为多个片段并过滤掉负面片段。通过共同减少可学习视觉提示中的参数使用,我们的两级修剪方法创建了软过滤提示,可以在倒带阶段重新训练。
Token-wise修剪。我们引入一个可学习掩模变量 ρ = { ρ 1 , ρ 2 , … , ρ M } \rho=\{\rho_1,\rho_2,\ldots,\rho_M\} ρ={ρ1,ρ2,…,ρM} ( M M M为可视提示符的长度),并将其与各transformer层的输入可视提示符相关联。式中 ρ k ∈ { 0 , 1 } \rho_k\in \{0,1\} ρk∈{0,1},其中0表示对相应的可学习输入提示进行剪枝。然后,屏蔽版本的视觉提示变成 P ~ k = ρ k ⋅ P k \tilde{P}_k=\rho_k\cdot {P}_k P~k=ρk⋅Pk 。为了确定修剪位置,我们计算每个提示符号的重要性分数[16,57],并消除得分最低的位置。重要性分数定义为模型对掩模变量 ρ k \rho_k ρk 的期望灵敏度[60]:

式中, L \mathcal{L} L 为损失函数, D x \mathcal{D}_x Dx 为训练数据分布[60]。分配给每个视觉提示的重要性分数反映了它对微调性能的贡献。低重要性分数表明提示对微调过程的贡献很小,甚至是负的。相反,高重要性分数表明提示是有意义和有用的,对微调过程有重大贡献。
Segment-wise修剪。我们进一步研究了分段修剪,以排除每个提示内的负面提示段。每个提示令牌的嵌入首先平均分成$ R $部分。每个部分作为一个独立的单元,可以共同优化。类似于标记式修剪,然后我们为提示标记内的每个片段分配一个掩码变量,并过滤掉那些重要性分数低的片段。
Rewinding。在执行两级级剪枝之后,权值倒卷阶段的重点是重新训练软过滤的提示令牌。这个过程包括在修剪阶段对每个层的重要性评分进行排序,当其重要性评分相对较低时,将相应的掩码变量设置为0。接下来,在微调过程中,使用学习率和权重衰减的原始组合,将软过滤输入提示与其他可学习参数一起重新训练。
4. 实验


参考资料
论文下载(ICCV 2023)
https://arxiv.org/abs/2307.13770

代码地址
https://github.com/ChengHan111/E2VPT
参考资料
https://zhuanlan.zhihu.com/p/671299605
相关文章:
E2VPT: An Effective and Efficient Approach for Visual Prompt Tuning
论文汇总 存在的问题 1.以前的提示微调方法那样只关注修改输入,而应该明确地研究在微调过程中改进自注意机制的潜力,并探索参数效率的极限。 2.探索参数效率的极值来减少可调参数的数量? 解决办法 提示嵌入进行transformer中 提示剪枝 Token-wise …...
影刀RPA实战:网页爬虫之天猫商品数据
1.实战目标 1.1 实战目标 在电商行业,我们经常爬取各个平台的商品数据,通过收集和分析这些商品数据,企业可以了解市场趋势、消费者偏好和竞争对手的动态,从而制定更有效的市场策略。爬取商品数据对于企业在市场竞争中把握先机、…...
微信小程序注册流程及APPID获取(完整版图文教程)
文章目录 前言1. 注册微信小程序账号1.1微信小程序注册1.2 点击注册按钮,进入小程序注册步骤。1.3 填写邮箱、密码、验证码1.4 用户信息登记1.5 微信扫码认证后,回到微信公众平台点击确认提交1.6 进小程序后台,完成注册 2.完善小程序账号信息…...
分享课程:VUE数据可视化教程
在当今这个数据驱动的世界中,数据可视化已经成为了一种至关重要的工具,它帮助我们理解复杂的数据集,发现模式、趋势和异常。数据可视化不仅仅是将数字转换成图表,它是一种将数据转化为洞察力的艺术。 1.什么是数据可视化…...
Flink的反压机制:底层原理、产生原因、排查思路与解决方案
反压(Backpressure)是流处理框架(如 Apache Flink)中非常重要的概念。反压的产生和有效处理,直接影响整个流处理作业的稳定性和性能。本文将从 Flink 的底层原理、反压产生的原因、如何排查反压问题,以及如…...
Unity DOTS系列之Aspect核心机制分析
最近DOTS发布了正式的版本, 我们来分享一下DOTS里面Aspect机制,方便大家上手学习掌握Unity DOTS开发。 Aspect 机制概述 当我们使用ECS开发的时候,编写某个功能可能需要某个entity的一些组件,如果我们一个个组件的查询出来,可能…...
webpack 的打包target讲解 node环境打包下的文件存储造成不易察觉的坑点
背景 electron 主渲进程的打包,以及 preload 的打包,还有注入脚本的打包,这些东西 webpack 本身是自带的,这里主要讲一下 target: node 模式 代码 https://gitee.com/sen2020/webpack-demo/tree/feature%2Fnode-code-package/ n…...
JVM面试问题集
什么是运行时数据区? 什么是JVM? 了解过字节码文件的组成吗? 说一下运行时数据区 哪些区域会出现内存溢出,会有什么现象? JM在JDK6-8之间在内存区域上有什么不同 类的生命周期 常见的类加载器 什么是双亲委派机制 说明各个类加载器之间的关系 解释双亲委派机制 …...
Go weak包前瞻:弱指针为内存管理带来新选择
在介绍Go 1.23引入的unique包的《Go unique包:突破字符串局限的通用值Interning技术实现》一文中,我们知道了unique包底层是基于internal/weak包实现的,internal/weak是一个弱指针功能的Go实现。所谓弱指针(Weak Pointer,也称为弱…...
ZStack AIOS平台智塔入选2024世界计算大会专题展优秀成果
9月24日至25日,由湖南省人民政府主办,湖南省工业和信息化厅、长沙市人民政府、中国电子信息产业发展研究院承办的2024世界计算大会在湖南长沙举办。云轴科技ZStack AIOS平台智塔凭借在智算领域的卓越表现,入选2024世界计算大会专题展优秀成果…...
总结 自行解决问题经验
一、总结在使用Linux时遇到的各种坑 yum 源要替换为国内源wget 需要用yum先行下载在make的时候需要预先安装各种库端口无法访问时要记得去防火墙开启端口访问权限安装完各种程序的时候记得创建环境变量或者软链接… 二、遇到故障如何正确高效的去解决 在使用yum下载wget的时…...
软件设计模式——工厂模式
软件设计模式——工厂模式 文章目录 软件设计模式——工厂模式一、设计模式的认知1.1 什么是软件设计模式:1.2 为什么要学习设计模式:1.3 设计模式的分类: 二、工厂模式2.1 工厂模式实例: 一、设计模式的认知 1.1 什么是软件设计…...
Apache Druid命令执行(CVE-2021-25646)
漏洞详情: Apache Druid 是用Java编写的面向列的开源分布式数据存储系统,旨在快速获取大量事件数据,并在数据之上提供低延迟查询。 Apache Druid含有能够执行嵌入在各种类型请求中由用户提供的JavaScript代码功能。此功能适用于高度信任环境…...
新的 MathWorks 硬件支持包支持从 MATLAB 和 Simulink 模型到高通 Hexagon 神经处理单元架构的自动化代码生成
MathWorks 今天宣布,推出针对 Qualcomm Hexagon™ 神经处理单元(NPU)的硬件支持包。该处理单元嵌入在 Snapdragon 系列处理器中。MathWorks 硬件支持包,则专门针对 Qualcomm Technologies 的 Hexagon NPU 架构进行优化,…...
gorm.io/sharding:改造,当查询条件中不包含分表键时,从自定义方法中获取对应的表进行查询
项目背景 这篇文章是一种特殊的情形——当查询条件中不包含分表键时,从自定义方法中获取对应的表进行查询。实际项目中并不建议这种用法。 当然,这里只是提供一种思路。这篇文章也是这个系列中的第三篇文章。前两篇文章《基于gorm.io/sharding分表中间…...
【CSS】变量的声明与使用
原生变量root 伪类 原生变量 CSS中我们可以统一设置变量方便页面维护。变量声明的时候,自定义样式变量名之前加上两根连词线 " – " 即可,使用 var() 来引用。声明的变量是有作用域的 ( 比如是在html中声明的变量,那么该变量在html…...
【数学分析笔记】第3章第4节闭区间上的连续函数(1)
3. 函数极限与连续函数 3.4 闭区间上的连续函数 3.4.1 有界性定理 【定理3.4.1】 f ( x ) f(x) f(x)在闭区间 [ a , b ] [a,b] [a,b]上连续,则 f ( x ) f(x) f(x)在闭区间 [ a , b ] [a,b] [a,b]上有界。 【证】用反证法,假设 f ( x ) f(x) f(x)在 [ …...
Mybatis中sql数组为空判断
一、Mybatis xml中的sql通过if语句判定是否为空 <if test"arrays ! null"> </if>上述示例只能判断arrays数组不为null,那如果是个空数组呢 二、Mybatis xml中的sql通过if语句判定数组非空数组 <if test"arrays ! null and arrays.l…...
12.第二阶段x86游戏实战2-CE找基地址
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要…...
笔记整理—内核!启动!—linux应用编程、网络编程部分(3)文件共享与标准IO
文件共享是指同一个文件被多个独立的读写进行操作。同一个文件为同一个inode,同一个pathname也就是同一个静态文件。同时进行操作,打开一个文件未关闭又被另一个操作打开。文件共享的方式可以实现高效的大文件读写。 文件共享的三种方式:①同…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
