11、QLora

摘要

QLora是一种非常有效的微调办法,可以对具有大规模模型参数的模型进行微调。例如它可以用来微调一个具有 650 亿个参数的大型模型,更重要的是,QLORA 能让这个巨大的模型在单个 48GB 的 GPU 上完成微调,还能保持与 16 位全精度微调相同的性能。
最好的模型被命名为Guanaco,可以在单个GPU上用很短的时间完成训练,同时表现非常好。

QLora的创新之处

4比特量化 【4-bit NormalFloat (NF4)】

是一个新的数据类型,它针对通常分布的权重进行了优化。NF4 可以更有效地表示那些遵循正态分布的权重参数,从而在保持精度的情况下,用更少的比特位数来存储这些参数

双重量化

双重量化技术旨在通过进一步量化量化常数来减少内存占用。在常规的量化过程中,量化常数(如量化因子、偏移量等)通常保持较高的精度(如32位浮点数),这也会占用一定的内存空间。双重量化将第一次量化的量化常数作为第二次量化的输入,使用较低精度的数据类型(如8位浮点数)进行第二次量化。这种方法能够显著减少量化常数所占用的内存空间,从而进一步降低整体内存占用。

分页优化器

分页优化器是一种利用NVIDIA统一内存管理技术的优化器,旨在解决在训练大型模型时可能出现的内存峰值问题。当GPU内存不足时,分页优化器能够自动将部分数据(如梯度检查点等)从GPU内存转移到CPU内存中,以释放GPU内存空间。当需要这些数据时,分页优化器会再次将它们从CPU内存移回GPU内存。通过这种方式,分页优化器能够在不牺牲性能的前提下有效管理内存使用,避免内存溢出错误的发生。

泛化能力

QLora有很强的泛化能力,实验结果表明,不管是大模型还是小模型,经过QLora微调后,模型的表现能力都很好。

介绍

QLORA(Quantization with Low-rank ORthogonal Adapters)是一种创新的量化方法,它首先使用高精度的技术将一个预训练模型量化到4位,然后添加一组可学习的低秩正交适配器(Low-rank Orthogonal Adapters)权重。这些适配器权重通过量化权重的反向传播梯度进行调整,以在保持模型性能的同时进一步减少量化带来的精度损失。

训练模型的趋势

(1)数据质量远比数据集大小重要
(2)对于给定任务,数据集的适用性比大小更重要

创新之处

(1)4-bit NormalFloat 4bit量化
(2)Double Quantization 双重量化
(3)Paged Optimizers 分页优化器

比较

在这里插入图片描述

背景

量化

量化是将输入从包含更多信息的表示离散化为包含较少信息的表示的过程。 它通常意味着采用更多位的数据类型并将其转换为更少的位。
输入数据类型通常通过输入元素的绝对最大值进行标准化,重新调整为目标数据类型范围,例如,将 32 位浮点 (FP32) 张量量化为范围为 [−127, 127] 的 Int8 张量
在这里插入图片描述

这种量化方法的弊端

在量化过程中,我们通常会将连续的浮点数映射到离散的量化级别上,这些量化级别由一系列的“量化桶”(quantization bins)或“量化区间”(quantization intervals)表示。每个桶对应一个特定的位组合(bit combination),并代表一个量化后的值。当输入张量中存在大量的小值或中等值时,这些值可以很好地分布到各个量化桶中,从而有效利用每个桶。然而,如果输入张量中包含一个或多个极端大或极端小的值(即异常值),情况就会变得复杂。这些异常值可能会占用原本设计为容纳较小或中等值的桶

量化弊端的解决

在这里插入图片描述

名词解释

适配器

在深度学习领域,特别是在处理大型语言模型(LLM)时,适配器(Adapters)是一种参数高效的微调(PEFT)方法。适配器的核心思想是在保持预训练模型大部分参数固定的情况下,通过引入一小部分可训练的参数(即适配器)来适应新的任务或数据。LoRA是一种特殊的适配器技术,它通过引入两个低秩矩阵(L1和L2)来近似原始权重矩阵的一个低秩更新

梯度检查点

梯度检查点是一种深度学习优化技术,旨在减少神经网络训练过程中的内存占用。在训练深度学习模型时,通常需要存储每一层的激活值(即网络层的输出),以便在反向传播时计算梯度。然而,当网络层数非常多时,这些激活值会占用大量的内存。梯度检查点技术通过只在前向传播时保存部分激活值的信息,并在反向传播时重新计算其他激活值,从而减少了内存的使用。具体来说,它在前向传播时使用特定的函数(如PyTorch中的torch.utils.checkpoint.checkpoint)来标记需要保存检查点的层。在反向传播时,这些检查点被用来重新计算之前未保存的激活值,从而避免了在内存中存储所有激活值的需求。

参数高效微调的内存要求

