使用PEFT插入LoRA或DoRA模块方法以及解决’cuda out of memory’问题
使用方法
在我们定义好自己的模型以及LoRA配置后,使用函数将LoRA模块加入到model里面去。
下面是我的使用的代码
from peft import LoraConfig,get_peft_model
lora_config=LoraConfig(r=16,target_modules=['qkv'],bias='all',use_dora=True)
model=get_peft_model(model,peft_config=lora_config)
我将我模型里面含有关键字’qkv’的线性层加入DoRA
但是由于模型改变后,key也改变了,导致以前的权重加不去,所以我打印出来对比以前保存的权重文件的key以及现在model的key
'backbone.0.layers.0.blocks.0.attn.qkv.weight'
'base_model.model.backbone.0.layers.0.blocks.0.attn.qkv.base_layer.weight'
发现修改后的模型key前面全部被加上了’base_model.model.‘,而且被添加DoRA的层原始的key被加上了’base_layer.’,所以我将权重的key变成对应的形式,重新保存为一个权重文件,下面是我的代码
import os, sys
import torch
model_checkpoint_path = "origin_checkpoint.pth"
checkpoint = torch.load(model_checkpoint_path, map_location='cpu')["model"]
l=['qkv']
backbone_dict={}
for k,v in checkpoint.items():
if any(s in k for s in l):
if '.weight' in k:
k=k.replace('.weight','.base_layer.weight')
elif '.bias' in k:
k=k.replace('.bias','.base_layer.bias')
k1='base_model.model.'+k
backbone_dict[k1]=v
dict={"model":backbone_dict}
torch.save(dict, "new_checkpoint.pth")
解决爆显存的问题
我刚开始以为是我更新梯度的参数过多,减少之后还是爆显存,然后我看了PEFT的issue发现有人也是同样的问题,然后我觉得可能是版本的问题,于是我找到上一个版本,刚好也有DoRA,于是我重新安装PEFT包
- 有问题的版本:v0.10.0
- 重新安装的版本:v0.9.0
# 解压包,进入包里面执行 python setup.py install