LoRA、QLoRA是什么

一:
LoRA(Low-Rank Adaptation,低秩适应)是一种高效的大模型参数微调技术,由Meta在2021年提出。它通过冻结预训练模型参数,仅训练少量新增的低秩矩阵,大幅减少了需要训练的参数量,同时保持接近全参数微调的效果。

为什么需要LoRA?

传统的全参数微调(Fine-tuning)需要更新大型语言模型的所有参数(如GPT-3有1750亿参数),这带来两个核心问题:

  1. 计算资源需求极高:需要大量GPU内存和长时间训练。
  2. 容易过拟合:对于小数据集,全参数微调可能导致模型忘记预训练知识(灾难性遗忘)。

而LoRA通过只训练少量新增参数,解决了这些问题。

LoRA的核心原理

LoRA的核心思想是:用两个低秩矩阵的乘积代替传统的权重更新矩阵

对于预训练模型中的权重矩阵 W 0 W_0 W0(通常维度很高,如768×768),LoRA不直接更新它,而是添加一个可训练的分解矩阵:
W = W 0 + Δ W = W 0 + B ⋅ A W = W_0 + \Delta W = W_0 + B \cdot A W=W0+ΔW=W0+BA
其中:

  • B B B A A A 是两个低秩矩阵,秩为 r r r(通常 r ≪ 维度 r \ll \text{维度} r维度,如 r = 8 r=8 r=8 r = 16 r=16 r=16)。
  • A A A 是随机初始化的矩阵, B B B 初始化为零矩阵。
  • 只有 B B B A A A 需要训练, W 0 W_0 W0 保持冻结。

LoRA的优势

  1. 参数量显著减少

    • 对于13B参数的CodeLlama模型,全参数微调需要训练130亿参数;
    • 而LoRA只需要训练约0.5%的参数(例如 r = 8 r=8 r=8 时,仅需约650万参数)。
  2. 内存和计算效率提升

    • 训练时GPU内存需求降低,可使用更小的GPU训练大模型。
    • 推理时不需要额外内存,因为LoRA权重可以与原始权重合并。
  3. 训练速度加快

    • 由于需要计算梯度的参数大幅减少,训练速度显著提升。
  4. 可并行训练多个任务

    • 可以为不同任务保存不同的LoRA权重,共享同一个预训练模型。

在你的代码中的应用

在你提供的代码中,LoRA的配置如下:

train_args = {"finetuning_type": "lora",  # 使用LoRA微调"lora_target": "q_proj,v_proj",  # 只对Attention层的query和value投影矩阵应用LoRA"lora_rank": 64,  # 低秩矩阵的秩r"lora_alpha": 32,  # 缩放因子,用于调整LoRA权重的大小
}

这意味着代码只会微调模型中Attention层的query和value投影矩阵,使用秩为64的低秩分解,从而大幅降低训练成本。

LoRA vs 全参数微调

对比项全参数微调LoRA微调
训练参数量所有参数(如13B)仅LoRA参数(如650K)
GPU内存需求高(需保存所有梯度)低(仅保存LoRA梯度)
训练时间
模型效果可能更好(数据充足时)接近全参数微调
多任务支持需要为每个任务保存完整模型共享预训练模型,仅保存LoRA权重

总结

LoRA是一种轻量级微调技术,特别适合在资源有限的情况下微调大型语言模型。通过冻结预训练权重并引入低秩适应矩阵,LoRA在大幅减少训练成本的同时,保持了接近全参数微调的效果。这使得即使是个人开发者也能在消费级GPU上微调13B甚至更大的模型。

QLoRA(Quantized Low-Rank Adaptation)是LoRA的升级版,由Meta在2023年提出。它通过量化预训练模型权重(如将权重压缩至4位或更少)并结合LoRA微调,进一步降低了大模型微调的资源门槛,让普通人也能在消费级GPU上微调百亿级参数模型。


二:

QLoRA的核心创新

1. 4位量化预训练模型
  • 传统LoRA:虽然只训练少量LoRA参数,但预训练模型权重仍需以FP16(16位浮点)或BF16(Brain Floating Point)格式存储,占用大量内存。例如,13B参数模型需约26GB显存。
  • QLoRA:将预训练模型权重压缩至4位(仅需约3.25GB),同时引入双量化技术进一步减少量化误差,几乎不损失模型性能。
2. Paged Optimizers
  • 设计了特殊的优化器,解决量化模型训练时的内存碎片问题,大幅减少内存峰值。
3. 高秩适应
  • 支持更高的LoRA秩(如 r = 64 r=64 r=64 r = 128 r=128 r=128),在低精度下仍能保持良好的表达能力。

