LLM训练的显存占用(LoRA、QLoRA)

部署运行你感兴趣的模型镜像

混合精度训练:

为什么不全都用FP16?

FP16精度的范围比FP32窄了很多,这就会产生数据溢出舍入误差两个问题(全网最全-混合精度训练原理),这会导致梯度消失无法训练,所以我们不能全都用FP16,还需要FP32来进行精度保证。BF16不会产生数据溢出了,业界的实际使用也反馈出比起精度,大模型更在意范围。

例子(暂时不看激活值占用 )

对于llama3.1 8B模型,FP32和BF16混合精度训练,用的是AdamW优化器,请问模型训练时占用显存大概为多少?

解:

模型参数:16(BF16) + 32(PF32)= 48G

梯度参数:16(BF16)= 16G

优化器参数:32(PF32) + 32(PF32)= 64G

不考虑激活值的情况下,总显存大约占用 (48 + 16 + 64) = 128G

KVCache动图:

KV cache的目的是减少延迟,也就是为了推理的速度牺牲显存。

我们推理就是在不断重复地做”生成下一个token“的任务,生成当前token 仅仅与当前的QKV和之前所有KV有关,那么我们就可以去维护这个KV并不断更新。 

KVCache计算公式:

(第1个2是K+V,第2个2是BP16 2个字节)

举例,对于llama7B,hiddensize = 4096,seqlength = 2048 , batchsize = 64,layers = 32:

降低显存最直观的方式:减少batch-size,由64降至1,显存降至约1GB了。

MQA&GQA:

把上式的hiddensize,换成heads_num * head_dim

对于普通MHA,heads_num*head_dim就等于hiddensize

对于GQA, heads_num从64变为8 (每8个heads共享1个KV)

对于MQA, heads_num变为1

LoRA

用了LoRA之后,

模型权重本身的权重, BF16的话,是2W;LoRA矩阵占用显存量,很小,可忽略;

全参模型和Optimize的状态,不需要了,因为梯度更新不更新全参模型;梯度更新只更新LoRA矩阵,很小,可忽略;

梯度,不需要计算原始模型部分的梯度,也基本不占用显存。LoRA矩阵的梯度,很小,可忽略;

LLama Factor给的表格:

QLora在训练计算时用到的精度仍是16bit,只是加载的模型是4bit,会进行一个反量化到16bit的方法,用完即释放。前面说到的都是模型原始参数本身,不包括lora部分的参数,Lora部分的参数不需要量化,一直都是16bit。 

比Lora多了一个反量化的操作,训练时间会更长,一般Qlora训练会比Lora多用30%左右的时间。


 

您可能感兴趣的与本文相关的镜像

ComfyUI

ComfyUI

AI应用
ComfyUI

ComfyUI是一款易于上手的工作流设计工具,具有以下特点:基于工作流节点设计,可视化工作流搭建,快速切换工作流,对显存占用小,速度快,支持多种插件,如ADetailer、Controlnet和AnimateDIFF等

