transformers QLoRA 基础知识

基础知识

QLoRA,这是一种高效的微调方法,可减少内存使用量,使得在单个 48GB GPU 上就可以微调 65B 的模型,而且所得模型的性能与全 16 比特微调相当。QLoRA 通过冻结 4 比特量化的预训练语言模型将梯度反向传播到低秩适配器 (LoRA) 中。我们最好的模型 (我们将其命名为 Guanaco) 仅需在单个 GPU 上进行 24 小时微调,就能在 Vicuna 基准测试中优于所有之前公开发布的模型,且达到了 ChatGPT 性能水平的 99.3%。

是什么能让QLoRA如此厉害了?

  • 1, 4 位 NormalFloat (NF4),一种新的数据类型,在信息论意义上是正态分布权重的最佳表示
  • 2, 双层量化,通过对量化系数进行二次量化来减少平均内存占用
  • 3, 用于降低峰值内存占用的分页优化器。
    就是上面三块新技术,保证我们使用QLoRA用较低成本训练我们特定的任务。

量化
量化是把一个输入从拥有更多信息的表示离散化为拥有更少信息表示的过程。这意味着常常把一个数据类型从更多位转换为更少位,例如:从32位浮点数转换为8位整数。
有一种不太准确的说法,量化后的整数都有一个对应浮点数,比如:
在这里插入图片描述
这也叫线性量化

正态分布
正态分布描述了一类数据的分布规律,在均值附近的数据集中度最高,随着数据远离均值,出现的概率逐渐减小,并且这种分布在统计图上呈现对称的钟形曲线。
如图:
在这里插入图片描述
在均值0处数据集中,随着数据远离均值,出现的概率逐渐减小,如同山峰一样。

什么是NF4
NF4(NormalFloat4)是一种专门用于量化符合正态分布数据的4比特量化数据类型。NF4的设计目的是对神经网络中参数值进行更高效的量化,同时减少量化误差,特别适用于参数值符合正态分布的情况。

在神经网络中,参数(如权重)通常呈现均值为0的正态分布,即:

  • 数据的分布在零值附近非常密集。
  • 数据的极大和极小值出现的概率较低。
    传统的线性量化方法会将数据范围均匀地划分为多个区间,但这样会导致稀疏区间(极大和极小值处)浪费量化空间,而在密集区间(零值附近)引入较大误差。因此,NF4量化方法根据数据的正态分布特性,重新设计量化区间,使量化后的整数值分布更加符合实际数据分布(数据密集分布也就越系)。
    如图:
    在这里插入图片描述
    图中换分的区域为什么16个区域了,这是因为4bit量化后的整数有16个。
    这里的反量化会存在两个问题。
    正态分布的范围是从负无穷到正无穷,反量化时,我们没有办法求最后一个区间的均值。
    这里QLoRA采用了舍弃两端的极值,确保累计概率密度合理分配。
    在这里插入图片描述
    第二个问题
    对于0值,不论它归属于左边的7,还是右边的8,它反量化后都不再是零了。
    0在深度学习里是有特殊意义的。我们这里将0作为一个区间。

NF4预定义的16个值表格
在这里插入图片描述
将上图山峰数据做归一化后获得-1到1区间表格。这可以用于NF4 的量化参考。

双层量化
QLoRA中采用了分块量化,每64个值作为一个块进行NF4 4-bit量化。
那么64个值的一个块就是64*4=256bit,但每块中还需一个FP32的32位scale,那么32/256=12.5%。
那么就要对FP32的32位scale还需做一个8bit量化。这就是双层量化。
在这里插入图片描述

