Lora训练的参数和性能

lora · 浏览次数 : 10

小编点评

**实验结果** | 模块 | 参数量 | 前向传播时间 | 训练反向传播时间 | |---|---|---|---| | 基础模型 | 881 | 0.002 | 0.002 | | Lora模块 | 1,161 | 0.005 | 0.002 | **结论** * 在正常情况下,增加Lora模块是会增加参数量的,因此前向传播和反向传播的时间也会增加。 * 大语言模型训练情况下,因为基础模型本身参数量非常大,Lora模块增加的参数量相对非常小。 * 并且,基础模型不参与梯度更新,可以做模型量化,实际上是能减少模型训练时间和显存使用量的。

正文

主要为了测试模型增加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训练的参数和性能相似的内容:

Lora训练的参数和性能

主要为了测试模型增加Lora模块后,参数量和训练速度的变化情况。结论:正常情况下,增加Lora模块是会增加参数量的,因此前向传播和反向传播的时间也会增加。但是,在大语言模型训练的情况下,因为基础模型本身参数量非常大,Lora模块增加的参数量相对非常小。并且,基础模型不参与梯度更新,可以做模型量化,实

大模型高效微调-LoRA原理详解和训练过程深入分析

博客首发于我的知乎,详见:https://zhuanlan.zhihu.com/p/702629428 一、LoRA原理 LoRA(Low-Rank Adaptation of LLMs),即LLMs的低秩适应,是参数高效微调最常用的方法。 LoRA的本质就是用更少的训练参数来近似LLM全参数微调所

基于 P-Tuning v2 进行 ChatGLM2-6B 微调实践

微调类型简介 1. SFT监督微调:适用于在源任务中具有较高性能的模型进行微调,学习率较小。常见任务包括中文实体识别、语言模型训练、UIE模型微调。优点是可以快速适应目标任务,但缺点是可能需要较长的训练时间和大量数据。 2. LoRA微调:通过高阶矩阵秩的分解减少微调参数量,不改变预训练模型参数,新

Llama2-Chinese项目:3.2-LoRA微调和模型量化

提供LoRA微调和全量参数微调代码,训练数据为data/train_sft.csv,验证数据为data/dev_sft.csv,数据格式为"Human: "+问题+"\nAssistant: "+答案。本文主要介绍Llama-2-7b模型LoRA微调以及4bit量化的实践过程。

【AI 模型】首个 Joy 模型诞生!!!全民生成 Joy 大片

经过这段时间无数次的探索、试错、实验,最终积累了非常多的训练经验,在不同IP角色的训练上实际上需要调试非常多的参数以及素材。本次成功完成了Joy的Lora模型,虽然在泛化以及场景上未来还有着很多的空间,但是本次的模型已经可以帮助完成大部分的运用场景,无论是设计师,还是产品,还是运营,还是研发,都可以...

Llama2-Chinese项目:3.1-全量参数微调

提供LoRA微调和全量参数微调代码,训练数据为data/train_sft.csv,验证数据为data/dev_sft.csv,数据格式如下所示: "Human: "+问题+"\nAssistant: "+答案 举个例子,如下所示: Human: 用一句话描述地球为什么是独

Llama2-Chinese项目:2.3-预训练使用QA还是Text数据集?

Llama2-Chinese项目给出pretrain的data为QA数据格式,可能会有疑问pretrain不应该是Text数据格式吗?而在Chinese-LLaMA-Alpaca-2和open-llama2预训练使用的LoRA技术,给出pretrain的data为Text数据格式。所以推测应该pre

大模型高效微调详解-从Adpter、PrefixTuning到LoRA

一、背景 目前NLP主流范式是在大量通用数据上进行预训练语言模型训练,然后再针对特定下游任务进行微调,达到领域适应(迁移学习)的目的。 指令微调是预训练语言模型微调的主流范式 其目的是尽量让下游任务的形式尽量接近预训练任务,从而减少下游任务和预训练任务之间的Gap, 实现预训练语言模型适应下游任务,

LLM微调方法(Efficient-Tuning)六大主流方法:思路讲解&优缺点对比[P-tuning、Lora、Prefix tuing等]

LLM微调方法(Efficient-Tuning)六大主流方法:思路讲解&优缺点对比[P-tuning、Lora、Prefix tuing等] 由于LLM参数量都是在亿级以上,少则数十亿,多则数千亿。当我们想在用特定领域的数据微调模型时,如果想要full-tuning所有模型参数,看着是不太实际,一

【转帖】调教LLaMA类模型没那么难,LoRA将模型微调缩减到几小时

https://www.thepaper.cn/newsDetail_forward_23250236 LoRA 微调方法,随着大模型的出现而走红。 最近几个月,ChatGPT 等一系列大语言模型(LLM)相继出现,随之而来的是算力紧缺日益严重。虽然人人都想打造专属于自己的大模型,但是能负担得起上亿