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>嗯,用户想在Windows 11上训练DeepSeek的1.7B参数大模型。首先,我得考虑Windows环境的限制,尤其是像PyTorch这样的框架对CUDA的支持是否完善。通常来说,Linux更适合训练大模型,但用户可能因为各种原因只能用Windows。 接下来,硬件要求。1.7B参数的模型训练需要足够的显存。一般来说,可能需要至少一块高端的GPU,比如NVIDIA的RTX 3090或A100,显存得24GB以上?不过不确定,可能需要检查DeepSeek的具体实现是否有优化。比如,使用混合精度训练或者内存优化技术如梯度检查点,可能可以降低显存需求。另外,用户可能需要多块GPU,但Windows下多卡训练的支持如何呢?PyTorch在Windows上支持NCCL吗?可能需要确认这一点。 然后是软件环境。需要安装Python、PyTorch、CUDA工具包,可能还需要其他库如HuggingFace的Transformers、DeepSpeed或者FSDP。但Windows上安装这些会不会有问题?比如,DeepSpeed在Windows上的支持可能有限,可能需要额外配置或者使用替代方案。还有,用户可能需要安装特定版本的CUDA和PyTorch,确保兼容性。 数据准备方面,用户需要合适的数据集,并且预处理成模型需要的格式。比如,文本数据需要分词、分块等处理。可能需要用到tokenizers库,或者HuggingFace的Datasets库。这部分在Windows上应该问题不大,但要注意文件路径的大小写和斜杠方向。 训练脚本方面,可能需要调整代码以适应Windows环境。比如,路径处理、多进程训练的启动方式(Windows不支持fork,只能用spawn),以及可能的文件锁问题。另外,分布式训练在Windows上的配置可能比较复杂,需要更多的步骤。 性能优化方面,用户可能需要使用混合精度训练(FP16或BF16)、梯度累积、梯度检查点等技术来减少显存占用。同时,使用LoRA或者QLoRA等参数高效微调方法,可能可以在有限资源下训练更大的模型。不过,1.7B本身已经比较大了,可能需要更多的优化策略。 另外,参考引用里提到的项目,比如使用LLaMA Pro、LoRA+等技术,可能可以借鉴。例如,使用LoRA进行微调,只需要训练部分参数,减少计算量。或者使用QLoRA进行4比特量化,进一步降低显存需求。这些方法是否适用于DeepSeek的模型结构?需要查看DeepSeek的文档或代码是否支持这些技术。 还有,用户提到的DeepSeek模型是否有现成的训练脚本或者示例?如果官方提供了在Linux下的脚本,可能需要修改才能在Windows上运行。比如,替换shell脚本为PowerShell脚本,处理路径分隔符等问题。 另外,监控和调试工具,比如TensorBoard或Wandb,在Windows上的安装和使用是否有特别需要注意的地方?通常这些工具是跨平台的,应该没问题。 最后,用户可能需要面对的是性能损失。Windows下的PyTorch可能在分布式训练或某些优化库上不如Linux高效,导致训练速度较慢。需要权衡是否值得在Windows上进行训练,或者考虑使用WSL(Windows Subsystem for Linux)来获得更好的兼容性。 总结一下,步骤可能包括:确认硬件符合要求,安装必要的软件和依赖,准备数据集,调整训练脚本以适应Windows环境,应用性能优化技术,处理可能的兼容性问题,然后进行训练和监控。过程中需要参考DeepSeek的官方文档和相关开源项目的最佳实践,比如引用中提到的那些方法。</think>在Windows 11系统上训练DeepSeek 1.7B参数大语言模型需要解决系统兼容性、计算资源限制等问题,以下是分步骤解决方案: ### 一、环境配置 1. **硬件要求** - 显存:建议至少24GB显存(如NVIDIA RTX 4090),若使用量化技术(如QLoRA)可降至12-16GB[^2] - 内存:推荐32GB以上 - 存储:预留100GB SSD空间用于模型和数据集 2. **软件环境** ```powershell # 安装CUDA工具包(需与显卡驱动匹配) choco install cuda --version=12.2 # 创建Python虚拟环境 conda create -n deepseek python=3.10 conda activate deepseek pip install torch==2.3.0+cu121 -f https://download.pytorch.org/whl/torch_stable.html pip install transformers==4.40.0 datasets==2.18.0 accelerate==0.29.3 ``` ### 二、训练优化策略 $$ \text{显存消耗} = 4 \times (\text{参数量}) \times (\text{批量大小}) \times (\text{序列长度}) \times 10^{-9} \text{ GB} $$ 对于1.7B参数模型,建议采用: - **QLoRA量化**:将模型权重量化为4bit,可减少60%显存占用 - **梯度检查点**:激活重计算技术,牺牲20%速度换取显存优化 - **混合精度训练**:使用`bfloat16`格式提升计算效率 ### 三、训练代码示例 ```python from transformers import AutoModelForCausalLM, TrainingArguments from peft import LoraConfig, get_peft_model # 加载基础模型 model = AutoModelForCausalLM.from_pretrained("deepseek-ai/deepseek-1.7b") # 配置LoRA lora_config = LoraConfig( r=64, lora_alpha=128, target_modules=["q_proj", "v_proj"], lora_dropout=0.05, bias="none" ) model = get_peft_model(model, lora_config) # 配置训练参数 training_args = TrainingArguments( output_dir="./output", per_device_train_batch_size=4, gradient_accumulation_steps=8, learning_rate=2e-5, fp16=True, optim="adamw_bnb_8bit", logging_steps=50, max_steps=1000 ) ``` ### 四、性能调优建议 1. 使用`FlashAttention-2`加速注意力计算,可获得30%的速度提升 2. 启用`NEFTune`噪声注入技术,提升模型泛化能力 3. 通过`LlamaBoard`监控训练过程,实时分析损失曲线和资源利用率 ### 五、常见问题解决 - **CUDA内存不足**:降低批量大小(建议≥2),增加梯度累积步数 - **DLL加载错误**:安装最新VC++运行库和NVIDIA C++工具包 - **训练速度慢**:禁用Windows Defender实时保护,设置GPU为"高性能"模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值