由于LoRA的内存占用非常小,我们可以使用更多的适配器来提高性能,而不会显著增加总内存使用量。尽管LoRA被设计为一种参数高效的微调(PEFT)方法,但在大型语言模型(LLM)微调中,大部分内存占用实际上来自于激活梯度,而不是学习的LoRA参数。通过使用梯度检查点技术,输入梯度的平均内存占用可以进一步降低到每个序列18MB,这使得它们比所有LoRA权重组合起来还要占用更多内存。相比之下,基础模型(假设为4位精度)消耗了5048MB的内存。这强调了梯度检查点技术的重要性,但也表明大幅度减少LoRA参数的数量只会带来微小的内存节省。因此,我们可以使用更多的适配器,而不会显著增加总体训练内存占用。
对于lora算法而言,使用更多的适配器意味着LoRA技术通过向预训练模型中的特定层(如Transformer的自注意力层或全连接层)注入低秩矩阵(A和B),来实现对模型的高效微调,而不需要重新训练整个模型。

QLORA四个创新介绍

QLora存储数据和计算数据介绍

QLora的存储数据类型通常是4位的,这意味着它可以以非常低的精度存储数据,这对于减少模型大小和加快推理速度非常有用。
QLora的计算数据类型则通常是BFloat16,这是一种专为浮点数运算优化的16位浮点数格式,它在保持较高精度的同时,相比传统的32位浮点数(如Float32)能够显著减少内存占用和计算量。
在实践中,当QLORA的权重张量被使用时,首先会进行反量化操作,将4位的低精度数据转换为BFloat16格式。这一步骤是必要的,因为直接在低精度格式下进行复杂的数学运算(如矩阵乘法)可能会导致精度损失过大,影响模型的性能。转换为BFloat16后,就可以在保持较高精度的同时,利用16位运算的优势进行矩阵乘法等计算。

4-bit NormalFloat Quantization(4bit量化)

分位数量化:分位数量化是一种数据压缩和量化的技术,它基于输入数据的分位数来划分量化区间.确保每个量化区间内分配相同数量的值(或尽可能接近相同数量)。
分位数量化的
工作原理
是通过经验累积分布函数估计输入张量的分位数。
分位数量化的一个主要限制是,准确估计分位数的过程非常昂贵,特别是对于大型数据集。分位数估计需要确定将数据分成等大小部分(或分位数)的值,这在数据未排序或分布在多个系统上时尤其计算密集。为了解决这个问题,通常会使用快速的分位数近似算法,如SRAM分位数等,来估计分位数。这些算法通过牺牲一些精度来换取更快的计算速度。然而,由于这些算法的近似性质,对于异常值(通常是最重要的值)的数据类型,会产生较大的量化误差
当输入张量(tensors)来自一个固定到某个量化常数的分布时,可以避免昂贵的分位数估计和近似误差
预训练的神经网络权重通常具有以0为中心、标准差为σ的正态分布。为了将这些权重适配到特定的数据类型范围内,我们可以对标准差σ进行缩放,以确保权重分布完全适应我们设定的数据类型范围。因此,数据类型的分位数和神经网络权重都需要标准化到这个范围内。
在这里插入图片描述

对称k位量化存在的问题及解决办法

在讨论对称k位量化时,确实存在一个问题,即这种方法无法精确表示零值,而精确表示零值对于量化填充(padding)和其他零值元素而不产生误差是至关重要的。为了确保有一个离散的零值点,并且充分利用k位数据类型中的2^k个比特,我们设计了一种非对称数据类型.

这种方法首先估计两个范围(负数和正数)的分位数qi,其中负数的范围是从-2(k-1)到-1(共2(k-1)个值),正数的范围是从1到2(k-1)(同样共2(k-1)个值,但注意这里不包括0,因为我们已经为负数范围分配了-1作为最接近零的负值)。然后,我们将这两个qi集合合并,并移除在两个集合中都出现的零值(实际上,在合并前,我们就没有为正数范围包括0,所以这一步主要是强调没有重复零值)。

这种数据类型被称为k位NormalFloat(NFk),因为它在每个量化桶中具有相等数量的预期值,这对于零中心正态分布的数据在信息论意义上是最优的。这意味着,对于符合正态分布(均值为0)的数据,NFk类型能够更有效地量化,减少量化误差。

NFk的具体值取决于k的大小和如何精确分配这些值以平衡正负范围。

Double Quantization(双重量化)

在这里插入图片描述

Paged Optimizers(分页优化器)

在 CPU 和 GPU 之间自动进行页到页传输,以便在 GPU 偶尔出现内存不足的情况下实现无错误的 GPU 处理。我们使用此功能为优化器状态分配分页内存,然后在 GPU 内存不足时自动将其移出到 CPU RAM,并在优化器更新步骤需要内存时将其分页回 GPU 内存。

局限性

论文中提出的局限性主要在于没有在一些数据集或者模型上进行测试,不确定QLora在其上的表现

