主要为了测试模型增加Lora模块后,参数量和训练速度的变化情况。
结论:正常情况下,增加Lora模块是会增加参数量的,因此前向传播和反向传播的时间也会增加。
但是,在大语言模型训练的情况下,因为基础模型本身参数量非常大,Lora模块增加的参数量相对非常小。并且,基础模型不参与梯度更新,可以做模型量化,实际上是能减少模型训练时间和显存使用量的。
以下是实验脚本和运行结果:
#部分参考https://zhuanlan.zhihu.com/p/666000885
import time
import torch
from torch import nn
from peft import LoraConfig, get_peft_model, PeftModel
from torchsummary import summary x_train = torch.randn((1000, 10))
y_train = torch.randn((1000, 1)) net = nn.Sequential(
nn.Linear(10,20),
nn.Sigmoid(),
nn.Linear(20,30),
nn.Sigmoid(),
nn.Linear(30,1)
)
summary(net, (1,10)) config = LoraConfig(target_modules=["0"], r=2)
model = get_peft_model(net, config)
criterion = torch.nn.MSELoss(reduction='mean') # 定义损失函数,采用均方误差
optimizer = torch.optim.Adam(model.parameters(), lr=0.3) # 定义优化器,采用Adam
summary(model, (1,10)) # base 前向计算时间
start = time.time()
for i in range(100000):
y_pre = net(x_train) # 前向传播
print("base 前向计算时间: ", time.time() - start) # lora 前向计算时间
start = time.time()
for i in range(100000):
y_pre = model(x_train) # 前向传播
print("lora 前向计算时间", time.time() - start) # base 反向传播时间
start = time.time()
for i in range(1000):
y_pre = net(x_train) # 前向传播
loss = criterion(y_pre, y_train) # 计算损失
optimizer.zero_grad() # 梯度清零
loss.backward() # 反向传播
optimizer.step() # 使用优化器更新梯度
print("base loss after training: ", loss.item())
print("base 反向计算时间", time.time() - start) # lora 反向传播时间
start = time.time()
for i in range(1000):
y_pre = model(x_train) # 前向传播
loss = criterion(y_pre, y_train) # 计算损失
optimizer.zero_grad() # 梯度清零
loss.backward() # 反向传播
optimizer.step() # 使用优化器更新梯度
print("lora loss after training: ", loss.item())
print("lora 反向计算时间", time.time() - start)

  运行代码输出:

----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Linear-1 [-1, 1, 20] 220
Sigmoid-2 [-1, 1, 20] 0
Linear-3 [-1, 1, 30] 630
Sigmoid-4 [-1, 1, 30] 0
Linear-5 [-1, 1, 1] 31
================================================================
Total params: 881
Trainable params: 881
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.00
Params size (MB): 0.00
Estimated Total Size (MB): 0.00
----------------------------------------------------------------
----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Linear-1 [-1, 1, 20] 220
Identity-2 [-1, 1, 10] 0
Linear-3 [-1, 1, 2] 20
Linear-4 [-1, 1, 20] 40
Linear-5 [-1, 1, 20] 220
Sigmoid-6 [-1, 1, 20] 0
Linear-7 [-1, 1, 30] 630
Sigmoid-8 [-1, 1, 30] 0
Linear-9 [-1, 1, 1] 31
================================================================
Total params: 1,161
Trainable params: 60
Non-trainable params: 1,101
----------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.00
Params size (MB): 0.00
Estimated Total Size (MB): 0.01
----------------------------------------------------------------
base loss after training: 1.0724023580551147
base 反向计算时间 2.9570980072021484
lora loss after training: 1.0643658638000488
lora 反向计算时间 3.053032159805298

