【论文笔记】QLoRA: Efficient Finetuning of Quantized LLMs
🍎个人主页:小嗷犬的个人主页
🍊个人网站:小嗷犬的技术小站
🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。
基本信息
标题: QLoRA: Efficient Finetuning of Quantized LLMs
作者: Tim Dettmers, Artidoro Pagnoni, Ari Holtzman, Luke Zettlemoyer
发表: NeurIPS 2023
arXiv: https://arxiv.org/abs/2305.14314

摘要
我们提出了QLoRA,一种高效的微调方法,能够将内存使用量降低到足以在单个48GB GPU上微调一个65B参数模型,同时保持完整的16位微调任务性能。
QLoRA通过冻结的、4位量化预训练语言模型将梯度反向传播到低秩适配器(LoRA)。
我们最好的模型系列,命名为Guanaco,在Vicuna基准测试中优于所有之前公开发布的模型,达到ChatGPT性能的99.3%,而只需在单个GPU上微调24小时。
QLoRA引入了多项创新以节省内存而不牺牲性能:
- 4-bit NormalFloat,一种信息论上对正态分布权重最优的新数据类型;
- Double Quantization,通过量化量化常数来减少平均内存占用;
- Paged Optimizers来管理内存峰值。
我们使用QLoRA微调了超过1000个模型,对8个指令数据集、多种模型类型(LLaMA、T5)和模型规模(例如33B和65B参数模型)的指令遵循和聊天机器人性能进行了详细分析,这些规模使用常规微调是不可行的。
我们的结果表明,在小型高质量数据集上进行的QLoRA微调可以达到最先进的结果,即使使用比之前SoTA更小的模型。
我们根据人类和GPT-4评估对聊天机器人性能进行了详细分析,表明GPT-4评估是廉价且合理的替代品。此外,我们发现当前的聊天机器人基准测试无法准确评估聊天机器人的性能水平。
柠檬采摘分析展示了Guanaco与ChatGPT相比失败的地方。
我们发布了所有模型和代码,包括4位训练的CUDA内核。
简介