QLora视频讲解

QLora原理
Qlora原理

<think>嗯,用户想了解如何用自己的数据微调DeepSeek模型。首先,我需要确定用户对DeepSeek的了解程度。DeepSeek是一家中国的人工智能公司,可能他们有自己的大语言模型,比如DeepSeek-R1或者类似的模型。用户可能已经有一定的机器学习基础,但需要具体步骤来微调。 接下来,用户提到“自己的数据”,所以需要说明数据准备的步骤。需要提醒用户数据格式,比如JSON、CSV或者文本文件,以及数据清洗的重要性,比如去除噪声、标准化格式。另外,数据可能需要标注,特别是如果微调的是监督式任务的话。 然后,选择微调方法。根据模型类型,比如LLM,常见的微调方法有全参数微调、LoRA、QLoRA等。需要解释这些方法的区别,特别是计算资源的需求,因为用户可能在本地环境资源有限的情况下,LoRA可能是更合适的选择。 工具和框架方面,可能需要用到Hugging Face的Transformers库、DeepSpeed或者PyTorch。如果DeepSeek有自己特定的库或工具,也需要提及。例如,使用Hugging Face的Trainer类可能会简化训练过程。 然后是具体的步骤:加载预训练模型、准备数据集、定义训练参数、开始微调、保存模型。每个步骤需要详细说明,比如如何加载模型,数据预处理的方法,训练参数如学习率、批次大小的设置,以及如何监控训练过程。 验证和测试部分很重要,用户需要知道如何评估微调后的模型效果,比如使用测试集或人工评估。可能需要调整超参数或数据,这里需要给出一些调整策略的例子,比如学习率调整或数据增强。 最后,注意事项部分要提醒用户计算资源、过拟合问题、数据质量和合规性。特别是如果数据涉及敏感信息,需要确保合法合规。 需要确认是否DeepSeek有公开的模型和微调指南,如果有的话,建议用户参考官方文档。如果假设用户使用的是类似LLaMA的架构,步骤可能类似,但具体细节可能不同。可能需要提醒用户根据实际情况调整,并考虑资源限制选择合适的微调方法。</think>使用自己的数据微调DeepSeek模型的基本流程和注意事项,供你参考: --- ### **1. 数据准备** - **格式要求**:需整理为模型支持的格式(如JSONL、CSV),常见结构为: ```json {"prompt": "用户输入文本", "completion": "期望的模型输出"} ``` - **数据清洗**: - 去除噪声、重复数据 - 统一文本编码(推荐UTF-8) - 确保任务相关性(如对话、问答等) - **数据划分**:建议按8:1:1划分训练集/验证集/测试集 --- ### **2. 选择微调方法** - **全参数微调**:需大量计算资源,适合充足GPU环境 - **高效微调技术**(推荐): - **LoRA**:低秩矩阵适配,显存占用减少约50% - **QLoRA**:4-bit量化+LoRA,可在单卡运行 - **Adapter**:插入小型网络模块 --- ### **3. 工具链选择** - **主流框架**: ```python # 示例代码框架 from transformers import Trainer, TrainingArguments from peft import LoraConfig, get_peft_model # 加载基础模型 model = AutoModelForCausalLM.from_pretrained("deepseek-ai/deepseek-base") # 配置LoRA lora_config = LoraConfig( r=8, lora_alpha=32, target_modules=["q_proj", "v_proj"], lora_dropout=0.1 ) model = get_peft_model(model, lora_config) ``` - **训练配置建议**: ```python training_args = TrainingArguments( output_dir="./results", per_device_train_batch_size=4, gradient_accumulation_steps=2, learning_rate=2e-5, num_train_epochs=3, fp16=True # 启用混合精度训练 ) ``` --- ### **4. 关键实施步骤** 1. **环境配置**:安装CUDA 11+、PyTorch 2.0+、Transformers库 2. **数据加载**:使用`datasets`库高效加载: ```python from datasets import load_dataset dataset = load_dataset("json", data_files={"train": "train.jsonl"}) ``` 3. **训练监控**:启用WandB记录损失曲线 4. **模型保存**:使用`model.save_pretrained("fine-tuned-model")` --- ### **5. 效果验证** - **自动评估**: - 使用ROUGE/BLEU指标(文本生成) - 计算准确率(分类任务) - **人工评估**:设计多样化的测试用例,重点关注: - 领域专业术语理解 - 任务特定格式遵守 - 逻辑一致性 --- ### **注意事项** 1. **资源预估**:7B参数模型QLoRA微调约需24GB显存 2. **过拟合预防**:建议设置`weight_decay=0.01`并监控验证集损失 3. **数据安全**:敏感数据需做脱敏处理 4. **迭代调优**:建议从小规模数据开始实验(如1k样本) 如需具体领域的微调方案(如医疗、金融等),可提供更多任务细节以便给出针对性建议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值