(Arxiv-2023)LORA-FA:针对大型语言模型微调的内存高效低秩自适应
LORA-FA:针对大型语言模型微调的内存高效低秩自适应
paper是香港浸会大学发表在Arxiv 2023的工作
paper title:LORA-FA: MEMORY-EFFICIENT LOW-RANK ADAPTATION FOR LARGE LANGUAGE MODELS FINE-TUNING
ABSTRACT
低秩自适应 (LoRA) 方法可以大大减少微调大型语言模型 (LLM) 所需的可训练参数数量,但是,它仍然需要昂贵的激活内存来更新低秩权重。减少 LoRA 层数或使用激活重新计算可能会损害微调性能或增加计算开销。在这项工作中,我们提出了 LoRA-FA,这是一种内存高效的微调方法,它可以在不降低性能和进行昂贵的重新计算的情况下减少激活内存。 LoRA-FA 选择在每个 LoRA 层中冻结 A 的向下投影权重并更新 B 的向上投影权重。它确保在 LLM 微调期间模型权重的变化位于低秩空间中,同时无需存储全秩输入激活。我们在多种模型类型(RoBERTa、T5、LLaMA)和模型规模上进行了广泛的实验。我们的结果表明,与全参数微调和 LoRA 相比,LoRA-FA 在不同任务中始终能够实现接近的微调精度。此外,与 LoRA 相比,LoRA-FA 可将总内存成本降低高达 1.4 倍。
1 INTRODUCTION
大型语言模型 (LLM) 已成为自然语言处理的基石 (Brown 等人,2020 年;Touvron 等人,2023a;OpenAI,2023 年;Anil 等人,2023 年),并且对预训练的 LLM 进行微调已被证明非常有效,可以提高其在各种下游任务中的表现 (Liu 等人,2019 年;Wei 等人,2021 年) 并使它们与人类意图保持一致 (Ouyang 等人,2022 年;Bai 等人,2022 年)。然而,对具有完整参数的 LLM 进行微调的成本过高,例如,使用 AdamW(Loshchilov & Hutter,2017)对 LLaMA-65B(Touvron et al, 2023a)模型进行微调需要超过 1TB 的 GPU 内存来存储模型参数、梯度和优化器状态(Rajbhandari et al, 2020)。
为了减少全参数微调的内存,提出了参数高效微调 (PEFT) 方法,仅更新一小部分参数,例如适配器权重 (Houlsby et al, 2019; Hu et al, 2022) 和提示权重 (Li & Liang, 2021; Lester et al, 2021)。在这些方法中,LoRA (Hu et al, 2022) 已证明其性能与全参数微调相当,并且已广泛应用于许多应用 (Dettmers et al, 2023)。
具体而言,LoRA 在线性层的权重旁边添加了一个并行的低秩适配器,如图 1(b) 所示,其中 W W W 是预训练的权重, A A A 和 B B B 是低秩权重。由于 LoRA 冻结了 W W W 并仅更新较小的矩阵 A A A 和 B B B,因此与图 1(a) 所示的全参数微调相比,其可训练参数、梯度和优化器状态的内存开销大幅减少(全参数微调可以视为更新 W W W 并冻结 A A A 和 B B B)。此外,通过将 A B A B AB 的值合并到 W W W 中,LoRA 不会引入额外的推理延迟。
图 1:(a) 全参数微调 (FT)、(b) LoRA 和 © LoRA-FA 的图示。
然而,LoRA 仍然存在局限性,因为它需要在 LoRA 层中消耗昂贵的激活内存。这是因为在前馈传递过程中需要存储 X 的大型输入激活,并在反向传播传递过程中用于构建 A 的梯度。这意味着与全参数微调相比,LoRA 无法降低激活内存成本。例如,对输入序列长度为 2048 且批大小为 4 的 LLaMA-65B 进行微调需要在所有 LoRA 层中使用超过 50GB 的激活内存(16 位格式)。为了解决这个问题,现有方法选择一部分线性层进行 LoRA 微调(Hu et al, 2022)或使用激活重新计算(Chen et al, 2016),但这会影响微调性能或效率。
在本工作中,我们提出了 LoRA with Frozen-A(LoRA-FA),该方法可以在不增加计算开销的情况下大幅减少 LoRA 的激活内存占用。具体来说,LoRA-FA 选择同时冻结预训练权重 W W W 和降维权重 A A A,仅更新升维权重 B B B,如图 1© 所示。通过这种方式,我们仅需计算 B B B 的梯度,而在前向传播过程中只需存储较小的输入 A X A X AX。
假设 W ∈ R d × d , A ∈ R d × r W \in \mathbb{R}^{d \times d}, A \in \mathbb{R}^{d \times r} W∈Rd×d,A∈Rd×r,以及 B ∈ R r × d B \in \mathbb{R}^{r \times d} B∈Rr×d,降维权重 A A A 将 d d d 维输入 X X X 映射为 r r r 维输入 X A X A XA。由于 r ≪ d r \ll d r≪d,LoRA-FA 的激活内存需求可以显著降低。例如,LoRA-FA(秩大小 r = 4 r=4 r=4)可以将 LLaMA-65B(隐藏维度 d = 8192 d=8192 d=8192)线性层的激活内存需求相比全参数微调减少 2048 倍。同时,LoRA-FA 将可训练参数的数量从 d 2 d^2 d2 降至 d r d r dr,同样减少了 2048 倍。
我们将 A A A 随机初始化为服从正态分布的矩阵(通常为秩 r r r 的矩阵),并将 B B B 初始化为零。这确保了在微调开始前,预训练模型与包含 LoRA-FA 模块的模型预测保持一致。在模型适配过程中,LoRA-FA 固定 A A A 并更新 B B B 来提升模型性能,这意味着模型权重的变化 Δ W = A B \Delta W=A B ΔW=AB 局限于初始 A A A 的列空间定义的低秩空间。
实验结果表明,LoRA-FA 已足够用于微调大语言模型(LLMs)。此外,LoRA-FA 不改变 LoRA 的前向传播和反向传播计算(除了跳过 A A A 的梯度计算),因此在微调阶段不会增加计算开销。在推理阶段,与 LoRA 类似,LoRA-FA 可以通过将低秩权重 A B A B AB 合并到 W W W 中实现,与全参数微调模型相比,不会引入额外的推理延迟。
我们对多种模型类型和规模进行了广泛的实验。我们在自然语言理解任务上对 RoBERTa(Liu 等人,2019 年)、在机器翻译任务上对 T5(Raffel 等人,2020 年)以及在 MMLU(Hendrycks 等人,2021 年)基准上对 LLaMA(Touvron 等人,2023a)进行了微调。我们发现,与全参数微调 (FT) 和 LoRA 相比,我们的 LoRA-FA 可以在许多任务中实现非常接近的模型精度。在内存开销方面,与全参数微调和 LoRA 相比,我们的 LoRA-FA 可以将总内存成本分别降低高达 2 倍和 1.4 倍。例如,LoRA-FA 将微调 LLaMA-7B 模型的内存占用从 56GB 减少到 27.5GB。这意味着我们可以使用更低的资源预算(例如,更便宜的 GPU 服务,内存更小)来实现相同的微调性能。此外,我们研究了超参数的影响,结果表明 LoRA-FA 对超参数具有很强的鲁棒性。
总之,LoRA-FA 有几个关键优势:1)通过减少可训练参数和激活的数量来提高内存效率,2)它不会增加微调阶段的计算开销,也不会增加推理阶段的延迟开销,3)与全参数微调相比,它在许多模型和任务中实现了类似的模型性能。
2 BACKGROUND
2.1 LARGE LANGUAGE MODELS
我们专注于基于 Transformer 的大型语言模型 (LLM)。Transformer 模型最早在 (Vaswani et al, 2017) 中提出,用于机器翻译任务。后来,不同的 Transformer 模型被用于语言建模 (即预训练),预训练模型适用于许多下游任务 (Kenton & Toutanova, 2019; Raffel et al, 2020; Brown et al, 2020)。
以仅解码器的 GPT (Brown et al, 2020) 模型为例,它由 L 个堆叠的 Transformer 块组成,每个块有两个子模块:多头注意力 (MHA) 和前馈网络 (FFN)。在 MHA 中,三个线性层将输入转换为查询、键和值,它们被输入到自注意力中进行交互,注意力输出被发送到另一个线性层。 在 FFN 中,我们有两个线性层和它们之间的 GeLU 激活函数。对于 MHA 和 FFN,应用层规范和残差连接来提高模型性能。在 LLM 中,这些线性层中的权重通常占模型参数的大多数,并负责大部分计算浮点运算。
2.2 LOW-RANK ADAPTATION
随着微调大型语言模型(LLMs)的全参数方法成本的不断增加,参数高效微调(PEFT)方法(尤其是 LoRA,Hu et al., 2022)被提出,通过仅更新模型参数的一小部分来减轻内存开销,同时实现与全参数微调 LLMs 可比的性能。具体来说,LoRA 在线性层的权重旁添加了一个低秩适配器,其计算公式如下:
Y = X W + α X A B Y = X W + \alpha X A B Y=XW+αXAB
其中, W ∈ R d in × d out W \in \mathbb{R}^{d_{\text{in}} \times d_{\text{out}}} W∈Rdin×dout 是预训练权重, d in d_{\text{in}} din 是输入维度, d out d_{\text{out}} dout 是输出维度。我们忽略偏置项,因为它不会影响分析。 X ∈ R b × s × d in X \in \mathbb{R}^{b \times s \times d_{\text{in}}} X∈Rb×s×din 和 Y ∈ R b × s × d out Y \in \mathbb{R}^{b \times s \times d_{\text{out}}} Y∈Rb×s×dout 分别为输入和输出张量, b b b 是批大小, s s s 是序列长度。对于 LoRA 部分, A ∈ R d in × r A \in \mathbb{R}^{d_{\text{in}} \times r} A∈Rdin×r 是降维权重, B ∈ R r × d out B \in \mathbb{R}^{r \times d_{\text{out}}} B∈Rr×dout 是升维权重, r r r 是秩大小, α > 0 \alpha > 0 α>0 是超参数(通常设置为 1 / r 1 / r 1/r)。
对于如 GPT(Brown et al., 2020)这样的 Transformer 模型,我们通常有 d in = d out = d d_{\text{in}} = d_{\text{out}} = d din=dout=d,适用于多头注意力(MHA)的四个线性层;而对于前馈网络(FFN)的第一(或第二)线性层,有 d in = d , d out = 4 d d_{\text{in}} = d, d_{\text{out}} = 4d din=d,dout=4d(或 d in = 4 d , d out = d d_{\text{in}} = 4d, d_{\text{out}} = d din=4d,dout=d),其中 d d d 是隐藏维度。默认情况下,我们在 Transformer 块的所有线性层中添加 LoRA 模块以增强微调性能(Zhang et al., 2023b)。
内存复杂度
对于全参数微调,我们需要更新线性层的权重 W W W,其元素数量为 d in × d out d_{\text{in}} \times d_{\text{out}} din×dout,GPT 类型模型的权重总数为 n = 12 d 2 L n = 12d^2L n=12d2L。对于 LoRA,仅需更新两个低秩矩阵,其元素数量为 ( d in + d out ) r \left(d_{\text{in}} + d_{\text{out}}\right)r (din+dout)r,GPT 的 LoRA 参数总数为 n r = 18 d r L n_r = 18drL nr=18drL。因此,当秩大小 r ≪ d r \ll d r≪d 时,LoRA 可以显著减少可训练参数的数量。
在16位混合精度训练环境下,全参数微调需要 2 n 2n 2n 字节用于模型权重,以及 14 n 14n 14n 字节用于梯度和优化器状态(32位 AdamW 的状态和参数副本)(Rajbhandari et al., 2020)。相比之下,LoRA 需要 2 n 2n 2n 字节用于模型权重,以及 16 n r 16n_r 16nr 字节用于适配器相关的权重、梯度和优化器状态。这意味着当 n r ≪ n n_r \ll n nr≪n(或 r ≪ d r \ll d r≪d)时,LoRA 可以将这一部分的内存开销减少约 8 倍。
然而,在激活内存开销方面,情况有所不同。全参数微调需要存储输入 X X X 以计算 W W W 的梯度,而 LoRA 需要存储输入 X X X 以计算 A A A 的梯度,同时还需要存储低秩输入 X A XA XA 以计算 B B B 的梯度。具体而言,在 16 位精度下,LoRA 和全参数微调分别需要 14 b s d L + 8 b s r L 14 b s d L + 8 b s r L 14bsdL+8bsrL 字节和 14 b s d L 14 b s d L 14bsdL 字节的激活内存,其中 b b b 是批大小, s s s 是序列长度, d d d 是隐藏维度, L L L 是层数。此外,二者在其他组件(如注意力、GeLU 和层归一化)中也会消耗激活内存(Korthikanti et al., 2023)。
因此,与全参数微调相比,LoRA 无法减少(甚至可能增加)激活内存的开销,这不幸地成为了新的内存瓶颈。
减少激活内存的挑战。有两种方法可以降低 LoRA 的激活记忆成本。首先,我们可以将 LoRA 模块添加到少数线性层中,例如 Transformer 模型中的查询和值投影 (Hu et al, 2022),因此,没有 LoRA 的其他冻结线性层不需要存储其输入激活。然而,这种方法可能会影响微调任务的性能 (Dettmers et al, 2023),并且还带来了选择使用 LoRA 进行微调的层的难度 (Zhang et al, 2023b)。其次,已经提出了激活重新计算 (Chen et al, 2016; Korthikanti et al, 2023),以在前馈传递期间仅检查每个 Transformer 块的输入,并在反向传播传递期间从此检查点开始重新计算其他必要的激活。然而,激活重新计算具有非常昂贵的重新计算成本,这会引入大约 1/3 的总计算次数。
3 LORA-FA METHOD
首先,我们介绍了 LoRA-FA 方法的设计,从低秩模型自适应的角度对其进行了解释,并分析了其在减少内存开销方面的优势。其次,我们表明 LoRAFA 可以集成到其他内存优化技术中以提高其利用率。第三,我们讨论了 LoRA-FA 与梯度压缩之间的关系。
3.1 LORA WITH FROZEN-A
LoRA 方法更新了两个低秩矩阵 A A A 和 B B B,并将 A B A B AB 作为线性层预训练冻结权重 W W W 的变化,即 W + α Δ W = W + α A B W + \alpha \Delta W = W + \alpha A B W+αΔW=W+αAB。如前所述,LoRA 不直接更新 W W W,因此能够显著减少可训练参数的数量,但仍需消耗昂贵的激活内存。
为了应对这一问题,我们提出了 LoRA with Frozen-A(LoRA-FA),在微调过程中冻结 W W W 和 A A A,仅更新 B B B。具体来说,我们将 A A A 随机初始化为服从正态分布的矩阵,通常是秩为 r r r 的矩阵,并将 B B B 初始化为零,这样 Δ W = A B \Delta W = A B ΔW=AB 初始为零,因此在微调开始前,模型预测不会受到影响。
低秩模型适配
在微调过程中,如图 1© 所示,我们冻结初始化的 A A A 和预训练的 W W W,仅更新升维权重 B B B。因此,模型适配期间的权重变化限制在低秩空间内,表示为:
Δ W = A B = Q B ˉ = ∑ i = 1 r Q : , i B ˉ i , : \Delta W = A B = Q \bar{B} = \sum_{i=1}^r Q_{:, i} \bar{B}_{i,:} ΔW=AB=QBˉ=i=1∑rQ:,iBˉi,:
其中, A = Q R A = Q R A=QR 是 A A A 的 QR 分解, Q Q Q 的 r r r 列(即 Q : , i Q_{:, i} Q:,i, i = 1 , ⋯ , r i=1, \cdots, r i=1,⋯,r)是正交单位向量,当 A A A 是秩为 r r r 的矩阵时成立。我们记 B ˉ = R B \bar{B} = R B Bˉ=RB,推导得 Δ W : , j = ∑ i = 1 r B ˉ i j Q : , i \Delta W_{:, j} = \sum_{i=1}^r \bar{B}_{i j} Q_{:, i} ΔW:,j=∑i=1rBˉijQ:,i,因此 Δ W \Delta W ΔW 的任何一列都是 r r r 个正交向量的组合。换句话说,权重变化位于由 A A A 的列空间定义的低秩空间中。
内存复杂度
我们详细分析了 LoRA-FA 的内存复杂度。对于 LoRA-FA 模块,它仅计算 B B B 的梯度,包含 d out × r d_{\text{out}} \times r dout×r 个元素。在 GPT 类型模型中,总的可训练参数为 n r / 2 = 9 d r L n_r / 2 = 9 d r L nr/2=9drL,即 LoRA 可训练参数的一半。因此,在 16 位混合精度训练中,模型权重和适配器相关状态的内存开销为 2 n + 8 n r 2n + 8n_r 2n+8nr 字节。
更重要的是,就激活内存而言,LoRA-FA 仅需存储低秩输入 X A X A XA 以计算 B B B 的梯度,这对所有 LoRA-FA 模块来说需 8 b s r L 8 b s r L 8bsrL 字节(16 位)。与全参数微调相比,LoRA-FA 通过显著减少可训练参数和输入激活的数量,在内存效率上具有明显优势。
3.2 COMBINATION WITH MEMORY OPTIMIZATIONS
LoRA-FA 可以自然地与先进的内存优化方法相结合,例如权重量化(Dettmers 等人,2023 年)、权重分片(Rajbhandari 等人,2020 年)和选择性激活重新计算(Korthikanti 等人,2023 年)。
权重量化
如前所述,16 位格式下模型权重的内存开销为 2 n 2n 2n,其中 n n n 是模型参数的数量。例如,LLaMA-65B 模型的权重内存开销为 130GB,无法装载到一块 NVIDIA A100 (80GB) GPU 上。在 LoRA-FA 中,由于模型权重在微调过程中是冻结的,我们可以将其量化为更低的位宽,以减少模型权重的内存开销,同时不影响微调性能。例如,8 位(Dettmers et al., 2022a)和 4 位量化方法(Dettmers et al., 2023)可以与 LoRA-FA 结合,将模型权重内存减少至原来的 1/2 或 1/4。
权重切分
在使用数据并行技术在多块 GPU 上训练 LLM 时,可以结合权重切分或 ZeRO 第 3 阶段(Rajbhandari et al., 2020)技术,将模型权重切分到不同的 GPU 上,从而将每块 GPU 的内存开销减少为原来的 1 / g 1 / g 1/g,其中 g g g 是 GPU 的数量。与全参数微调中使用 ZeRO 第 3 阶段不同,我们仅对模型权重进行切分,并在前向和反向传播计算中进行权重收集,而不对适配器相关权重、其梯度和优化器状态进行切分。然而,在 LoRA-FA 中,权重切分引入了代价高昂的权重收集通信开销,而数据并行技术仅需通信少量可训练参数的梯度。
选择性激活重计算
Transformer 模型的其他组件(如注意力机制、层归一化、GeLU 和 dropout)也会导致激活内存开销(Korthikanti et al., 2023)。为了解决这个问题,可以使用完整激活重计算来存储每个 Transformer 块的输入。然而,这将使 LoRA-FA 相较于 LoRA 的内存优势丧失,因为在完整激活重计算下,无需为 LoRA 层存储输入。
为了平衡激活开销和重计算开销,我们采用选择性激活重计算,仅对部分模型组件进行重计算。例如,FlashAttention(Dao et al., 2022)可以消除注意力机制中 softmax 输出的内存开销,同时通过减少高带宽内存(HBM)访问加速注意力计算。此外,我们可以通过存储随机生成器状态来精确重现 dropout 掩码,从而实现 dropout 的重计算。
3.3 RELATION TO GRADIENT COMPRESSION
我们探讨 LoRA-FA 与低秩梯度压缩(Vogels et al., 2019;Zhang et al., 2023a)之间的关系。对于一个 LoRA-FA 层(为简化,省略 α \alpha α),即 Y = X W + X A B Y = X W + X A B Y=XW+XAB, B B B 的梯度计算为:
d B = A T X T d Y = A T d W d B = A^T X^T d Y = A^T d W dB=ATXTdY=ATdW
在标准 SGD 的单步更新中, B B B 的变化为 Δ B = − η d B \Delta B = -\eta d B ΔB=−ηdB,其中 η \eta η 是学习率。因此,冻结 A A A 时, W W W 的变化为:
Δ W = A Δ B = − η A A T d W \Delta W = A \Delta B = -\eta A A^T d W ΔW=AΔB=−ηAATdW
其中, d W d W dW 是 W W W 的梯度。这表明,LoRA-FA 等价于一种低秩梯度压缩方法,用于全参数微调。在这种方法中,计算得到的权重梯度通过 A T d W A^T d W ATdW 被压缩(以减少梯度通信开销),然后通过 A ( A T d W ) A\left(A^T d W\right) A(ATdW) 被解压缩。
由于 A A A 是从正态分布初始化的,我们有:
E [ A A T d W ] = E [ A A T ] d W = r d W \mathbb{E}\left[A A^T d W\right] = \mathbb{E}\left[A A^T\right] d W = r d W E[AATdW]=E[AAT]dW=rdW
这表明这种方法几乎是无偏的梯度压缩。
然而,梯度压缩在微调大型语言模型(LLMs)时,相较于 LoRA-FA 并无优势,因为梯度压缩仍然需要更新全部参数,带来较大的内存开销,而 LoRA-FA 仅需少量可训练权重,也能在数据并行设置下减少梯度通信。此外,当使用自适应优化方法(如 AdamW)时,这两种方法会表现出不同的行为。
相关文章:
(Arxiv-2023)LORA-FA:针对大型语言模型微调的内存高效低秩自适应
LORA-FA:针对大型语言模型微调的内存高效低秩自适应 paper是香港浸会大学发表在Arxiv 2023的工作 paper title:LORA-FA: MEMORY-EFFICIENT LOW-RANK ADAPTATION FOR LARGE LANGUAGE MODELS FINE-TUNING ABSTRACT 低秩自适应 (LoRA) 方法可以大大减少微调…...
Ubuntu | 系统软件安装系列指导说明
文章目录 Ubuntu 系统软件安装系列指导说明工具系列1. Docker 与 Docker-Compose部署与安装 环境系列1. Golang部署与安装 数据库系列1. PostgreSQL17.2源码部署与安装 Ubuntu 系统软件安装系列指导说明 工具系列 1. Docker 与 Docker-Compose部署与安装 链接 环境系列 1…...
攻防靶场(32):两个爆破技巧 Funbox 7 EasyEnum
目录 攻击路径一 1. 侦查 1.1 收集目标网络信息:IP地址 1.2 主动扫描:扫描IP地址段 1.3 主动扫描:字典扫描 2. 初始访问 2.1 有效帐号:本地账户 3. 权限提升 3.1 滥用特权控制机制:Sudo和Sudo缓存 4. 凭据访问 4.1 凭据…...
Vue3初学之插槽(slot)使用
在 Vue 3 中,插槽(Slots)是一种强大的内容分发机制,允许你在组件中定义可替换的内容区域,从而使组件更加通用和灵活。以下是 Vue 3 中插槽的几种常见用法: 默认插槽 默认插槽是最基本的插槽类型࿰…...
从 0 开始上手 Solana 智能合约
Solana CLI 基础知识 Solana CLI 是一个命令行界面工具,提供了一系列用于与 Solana Cluster 交互的命令。 我们将介绍一些最常见的命令,但你始终可以通过运行 solana --help 查看所有可能的 Solana CLI 命令列表。 Solana CLI 配置 Solana CLI 存储了…...
USB基础 -- USB 控制传输(Control Transfer)的重传机制
USB 控制传输(Control Transfer)的重传机制 1. 控制传输的事务结构 控制传输分为三个阶段,每个阶段都有自己的事务,并可能触发重传机制: 设置阶段(Setup Stage):主机发送 8 字节的…...
创建基本的 Electron 应用项目的详细步骤
创建一个基本的 Electron 应用项目的详细步骤。我们将从安装 Node.js 开始,然后创建项目文件夹并初始化 Electron 项目。 1. 安装 Node.js 首先,确保你已经安装了 Node.js 和 npm。你可以在终端中运行以下命令来检查是否已经安装: node -v…...
《异步编程之美》— 全栈修仙《Java 8 CompletableFuture 对比 ES6 Promise 以及Spring @Async》
哈喽,大家好!在平常开发过程中会遇到许多意想不到的坑,本篇文章就记录在开发过程中遇到一些常见的问题,看了许多博主的异步编程,我只能说一言难尽。本文详细的讲解了异步编程之美,是不可多得的好文…...
Android 修改SVG属性并显示图片(AndroidSvg)
引入依赖: dependencies {implementation com.caverock:androidsvg-aar:1.4 }核心代码: import com.caverock.androidsvg.SVG import org.w3c.dom.Document import java.io.StringWriter import javax.xml.transform.OutputKeys import javax.xml.tran…...
Ubuntu 磁盘修复
Ubuntu 磁盘修复 在 ubuntu 文件系统变成只读模式,该处理呢? 文件系统内部的错误,如索引错误、元数据损坏等,也可能导致系统进入只读状态。磁盘坏道或硬件故障也可能引发文件系统只读的问题。/etc/fstab配置错误,可能…...
移动云自研云原生数据库入围国采!
近日,中央国家机关2024年度事务型数据库软件框架协议联合征集采购项目产品名单正式公布,移动云自主研发的云原生数据库产品顺利入围。这一成就不仅彰显了移动云在数据库领域深耕多年造就的领先技术优势,更标志着国家权威评审机构对移动云在数…...
Java一个简单的反弹动画练习
文章目录 说明代码详解创建窗体代码创建绘图板创建线程 运行结果完整代码 说明 做了一个小球和星型做反弹动画的窗体作为练习,分享给大家,为了方便和我一样的小白可以看的比较明白,所以尽量详细的标注了注释,希望能帮到同样在学习…...
互联网架构变迁:从 TCP/IP “呼叫” 到 NDN “内容分发” 的逐浪之旅
本文将给出关于互联网架构演进的一个不同视角。回顾一下互联网的核心理论基础产生的背景: 左边是典型的集中控制通信网络,很容易被摧毁,而右边的网络则没有单点问题,换句话说它很难被全部摧毁,与此同时,分…...
git push命令
git push 常用命令 1. 拉取远程仓库最新数据 使用 git fetch git fetch作用: 获取远程仓库的最新数据(包括分支、标签等),但不会修改本地工作目录。 结果: 仅更新远程分支(如 origin/main)的…...
day01-HTML-CSS——基础标签样式表格标签表单标签
目录 此篇为简写笔记下端1-3为之前笔记(强迫症、保证文章连续性)完整版笔记代码模仿新浪新闻首页完成审核不通过发不出去HTMLCSS1 HTML1.1 介绍1.1.1 WebStrom中基本配置 1.2 快速入门1.3 基础标签1.3.1 标题标签1.3.2 hr标签1.3.3 字体标签1.3.4 换行标…...
软考信安16~网络安全风险评估技术原理与应用
1、网络安全风险评估概述 1.1、网络安全风险评估概念 网络安全风险评估(简称“网络风险评估")就是指依据有关信息安全技术和管理标准,对网络系统的保密性、完整性、可控性和可用性等安全属性进行科学评价的过程,评估内容涉及网络系统的脆弱性、网络安全威胁以及脆弱性被…...
嵌入式C语言:二维数组
目录 一、二维数组的定义 二、内存布局 2.1. 内存布局特点 2.2. 内存布局示例 2.2.1. 数组元素地址 2.2.2. 内存布局图(简化表示) 2.3. 初始化对内存布局的影响 三、访问二维数组元素 3.1. 常规下标访问方式 3.2. 通过指针访问 3.2.1. 指向数…...
计算机网络期末复习(知识点)
概念题 在实际复习之前,可以看一下这个视频将网络知识串一下,以便更好地复习:【你管这破玩意叫网络?】 网络规模的分类 PAN(个人区域网络):用于个人设备间的连接,如手机与蓝牙耳机…...
LeetCode:3298. 统计重新排列后包含另一个字符串的子字符串数目 II(滑动窗口 Java)
目录 3298. 统计重新排列后包含另一个字符串的子字符串数目 II 题目描述: 实现代码与解析: 滑动窗口 原理思路: 3298. 统计重新排列后包含另一个字符串的子字符串数目 II 题目描述: 给你两个字符串 word1 和 word2 。 如果…...
【SpringAOP】Spring AOP 底层逻辑:切点表达式与原理简明阐述
前言 🌟🌟本期讲解关于spring aop的切面表达式和自身实现原理介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 &am…...
es 3期 第23节-运用Pipeline实现二转聚合统计
#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性ÿ…...
T-SQL语言的编程范式
T-SQL编程范式探析 引言 随着信息技术的迅猛发展,数据库在各个行业的应用日益广泛。在众多数据库管理系统中,SQL Server以其高性能和易用性受到广泛欢迎。T-SQL(Transact-SQL)是SQL Server的扩展版本,是一种用于查询…...
【ArcGIS微课1000例】0137:色彩映射表转为RGB全彩模式
本文讲述ArcGIS中,将tif格式的影像数据从色彩映射表转为RGB全彩模式。 参考阅读:【GlobalMapper精品教程】093:将tif影像色彩映射表(调色板)转为RGB全彩模式 文章目录 一、色彩映射表预览二、色彩映射表转为RGB全彩模式一、色彩映射表预览 加载配套数据包中的0137.rar中的…...
论文笔记(六十一)Implicit Behavioral Cloning
Implicit Behavioral Cloning 文章概括摘要1 引言2 背景:隐式模型的训练与推理3 隐式模型与显式模型的有趣属性4 policy学习成果5 理论见解:隐式模型的通用逼近性6 相关工作7 结论 文章概括 引用: inproceedings{florence2022implicit,titl…...
网络安全核心目标CIA
网络安全的核心目标是为关键资产提供机密性(Confidentiality)、可用性(Availablity)、完整性(Integrity)。作为安全基础架构中的主要的安全目标和宗旨,机密性、可用性、完整性频频出现,被简称为CIA,也被成为你AIC,只是顺序不同而已…...
hive迁移后修复分区慢,怎么办?
我有1个30TB的分区表,客户给的带宽只有600MB,按照150%的耗时来算,大概要迁移17小时。 使用hive自带的修复分区命令(一般修复分区比迁移时间长一点),可能要花24小时。于是打算用前面黄大佬的牛B方案。 Hive增…...
一块钱的RISC-V 32位芯片
之前跟一个朋友聊天,说以后的芯片一定是越来越趋向于定制化,比如我们需要一个ADC芯片,这颗ADC芯片需要有串口功能,那就只开发一颗这样的芯片就好了,其他的功能都可以裁剪掉。 ➵➵➵➵➵➵➵➵➵➵➵➵➵➵➵…...
Linux常用指令
目录 1 概述2 指令2.1 简单指令2.2 解压缩2.2.1 tar.bz2和tar.gz2.2.2 单独bz22.2.3 zip2.2.4 7z 2.3 网卡操作 1 概述 本章主要是记录一些日常用到的Linux指令,方便自己忘记的时候查找,也为有需要的人提供参考。 2 指令 2.1 简单指令 指令解释cat /…...
车载音频开发(二):对音频数据作音量调节
通过前一个章节打下的基础车载音频开发(一):从看懂wav开始https://blog.csdn.net/Hellomino_/article/details/140873133?fromshareblogdetail&sharetypeblogdetail&sharerId140873133&sharereferPC&sharesourceHellomino_&…...
误差与误差限
目录 误差误差限小结 误差 设 x x x为准确值 , x ∗ ,x^* ,x∗为 x x x的一个近似值,称 e ∗ x ∗ − x e^*x^*-x e∗x∗−x为近似值的绝对误差,简称误差. 这样定义的误差 e ∗ e^{*} e∗可正可负,当绝对误差为正时近似值偏大,…...
halcon三维点云数据处理(七)find_shape_model_3d_recompute_score
目录 一、find_shape_model_3d_recompute_score例程代码二、set_object_model_3d_attrib_mod函数三、prepare_object_model_3d 函数四、create_cube_shape_model_3d函数五、获得CamPose六、project_cube_image函数七、find_shape_model_3d函数八、project_shape_model_3d函数 一…...
如何从串 ‘ 中国 +86‘ 中,获取到‘中国’:strip()、split()及正则表达式的使用
业务中有这样一个场景,国家列表中的数据格式是这样: 中国 86 ,其中的 "中国" 前面有3个空格,需要从中提取出 "中国",有哪些方法呢? 方法 1:使用 strip() 和 split() str…...
Java Web开发进阶——Spring Security基础与应用
Spring Security是Spring框架的核心模块之一,用于保护Web应用程序和微服务的安全。它提供强大的认证和授权功能,并与Spring生态系统无缝集成。本节将详细介绍Spring Security的基础知识及其在实际项目中的应用。 1. Spring Security概述与功能 1.1 什么…...
1. Doris分布式环境搭建
一. 环境准备 本次测试集群采用3台机器hadoop1、hadoop2、hadoop3, Frontend和Backend部署在同一台机器上,Frontend部署3台组成高可用,Backend部署3个节点,组成3副本存储。 主机IP操作系统FrontendBackendhadoop1192.168.47.128Centos7Foll…...
消息中间件类型介绍
消息中间件是一种在分布式系统中用于实现消息传递的软件架构模式。它能够在不同的系统或应用之间异步地传输数据,实现系统的解耦、提高系统的可扩展性和可靠性。以下是几种常见的消息中间件类型及其介绍: 1.RabbitMQ 特点: • 基于AMQP&#…...
Win10微调大语言模型ChatGLM2-6B
在《Win10本地部署大语言模型ChatGLM2-6B-CSDN博客》基础上进行,官方文档在这里,参考了这篇文章 首先确保ChatGLM2-6B下的有ptuning AdvertiseGen下载地址1,地址2,文件中数据留几行 模型文件下载地址 (注意࿱…...
C# GID+绘制不透明和半透明的线条
绘制线条时,必须将 Pen 对象传递给 DrawLine 类的 Graphics 方法。 Pen 构造函数的参数之一是 Color 对象。 若要绘制不透明的线条,请将颜色的 alpha 分量设置为 255。 若要绘制半透明的线条,请将 alpha 分量设置为从 1 到 254 的任何值。 在…...
解锁 C# 与 LiteDB 嵌入式 NoSQL 数据库
一、开篇:邂逅 C# 与 LiteDB 新世界 在当今的软件开发领域,数据管理如同建筑的基石,而选择一款合适的数据库则是项目成功与否的关键因素之一。对于 C# 开发者来说,面对琳琅满目的数据库选项,如何抉择常常令人头疼。今…...
iOS - 数组的真实类型
1. NSArray 类簇 // 1. __NSArray0 (空数组) NSArray *empty [];// 2. __NSArrayI (不可变数组) NSArray *immutable [1, 2, 3];// 3. __NSArrayM (可变数组) NSMutableArray *mutable [NSMutableArray array];// 4. __NSSingleObjectArrayI (单元素数组) NSArray *single …...
Unity热更新 之 Addressables(2) 本地/远端打包 流程测试
基础篇:Unity热更新 之 Addressables(1) 资源基础加载-CSDN博客 基础方法来源于唐老狮,我也是初学热更这一块,所有不保证步骤完全正确,如有不足还请斧正 目录 0.前提 1.本地打包 1.1.资源放入包 1.2.简化路径名称给出标签(如有需要的话) …...
Python标准库之SQLite3
包含了连接数据库、处理数据、控制数据、自定义输出格式及处理异常的各种方法。 官方文档:sqlite3 --- SQLite 数据库的 DB-API 2.0 接口 — Python 3.13.1 文档 官方文档SQLite对应版本:3.13.1 SQLite主页:SQLite Home Page SQL语法教程&a…...
php 使用simplexml_load_string转换xml数据格式失败
本文介绍如何使用php函数解析xml数据为数组。 <?php$a <xml><ToUserName><![CDATA[ww8b77afac71336111]]></ToUserName><FromUserName><![CDATA[sys]]></FromUserName><CreateTime>1736328669</CreateTime><Ms…...
Linux第二课:LinuxC高级 学习记录day01
0、大纲 0.1、Linux 软件安装,用户管理,进程管理,shell 命令,硬链接和软连接,解压和压缩,功能性语句,结构性语句,分文件,make工具,shell脚本 0.2、C高级 …...
Notepad++上NppFTP插件的安装和使用教程
一、NppFTP插件下载 图示是已经安装好了插件。 在搜索框里面搜NppFTP,一般情况下,自带的下载地址容易下载失败。这里准备了一个下载连接:Release v0.29.10 ashkulz/NppFTP GitHub 这里我下载的是x86版本 下载好后在nodepad的插件里面选择打…...
怎样提高服务器中的数据传输速度?
服务器中的数据传输速度会影响着用户的体验感,当企业中的数据传输速度出现卡顿或者是过慢时,用户不能及时浏览到所需的内容,给用户造成不好的体验感,那么企业该怎样才能提高服务器中的数据传输速度呢? 服务器之间如何传…...
Java聊天小程序
拟设计一个基于 Java 技术的局域网在线聊天系统,实现客户端与服务器之间的实时通信。系统分为客户端和服务器端两类,客户端用于发送和接收消息,服务器端负责接收客户端请求并处理消息。客户端通过图形界面提供用户友好的操作界面,服务器端监听多个客户端的连接并管理消息通…...
Spring事件发布与监听
Spring事件机制详解:事件发布与监听 在Spring框架中,事件机制基于发布-订阅模式,允许组件之间进行解耦。发布者发布事件,监听者订阅并响应这些事件。Spring事件机制的核心在于ApplicationEvent和ApplicationListener,…...
【PPTist】公式编辑、插入音视频、添加动画
一、插入公式 点击公式的时候 latexEditorVisible 会变成 true src/views/Editor/CanvasTool/index.vue <Modalv-model:visible"latexEditorVisible" :width"880" ><LaTeXEditor close"latexEditorVisible false"update"data &…...
Dart语言的面向对象编程
Dart语言的面向对象编程 Dart是一种由谷歌开发的编程语言,主要用于构建Web、移动应用及服务器端应用。作为一门现代编程语言,Dart自带丰富的特性,尤其是在面向对象编程(Object-Oriented Programming, OOP)方面&#x…...
selenium+pyqt5自动化工具总结
说明:本工具是,操作外部google浏览器、selenium是无法操作qt界面中嵌套的浏览器的, 工具在后面 1. 代码结构 pycharm打开的文件下,再写一个子文件,文件导入的时候把子文件名带上 这样就可以在 外层使用命令 pyinst…...