不同的微调方法和它们的内存需求。QLoRA通过将Transformer模型量化到4位精度并使用分页优化器来处理内存峰值,在LoRA的基础上进行了改进。
背景
Block-wise k-bit Quantization
量化是将输入从一个包含更多信息的表示转换为包含较少信息的表示的过程。它通常意味着将具有更多位的数据类型转换为更少位,例如从32位浮点数转换为8位整数。为了确保低比特数据类型的整个范围被使用,输入数据类型通常通过归一化到输入元素绝对最大值来重新缩放到目标数据类型范围,这些输入元素通常以张量的形式结构化。例如,将32位浮点(FP32)张量量化为范围 [ − 127 , 127 ] [-127, 127] [−127,127] 的Int8张量:
X Int8 = round ( 127 absmax ( X FP32 ) X FP32 ) = round ( c FP32 ⋅ X FP32 ) \mathbf{X}^{\text{Int8}} = \text{round}\left(\frac{127}{\text{absmax}(\mathbf{X}^{\text{FP32}})} \mathbf{X}^{\text{FP32}}\right) = \text{round}(c^{\text{FP32}} \cdot \mathbf{X}^{\text{FP32}}) XInt8=round(absmax(XFP32)127XFP32)=round(cFP32⋅XFP32)
其中 c c c 是量化常数或量化尺度。反量化是其逆过程:
dequant ( c FP32 , X Int8 ) = X Int8 c FP32 = X FP32 \text{dequant}(c^{\text{FP32}}, \mathbf{X}^{\text{Int8}}) = \frac{\mathbf{X}^{\text{Int8}}}{c^{\text{FP32}}} = \mathbf{X}^{\text{FP32}} dequant(cFP32,XInt8)=cFP32XInt8=XFP32
这种方法的问题是,如果在输入张量中出现大数值(即异常值),则量化箱——某些位组合——没有得到充分利用,有些箱几乎没有或没有数字被量化。
为防止异常值问题,一种常见的方法是将输入张量分割成独立量化的块,每个块都有自己的量化常数 c c c。这可以形式化如下:我们将输入张量 X ∈ R b × h \mathbf{X} \in \mathbb{R}^{b \times h} X∈Rb×h 分割成 n n n 个连续的块,每个块大小为 B B B,通过展平输入张量并将线性段切分为 n = ( b × h ) / B n = (b \times h)/B n=(b×h)/B 块。我们独立地量化这些块,使用方程1创建量化张量和 n n n 个量化常数 c i c_i ci。
Low-rank Adapters
低秩适配器(LoRA)微调是一种通过使用一组可训练参数(通常称为适配器)减少内存需求的方法,同时不更新保持固定的完整模型参数。在随机梯度下降期间,梯度通过固定预训练模型权重传递给适配器,该适配器被更新以优化损失函数。LoRA 通过额外的因子投影增强线性投影。给定一个投影 X W = Y \mathbf{XW} = \mathbf{Y} XW=Y 其中 X ∈ R b × h \mathbf{X} \in \mathbb{R}^{b \times h} X∈Rb×h, W ∈ R h × o \mathbf{W} \in \mathbb{R}^{h \times o} W∈Rh×o,LoRA 计算:
Y = X W + s X L 1 L 2 \mathbf{Y} = \mathbf{XW} + s \mathbf{XL}_1 \mathbf{L}_2 Y=XW+sXL1L2
其中 L 1 ∈ R h × r \mathbf{L}_1 \in \mathbb{R}^{h \times r} L1∈Rh×r 和 L 2 ∈ R r × o \mathbf{L}_2 \in \mathbb{R}^{r \times o} L2∈Rr×o,且 s s s 是标量。
QLoRA Finetuning
QLoRA通过我们提出的两种技术实现了高保真4位微调——4位NormalFloat(NF4)量化和双重量化。此外,我们引入了分页优化器,以防止梯度检查点期间的内存峰值导致传统上使大型模型在单机上微调困难的内存不足错误。
QLoRA有一个低精度存储数据类型,在我们的案例中通常是4位,还有一个通常是BFloat16的计算数据类型。在实践中,这意味着每当使用QLoRA权重张量时,我们将张量反量化为BFloat16,然后进行16位矩阵乘法。
现在我们讨论QLORA的组件,然后给出QLoRA的正式定义。
4-bit NormalFloat Quantization
NormalFloat(NF)数据类型建立在分位数量化之上,这是一种信息论上最优的数据类型,确保每个量化区间从输入张量中分配相同数量的值。分位数量化通过经验累积分布函数估计输入张量的分位数。
分位数量化的主要局限性在于分位数估计过程成本高昂。因此,使用快速分位数近似算法,如SRAM分位数,来估计它们。由于这些分位数估计算法的近似性质,该数据类型对于异常值具有较大的量化误差,而异常值通常是最重要的值。
当输入张量来自一个固定到量化常数的分布时,可以避免昂贵的分位数估计和近似误差。在这种情况下,输入张量具有相同的分位数,使得精确的分位数估计在计算上是可行的。
由于预训练神经网络权重通常具有均值为零、标准差为 σ \sigma σ 的正态分布,我们可以通过缩放 σ \sigma σ 将所有权重转换为单一固定分布,使得该分布正好适合我们的数据类型范围。对于我们的数据类型,我们设定了任意范围 [ − 1 , 1 ] [-1, 1] [−1,1]。因此,数据类型和神经网络权重的分位数都需要归一化到这个范围内。
理论上最优的数据类型适用于均值为零、标准差为 σ \sigma σ 的正态分布,且 σ \sigma σ 在 [ − 1 , 1 ] [-1, 1] [−1,1] 范围内,计算方法如下:
- 估计理论 N ( 0 , 1 ) N(0, 1) N(0,1) 分布的 2 k + 1 2^k + 1 2k+1 个分位数,以获得 k k k 位量化数据类型用于正态分布;
- 取此数据类型并将其值归一化到 [ − 1 , 1 ] [-1, 1] [−1,1] 范围内;
- 通过绝对最大值重新缩放,将输入权重张量量化到 [ − 1 , 1 ] [-1, 1] [−1,1] 范围内。
一旦权重范围和数据类型范围匹配,我们可以像往常一样进行量化。步骤3等价于重新缩放权重张量的标准差,使其与 k k k 位数据类型的标准差相匹配。更正式地,我们估计数据类型的 2 k 2^k 2k 个值 q i q_i qi 如下:
q i = 1 2 ( Q X ( i 2 k + 1 ) + Q X ( i + 1 2 k + 1 ) ) q_i = \frac{1}{2} \left( Q_X \left( \frac{i}{2^k + 1} \right) + Q_X \left( \frac{i + 1}{2^k + 1} \right) \right) qi=21(QX(2k+1i)+QX(2k+1i+1))
其中 Q X ( ⋅ ) Q_X(\cdot) QX(⋅) 是标准正态分布 N ( 0 , 1 ) N(0, 1) N(0,1) 的分位数函数。对称 k k k 位量化的一个问题是,这种方法没有精确表示零,这对于量化填充和其他零值元素时无误差是一个重要属性。为了确保离散零点为 0 0 0,并使用所有 2 k 2^k 2k 位作为 k k k 位数据类型,我们创建了一个不对称的数据类型,通过估计两个范围 q i q_i qi 的分位数: 2 k − 1 2^{k-1} 2k−1 用于负部分, 2 k − 1 + 1 2^{k-1} + 1 2k−1+1 用于正部分,然后统一这两组 q i q_i qi 并去除两组中出现的其中一个零。我们将每个量化箱具有相同期望值数量的数据类型称为 k k k 位 NormalFloat (NFk),因为该数据类型信息理论上最适合均值为中心的正态分布数据。
Double Quantization
我们引入了Double Quantization(DQ),即对量化常数进行量化以节省额外的内存。虽然 4 4 4 位量化需要较小的块大小以实现精确量化,但它也具有相当大的内存开销。例如,使用 32 32 32 位常数和 64 64 64 的块大小 W \mathbf{W} W,量化常数平均为每个参数增加 32 / 64 = 0.5 32/64 = 0.5 32/64=0.5 位。双重量化有助于减少量化常数的内存占用。
更具体地说,双重量化将第一次量化的量化常数 c 2 FP32 c_2^{\text{FP32}} c2FP32 作为输入进行第二次量化。这第二步产生了量化后的量化常数 c 2 FP8 c_2^{\text{FP8}} c2FP8 和第二级量化常数 c 1 FP32 c_1^{\text{FP32}} c1FP32。我们使用 8 8 8 位浮点数和 256 256 256 的块大小进行第二次量化,因为对于 8 8 8 位量化没有观察到性能下降。由于 c 2 FP32 c_2^{\text{FP32}} c2FP32 是正数,我们在量化之前从 c 2 c_2 c2 中减去均值,使值集中在零附近,并利用对称量化。
平均而言,对于 64 64 64 的块大小,这种量化将每个参数的内存占用从 32 / 64 = 0.5 32/64 = 0.5 32/64=0.5 位减少到 8 / 64 + 32 / ( 64 ∗ 256 ) = 0.127 8/64 + 32/(64 * 256) = 0.127 8/64+32/(64∗256)=0.127 位,每个参数减少了 0.373 0.373 0.373 位。
Paged Optimizers
使用 NVIDIA 统一内存特性,该特性在 CPU 和 GPU 之间自动进行页面到页面的传输,以确保在 GPU 偶尔出现内存不足的情况下进行无错误的 GPU 处理。该功能类似于 CPU RAM 和磁盘之间的常规内存分页。我们使用此功能为优化器状态分配分页内存,当 GPU 内存不足时,这些内存自动被移至 CPU RAM,在优化器更新步骤需要内存时,这些内存又会自动回传到 GPU 内存中。
QLoRA
使用上述组件,我们为单线性层中的量化基础模型与单个 LoRA 适配器定义了 QLoRA,如下所示:
Y BF16 = X BF16 ⋅ doubleDequant ( c 1 FP32 , c 2 k -bit , W NF4 ) + X BF16 L 1 BF16 L 2 BF16 Y^{\text{BF16}} = X^{\text{BF16}} \cdot \text{doubleDequant}(c_1^{\text{FP32}}, c_2^{k\text{-bit}}, W^{\text{NF4}}) + X^{\text{BF16}} L_1^{\text{BF16}} L_2^{\text{BF16}} YBF16=XBF16⋅doubleDequant(c1FP32,c2k-bit,WNF4)+XBF16L1BF16L2BF16
doubleDequant ( c 1 FP32 , c 2 k -bit , W k -bit ) = dequant ( dequant ( c 1 FP32 , c 2 k -bit ) , W 4 bit ) = W BF16 \text{doubleDequant}(c_1^{\text{FP32}}, c_2^{k\text{-bit}}, W^{k\text{-bit}}) = \text{dequant}(\text{dequant}(c_1^{\text{FP32}}, c_2^{k\text{-bit}}), W^{4\text{bit}}) = W^{\text{BF16}} doubleDequant(c1FP32,c2k-bit,Wk-bit)=dequant(dequant(c1FP32,c2k-bit),W4bit)=WBF16
我们对 W W W 使用 NF4,对 c 2 c_2 c2 使用 FP8。为了提高量化精度,我们对 W W W 使用 64 的块大小,对 c 2 c_2 c2 使用 256 的块大小以节省内存。
在参数更新时,仅需要计算适配器权重 ∂ E ∂ L i \frac{\partial E}{\partial L_i} ∂Li∂E 相对于误差的梯度,而不需要计算 4-bit 权重 ∂ E ∂ W \frac{\partial E}{\partial W} ∂W∂E。然而, ∂ E ∂ L i \frac{\partial E}{\partial L_i} ∂Li∂E 的计算涉及到通过 Y BF16 Y^{\text{BF16}} YBF16 从存储形式 W NF4 W^{\text{NF4}} WNF4 解量化到计算数据类型 W BF16 W^{\text{BF16}} WBF16,以计算梯度 ∂ X ∂ W \frac{\partial X}{\partial W} ∂W∂X,并在 BFloat16 精度下完成。
总结来说,QLoRA 使用一种存储数据类型(通常为 4-bit NormalFloat)和一种计算数据类型(16-bit BrainFloat)。我们将存储数据类型解量化为计算数据类型以执行前向和后向传递,但仅为使用 16-bit BrainFloat 的 LoRA 参数计算权重梯度。
实验
QLoRA vs. Standard Finetuning