<think> 首先,用户的问题是:“我想了解模型微调中QLoRALoRA的区别”。基于提供的引用,我需要结构化地回答这个问题。 回顾引用: - 引用[1]:QLoRALoRA都是用于高效微调大型语言模型的技术,核心思想是避免全参数微调的开销。主要区别是QLoRA引入了量化技术,进一步降低内存需求。 - 引用[2]:QLoRA结合了量化(如4-bit)和LoRA微调,先在主权重上用低精度量化减少存储,然后用LoRA仅微调少部分参数。 - 引用[4]:QLoRA的核心要点包括4-bit Normal Float量化、双重量化、分页优化器。LoRA的思想是大矩阵分解成两个小矩阵,训练时冻结原参数仅训练低秩矩阵A与B。 - 引用[5]:这是一个命令行示例,涉及内存优化,提到量化比特(quantization_bit 4)等设置。 关键点: - **LoRA (Low-Rank Adaptation)**:冻结预训练模型的大部分参数,只训练添加的低秩矩阵(两个小矩阵),减少参数量和计算开销。 - **QLoRA (Quantized Low-Rank Adaptation)**:在LoRA的基础上,先对原始模型权重进行量化(如4-bit),进一步压缩模型大小和内存占用,然后再应用LoRA微调。 从引用[4]: - LoRA:冻结原模型参数,训练低秩矩阵A和B;适用于所有线性层(如QKV、FFN)。 - QLoRA:先量化模型权重(减少内存),再应用LoRA。 我的回答需要: 1. **结构清晰**:逐步解释两种技术。 2. **使用中文**:用户指定使用中文回答。 3. **引用标识**:在回答中自然地添加引用标识,如[^1]。 4. **生成相关问题**:在末尾添加相关问题。 5. **格式要求**:行内数学表达式用$...$,独立公式用$$...$$并单独成段。由于主题是模型微调,可能涉及公式如矩阵分解。 可能涉及的公式: - LoRA:假设原始权重矩阵 $W \in \mathbb{R}^{d \times k}$,LoRA引入两个小矩阵 $A \in \mathbb{R}^{d \times r}$ 和 $B \in \mathbb{R}^{r \times k}$,其中 $r \ll d, k$,更新为 $W + BA$。 - QLoRA:在权重存储时量化,如到4-bit,但微调时可能在高精度操作。 回答结构: 1. **引言**:简述两种技术的背景和共同目的。 2. **LoRA详解**:解释LoRA的原理、优点。 3. **QLoRA详解**:解释QLoRA如何结合量化,核心特点。 4. **主要区别**:对比内存占用计算效率、适用场景等。 5. **总结**:简要总结。 6. **相关问题**:生成相关问题。 确保真实性:基于提供的引用,避免添加个人知识。 生成相关问题: - 参考用户上次的问题(系统指令说“参考用户上一次的问题”,但这是新对话,所以我需基于当前内容)。 - 主题是QLoRALoRA的区别,相关问题可以是: 1. QLoRA中的量化技术如何工作? 2. 在实际应用中,选择QLoRA还是LoRA取决于什么因素? 3. QLoRA的性能优化如何? 4. 如何实现QLoRA微调?(参考引用[5]的命令行示例) 最终回答框架: - 回答部分:清晰、分节。 - 相关问题:以“§§相关问题§§”开头列出。 </think> ### QLoRALoRA 在模型微调中的区别 在大型语言模型(LLM)的微调中,QLoRALoRA 都是针对全参数微调计算开销大、内存需求高的问题而设计的高效技术。它们的核心思想是通过冻结大部分预训练模型参数,只更新少量额外参数,从而降低训练成本。但它们的关键区别在于 QLoRALoRA 的基础上引入了量化技术,大幅减少了内存占用。下面我将逐步解释两者的原理、核心区别和实际影响。 #### 1. **LoRA(Low-Rank Adaptation)的原理** LoRA 是一种参数高效微调(PEFT)方法,其核心思想是将原始模型权重矩阵分解为两个低秩矩阵的乘积。假设原始权重矩阵为 $W \in \mathbb{R}^{d \times k}$,LoRA 引入两个小矩阵 $A \in \mathbb{R}^{d \times r}$ 和 $B \in \mathbb{R}^{r \times k}$,其中 $r \ll d, k$(通常 $r$ 远小于原矩阵维度),并将权重更新为 $W + BA$。训练时: - 冻结原始模型参数(如 $W$),只训练低秩矩阵 $A$ 和 $B$。 - 这减少了可训练参数的数量(通常只占原参数的 1% 左右),显著降低了计算和内存开销。 - 适用于所有线性层,包括注意力机制中的 Q/K/V 变换和前馈网络(FFN)层。 - 推理时,$BA$ 可直接融合到 $W$ 中,不改变模型结构。 LoRA 的优势在于简单高效,适用于资源受限的环境,但内存占用仍较高,尤其对大型模型[^1][^4]。 #### 2. **QLoRA(Quantized Low-Rank Adaptation)的原理** QLoRA 是对 LoRA 的扩展,核心创新是引入了量化技术,先压缩模型权重,再应用 LoRA 微调。具体步骤: - **量化阶段**:将预训练模型的权重(例如 FP16 或 FP32)压缩到低精度(如 4-bit),使用 **4-bit Normal Float (NF4) 量化**技术。这大幅减少了存储需求(例如,4-bit 权重可将内存占用减少 75% 以上)。 - 为了进一步优化,QLoRA 采用 **双重量化(Double Quantization)**:对普通参数量化一次,再对量化常数进行二次量化,减少缓存占用。 - 例如,一个权重矩阵量化后表示为 $Q(W)$,其中 $Q$ 是量化函数。 - **微调阶段**:在量化后的权重基础上应用 LoRA 方法。只训练低秩矩阵 $A$ 和 $B$,这些参数保持在高精度(如 FP16),确保梯度更新的准确性。 - 更新公式为:$Q(W) + BA$,其中 $Q(W)$ 是量化权重,$A$ 和 $B$ 为可训练的低秩矩阵。 - **额外优化**:引入了 **分页优化器(Page Optimizer)**,当 GPU 显存不足时,可将部分数据移到 CPU 内存处理,避免了内存溢出问题[^1][^2][^4]。 整体上,QLoRA 是一种统一方法,不是简单地将量化与 LoRA 并行使用,而是将量化作为前置步骤,再结合 LoRA 进行微调[^2][^4]。 #### 3. **主要区别对比** 下表总结了 QLoRALoRA 的核心差异: | 特性 | LoRA | QLoRA | |------|------|-------| | **核心技术** | 低秩矩阵分解($W + BA$) | 量化 + 低秩矩阵分解($Q(W) + BA$) | | **内存需求** | 中等:需存储全精度权重和低秩矩阵 | 极低:权重压缩为 4-bit(减少 75%+),配合双重量化进一步优化 | | **计算开销** | 较低:只训练少量参数 | 类似 LoRA,但量化步骤增加了初始压缩成本 | | **精度影响** | 微调参数保持高精度,性能接近全微调 | 量化可能引入轻微精度损失,但通过高精度微调参数($A$ 和 $B$)补偿 | | **适用场景** | 资源较充足的中小型模型 | 内存严格受限的大型模型(如消费级 GPU) | | **实现复杂度** | 简单,易于部署 | 较高,需处理量化算法和内存管理(如分页优化器) | | **性能优势** | 减少训练参数 90-99%,但内存仍是瓶颈 | 内存需求显著更低,能在低端硬件上运行大型模型 | **关键区别总结**: - **内存优化**:QLoRA 的核心优势在于量化技术(如 4-bit NF4),使其能在消费级 GPU 上微调数十亿参数模型,而 LoRA 通常需要专业级硬件[^1][^4]。 - **技术集成**:QLoRA 不是独立于 LoRA 的替代品,而是其增强版,通过量化前置步骤统一处理存储问题,再使用 LoRA 进行微调[^2][^4]。 - **实际影响**:在相同硬件下,QLoRA 能处理更大模型或更大批次的数据。例如,引用[5]展示了命令行代码中使用 `quantization_bit 4` 和 `double_quantization True` 来启用 QLoRA,显著降低训练内存需求。 #### 4. **应用建议与未来展望** - 选择建议:如果硬件资源充足(如服务器级 GPU),LoRA 更简单高效;如果内存受限(如笔记本或低端 GPU),优先使用 QLoRA[^4]。 - 未来趋势:量化方法(如混合精度或多级量化)和微调技术(如 Prefix Tuning 或 Adapter)的融合将进一步提升 QLoRA 的效率,推动在通用硬件上训练更大模型[^3]。 QLoRALoRA 都推动了高效微调的革新,但 QLoRA 在内存压缩上的突破,使其成为资源受限场景的理想选择。如需实践示例,可参考引用[5]中的命令行代码,它展示了 QLoRA训练中的具体参数配置[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值