四两拨千斤,训练大模型的PEFT方法

news2025/3/12 20:34:06

自然语言处理进入大语言模型(Large Language Model, LLM)时代之后,模型的参数量级越来越庞大,以稍早之前的GPT-3为例,它有175B即1亿7千5百万参数,而ChatGPT及后续模型则更大。一方面大语言模型解决自然语言处理任务所需的涌现能力确实需要如此量级的参数,另一方面如此巨大的参数会引起训练成本的急剧增加,甚至从消费级硬件角度来讲,用户全量训练大语言模型的参数的成本令人生畏。大语言模型已经过pre-training阶段,于是就有学者提出是否能通过finetune一部分少量参数实现下游任务的精调,这催生了一系列PEFT(Parameter-Efficient Fine Tuning,PEFT,可译为参数高效精调)方法。

截止目前(2023年7月),PEFT一共有三类方法,不同的方法在以不同的形式在固定预训练模型参数的前提下添加少量的新参数来实现对下游任务的适配。三类方法列举如下:

  • Adapter-Tuning:在预训练模型的每一层新增浅层前馈网络或模块作为adapter以适配下游任务,训练时仅更新adapter的参数,存储时每个下游任务仅存储对应的adapter的参数。
  • Prefix/Prompt:在预训练模型的输入层或者一层增加一些可训练的虚拟tokens(也称作Prompt),只训练这些token的参数,存储时每个下游任务仅存储对应的token的参数。
  • LoRA:通过引入低秩矩阵参数参与模型前向传播(与原有部分参数产生的及或者相加)来适配下游任务,训练时仅更新低秩矩阵参数,存储时每个下游任务仅存储对应的低秩矩阵参数。

Adapter Tuning

原论文:Parameter-Efficient Transfer Learning for NL

Bert时代,自然语言处理范式为Pre-Training + Finetuning:即首先使用超大型语料库预训练一个通用语言模型,然后在各下游任务精调参数。我们可以将预训练模型(Pre-Training Model, PTM)到下游任务模型看作是一个迁移学习的过程。这种模式使得模型在不同的下游任务均能取得良好效果,但存在一个问题是训练每一个下游任务都相当于训练了一个新模型(预训练模型迁移学习时参数低效),这样比较繁琐且有训练有比较大的开销。那有没有可能存在更高效的迁移学习方式使得预训练模型能在不损失性能的前提下一次性高效迁移到所有下游任务呢,答案时有的。

Google研究人员在2019年的ICML上发表了一篇题为Parameter-Efficient Transfer Learning for NLP的论文,提出了Adapter tuning(可译为转换器微调)作为一种高效的迁移学习方法。该方法并不复杂,它在原始tranformer的基础上增加了一个新的模块Adapter module,Adapter module的架构可选,但论文提出一个非常简单的架构却可以实现非常好的效果。

原论文提出的架构如下图,作者在每一个transformer的2个前馈层之后加入一个新的组件Adapter module,每个adapter module包含三个部分:

  1. Feedforward down-project层将输入的维度放缩到非常小的级别,以减少训练参数量
  2. Nonlinearity引入非线性特征,矩阵运算 + 非线性等价于一层FFW
  3. Feedforward up-project层将输入还原到原始维度,以参与后续计算

在这里插入图片描述

记输入原始维度为 d d d,放缩后的维度为 m m m,则Feedforward down-project层参数量为 d ∗ m + m d*m+m dm+m, Feedforward up-project层的参数量为 m ∗ d + d m*d+d md+d, 总参数量为 2 m d + d + m 2md+d+m 2md+d+m,但是 m m m可以设置得非常小,即 m ≪ d m\ll d md,最终达到的效果是仅使用相当于原始模型参数总量的 % 0.5   − % 8 \%0.5\ - \%8 %0.5 %8的新参数,却可以实现在全部下游任务上流式训练后公用一套参数,取得和每个任务都finetune一遍全量参数差不多的效果:

