大模型平民化技术之LORA

news2024/12/22 9:31:42

1. 引言

在这篇博文中, 我将向大家介绍LoRA技术背后的核心原理以及相应的代码实现。

LoRA Low-Rank AdaptationLow-Rank Adaptors 的首字母缩写词,它提供了一种高效且轻量级的方法,用于微调预先训练好的的大语言模型。这包括 BERT RoBERTa 等掩码语言模型,以及 GPTLlamaMistral 等因果推断模型。

闲话少说,我们直接开始吧!

2. 优势分析

LoRA的主要优点之一是他们的效率。通过使用更少的参数,LoRA显著降低了模型训练过程中计算复杂性和显存使用量。这可以让我们在消费级的GPU上来训练大模型,并且可以便利地将我们训练好的LoRA权重(以兆为单位)分发给其他人。

此外,LoRA可以提升模型的泛化性。通过限制模型的复杂度,可以有助于防止在训练数据有限场景下的过拟合现象;由于LoRA至少保留了初始模型的能力,在处理一些新的,未见过的数据时更具有弹性。

最后,LoRA可以无缝地集成到现有的神经网络架构中。这种集成允许以最小的额外训练成本对预训练模型进行微调和调整,使其非常适合迁移学习应用。

3. 工作原理

LoRA 的基本思想是保持预训练矩阵(即原始模型的参数)冻结(即处于固定状态),并且只在原始矩阵中添加一个小的增量,其参数量比原始矩阵少很多。

例如,考虑矩阵 W,它可以是全连接层的参数,也可以是来Transformer中计算自注意力机制的矩阵之一:
在这里插入图片描述

显然,如果 Worig 的维数为 n×m,而假如我们只是初始化一个具有相同维数的新的增量矩阵进行微调,虽然我们也实现类似的功能,但是我们的参数量将会加倍。 LoRA使用的Trick就是通过训练低维矩阵 B A ,通过矩阵乘法来构造 ΔW ,来使 ΔW 的参数量低于原始矩阵。
在这里插入图片描述
这里我们不妨定义秩 r,它明显小于基本矩阵维度 r≪nr≪m。则矩阵 B n×r,矩阵 A r×m。将它们相乘会得到一个维度为 nxmW 矩阵,但构建的参数量减小了很多。

此外,我们希望我们的增量ΔW在训练开始时为零,这样微调就会从原始模型一样开始。因此,B 通常初始化为全零,而 A 初始化为随机值(通常呈正态分布)。

4. 举个栗子

我们不妨来看个直观的栗子,如下图所示:
在这里插入图片描述
想象一下,我们的基本维数是 1024,我们选择了 LoRA 的秩r为 4,则对于上述过程:
● 权重W的参数量为1024X1024≈1M
AB的参数量一致,均为rX1024≈4K,这样二者之和为8K
● 这样使用LoRA技术,在上述例子中我们仅仅需要训练0.8%的参数就可以更新我们的参数矩阵

5. LoRA指令速查

主要可查阅微软的官方文档Github: 戳我 , 由于封装的很好,目前该库页整合至 HuggingFace Parameter-Efficient Fine-Tuning (PEFT) 。

  • 如果模型要将特定层替换成 LoRA,需要调整模型的结构,但调用很简单:
# ===== Before =====
# layer = nn.Linear(in_features, out_features)
# ===== After ======
import loralib as lora
# Add a pair of low-rank adaptation matrices with rank r=16
layer = lora.Linear(in_features, out_features, r=16)
  • 在训练之前要把原本的LLM模型 Freeze 住,并且设定只有 LoRA 的参数是可训练的
import loralib as lora
model = BigModel()
# This sets requires_grad to False for all parameters without the string "lora_" in their names
lora.mark_only_lora_as_trainable(model)
# Training loop
for batch in dataloader:
  • 保存模型时也可以只储存LoRA所训练的权重,这特性将方便大家分享自己的权重
# ===== Before =====
# torch.save(model.state_dict(), checkpoint_path)
# ===== After =====
torch.save(lora.lora_state_dict(model), checkpoint_path)
  • 推理时读取 LoRA 或是原本 LLM 的权重时,要将 strict 设定为 False
# Load the pretrained checkpoint first
model.load_state_dict(torch.load('ckpt_pretrained.pt'), strict=False)
# Then load the LoRA checkpoint
model.load_state_dict(torch.load('ckpt_lora.pt'), strict=False)

6. SD-LoRA应用

