一文读懂「LoRA」:大型语言模型的低秩适应
LoRA: Low-Rank Adaptation of Large Language Models
前言
LoRA作为大模型的微调框架十分实用,在LoRA出现以前本人都是通过手动修改参数、优化器或者层数来“炼丹”的,具有极大的盲目性,但是LoRA技术能够快速微调参数,如果LoRA微调后的效果不行,就可以转而修改优化器或模块了。而调整参数一步是工作量最大的,而且大模型的参数都是以亿为计数单位的,所以人工硬调参数变得不太可能,而LoRA就为这个提供了解决方法!
LoRA通过仅训练低秩矩阵,然后将这些参数注入到原始模型中,从而实现对模型的微调。这种方法不仅减少了计算需求,而且使得训练资源比直接训练原始模型要小得多,因此非常适合在资源有限的环境中使用。
主流的微调方式
目前主流的低成本微调大模型方法包括2019年 Houlsby N 等人提出的 Adapter Tuning,2021年微软提出的 LORA,斯坦福提出的 Prefix-Tuning,谷歌提出的 Prompt Tuning,2022年清华提出的 P-tuning v2。
LORA 的效果会好于其它几种方法。其它方法都有各自的一些问题:
- Adapter Tuning 增加了模型层数,引入了额外的推理延迟
- Prefix-Tuning 难于训练,且预留给 Prompt 的序列挤占了下游任务的输入序列空间,影响模型性能
- P-tuning v2 很容易导致旧知识遗忘,微调之后的模型,在之前的问题上表现明显变差
LoRA的出发点
微调大规模语言模型到特殊领域和任务是自然语言处理的重要课题之一。但随着模型规模的不断扩大,微调模型的所有参数(full fine-tuning
)的可行性变得越来越低。以GPT-3的175B参数为例,每增加一个新领域就需要完整微调一个新模型,代价和成本很高。
LoRA的特点
- 优点:训练和计算成本低、可并行、不引入推理延迟
- 在 每层 transfomer block 旁边引入一个并行低秩的支路,支路的输入是transfomer block 的输入。然后将输出和 transfomer block 的输出相加,在固定主pretrian model参数的情况下,用支路去学习特定任务知识,来完成特定任务。
动机
-
Lora在不改变模型推理结构的条件下,直接调整少量参数
-
参数的变化量△W△W 通常是参数冗余的,使用低秩近似可以很好地表达
-
普适性强,可以微调任意模型中的线性层
算法流程
-
将模型参数分解为W0+△WW0+△W,W0W0 表示预训练参数,△W表示微调后的变化量
-
训练阶段:并联低秩矩阵分支,冻结预训练参数W0W0 ,学习变化量△W
-
推理阶段:去除并联分支,将学习到的△W与W0W0 相加,不改变模型结构,不影响推理效率。公式为:W=W0W0 +△W
实验结论
LORA论文实验表明
相比其它微调方法
- LORA 相比其它微调方法,增加参数量不会导致性能的下降。
- 性能上与全参数微调持平甚至超过。
秩的选择
实验结果显示,对于一般的任务, r=1,2,4,8r=1,2,4,8 就足够了。而一些领域差距比较大的任务可能需要更大的 rr
同时,增加 rr 值变大并不能提升微调的效果,这可能是因为参数量增加需要更多的语料。
动手实践
目前 LORA 已经被 HuggingFace 集成在了 PEFT(Parameter-Efficient Fine-Tuning) 代码库里。lora 微调需要设置两个参数一个是r,即矩阵秩。 alpha是一个scale参数。
pip install peft
通过使用 get_peft_model 包装基础模型和 PEFT 配置,准备使用 PEFT 方法(例如 LoRA)进行训练的模型。对于 bigscience-mt0-large 模型,仅需要训练 0.19% 的参数!
from transformers import AutoModelForSeq2SeqLM
from peft import get_peft_config, get_peft_model, LoraConfig, TaskType
model_name_or_path = "bigscience/mt0-large"
tokenizer_name_or_path = "bigscience/mt0-large"peft_config = LoraConfig(task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1
)model = AutoModelForSeq2SeqLM.from_pretrained(model_name_or_path)
model = get_peft_model(model, peft_config)
model.print_trainable_parameters()
结果如下:
"trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282"
可以看到仅仅需要训练0.19%的参数
加载一个PEFT模型用于推理:
from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
import torchmodel = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora").to("cuda")
tokenizer = AutoTokenizer.from_pretrained("facebook/opt-350m")model.eval()
inputs = tokenizer("Preheat the oven to 350 degrees and place the cookie dough", return_tensors="pt")outputs = model.generate(input_ids=inputs["input_ids"].to("cuda"), max_new_tokens=50)
print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
结果:
"Preheat the oven to 350 degrees and place the cookie dough in the center of the oven. In a large bowl, combine the flour, baking powder, baking soda, salt, and cinnamon. In a separate bowl, combine the egg yolks, sugar, and vanilla."
拓展:QLoRA和LoRA的区别
QLoRA和LoRA的性能对比通常取决于多个因素,包括任务类型、数据集、模型架构、硬件环境等。以下是一些可能的性能对比方面:
参数数量和训练效率
- LoRA:由于使用了低秩矩阵,LoRA显著减少了需要微调的参数数量,这通常意味着更快的训练速度和更低的内存需求。
- QLoRA:进一步通过量化减少了参数的大小,因此在相同的硬件上,QLoRA可能会提供更高的训练效率,尤其是在资源受限的环境中。
"参数量化"是指在机器学习和深度学习中,将模型的参数(通常是权重和偏置)从浮点数(如32位浮点数)转换为低精度的表示,比如16位、8位甚至更少的位。这样做的目的主要是为了减少模型的存储需求和计算复杂度,从而提高模型在硬件上的运行效率,尤其是在那些不支持或不擅长处理浮点运算的硬件上。
参数量化可以带来以下好处:
- 减少模型大小:量化后的模型占用的存储空间更小,便于在资源受限的设备上部署。
- 降低计算成本:量化后的模型在计算时需要的算力更少,可以减少能耗和提高处理速度。
- 提高硬件兼容性:在不支持浮点运算的硬件上,量化模型可以更有效地运行。
然而,参数量化也可能带来一些挑战,比如模型精度的下降,因为量化过程可能会导致信息的损失。因此,量化技术需要在模型效率和精度之间找到一个平衡点。
精度和模型性能
- LoRA:保持浮点精度,通常能够提供与全模型微调相当或接近的性能,尤其是在参数较少且任务与原始预训练任务相似的情况下。
- QLoRA:量化可能会引入一些精度损失,这可能导致模型性能略有下降。然而,这种损失通常很小,特别是在使用4位或更高位量化时。
推理速度和资源消耗
- LoRA:在推理时,由于参数数量的减少,LoRA可以提高推理速度并减少资源消耗。
- QLoRA:由于参数量化,QLoRA在推理时可能会更加高效,特别是在不支持浮点运算或浮点运算效率较低的硬件上。
具体性能对比
- 在标准硬件上:LoRA和QLoRA的性能可能非常接近,但QLoRA可能在使用低精度运算的硬件上具有优势。
- 在移动或嵌入式设备上:QLoRA的性能通常优于LoRA,因为它更适合资源受限的环境。
- 在特定任务上:对于某些任务,量化可能对模型性能的影响较小,因此QLoRA可能接近或达到LoRA的性能。
实际应用中的考量
点击一文读懂「LoRA」:大型语言模型的低秩适应查看全文。
相关文章:
一文读懂「LoRA」:大型语言模型的低秩适应
LoRA: Low-Rank Adaptation of Large Language Models 前言 LoRA作为大模型的微调框架十分实用,在LoRA出现以前本人都是通过手动修改参数、优化器或者层数来“炼丹”的,具有极大的盲目性,但是LoRA技术能够快速微调参数,如果LoRA…...
新车月交付突破2万辆!小鹏汽车“激活”智驾之困待解
首次突破月交付2万辆规模的小鹏汽车,稳吗? 本周,高工智能汽车研究院发布的最新监测数据显示,2024年11月,小鹏汽车在国内市场(不含出口)交付量(上险口径,下同)…...
dockerfile 中 #(nop)
在 Dockerfile 中,#(nop) 通常出现在 docker history 命令的输出中。以下是对它的详细解释: 背景 当你使用 docker history <image_name> 命令查看 Docker 镜像的构建历史时,你可能会看到 #(nop) 这样的标记。这是因为 Docker 镜像由…...
升级 Spring Boot 3 配置讲解 —— 为何 SpringBoot3 淘汰了 JDK8?
学会这款 🔥全新设计的 Java 脚手架 ,从此面试不再怕! 随着 Spring Boot 3 的发布,许多开发者发现了一个重要的变化:Spring Boot 3 不再支持 JDK 8。这一变化引发了不少讨论,尤其是对于那些仍然在使用 JDK …...
IT面试求职系列主题-人工智能(一)
想成功求职,必要的IT技能一样不能少,再从人工智能基础知识来一波吧。 1)您对人工智能的理解是什么? 人工智能是计算机科学技术,强调创造能够模仿人类行为的智能机器。这里智能机器可以定义为能够像人一样行动、像人一…...
JVM 优化指南
JVM 优化指南 1. JVM 参数配置 1.1 基础参数配置 设置堆内存大小 -Xms2048m -Xmx2048m 设置新生代大小 -Xmn1024m 设置元空间大小 -XX:MetaspaceSize256m -XX:MaxMetaspaceSize256m 设置线程栈大小 -Xss512k1.2 垃圾回收器配置 使用 G1 垃圾回收器 -XX:UseG1GC 设置期望停顿…...
windows下编写的shell脚本在Linux下执行有问题解决方法
前言: 这个问题在实际工作中经常会遇到(非语法错误),脚本来源有些是自己在windows系统编写的、有些是从别人那里copy来的,还有些原本是好的被别人拿到windows下修改了一些内容,总之各种场景,但是如果是一个内容比较多的…...
使用 SQL 和表格数据进行问答和 RAG(6)—将指定目录下的 CSV 或 Excel 文件导入 SQLite 数据库
将指定目录下的 CSV 或 Excel 文件导入 SQLite 数据库。以下是详细代码逻辑: 1. 类结构 该类包含三个主要方法: _prepare_db:负责将文件夹中的 CSV 和 XLSX 文件转换为 SQL 表。_validate_db:用于验证 SQL 数据库中创建的表是否…...
【算法】算法大纲
这篇文章介绍计算机算法的各个思维模式。 包括 计数原理、数组、树型结构、链表递归栈、查找排序、管窥算法、图论、贪心法和动态规划、以及概率论:概率分治和机器学习。没有办法逐个说明,算法本身错综复杂,不同的算法对应着不同的实用场景,也需要根据具体情况设计与调整。…...
vue(2,3), react (16及以上)开发者工具资源
在前端开发的广阔领域中,Vue.js 和 React.js 作为两大主流框架,各自拥有庞大的用户群体和丰富的生态系统。为了帮助开发者更高效地进行调试和开发,Vue Devtools 和 React 开发者工具应运而生,成为这两个框架不可或缺的辅助工具。本…...
系统编程(网络,文件基础)
网络链接 虚拟机和主机之间网络连接的主要模式有三种,分别是桥接模式(Bridged)、网络地址转换模式(NAT)以及主机模式(Host-Only)。以下是这三种模式的详细解释: 一、桥接模式&…...
重温设计模式--13、策略模式
策略模式介绍 文章目录 策略模式介绍C 代码示例 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。该模式将算法的定义和使用分离开来,使得算法可以独立于使用它的客户端而变化,提高了代码的灵活性和可维护性。 其主要包含以下几个…...
数字IC设计高频面试题
在数字IC设计领域,面试是评估候选人技术能力和问题解决能力的重要环节。数字IC设计的复杂性和要求在不断提高。面试官通常会提出一系列面试题,以考察应聘者在数字设计、验证、时钟管理、功耗优化等方面的专业知识和实践经验。 这些题目不仅涉及理论知识…...
C#异步多线程——ThreadPool线程池
C#实现异步多线程的方式有多种,以下总结的是ThreadPool的用法。 线程池的特点 线程池受CLR管理,线程的生命周期,任务调度等细节都不需要我们操心了,我们只需要专注于任务实现,使用ThreadPool提供的静态方法把我们的任…...
矩母函数(MGF)
矩母函数(MGF)简介 矩母函数(Moment Generating Function,MGF)是概率统计中描述随机变量分布特征的重要工具。MGF的主要用途是通过导数来计算随机变量的矩(比如均值、方差等),同时它…...
【技术支持】安卓无线adb调试连接方式
Android 10 及更低版本,需要借助 USB 手机和电脑需连接在同一 WiFi 下;手机开启开发者选项和 USB 调试模式,并通过 USB 连接电脑(即adb devices可以查看到手机);设置手机的监听adb tcpip 5555;拔掉 USB 线…...
OpenCV相机标定与3D重建(46)将三维空间中的点投影到二维图像平面上函数projectPoints()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将3D点投影到图像平面上。 cv::projectPoints 是 OpenCV 库中的一个函数,用于将三维空间中的点投影到二维图像平面上。这个过程涉及到…...
Android wifi常见问题及分析
参考 Android Network/WiFi 那些事儿 前言 本文将讨论几个有意思的网络问题,同时介绍 Android 上常见WiFi 问题的分析思路。 网络基础Q & A 一. 网络分层缘由 分层想必大家很熟悉,是否想过为何需要这样分层? 网上大多都是介绍每一层…...
如何用 ESP32-CAM 做一个实时视频流服务器
文章目录 ESP32-CAM 概述ESP32-S 处理器内存Camera 模块MicroSD 卡槽天线板载 LED 和闪光灯其他数据手册和原理图ESP32-CAM 功耗 ESP32-CAM 引脚参考引脚排列GPIO 引脚哪些 GPIO 可以安全使用?GPIO 0 引脚MicroSD 卡引脚 ESP32-CAM 的烧录方式使用 ESP32-CAM-MB 编程…...
编译与汇编
本文来自《程序员的自我修养》 编译过程是把预处理完的文件进行一系列词法分析,语法分析,语义分析以及优化后生成相应的汇编文件代码。 现在版本的GCC把预编译和编译两个步骤合并为一个步骤。 gcc -S HelloWorld.c HelloWorld.sint main() {//test/* …...
Linux入门攻坚——43、keepalived入门-1
Linux Cluster(Linux集群的类型):LB、HA、HPC,分别是负载均衡集群、高可用性集群、高性能集群。 LB:lvs,nginx HA:keepalived,heartbeat,corosync,cman HP&am…...
备考蓝桥杯:顺序表相关算法题
目录 询问学号 寄包柜 移动0 颜色分类 合并两个有序数组 物品移动 询问学号 我们的思路:创建一个顺序表存储从1开始依次存放进入教室的学生学号,然后查询 #include <iostream> #include <vector> using namespace std; const int N 2…...
【STM32+QT项目】基于STM32与QT的智慧粮仓环境监测与管理系统设计(完整工程资料源码)
视频演示: 基于STM32与QT的智慧粮仓环境监测与管理系统设计 目录: 目录 视频演示: 目录: 前言:...
Vue3 自定义hook
文章目录 Vue3 自定义hook概述用法 Vue3 自定义hook 概述 Vue3推荐利用Vue的组合式API函数进行代码封装,这种封装方式统称为自定义hook。 用法 定义 hook/countHook.js: import {computed, ref, watch} from "vue";export default (initC…...
【VBA】【EXCEL】将某列内容横向粘贴到指定行
Sub CopyRowToColumn()On Error GoTo ErrorHandler 添加错误处理Application.ScreenUpdating FalseApplication.Calculation xlCalculationManualApplication.EnableEvents False 禁用事件处理Dim lastCol As LongDim lastRow As LongDim i As Long, colCount As LongDim …...
使用Llama 3.1创建合成数据集以调优你的大型语言模型
使用Llama 3.1创建合成数据集以调优你的大型语言模型 在数据驱动的人工智能领域,数据是核心资产。开发高质量数据集既复杂又昂贵,因此很多实验室和开发者选择使用合成数据集。本文将介绍如何利用大型语言模型Llama 3.1 405B创建合成数据集,并…...
【Ubuntu22.04】VMware虚拟机硬盘扩容
1.首先打开虚拟机设置 2.根据需要对硬盘扩展 这边提示我们还需要进入虚拟机在内部分区 3.安装界面化磁盘管理工具 # 安装 sudo apt install gparted# 启动 sudo gparted调整硬盘大小 调整的时候会提示我们硬盘是只读的,因此还要进行操作 新建终端重新挂载文件系…...
初学stm32 --- DMA直接存储器
目录 DMA介绍 STM32F1 DMA框图 DMA处理过程 DMA通道 DMA优先级 DMA相关寄存器介绍 F1 DMA通道x配置寄存器(DMA_CCRx) DMA中断状态寄存器(DMA_ISR) DMA中断标志清除寄存器(DMA_IFCR) DMA通道x传输…...
reactor中的并发
1. reactor中的并发有两种方式 1.1 flatmap,底层是多线程并发处理。在reactor的演讲中,flatmap对于io类型的并发效果较好. flamap有两个参数: int concurrency, int prefetch。分别代表并发的线程数和缓存大小 注意凡是参数中有prefetch的,都…...
HTML - <script>,<noscript>
<script>标签用于在网页插入脚本,<noscript>标签用于指定浏览器不支持脚本时的显示内容。 1.<script> <script>用于加载脚本代码,目前主要是加载 JavaScript 代码。 <script> console.log(hello world); </script&g…...
C#语言的函数实现
C#语言的函数实现 在现代编程语言中,函数(Function)是最基本也是最重要的组成部分之一。函数不仅提高了代码的复用性,还使得程序结构更清晰。C#作为一种多用途的编程语言,函数的知识是程序员必备的基本技能之一。本文…...
JAVA I/O流练习1
往D盘中的JAVA复习文件夹中写数据: 数据改了一下哈: import java.io.*; import java.util.Scanner; public class Test {public static void main(String[] args) throws IOException {String fileName"D:JAVA复习\\grade.txt";FileWriter w…...
HTML——75. 内联框架
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>内联框架</title><style type"text/css">iframe{width: 100%;height: 500px;}</style></head><body><!--iframe元素会创建包含…...
js获取当前浏览器地址,ip,端口号等等
前言: js获取当前浏览器地址,ip,端口号等等 window.location属性查询 具体属性: 1、获取他的ip地址 window.location.hostname 2、获取他的端口号 window.location.port 3、获取他的全路径 window.location.origin 4、获取…...
C++虚函数(八股总结)
什么是虚函数 虚函数是在父类中定义的一种特殊类型的函数,允许子类重写该函数以适应其自身需求。虚函数的调用取决于对象的实际类型,而不是指针或引用类型。通过将函数声明为虚函数,可以使继承层次结构中的每个子类都能够使用其自己的实现&a…...
【每日学点鸿蒙知识】跳转三方地图、getStringSync性能、键盘避让模式等
1、跳转三方地图导航页 类似于Android 跳转到地图APP 导航页面: // 目标地点的经纬度和名称 double destinationLat 36.547901; double destinationLon 104.258354; String destinationName "目的地名称"; // 构建URI Uri uri Uri.parse("…...
【线性代数】通俗理解特征向量与特征值
这一块在线性代数中属于重点且较难理解的内容,下面仅个人学习过程中的体会,错误之处欢迎指出,有更简洁易懂的理解方式也欢迎留言学习。 文章目录 概念计算几何直观理解意义 概念 矩阵本身就是一个线性变换,对一个空间中的向量应用…...
C#设计模式(行为型模式):备忘录模式,时光倒流的魔法
C#设计模式:备忘录模式,时光倒流的魔法 在软件开发中,我们经常会遇到需要保存对象状态,并在未来某个时刻恢复的场景。例如: 撤销操作: 文本编辑器中的撤销功能,游戏中的回退操作。事务回滚&am…...
服务器信息整理:用途、操作系统安装日期、设备序列化、IP、MAC地址、BIOS时间、系统
文章目录 引言I BIOS时间Windows查看BIOS版本安装日期linux查看BIOS时间II 操作系统安装日期LinuxWindowsIII MAC 地址IV 设备序列号Linux 查看主板信息知识扩展Linux常用命令引言 信息内容:重点信息:用途、操作系统安装日期、设备序列化、IP、MAC地址、BIOS时间、系统 Linux…...
用OpenCV实现UVC视频分屏
分屏 OpencvUVC代码验证后话 用OpenCV实现UVC摄像头的视频分屏。 Opencv opencv里有很多视频图像的处理功能。 UVC Usb 视频类,免驱动的。视频流格式有MJPG和YUY2。MJPG是RGB三色通道的。要对三通道进行分屏显示。 代码 import cv2 import numpy as np video …...
【C#学习】基类的静态变量 派生类会如何处理
来源GPT,仅记录学习 在C#中,子类继承父类的public static变量时,父类的静态变量对所有类(包括子类)都是共享的。子类并不会重新创建父类静态变量,而是共享父类的静态成员。 具体行为: 静态变量…...
Unity3D仿星露谷物语开发19之库存栏丢弃及交互道具
1、目标 从库存栏中把道具拖到游戏场景中,库存栏中道具数相应做减法或者删除道具。同时在库存栏中可以交换两个道具的位置。 2、UIInventorySlot设置Raycast属性 在UIInventorySlot中,我们只希望最外层的UIInventorySlot响应Raycast,他下面…...
SQL进阶实战技巧:如何利用 Oracle SQL计算线性回归置信区间?
目录 1 置信区间计算方法 步骤1:计算回归系数 步骤2:计算标准误差 步骤3:计算置信区间 2 数据准备 <...
计算机网络——网络层—IP数据报与分片
一、IP 数据报的格式 • 一个 IP 数据报由首部和数据两部分组成。 • 首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。 • 在首部的固定部分的后面是一些可选字段,其长度是可变的。 IP 数据报首部的固定部分中的各字段 版…...
高山旅游景区有效降低成本,无人机山下到山上物资吊运技术详解
在高山旅游景区,传统的物资运输方式往往面临人力成本高昂、效率低下等问题,而无人机技术的引入为这一难题提供了新的解决方案。以下是对无人机从山下到山上进行物资吊运技术的详细解析: 一、无人机物资吊运技术的优势 1. 降低人力成本&#…...
Linux 注册线程化的中断处理程序
1. 注册线程化中断处理函数 devmem_request_threaded_irq 是 Linux 内核中的一个函数,用于请求并注册一个线程化的中断处理程序。这个函数允许开发者注册一个中断处理函数,这个函数会在中断发生时被调用,从而实现相应的中断处理逻辑。它通过…...
【狂热算法篇】解锁数据潜能:探秘前沿 LIS 算法
嘿,各位编程爱好者们!今天带来的 LIS 算法简直太赞啦 无论你是刚入门的小白,还是经验丰富的大神,都能从这里找到算法的奇妙之处哦!这里不仅有清晰易懂的 C 代码实现,还有超详细的算法讲解,让你轻…...
Linux: 关于 mount 的一些细节
文章目录 1. 前言2. mount 的主要细节 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. mount 的主要细节 mount 从系统调用 sys_mount() 发起,如 mount -t tmpfs cgroup /sys/fs/cg…...
CSS3——3. 书写格式二
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><!--css书写:--><!--1. 属性名:属性值--><!--2.属性值是对属性的相关描述--><!--3.属性名必须是…...
Java-JVM详解
Java-JVM ①JVM概述 ❶基本介绍 JVM:全称 Java Virtual Machine,一个虚拟计算机,Java 程序的运行环境(Java二进制字节码的运行环境) 特点: Java 虚拟机基于二进制字节码执行,由一套字节码指…...