当前位置:   article > 正文

使用PEFT插入LoRA或DoRA模块方法以及解决’cuda out of memory’问题_peft dora

peft dora

使用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)
  • 1
  • 2
  • 3

我将我模型里面含有关键字’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'
  • 1
  • 2

发现修改后的模型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")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

解决爆显存的问题

我刚开始以为是我更新梯度的参数过多,减少之后还是爆显存,然后我看了PEFT的issue发现有人也是同样的问题,然后我觉得可能是版本的问题,于是我找到上一个版本,刚好也有DoRA,于是我重新安装PEFT包

  • 有问题的版本:v0.10.0
  • 重新安装的版本:v0.9.0
    # 解压包,进入包里面执行  
    python setup.py install
    
    • 1
    • 2
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号