Lora训练的参数和性能的更多相关文章

  1. 训练超参数, 出现 Cannot use GPU in CPU-only Caffe 错误?

    当我们用MNIST手写体数字数据库和LeNet CNN 模型训练超参数,运行 examples/mnist/train_lenet.sh是出现Cannot use GPU in CPU-only Ca ...

  2. 05:Sysbench压测-innodb_deadlock_detect参数对性能的影响

    目录 sysbench压测-innodb_deadlock_detect参数对性能的影响 一.OLTP测试前准备 二.进行OLTP测试 三.测试结果解读: 四.关于测试后的结论: 五.关于测试后的性能 ...

  3. 04:Sysbench压测-innodb_flush_log_at_trx_commit,sync_binlog参数对性能的影响

    目录 sysbench压测-innodb_flush_log_at_trx_commit,sync_binlog参数对性能的影响 一.OLTP测试前准备 二.MySQL 数据落盘的过程 三.参数说明 ...

  4. [转帖]PostgreSQL 参数调整(性能优化)

    PostgreSQL 参数调整(性能优化) https://www.cnblogs.com/VicLiu/p/11854730.html 知道一个 shared_pool 文章写的挺好的 还没仔细看 ...

  5. Tomcat学习四步走:内核、集群、参数及性能

    主题简介: 内核实现原理 分布式集群 生产部署关键参数 性能监控和分析 一.内核实现原理 HTTP Web服务器与浏览器之间以HTTP协议通信,浏览器要访问服务器即向服务器发送HTTP请求报文. 如图 ...

  6. pytorch和tensorflow的爱恨情仇之定义可训练的参数

    pytorch和tensorflow的爱恨情仇之基本数据类型 pytorch和tensorflow的爱恨情仇之张量 pytorch版本:1.6.0 tensorflow版本:1.15.0 之前我们就已 ...

  7. C# 中的 in 参数和性能分析

    in 修饰符也是从 C# 7.2 开始引入的,它与我们上一篇中讨论的 <C# 中的只读结构体(readonly struct)>[1] 是紧密相关的. in 修饰符 in 修饰符通过引用传 ...

  8. IO模式设置网络编程常见问题总结—IO模式设置,阻塞与非阻塞的比较,recv参数对性能的影响—O_NONBLOCK(open使用)、IPC_NOWAIT(msgrcv)、MSG_DONTWAIT(re

    非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明:       基本概念: 阻塞IO:: socket 的阻塞模式 ...

  9. Linux内存管理-内核的shmall和shmmax参数(性能调优)(转)

    内核的shmall和shmmax参数 SHMMAX=配置了最大的内存segment的大小:这个设置的比SGA_MAX_SIZE大比较好. SHMMIN=最小的内存segment的大小 SHMMNI=整 ...

  10. PostgreSQL 参数调整(性能优化)

    昨天分别在外网和无外网环境下安装PostgreSQL,有外网环境下安装的相当顺利.但是在无外网环境下就是两个不同的概念了,可谓十有八折.感兴趣的同学可以搭建一下. PostgreSQL安装完成后第一件 ...

随机推荐

  1. Markdown文档图片展示问题解决方案

    微信不支持Markdown排版 目前来看微信公众号是不支持Markdown语法的,所以就会出现Markdown预览,复制在粘贴完成吧. 从资料收集来看有一款出现频率比较高的插件 Markdown ni ...

  2. windows系统cmd切换盘符路径命令失效

    问题描述:比如当我在C盘想切换到D盘的某个文件夹路径下时 只是输出了那个路径 但是并没有真的切换 这时候需要再多操作一步就会成功了

  3. Base64编码的全面介绍

    1. Base64的定义和作用 Base64是一种用64个字符表示二进制数据的编码方式,通常用于在网络传输中将二进制数据转换为可打印字符的形式.Base64编码后的数据由大小写字母.数字和特殊字符组成 ...

  4. #线段树、构造#A 或位运算

    题目 一个长度为\(n\)的非负整数序列, 需要满足\(m\)个区间或值为阈值的限制条件 现在要构造一个这样的序列,不存在输出No 分析 线段树支持区间与,但查询区间或,下传标记,那就很好做了 代码 ...

  5. #状压dp,背包,贪心#洛谷 5997 [PA2014]Pakowanie

    题目 你有 \(n\) 个物品和 \(m\) 个包.物品有重量,且不可被分割: 包也有各自的容量.要把所有物品装入包中,至少需要几个包? 分析 考虑物品的数量很小,首先优先选容量大的背包, 设\(f[ ...

  6. netty系列之:给ThreadLocal插上梦想的翅膀,详解FastThreadLocal

    目录 简介 从ThreadLocalMap中获取数据 FastThreadLocal 总结 简介 JDK中的ThreadLocal可以通过get方法来获得跟当前线程绑定的值.而这些值是存储在Threa ...

  7. Java 数据类型详解与类型转换技巧

    Java 数据类型 Java 中的变量必须是指定的数据类型: int myNum = 5; // 整数 float myFloatNum = 5.99f; // 浮点数 char myLetter = ...

  8. k8s之基于metallb实现LoadBalancer型Service

    一.实验说明 1.介绍 MetalLB 是裸机 Kubernetes 集群的负载均衡器实现,使用标准路由协议,主要用于暴露 K8s 集群的服务到集群外部访问,MetalLB 可以让我们在 K8s 集群 ...

  9. UE4下实现HTC Vive手柄拾取物品蓝图编程

    UE4下实现Vive手柄拾取物品 标签: UE4Vive游戏引擎 目录(?) [-] 创建拾取接口 实现接口 定义拾取 简单说下思路,首先定义拾取接口,然后在需要拾取的物品的蓝图类中实现该接口,最后在 ...

  10. 13_总结Vue数据监测

    总结: Vue监视数据的原理:         1.vue会监视data中所有层次的数据         2.如何监视对象中的数据?             通过setter实现监视,且要在new V ...