QLoRA的优势

  1. 显存需求极低

    • 13B模型只需约7GB显存即可微调(相比传统LoRA的26GB)。
    • 70B模型可在单张48GB GPU上微调(传统方法需多张A100)。
  2. 接近全参数微调的效果

    • 在多个基准测试中,QLoRA微调的模型性能接近甚至超过全参数微调的结果。
  3. 训练效率提升

    • 由于权重存储量减少,内存带宽压力降低,训练速度略有提升。

QLoRA vs LoRA

对比项LoRAQLoRA
预训练模型精度FP16/BF16 (16位)4位量化
13B模型显存需求~26GB~7GB
70B模型显存需求~140GB~18GB
参数量仅LoRA参数仅LoRA参数(量化权重不占训练内存)
硬件要求需要高端GPU(如A100)可在消费级GPU(如RTX 4090)上运行

在你的代码中如何使用QLoRA?

如果要将你的代码从LoRA切换到QLoRA,需要:

  1. 安装额外依赖

    pip install bitsandbytes  # 用于权重量化
    
  2. 修改训练参数

    from transformers import BitsAndBytesConfig# 配置4位量化
    quantization_config = BitsAndBytesConfig(load_in_4bit=True,  # 加载4位量化模型bnb_4bit_compute_dtype=torch.bfloat16,  # 计算精度bnb_4bit_use_double_quant=True,  # 双量化bnb_4bit_quant_type="nf4",  # 量化类型
    )train_args = {"model_name_or_path": "codellama/CodeLlama-13b-Instruct-hf","quantization_config": quantization_config,  # 添加量化配置"do_train": True,"finetuning_type": "lora","lora_target": "q_proj,v_proj",# 其他参数保持不变...
    }
    

QLoRA的局限性

  1. 初始加载时间较长:量化模型需要额外时间加载和准备。
  2. 特定硬件依赖:需要GPU支持BF16或FP16计算(大多数现代GPU都支持)。
  3. 极端低精度可能影响性能:在某些任务上,4位量化可能略微降低模型表现,但通常影响较小。

总结

QLoRA是当前最先进的大模型微调技术之一,它通过量化预训练权重+LoRA微调的组合,将百亿级参数模型的微调门槛降低到消费级硬件水平。对于个人开发者或资源有限的团队,QLoRA是实现低成本、高效率模型微调的理想选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84224.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【web应用】在 Vue 3 中实现饼图:使用 Chart.js实现饼图显示数据分析结果

文章目录 前言一、准备工作二、实现饼图组件三、关键点解析四、实现效果总结 前言 在现代 Web 应用中,数据可视化是不可或缺的一部分。无论是展示统计信息还是监控关键指标,图表都能帮助用户更直观地理解数据。在 Vue 3 项目中,我们可以使用…

分页数据不准问题分析与解决