近年来生成式 AI DALLE 再到 Stable-diffusion,都显示了现在的 AI 可以生成高质量以及高分辨率的图片,但是让人诟病的还是需要大量的运算资源才能够训练得了这种高分辨率的模型,因为要训练一个高分辨率的扩散模型是需要相当多内存的,即便 Stable-diffusion 将原本的 Pixel-level Diffusion 变成 Latent Diffusion Model 已经大幅降低训练的内存,但仍无法在单一张 11 GB 的 GPU 上训练,但现在不一样了,有人将 LoRA 技术整合到 Stable-diffusion,推出了 Stable Diffusion LoRA
在这里插入图片描述
整合 LoRAStable-diffusion 直接带来了以下的好处:

  • 训练快很多
  • 可在 11GB 显卡上直接进行训练
  • LoRA 权重的保存只有 3MB~200MB,易于分享

7. SD-LoRA更多资源

LoRA这项技术上的突破也使得Stable Diffusion 的社区多了许多生成模型,甚至可将模型上传至网站 CivitAI,可以看到上面有许多模型是使用 LoRA 进行训练的:

在这里插入图片描述
当然,网络上也有许多资源是使用 Colab 或是在个人 PC 上面生成/训练模型,最近 Stable diffusion 的社群已经开源相当多项目,并提供 GUI 界面,甚至不需要懂程序代码就可以训练好生成式 AI。

stable-diffusion-webui-colab

Kohya’s GUI, Support Windows

如果只是想来看看 Stable-diffusion 的人建议使用 WebUI,不仅能使用官方释出的模型,也可以直接登陆到 CivitAI,直接下载别人的训练好的生成模型:

在这里插入图片描述
在这里插入图片描述

8. 总结

共享大型的LLM模型是未来的趋势,如果要适应到某个具体任务上,只要训练LoRA模组即可,而这项技术也带来方便的替换性,未来大家只要分享LoRA的模型权重,就可以快速切换至不同的任务。

此外,LoRA通过大量降低训练参数,来大幅降低了硬体的训练门槛,并且与完全 Fine-tuning 的模型相比,推论速度的增加是相当少的。

9. 附录

本文重点参考链接如下:

[1] LoRA论文:戳我
[2] LoRA tutorial:戳我
[3] PEFT tutorial: 戳我
[4] Stable Diffusion Webui: 戳我
[5] ai-drawing: 戳我

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

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

相关文章

7-liunx服务器规范

目录 概况liunx日志liunx系统日志syslog函数openlog 可以改变syslog默认输出方式 ,进一步结构化 用户信息进程间的关系会话ps命令查看进程关系 系统资源限制改变工作目录和根目录服务器程序后台话 概况 liunx服务器上有很多细节需要注意 ,这些细节很重要…

C++的deque容器->基本概念、构造函数、赋值操作、大小操作、插入和删除、数据存取、排序

#include<iostream> using namespace std; #include <deque> //deque构造函数 void printDeque(const deque<int>& d) { for (deque<int>::const_iterator it d.begin(); it ! d.end(); it) { //*it 100; 容器中的数据不可以修…

【Java网络编程06】HTTPS原理

1. HTTPS基本概念 HTTPS&#xff1a;HTTPS也是一个应用层协议&#xff0c;它在HTTP协议的基础上引入了一个加密层——SSL协议&#xff0c;区别就在于HTTP协议是基于明文传输的&#xff08;不安全&#xff09;&#xff0c;使用HTTPS加密就能在一定程度上防止数据在传输过程中被…

高级语言期末2012级A卷

1.编写函数&#xff0c;输出任意正整数n的位数&#xff08;n默认为存储十进制的整形变量&#xff09; 例如&#xff1a;正整数13&#xff0c;则输出2,&#xff1b;正整数3088&#xff0c;则输出4 #include <stdio.h>int func(int n) {int count0;while(n>0) {n/10;co…

自学Python第十八天-自动化测试框架(二):DrissionPage、appium

自学Python第十八天-自动化测试框架&#xff08;二&#xff09;&#xff1a;DrissionPage、appium DrissionPage环境和安装配置准备工作简单的使用示例控制浏览器收发数据包模式切换 浏览器模式创建浏览器对象访问页面加载模式none 模式技巧 获取页面信息页面交互查找元素ele()…

【学网攻】 第(30)节 -- 综合实验三

系列文章目录 目录 系列文章目录 文章目录 前言 一、综合实验 二、实验 1.引入 实验目标 实验设备 实验拓扑图 实验配置 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节…

个人博客系列-环境配置-gitee(2)

注册gitee账户 地址&#xff1a;https://gitee.com/ 此步骤省略 新建仓库 执行以下命令 即可 拉取代码 创建目录 mkdir myCode && cd myCode 登录gitee找到项目&#xff0c;点击克隆&#xff0c;拉取代码 连接远程仓库命令 git remote add origin 仓库地址http…