在这里插入图片描述
更多详细比较和其他信息参见原论文,需要补充说明的是,用来执行分类任务的最后一层,也是可训练参数的一部分。

Prefix Tuning

原论文:Prefix-Tuning: Optimizing Continuous Prompts for Generation

Finetuning在下游任务精调阶段更新预训练模型的所有参数,并为每一个任务保存一份预训练模型参数副本(如下图上半部分)。

在这里插入图片描述

红色部分表示更新,灰色部分参数不更新

Prefix-Tuning在模型执行不同的任务时添加不同的前缀(prefix),训练时固定预训练模型的原始参数,仅更新前缀部分的参数(上图下半部分)。前缀其实是连续的向量序列形式的可训练参数,从逻辑上可以认为是人为在输入前加入了一些虚拟token,前缀表示这些虚拟token产生的激活值。这使得不同的任务仅需要存储一份预训练模型参数加上每个任务对应的前缀,节省了可观的存储空间。
在这里插入图片描述

如上图,以GPT2(自回归语言模型典型代表)为例:
将输入 x x x和输出 y y y拼接在一起记为 z = [ x : y ] z=[x:y] z=[x:y],经过预训练模型某一层参数计算之后得到激活值 h = [ h 1 , h 2 , . . . , h n ] ( h i = L M ϕ ( z i , h < i ) h=[h_1,h_2,...,h_n] (h_i=LM_{\phi}(z_i,h_{<i}) h=[h1,h2,...,hn](hi=LMϕ(zi,h<i),使用 X i d x X_idx Xidx Y i d x Y_idx Yidx表示输入序列和输出序列的索引。那么Prefix-Tuning在 x x x之前插入prefix部分,得到 z = [ p r e f i x , x , y ] z=[prefix,x,y] z=[prefix,x,y],使用 P i d x P_{idx} Pidx表示前缀的索引, ∣ P i d x ∣ |P_{idx}| Pidx表示前缀的长度,整个前缀部分对应向量矩阵形式的参数 P θ P_{\theta} Pθ,参数的维度为 ∣ P i d x ∣ ∗ d i m ( h i ) |P_{idx}|*dim(h_i) Pidxdim(hi),模型隐层的激活值可以按照如下公式给定:
h i = { P θ [ i , : ] ,  if  i ∈ P i d x h i = L M ϕ ( z i , h < i ) ,   o t h e r w i s e h_i = \begin{cases} P_{\theta}[i,:], \ \text{if } i\in P_{idx} \\ h_i=LM_{\phi}(z_i,h_{<i}), \ otherwise \end{cases} hi={Pθ[i,:], if iPidxhi=LMϕ(zi,h<i), otherwise
即索引 i i i在前缀部分时,激活值由前缀参数给定,否则由预训练模型计算。

方法提出者实际检验发现直接优化参数 P θ P_{\theta} Pθ结果并不稳定且导致模型效果变差一点,于是又提出了通过更小的矩阵 P θ ′ [ i , : ] P'_{\theta}[i,:] Pθ[i,:](维度为 ∣ P i d x ∣ ∗ k |P_{idx}|*k Pidxk,原论文文本分类任务时 k = 512 k=512 k=512,表格转文字任务是 k = 800 k=800 k=800)并经过一个稍大的前馈网络 M L P θ MLP_{\theta} MLPθ处理(将 k k k还原到 d i m ( h i ) dim(h_i) dim(hi))来作为替代优化目标,即 P θ = M L P θ ( P θ ′ [ i , : ] ) P_{\theta}=MLP_{\theta}(P'_{\theta}[i,:]) Pθ=MLPθ(Pθ[i,:]),此时可训练参数包括 P θ ′ [ i , : ] P'_{\theta}[i,:] Pθ[i,:]和MLP的参数 θ \theta θ

有读者可能这里会想到,能否把额外的参数部分添加在输入 x x x和输出 y y y之间呢,原作者这种方式称为 I n f i x − T u n i n g Infix-Tuning InfixTuning,也进行了尝试,但实际效果不如 P r e f i x − T u n i n g Prefix-Tuning PrefixTuning

除此之外还有一个细节,原作者实际检验发现仅在embedding层加prefix表示能力不足,模型的所有隐层都加上prefix才能效果最好。

Prompt Tuning

原论文:The Power of Scale for Parameter-Efficient Prompt Tuning

在这里插入图片描述

Prompt Tuning可以看作是Prefix Tuning的简化版本,仅在输入层加入了可训练的prompt token,无需引入MLP(如上图)。作者主要的目的是想说明只要模型的参数规模持续增大到一定量级( 1 0 1 0 , 100 亿 10^10,100亿 1010100亿)时,那么固定预训练模型的参数,仅需在输入文本前加入少量的可更新的token(称为prompt)就能够达到Finetuning的效果:

作者在论文中列出了一系列消融实验,比较了prompt长度、prompt初始化方法,预训练任务目标调整、LM adaptation(即下游任务finetuning)步数对模型最终效果的影响,感兴趣的读者可以打开论文一窥究竟,这里不再赘述。

在这里插入图片描述

P-Tuning

原论文:GPT Understands, Too

P-Tuning方法的提出是为了让GPT类模型可以更好的应用于自然语言理解(Natural Language Understanding,NLU)任务,它引入了可训练的的连续的embedding层参数作为prompt代替人工设计的prompt,prompt参见GPT-3原论文: Language Models are Few-Shot Learners。

在这里插入图片描述
如上图,以图中的The capital of Britain is [MASK]为例,这是一个由prompt(黄色部分),context(蓝色部分),target(红色部分)组成的template。采用P-Tuning的情况下(上图右半部分),template则可以表示为 T = [ P 0 : i , x , [ P i + 1 : m , y ] ] T={[P_{0:i},x,[P_{i+1:m},y]]} T=[P0:i,x,[Pi+1:m,y]],其中 P i P_i Pi表示模板 T T T中第 i i i个prompt token,模板token分布在输入 x x x左右,同样可以认为是插入的虚拟token,经过Prompt Encoder之后变为 h 0 , . . . , h i , h i + 1 , . . . , h m {h_0,...,h_i,h_{i+1},...,h_m} h0,...,hi,hi+1,...,hm,作者认为相对于离散的词向量这部分是prompt token序列产生的连续参数值,,整个template则可以表示为 T = { h 0 , . . . , h i , e ( x ) , h i + 1 , . . . , h m , e ( y ) } T=\{h_0,...,h_i,e(x),h_{i+1},...,h_m,e(y)\} T={h0,...,hi,e(x),hi+1,...,hm,e(y)},其中 e e e表示embedding,未经prompt encoder处理也不参与训练, h i h_i hi则是可训练的参数,除此之外预训练模型本身的参数是固定的。

作者针对实验中发现的2个问题进行了优化,这2个问题是:

  1. 离散性)由于词向量已经高度离散化,直接初始化 h 0 , . . . , h i , h i + 1 , . . . , h m {h_0,...,h_i,h_{i+1},...,h_m} h0,...,hi,hi+1,...,hm使用SGD进行训练,则非常容易陷入局部最优值(笔者注:可以加一两层网络来处理,增加一定程度的灵活性)。
  2. 关联性)作者认为prompt embedding部分即 h 0 , . . . , h i , h i + 1 , . . . , h m {h_0,...,h_i,h_{i+1},...,h_m} h0,...,hi,hi+1,...,hm彼此之间是相互依赖而不是相互独立的,因而需要有一种机制能将它们关联起来(笔者注:很容易联想到序列模型,常用的即为LSTM)。

综上,作者提出了Prompt Encoder的架构,由Bi-LSTM(solve for 关联性,为了加强效果采用了双向模型)处理之后再接上一个两层前馈网络(solve for 离散性)来对prompt虚拟token进行编码得到prompt embedding在喂给预训练模型,即:

h i = M L P ( h → i : h ← i ) = M L P ( [ L S T M ( h 0 : i : L S T M ( h i : m ) ) ] ) \begin{equation} \begin{split} h_i&=MLP(\overrightarrow h_i: \overleftarrow h_i)\\ &=MLP([LSTM({h_{0:i}}:LSTM(h_{_{i:m}}))]) \end{split} \end{equation} hi=MLP(h i:h i)=MLP([LSTM(h0:i:LSTM(hi:m))])

作者通过实验证明了通过P-Tuning的方法可以是的GPT类模型在NLU方面达到BERT同样水平的效果,偶尔甚至能有更好的表现。

从方法上来讲,P-Tuning也是固定了预训练模型的参数,通过引入一部分额外参数加一个Bi-LSTM加DNN的简单Encoder(Encoder本身的参数也属于额外增加的部分)来实现NLU任务的训练,它跟Prefix有一下不同点:

  1. Prefix-Tuning将额外的参数加在输入embedding开头,更像是一种Instruction;而P-Tuning则加在输入的一部分构成的prompt token embedding的左右两边。
  2. Prefix Tuning在每个transformer前馈层都加入了Prefix Embedding,通过MLP来encoding;而P-Tuning则仅在输入层加入额外的embedding,并通过Bi-LSTM和MLP来进行初始化。

P-Tuning V2

原论文:P-Tuning v2: Prompt Tuning Can Be
Comparable to Fine-tuning Universally Across Scales and Tasks

在这里插入图片描述
P-Tuning V2版本则跟Prefix-Tuning一样将额外添加的token加入到了网络的每一层,训练时更新每一层的prompt token embedding,它同样也是仅适配NLU任务。这样的改动也使得相较于初版,P-Tuning V2具备以下2点优势:
(1) 拥有更多的可训练参数,表征能力更强,但总体仍维持少量 (初版0.1%,0.1%~3%)。
(2) 加入到更深层的网络结构中,对模型最终预测带来更直接的影响,能取得更好的效果。

从论文标题就能够看出,作者的目的是希望在不同参数规模的预训练模型、针对不同的下游任务都可以使用P-Tuning V2达到Fine-Tuning同等水平的效果。

LoRA

LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
核心思路是对模型参数做低秩分解,仅训练分解后的参数,模型部署也需额外保存低秩参数,计算时加上低秩参数部分。

LoRA的提出在上述PEFT方法之后,来自微软的研究者认为,现有的Adapter Tuning和Prefix Tuning这两种方法均有缺点:

  • Adapter Layers Introduce Inference Latency:
    虽然Adapter后续又有很多变种,但无论如何额外添加的Adapter层都会拖慢推理速度
  • Directly Optimizing the Prompt is Hard:
    应用Prefix-Finetuning时,直接优化prompt非常困难,而且其效果也不是随着训练参数的增加而单调递增

Aghajanyan等研究者在论文Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning提出了关于大模型的一个核心观察点:预训练模型存在一个低秩的“内在维度”(intrinsic dimension)使得其在被随机映射到一个更小的子空间时仍然可以高效学习。基于这种想法,作者假设预训练模型在转换到下游模型过程中也有一个内在维度,提出了下面的方法。

对于预训练模型权重 W 0 ∈ R d × k W_0 \in \R^{d \times k} W0Rd×k,引入一个低秩部分 Δ W \Delta W ΔW来限制其更新,即: W 0 + Δ W = W 0 + B A W_0 + \Delta W = W_0 + BA W0+ΔW=W0+BA,其中 B ∈ R d × r B\in \R^{d \times r} BRd×r A ∈ R r × k A \in \R^{r \times k} 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为可训练参数,修改后的前向传播可表示为:
h = W 0 x + Δ W x = W 0 x + B A x h=W_0x+\Delta Wx=W_0x + BAx h=W0x+ΔWx=W0x+BAx
这意味着增加的部分 Δ W x \Delta Wx ΔWx和原始部分可以并行计算,没有引入任何推理时延。

总结下来,LoRA拥有以下优点:

  1. A Generalization of Full Fine-tuning
    LoRA是一个更通用的finetuning方法,可以仅训练预训练模型参数的一小部分,它不需要在模型适配过程中累积梯度来更新全秩参数。这意味着当应用在全部权重矩阵和偏差项上应用LoRA更新时,通过设置LoRA的秩 r r r为预训练权重的秩,基本能够还原全量finetuning同等水平的表征能力。换句话讲,随着我们增大 r r r增加可训练参数的数量,使用LoRA方式训练基本可以收敛到训练原始模型。与之形成对比的是,采用adapter的一系列方法仅能收敛到MLP,而基于prefix的方法不能不处理长输入序列。

  2. No Additional Inference Latency
    可以按照 W = W 0 + B A W=W_0 + BA W=W0+BA来存储和执行推理,迁移到其他任务时,可以减去 B A BA BA,再加上新任务的 B ′ A ′ B'A' BA,仅需一个占用少量存储的快捷操作即可迁移到新任务。这保证了和采用构建的finetuning方法相比,单任务及多任务都没有引入额外的推理时延。

作者通过实践发现,LoRA实际产生的最大的益处是节省内存和存储消耗,通过设置 r ≪ d m o d e l r \ll d_{model} rdmodel能够将一个使用Adam训练的大型transformer的VRAM(即显存)占用最大减少 2 / 3 2/3 2/3。具体而言,在GPT-3 175B上,VRAM消耗从1.2TB降低到350GB,在仅采用query和value矩阵映射矩阵的条件下,检查点的大小被降低了10000倍(从350GB到35MB)。假设我们需要100个转化模型,使用LoRA仅需保存 350 G B + 35 M B × 100 ≈ 354 G B 350GB+35MB\times 100 \approx 354GB 350GB+35MB×100354GB大小的空间,而全量Finetuning则需要 100 × 350 G B = 350 T B 100 \times 350GB=350TB 100×350GB=350TB的存储空间。这使得训练需要的GPU数量变少且减少了I/O瓶颈的次数,并且在任务间切换时,仅需在VRAM实时切换LoRA权重而不需要花费大量时间切换全量参数。除此之外,由于不需要计算大多数参数的梯度,训练速度也提升了25%。

AdaLoRA

Adaptive Budget Allocation for Parameter-Efficient Fine-Tuning
待更新

开源第三方库

  1. huggingface开源了peft库,支持LoRA、Prefix Tuning、P-Tuning、Prompt Tuning、AdaLoRA等方法,并可以结合 Accelerate的DeepSpeed一起使用,实现高效训练。
    git地址:https://github.com/huggingface/peft
pip install peft
  1. LLM-Adapters在peft库基础上增加了adapter变种AdapterP、Parallel的支持。
    git地址:https://github.com/AGI-Edgerunners/LLM-Adapters

参考文献

  1. 大模型参数高效微调(PEFT)
  2. 让天下没有难Tuning的大模型-PEFT技术简介
  3. Parameter-Efficient Transfer Learning for NL
  4. Prefix-Tuning: Optimizing Continuous Prompts for Generation
  5. The Power of Scale for Parameter-Efficient Prompt Tuning
  6. GPT Understands, Too
  7. P-Tuning v2: Prompt Tuning Can Be
    Comparable to Fine-tuning Universally Across Scales and Tasks
  8. LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
  9. Intrinsic Dimensionality Explains the
    Effectiveness of Language Model Fine-Tuning

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

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

相关文章

用html+javascript打造公文一键排版系统4:一级标题排版

完成公文标题的排版后&#xff0c;我们要进行对正文中的标题进行处理。 一般正文中的标题分为四级&#xff0c;文中结构层次序数依次可以用“一、”“&#xff08;一&#xff09;”“1.”“&#xff08;1&#xff09;”标注&#xff1b;一般第一层用黑体字、第二层用楷体字加粗…

10.25UEC++/小试牛刀(笨鸟先飞案例)

1.思路整理&#xff1a; 如何入手&#xff1f; 角色可能是每个游戏的最重要的部分&#xff0c;所以一般可以先从角色入手&#xff0c;如果游戏很复杂&#xff0c;可以进行拆分设计。 蓝图创建地图&#xff1a; 创建默认Pawn&#xff1a; 编写GameMode默认构造函数&#xff1a;…

第二十二章:逻辑架构

第二十二章&#xff1a;逻辑架构 22.1&#xff1a;逻辑架构剖析 服务器处理客户端请求 ​ MySQL是典型的C/S架构&#xff0c;即Client/Server架构&#xff0c;服务端程序使用的mysqld。不论客户端进程和服务器进程是采用哪种方式进行通信&#xff0c;最后实现的效果都是&#…

VoLTE信令流程

文章目录 VoLTE概述VoLTE 协议栈IMS(IP Multimedia Subsystem)&#xff0c;IP多媒体子系统会谈边界控制器&#xff08;Session Border Controller, SBC&#xff09;QCI (QoS Class Identifier)&#xff0c;QoS类标识符 SIP&#xff08;Session initialization Protocol&#xf…

Android mac 交叉编译与ffmpeg编译踩坑记 (v7a 与 v8a and 动态库与静态库)

Android mac 交叉编译与ffmpeg编译踩坑记 环境: system: mac NDK: android-ndk-r17c Fffmpeg: ffmpeg-4.0.2 Cmake: 3.10.2 Gradle: 4.1.3 tips: 本文记录踩坑过程,具体细节如果感兴趣可以在评论区留言交流讨论! mac 编译 (动态库(so)) 首先来回顾一下,mac原始库是如何…

Redis常见命令和使用示例

目录 1.使用官方文档学习redis 2.核心命令 SET GET 3.全局/通用命令 KEYS EXISTS DEL EXPIRE TTL TYPE 1.使用官方文档学习redis redis官网 点击搜索&#xff0c;输入&#xff0c;比如输入ping&#xff0c;会显示Commands,是一个命令&#xff0c;点击ping&#xff…

新版2021等启动unity包管理器本地服务器进程失败解决

1、问题 2、解决办法 最后我发现每个unity版本都有一个包管理器&#xff0c;也就是图中的路径&#xff0c;而且都是相同的路径&#xff0c;只是因为版本不同或多或少存在一些小差异&#xff0c;其他版本可以正常启动&#xff0c;就2021不行会不会是2021的包管理器这个文件夹出…

YOLOv5 实现 10 种热力图可视化方式教程

效果展示 GradCAMEigenCAMEigenGradCAMGradCAMElementWiseGradCAMPlusPlusHiResCAMLayerCAM

前端下载PDF内容空白且大小偏大问题解决

前端使用React框架axios请求后端接口下载文件&#xff0c;请求返回正常但文件大小和内容异常。经排查&#xff0c;其原因是使用了mockjs用作数据模拟&#xff0c;导致了请求异常&#xff0c;将其注释掉后&#xff0c;文件大小与内容恢复正常。 目录 1.文件异常 2.定位问题 3…

【C语言进阶技巧】指针解密:炼金术士的秘密面试题揭秘

【C语言进阶技巧】指针解密&#xff1a;炼金术士的秘密面试题揭秘 1. 主要涉及sizeof与strlen函数的使用的笔试题1.1 笔试题一&#xff08;一维整形数组&#xff09;1.2 笔试题二&#xff08;不带\0的字符数组&#xff09;1.3 笔试题三(带\0的字符数组)1.4 笔试题四 &#xff0…

【C#】默认打开图片、文件下载

系列文章 【C#】编号生成器&#xff08;定义单号规则、固定字符、流水号、业务单号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器&#xff08;开始日期、结束日期&#xff09; 本文链接&#xff1a;h…

Linux(centos7)系统关闭 virbr0

背景&#xff1a; 在使用 VMware 虚拟机安装 centos7 操作系统中&#xff0c;经常出现将 IP 地址分配到虚拟网桥接口virbr0 上&#xff0c;引起虚拟机不能正常访问网络的问题。 我是在学习 docker 网络分析这块遇到的问题&#xff0c;教程上在虚拟机上输入 ip addr 并没有出现 …

linux开发工具:repo

1&#xff1a;repo简单介绍 repo是Google开发的用于管理Android版本库的一个工具&#xff0c;它是由一系列的Python脚本组成&#xff0c;封装了一系列的Git命令&#xff0c;用来统一管理多个Git仓库。repo不是用于取代git&#xff0c;而是简化了对多个Git版本库的管理。 repo…

6 种方式读取 Springboot 的配置(原理+实战)

从配置文件中获取属性应该是SpringBoot开发中最为常用的功能之一&#xff0c;但就是这么常用的功能&#xff0c;仍然有很多开发者在这个方面踩坑。 我整理了几种获取配置属性的方式&#xff0c;目的不仅是要让大家学会如何使用&#xff0c;更重要的是弄清配置加载、读取的底层…

搭建Promethues + grafana +alertManager+blakbox 监控springboot 健康和接口情况

一。概述 架构图&#xff1a; 拓扑图&#xff1a; prometheus 是一个开源系统&#xff0c;用于构建监控和报警的工具包。 Prometheus 收集其指标并将其存储为时间序列数据&#xff0c;即指标信息与记录它的时间戳一起存储&#xff0c;以及称为标签的可选键值对。 特点&#…

003.PADS VX2.4选项设置及显示颜色设置

文章目录 一、PADS颜色设置及选项设置二、选项设置1.全局2.设计3.栅格和捕获4.显示5.布线选项页6.覆铜平面选项页7.文本和线选项页8.文本和线选项页9.过孔样式选项页 一、PADS颜色设置及选项设置 一、颜色设置 1&#xff0e;点击设置—显示颜色&#xff09;&#xff08;快捷键…

Kkfileview | Docker | 文件预览kkfile配置

文章目录 简介DockerRedis部署 简介 kkFileView为文件文档在线预览解决方案&#xff0c;该项目使用流行的spring boot搭建&#xff0c;易上手和部署&#xff0c;基本支持主流办公文档的在线预览&#xff0c;如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等 …

SQLSERVER 临时表 和 表变量 有区别吗

一&#xff1a;背景 1. 讲故事 今天和大家聊一套面试中经常被问到的高频题&#xff0c;对&#xff0c;就是 临时表 和 表变量 这俩玩意&#xff0c;如果有朋友在面试中回答的不好&#xff0c;可以尝试看下这篇能不能帮你成功迈过。 二&#xff1a;到底有什么区别 1. 前置思…

十五、flex弹性元素的样式

目录&#xff1a; 1. 基本布局 2. 弹性元素的属性&#xff1a;flex-grow 3. 弹性元素的属性&#xff1a;flex-shrink 4. 弹性元素的属性&#xff1a;flex-basis 5. flex 统一设置这3个属性&#xff08;常用&#xff09; 6. order 一、基本布局 <style>*{margin: 0;paddin…

【Maven】类或者包提示找不到,报红

背景 使用IDEA&#xff0c;类或者包提示找不到&#xff0c;报红 解决方法 1. maven reload 2. 检查profiles是否对 3. 不要选中offline模式 4. 检查本地仓库位置 5. 清掉idea缓存 6. 到本地maven仓库删掉出错的包然后重新maven reload 7. update本地仓库 8. 排查是不是别人没…