大纲 📖 1、场景 🪵2、原因 🔥3、解决方式:游标分页 📏4、一点思考💡5、全表查询的优化思路 🍅 记录一个分页不准的问题 1、场景 🪵 调用一个第三方List接口(带分页&am…

MyBatis原理剖析(三)--加载配置文件

下面我们正式进入mybatis的源码学习,之前我们已经了解过mybatis中通过配置文件来保证与数据库的交互。配置文件分为核心配置文件和映射配置文件,核心配置文件的主要作用就是加载数据库的一些配置信息而映射配置文件则是执行对应的sql语句。同时核心配置文…

C++(运算符重载)

一.友元 C中使用关键字friend可以在类外访问所有的成员,包括私有成员(之前提到过封装的核心思想是隐藏内部实现细节,通过公共接口控制访问),所以友元可以突破封装的限制访问数据,盲目使用会导致程序稳定性…

XR-RokidAR-UXR3.0-Draggable 脚本解析

using System.Collections.Generic; using Rokid.UXR.Utility; using UnityEngine; using UnityEngine.EventSystems;namespace Rokid.UXR.Interaction {/// <summary>/// Draggable 拖拽组件/// </summary>// [RequireComponent(typeof(RayInteractable))]public …

GitHub 趋势日报 (2025年06月17日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 1022 anthropic-cookbook 986 awesome-llm-apps 910 fluentui-system-icons 754 r…

NodeJS的中间件是什么

说简单一点&#xff0c;中间件就是在你的请求和业务逻辑之间做一层拦截。 在 Node.js 中&#xff0c;中间件&#xff08;Middleware&#xff09; 是一种函数&#xff0c;它在 请求&#xff08;Request&#xff09;到达路由处理器之前&#xff0c;或在 响应&#xff08;Respons…

MCAL学习(6)——诊断、DCM

1.诊断概述 汽车诊断就是通过汽车总线&#xff08;CAN LIN Eth&#xff09;来进行诊断会话&#xff0c;大部分通过CAN总线通讯进行请求与响应。 1.诊断分层 DCM内部支持UDS服务和OBD服务&#xff08;排放&#xff0c;动力&#xff09;。 以统一诊断服务UDS为例&#xff0c;应…

kafka-生产者-(day-4)

day-3 BufferPool 产生原因&#xff1a;ByteBuffer的创建和释放都是比较耗费资源的&#xff0c;为了实现内存的高效利用&#xff0c;产生了他。他会对特定大小的ByteBuffer进行管理 BufferPool的字段 free:是一个ArrayDeque队列&#xff0c;缓存指定大小的ByteBuffer对象Re…

java 验证ip是否可达

默认IP的设备已开放ping功能 代码 public class PingTest {public static void main(String[] args) throws Exception {String ip "192.168.21.101";boolean reachable InetAddress.getByName(ip).isReachable(3000);System.out.println(ip (reachable ? &quo…

LeetCode 2187.完成旅途的最少时间

题目&#xff1a; 给你一个数组 time &#xff0c;其中 time[i] 表示第 i 辆公交车完成 一趟旅途 所需要花费的时间。 每辆公交车可以 连续 完成多趟旅途&#xff0c;也就是说&#xff0c;一辆公交车当前旅途完成后&#xff0c;可以 立马开始 下一趟旅途。每辆公交车 独立 运…

永磁同步电机无速度算法--基于正切函数锁相环的滑模观测器

最近在学习锁相环&#xff0c;后续会记录一下了解到的几种PLL。 一、原理介绍 传统锁相环控制框图如下所示 在电机正转时&#xff0c;传统锁相环可以实现很好的转速和转子位置估计&#xff0c;但是当电机反转&#xff0c;反电动势符号发生变化&#xff0c;系统估计转子位置最…

Vim-vimrc 快捷键映射

Vim-vimrc 快捷键映射 文章目录 Vim-vimrc 快捷键映射Leader 键快捷键映射&#xff1a;插入特定字符插入 --插入 ##插入 解释Leader键设置快速插入分隔线 Leader 键 我们还将 , 设置为 Leader 键&#xff0c;使得其他快捷键映射更加简洁。 let mapleader ","快捷键…

SylixOS armv7 任务切换

SylixOS 操作系统下&#xff0c;任务切换可以分为两种 中断退出时&#xff0c;执行的任务切换&#xff08;_ScheduleInt&#xff09;内核退出时&#xff0c;执行的任务切换&#xff08;_Schedule&#xff09; 下面分别讲讲这两种任务切换 1、中断退出时任务切换 关于 ARM 架…

Java 自定义异常:如何优雅地处理程序中的“业务病”?

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、从一个真实场景开始&#xff1a;银行转账系统的困境 假设你正在开发一个银行转账系统&#xff0c;当用户尝试转账时可能出现以下问题&#xff1a; 转…

【JAVA】【Stream流】

1. filter操作 filter()方法用于根据给定的条件过滤列表中的元素&#xff0c;仅保留满足条件的项。 List<Integer> list Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);List<Integer> res list.stream().filter(a -> a % 2 0).collect(Collectors.toList());for(I…

四、Redis实现限流

简介&#xff1a; 限流算法在分布式领域是一个经常被提起的话题&#xff0c;当系统的处理能力有限时&#xff0c;如何阻止计划外的请求继续对系统施压。 系统要限定用户的某个行为在指定的时间里只能允许发生 N 次&#xff0c;如何使用 Redis 的数据结构来实现这个限流的功能&a…

基于Geotools的两条道路相交并根据交点形成新路线实战-以OSM数据为例

目录 前言 一、需求场景及分解 1、需求场景 2、需求应用 二、需求实现 1、加载路网数据 2、获取道路信息 3、相交点求解 4、生成新道路 5、结果可视化 三、总结 前言 在当今数字化迅速发展的时代&#xff0c;地理空间数据的处理与分析已成为众多领域不可或缺的关键技…

goland有基础速通(需要其它编程语言基础)

tip: 无论是变量、方法还是struct的访问权限控制都是通过命名控制的&#xff0c;命名的首字母是大写就相当于java中的public&#xff0c;小写的话就是private&#xff0c;&#xff08;private只有本包可以访问&#xff09; 1 go的变量声明 普通变量 特点&#xff1a; 变量类…

量化面试绿皮书:19. 相关系数

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 19. 相关系数 假设有三个随机变量x、y和z。 x与y之间的相关系数为0.8&#xff0c;x与z之间的相关系数也是0.8。 Q: 那么y与z之间的最大相关…