<think>好的,我现在需要回答用户关于PEFT和QLoRA的实现方法或比较的问题。首先,我需要回忆一下PEFT和QLoRA的基本概念以及它们在机器学习中的应用。PEFT代表参数高效微调,是一种在微调预训练模型时只调整少量参数的技术,从而节省计算资源和内存。常见的PEFT方法包括LoRA(低秩适应)、Adapter Tuning和Prefix Tuning。 接下来是QLoRA,这是LoRA的量化版本,结合了量化技术和LoRA,进一步减少显存占用,使得在资源有限的设备上训练大型模型成为可能。用户提到实现方法,我需要详细说明如何使用这些技术,比如使用Hugging Face的Transformers库和PEFT库来实现QLoRA。 然后需要考虑用户提供的引用内容。引用[1]提到使用LoRA高效精调和3M指令数据,这可能涉及到如何配置LoRA的参数,比如秩的大小和alpha值。引用[2]指出在训练时使用QLoRA时需要添加--device cpu避免OOM,这说明在实现时需要注意显存管理,可能需要使用CPU卸载技术。引用[3]和[4]涉及模型评估,但可能和当前问题关联不大,但可以提及QLoRA在微调后的模型效果依然优秀,比如在LLaMA2上的表现。 在比较部分,需要对比PEFT的不同方法,比如LoRA、QLoRA、Adapter Tuning等在参数效率、显存占用、训练速度等方面的差异。例如,QLoRA由于量化,显存占用更小,但可能会增加一些计算开销。 最后,生成相关问题时要围绕PEFT和QLoRA的应用场景、优化方法、与其他技术的对比等方面展开,确保问题具有针对性和延伸性。 现在需要确保回答结构清晰,分点说明实现步骤和比较,并正确引用用户提供的资料。同时,所有数学公式要按照要求使用$...$或$$...$$格式,例如LoRA中的低秩分解可以表示为矩阵乘积$W + \Delta W = W + BA$,其中B和A是低秩矩阵。</think>### PEFT与QLoRA的实现方法及比较 #### 1. **PEFT(参数高效微调)的核心思想** PEFT通过仅微调预训练模型中的少量参数(通常小于1%),在保留原模型知识的同时适应下游任务。例如,LoRA(Low-Rank Adaptation)将参数更新量分解为低秩矩阵乘积: $$W_{\text{new}} = W + \Delta W = W + B \cdot A$$ 其中,$B \in \mathbb{R}^{d \times r}$和$A \in \mathbb{R}^{r \times k}$为低秩矩阵($r \ll d,k$),显著减少训练参数量[^1]。 #### 2. **QLoRA的实现步骤** QLoRA在LoRA基础上引入**4-bit量化**和**分页优化器**,具体实现流程如下: 1. **量化权重**:将预训练模型权重量化为4-bit精度,减少显存占用。 2. **插入LoRA适配器**:在Transformer层的注意力模块中注入可训练的LoRA低秩矩阵。 3. **分页训练**:使用`bitsandbytes`库的分页优化器,防止显存溢出(需添加`--device cpu`参数辅助卸载[^2])。 4. **反向传播与解量化**:训练时动态解量化权重计算梯度,更新低秩矩阵参数。 示例代码框架(基于Hugging Face库): ```python from transformers import AutoModelForCausalLM from peft import LoraConfig, get_peft_model import bitsandbytes as bnb model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b", quantization_config=bnb.nn.BitsAndBytesConfig(load_in_4bit=True)) lora_config = LoraConfig(r=8, lora_alpha=16, target_modules=["q_proj", "v_proj"]) model = get_peft_model(model, lora_config) # 仅0.1%参数可训练 ``` #### 3. **关键对比:PEFT方法差异** | 方法 | 参数量占比 | 显存占用 | 训练速度 | 适用场景 | |-------------|------------|----------|----------|------------------------| | Full Fine-tuning | 100% | 极高 | 慢 | 数据充足,硬件强 | | LoRA | 0.1%~1% | 中等 | 快 | 通用任务高效微调[^1] | | QLoRA | 0.1%~1% | **低** | 较快 | 显存受限(如单卡训练)[^2] | | Adapter | 3%~5% | 中等 | 中等 | 多任务连续学习 | #### 4. **效果评估与优化建议** - **性能表现**:QLoRA微调的LLaMA2模型在长文本任务中仍优于GPT-3.5和GPT-4[^3]。 - **优化方向**: - 调整LoRA的秩(`r`)和缩放因子(`alpha`)平衡效果与效率。 - 使用更大的指令数据集(如3M样本[^1])提升泛化性。 - 通过多裁判评估减少模型偏好偏差(如GPT-4作为裁判时的偏心问题[^4])。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值