Pushing the Chatbot State-of-the-art with QLoRA



Limitations and Discussion
我们已经证明了我们的方法QLoRA,使用4位基模型和低秩适配器,可以复制16位全微调的性能。然而,由于资源成本巨大,我们没有在33B和65B规模上证明QLoRA可以匹配16位微调性能。
另一个限制是对指令微调模型的评估。虽然我们在MMLU、Vicuna/OA基准上提供了评估,但我们没有在BigBench、RAFT和HELM上评估,也不能保证我们的评估可以推广到这些基准。另一方面,我们在MMLU上进行了非常广泛的研究,并开发了评估聊天机器人新方法。
从所提供证据来看,这些基准的性能可能取决于微调数据与基准数据集的相似程度。例如,FLAN v2与MMLU相似,但与Vicuna基准不相似,反之亦然对于Chip2数据集。这表明,不仅需要更好的基准和评估,而且需要谨慎考虑最初要评估的内容。我们是要创建在教室高中和同事知识上表现良好的模型,还是要创建在聊天机器人对话能力上表现良好的模型?也许还有其他?因为与创建新的基准相比,评估现有的基准总是更容易,某些基准可能会引导社区走向某个方向。作为社区,我们应该确保基准衡量的是我们所关心的。
另一个限制是我们没有评估不同的位精度或不同的适配器方法。除了LoRA之外,还有许多参数高效微调(PEFT)方法已被证明效果良好。然而,不清楚这些方法是否可以扩展到大型模型。我们使用LoRA,因为许多结果已经证明了其鲁棒性,但其他适配器可能产生更好的性能。由于量化后的微调似乎可以恢复量化过程中丢失的大部分信息,这可能使得量化更加激进。例如,3位GPTQ量化在微调后也可能产生16位全微调的性能。
Broader Impacts
我们的QLoRA微调方法首次实现了在单个消费级GPU上对33B参数模型进行微调,以及在单个专业GPU上对65B参数模型进行微调,同时不会降低与完整微调基线相比的性能。我们已经证明,我们在Open Assistant数据集上训练的最佳33B模型在Vicuna基准测试中可以与ChatGPT相媲美。由于指令微调是将原始预训练LLM转换为类似ChatGPT的聊天机器人的重要工具,我们相信我们的方法将使微调变得普遍且常见,特别是对于资源最少的科研人员来说——这是对最先进NLP技术可及性的重大胜利。QLoRA可以被视为一种平衡因素,有助于缩小大型企业和拥有消费级GPU的小团队之间的资源差距。
另一个潜在的影响来源是将QLoRA部署到手机和其他低资源设备上。虽然之前已经证明7B模型可以在手机上运行,但QLoRA是第一个能够对这类模型进行微调的方法。我们估计,使用iPhone 12 Plus,QLoRA可以在手机充电时每晚微调300万个标记。QLoRA可以帮助实现LLM的隐私保护使用,用户可以拥有和管理自己的数据和模型,同时使LLM更容易部署。
此外,由于4位模型推理效率的提高,如果部署QLoRA模型,它们可以减少LLM在个人使用时产生的环境影响。我们估计,如果50%的部署是个人使用,50%是公司部署,QLoRA部署可以将总体碳足迹减少72%。
然而,微调是一种双刃剑技术,可能会被滥用造成伤害。LLM的广泛使用存在已知的危险,但我们相信,平等获取一种迅速普及的技术将允许进行更好的独立分析,而不是将LLM的权力掌握在那些不发布模型或源代码以供审计的大型企业手中。
总的来说,我们相信QLoRA将产生广泛积极的影响,使高质量LLM的微调变得更加广泛和容易获取。
相关文章:
【论文笔记】QLoRA: Efficient Finetuning of Quantized LLMs
🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: QLoRA: Efficient Finetun…...
计算机网络之---物理层的基本概念
物理层简介 物理层(Physical Layer) 是 OSI(开放系统互联)模型 中的第 1 层,它主要负责数据在物理媒介上的传输,确保原始比特(0 和 1)的传输不受干扰地从一个设备传送到另一个设备。…...
Burpsuite20241102macM1版安装
1、安装jdk11 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew update brew install openjdk11 echo export PATH"/opt/homebrew/opt/openjdk11/bin:$PATH" >> ~/.zshrc source ~/.zshrc j…...
缓存常见问题
缓存问题: 1. 缓存穿透:访问一个不存在的缓存 2. 缓存击穿:大批用户访问热点数据的时候,热点数据缓存失效,大量访问数据库 3. 缓存雪崩:大批量缓存全部失效 Redis和Memcached区别: 1. Redi…...
C++ 入门第25天:线程池(Thread Pool)基础
往期回顾: C 学习第22天:智能指针与异常处理-CSDN博客 C 入门第23天:Lambda 表达式与标准库算法入门-CSDN博客 C 入门第24天:C11 多线程基础-CSDN博客 C 入门第25天:线程池(Thread Pool)基础 前…...
微信小程序中的 storage(本地存储)和内存是两个完全不同的存储区域
这是一个非常关键且容易混淆的概念 既然 this.globalData.appId appId 是将 appId 存储在内存中,为什么微信小程序中的 wx.getStorage 和 wx.setStorage(本地存储)中没有 appId,并且您提出了一个非常重要的疑问:stor…...
WLAN基本原理与配置
一、WLAN概述 二、WLAN的基本概念 AC与Fit AP的组网架构: 1.二层组网 AC和Fit AP在一个广播域中 2.三层组网 AC和Fit AP需要跨三层通信 CAPWAP(无线接入点控制和配置协议): 该协议定义了如何对AP进行管理、业务配置&#…...
KaliLinux 2022.1安装和相关配置
一、安装系统和设置中文 (一)下载安装KaliLInux2022.1 以直接下载虚拟机映像文件为例,下载地址:https://www.kali.org/get-kali/#kali-virtual-machines,下载完成后直接解压,再用VMware打开后开机&#x…...
HarmonyOS开发:ArkTS初识
ArkTS基本语法 ArkTS语言简介 ArkTS是鸿蒙生态的应用开发语言。基本语法风格与TypeScript(简称TS)相似,在TS的生态基础上进一步扩展,继承了TS的所有特性,是TS的超集。 基本语法概述 扩展能力 基础语法:…...
Unity的四种数据持久化方式
目录 什么是数据持久化 数据持久化之PlayerPrefs 概述 API及用法 电脑中存放的位置 优缺点 主要用处 封装PlayerPrefs 数据持久化之XML XML是什么 读取XML信息 C#读取XML的方法有几种 读取xml文件信息 读取元素和属性信息 总结 写入XML信息 选择存储目录 存储…...
机器学习笔记 - 单幅图像深度估计的最新技术
1、深度估计简述 单眼深度估计是一项计算机视觉任务,AI 模型从单个图像中预测场景的深度信息。模型估计场景中对象从一个照相机视点的距离。单目深度估计已广泛用于自动驾驶、机器人等领域。深度估计被认为是最困难的计算机视觉任务之一,因为它要求模型理解对象及其深度信息之…...
Postman接口测试02|接口用例设计
目录 六、接口用例设计 1、接口测试的测试点(测试维度) 1️⃣功能测试 2️⃣性能测试 3️⃣安全测试 2、设计方法与思路 3、单接口测试用例 4、业务场景测试用例 1️⃣分析测试点 2️⃣添加员工 3️⃣查询员工、修改员工 4️⃣删除员工、查询…...
C#语言的学习路线
C#语言的学习路线 C#(读作“C Sharp”)是一种由微软开发的现代编程语言,具有强大的功能和灵活性,广泛应用于桌面应用程序、Web开发、游戏开发以及企业级应用等多个领域。无论你是编程新手还是有一定基础的开发者,掌握…...
双目的一些文章学习
文章1 PSMNet https://arxiv.org/pdf/1803.08669PSMNet文章博客PSMNet文章中牵涉到的一些知识,空洞卷积,SPPNet网络,计算视差时用soft argmin代替argmin文章中引入了空洞卷积和SPPNet网络来融合多尺度的信息,又引入3D卷积来增加模…...
开源模型应用落地-qwen2-7b-instruct-LoRA微调合并-ms-swift-单机单卡-V100(十三)
一、前言 本篇文章将使用ms-swift去合并微调后的模型权重,通过阅读本文,您将能够更好地掌握这些关键技术,理解其中的关键技术要点,并应用于自己的项目中。 二、术语介绍 2.1. LoRA微调 LoRA (Low-Rank Adaptation) 用于微调大型语言模型 (LLM)。 是一种有效的自适应策略,…...
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 一、类的声明和使用 1. 类的声明基础 2. 类的访问控制 3. 类的使用 二、类的声明和对象的声明 1. 类声明中的函数定义 2. 对象声明的多种方式 三、构造函数和析构函数的执行过程 1. 构造函数 2. 析构函数 实验步骤 测试说明…...
性能测试05|JMeter:分布式、报告、并发数计算、性能监控
目录 一、JMeter分布式 1、应用场景 2、原理 3、分布式相关注意事项 4、分布式配置与运行 二、JMeter报告 1、聚合报告 2、HTML报告 三、并发用户数(线程数)计算 四、JMeter下载第三方插件 五、性能监控 1、Concurrency Thread Group 线程组…...
关于Java面试题大全网站无法访问的解决方案
如果Java面试题大全网站无法访问,你仍然可以通过以下渠道获取高质量的Java面试题资源: 1. 国内网站 牛客网: 网址:https://www.nowcoder.com/特点:提供大量Java面试题和在线编程练习,适合刷题和模拟面试。推…...
CSS进阶和SASS
目录 一、CSS进阶 1.1、CSS变量 1.2、CSS属性值的计算过程 1.3、做杯咖啡 1.4、下划线动画 1.5、CSS中的混合模式(Blending) 二、SASS 2.1、Sass的颜色函数 2.2、Sass的扩展(extend)和占位符(%)、混合(Mixin) 2.3、Sass的数学函数 2.4、Sass的模块化开发 2.5、Sass…...
SwiftUI 撸码常见错误 2 例漫谈
概述 在 SwiftUI 日常撸码过程中,头发尚且还算茂盛的小码农们经常会犯这样那样的错误。虽然犯这些错的原因都很简单,但有时想要快速准确的定位它们却并不容易。 况且这些错误还可能在模拟器和 Xcode 预览(Preview)表现的行为不甚…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