负载均衡.

简介: 将请求/数据【均匀】分摊到多个操作单元上执行&#xff0c;负载均衡的关键在于【均匀】。 负载均衡的分类: 网络通信分类 四层负载均衡:基于 IP 地址和端口进行请求的转发。七层负载均衡:根据访问用户的 HTTP 请求头、URL 信息将请求转发到特定的主机。 载体维度分类 硬…

证件照(兼容H5,APP,小程序)

证件照由uniappuyui开发完成&#xff0c;并同时兼容H5、App、微信小程序、支付宝小程序&#xff0c;其他端暂未测试。 先看部分效果图吧具体可以下方复制链接体验demo 首页代码 <template><view class""><view class"uy-m-x-30 uy-m-b-20"…

2024移动应用的发展趋势,开发者如何抢占变现先机?

2024年对移动应用市场将是变革之年&#xff0c;社交媒体变现方式的瞬息万变&#xff0c;到人工智能的快速崛起&#xff0c;移动应用市场的换代速度逐渐加快&#xff0c;一些新的机遇也在出现。 data.ai推出的2024全球移动市场预测&#xff1a; •TikTok将打破应用商店支出的所…

Linux中的各类时间 与 find命令的常用参数

之前研究wal日志清理的副产物&#xff0c;wal日志名被修改后文件的哪个时间会变&#xff1f;应该如何删除&#xff1f;由此整理一下Linux中atime、mtime、ctime的区别&#xff0c;以及find的常见用法。 一、 Linux中的各类时间 1. 各类时间的定义 Linux中有三种用于文件时间戳…

基于springboot+vue的桂林旅游景点导游平台(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

3个精美的wordpress企业网站模板

WordPress企业网站模板 https://www.zhanyes.com/qiye/6305.html WordPress企业官网模板 https://www.zhanyes.com/qiye/6309.html WordPress律师模板 https://www.zhanyes.com/qiye/23.html

新代码质量评审标准与评分表格

前面发了一个《代码质量评审标准与评分表格》&#xff0c;是比较宽泛的&#xff0c;下面发一个更贴近具体场景的《新代码质量评审标准与评分表格》。 一、引言 本文档旨在为代码质量评审提供一个统一的标准和评分机制&#xff0c;以确保代码质量、可读性和可维护性。通过遵循这…

JAVA代码审计之XSS漏洞

Part1 漏洞案例demo&#xff1a; 没有java代码审计XSS漏洞拿赏金的案例。 所以将就看看demo吧 漏洞原理&#xff1a;关于XSS漏洞的漏洞原理核心其实没啥好说的&#xff0c;网上一查一大堆 反射性XSS漏洞 <% page language"java" contentType"text/html; c…

微服务远程调用Feign

目录 RPC概述 什么是Feign&#xff1f; Ribbon&Feign对比 Feign的设计架构 Spring Cloud Alibaba快速整合Feign Spring Cloud Feign扩展 日志配置 契约配置 通过拦截器实现参数传递 自定义拦截器实现认证逻辑 超时时间配置 RPC概述 微服务之间如何方便优雅的实…

【Linux进阶之路】Socket —— “UDP“ “TCP“

文章目录 一、再识网络1. 端口号2. 网络字节序列3.TCP 与 UDP 二、套接字1.sockaddr结构2.UDP1.server端1.1 构造函数1.2 Init1.3 Run 2.客户端1.Linux2.Windows 3.TCP1. 基本接口2. 客户端3. 服务端1.版本12.版本23.版本34.版本4 三、守护进程尾序 一、再识网络 1. 端口号 在…

给windows server安装nginx服务

一、先安装chocolatey https://chocolatey.org/install 二、查询nginx包 https://community.chocolatey.org/packages 三、安装nginx choco install nginx 四、通过命令行启动/关闭nginx net stop nginx net start nginx 我开发的chatgpt网站&#xff1a; https://chat.xut…

Unity中URP实现水效果(水的深度)

文章目录 前言一、搭建预备场景1、新建一个面片&#xff0c;使其倾斜一个角度&#xff0c;来模拟水底和岸边的效果2、随便创建几个物体&#xff0c;作为与水面接触的物体3、再新建一个面片&#xff0c;作为水面 二、开始编写水体的Shader效果1、新建一个URP基础Shader2、把水体…

【Java】类与对象(实验二)

目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 掌握类的定义与对象的创建。理解构造方法和this关键字的用法。掌握对象对于属性及方法的引用。 二、实验内容 1、编写一个Java程序&#xff0c;定义一个表示学生的类Student&#xff0c;该类包括: (1)这个类的…