hugging face笔记:PEFT

1 介绍

  • PEFT (Parameter-Efficient Fine Tuning) 方法在微调时冻结预训练模型参数,并在其上添加少量可训练的参数(称为适配器)
  • 这些适配器被训练用来学习特定任务的信息。
  • 这种方法已被证明在内存效率和计算使用上非常高效,同时能产生与完全微调模型相当的结果
  • 使用PEFT训练的适配器通常比完整模型小一个数量级,这使得分享、存储和加载它们变得非常方便。
    • 例如,一个OPTForCausalLM模型的适配器权重在Hub上的存储只有约6MB
    • 相比之下,完整的模型权重可以达到约700MB。

2 加载 PEFT适配器

2.1 直接from_pretrained加载

  • 若要从 Transformers 加载和使用 PEFT 适配器模型,请确保 Hub 存储库或本地目录包含 adapter_config.json 文件和适配器权重
  • 然后,可以使用 AutoModel类加载 PEFT 适配器模型
python 复制代码
from transformers import AutoModelForCausalLM, AutoTokenizer

peft_model_id = "ybelkada/opt-350m-lora"
model = AutoModelForCausalLM.from_pretrained(peft_model_id)

2.2 load_adapter加载

python 复制代码
from transformers import AutoModelForCausalLM

model_id = "facebook/opt-350m"
peft_model_id = "ybelkada/opt-350m-lora"

model = AutoModelForCausalLM.from_pretrained(model_id)
model.load_adapter(peft_model_id)

2.3 以8位/4位加载

  • bitsandbytes 集成支持 8 位和 4 位精度数据类型,这对于加载大型模型非常有用,因为它节省了内存
  • 在 from_pretrained() 中添加 load_in_8bit 或 load_in_4bit 参数,并设置 device_map="auto" 以有效地将模型分配到你的硬件
python 复制代码
from transformers import AutoModelForCausalLM, AutoTokenizer

peft_model_id = "ybelkada/opt-350m-lora"
model = AutoModelForCausalLM.from_pretrained(peft_model_id, 
                                             device_map="auto", 
                                             load_in_8bit=True)

3 添加适配器

python 复制代码
from transformers import AutoModelForCausalLM
from peft import LoraConfig

model_id = "facebook/opt-350m"
model = AutoModelForCausalLM.from_pretrained(model_id)
#加载这个模型

lora_config = LoraConfig(
    target_modules=["q_proj", "k_proj"],
    init_lora_weights=False
)
'''
target_modules 参数指定了将 LoRA 适配器应用于模型的哪些部分

这里是 "q_proj"(查询投影)和 "k_proj"(键投影)

init_lora_weights 设置为 False,意味着在初始化时不加载 LoRA 权重
'''

model.add_adapter(lora_config, adapter_name="adapter_1")
#使用 add_adapter 方法将之前配置的 LoRA 适配器添加到模型中,适配器命名为 "adapter_1"


model.add_adapter(lora_config, adapter_name="adapter_2")
# 附加具有相同配置的新适配器"adapter_2"

4 设置使用哪个适配器

python 复制代码
# 使用 adapter_1
model.set_adapter("adapter_1")
output = model.generate(**inputs)
print(tokenizer.decode(output_disabled[0], skip_special_tokens=True))

# 使用 adapter_2
model.set_adapter("adapter_2")
output_enabled = model.generate(**inputs)
print(tokenizer.decode(output_enabled[0], skip_special_tokens=True))

5 启用和禁用适配器

一旦向模型添加了适配器,可以启用或禁用适配器模块

python 复制代码
from transformers import AutoModelForCausalLM, OPTForCausalLM, AutoTokenizer
from peft import PeftConfig

model_id = "facebook/opt-350m"
adapter_model_id = "ybelkada/opt-350m-lora"


tokenizer = AutoTokenizer.from_pretrained(model_id)
text = "Hello"
inputs = tokenizer(text, return_tensors="pt")
#加载分词器和初始化输入



model = AutoModelForCausalLM.from_pretrained(model_id)
peft_config = PeftConfig.from_pretrained(adapter_model_id)
'''
加载了预训练的基础模型 facebook/opt-350m 和适配器的配置。

PeftConfig.from_pretrained 方法用于加载预定义的适配器配置。
'''


peft_config.init_lora_weights = False
model.add_adapter(peft_config)
'''
在添加适配器前,设置 init_lora_weights = False 指明在初始化时不使用预训练的 LoRA 权重,
而是使用随机权重。

然后将适配器添加到模型中。
'''



model.enable_adapters()
output1 = model.generate(**inputs)
#启用适配器,然后使用启用了适配器的模型生成文本




model.disable_adapters()
output2 = model.generate(**inputs)
#禁用适配器后,再次生成文本以查看不使用适配器时模型的输出表现


tokenizer.decode(output1[0])
'''
'</s>Hello------------------'
'''

tokenizer.decode(output2[0])
'''
"</s>Hello, I'm a newbie to this sub. I'm looking for a good place to"
'''

6 训练PEFT适配器

6.1 举例:添加lora适配器

6.1.1 定义你的适配器配置

python 复制代码
from peft import LoraConfig

peft_config = LoraConfig(
    lora_alpha=16,
    lora_dropout=0.1,
    r=64,
    bias="none",
    task_type="CAUSAL_LM",
)
  • lora_alpha=16:指定 LoRA 层的缩放因子。
  • lora_dropout=0.1:设置在 LoRA 层中使用的 dropout 比率,以避免过拟合。
  • r=64:设置每个 LoRA 层的秩,即低秩矩阵的维度。
  • bias="none":指定不在 LoRA 层中使用偏置项。
  • task_type="CAUSAL_LM":设定这个 LoRA 配置是为了因果语言模型任务。

6.1.2 将适配器添加到模型

python 复制代码
model.add_adapter(peft_config)

6.1.3将模型传递给 Trainer以进行训练

python 复制代码
from transformers import Trainer
trainer = Trainer(model=model, ...)
trainer.train()
相关推荐
被制作时长两年半的个人练习生5 分钟前
【pytorch】权重为0的情况
人工智能·pytorch·深度学习
Elastic 中国社区官方博客20 分钟前
使用 Vertex AI Gemini 模型和 Elasticsearch Playground 快速创建 RAG 应用程序
大数据·人工智能·elasticsearch·搜索引擎·全文检索
说私域1 小时前
地理定位营销与开源AI智能名片O2O商城小程序的融合与发展
人工智能·小程序
alfiy1 小时前
Elasticsearch学习笔记(四) Elasticsearch集群安全配置一
笔记·学习·elasticsearch
向上的车轮1 小时前
Django学习笔记十一:部署程序
笔记·学习·django
Q_w77421 小时前
计算机视觉小目标检测模型
人工智能·目标检测·计算机视觉
创意锦囊1 小时前
ChatGPT推出Canvas功能
人工智能·chatgpt
知来者逆1 小时前
V3D——从单一图像生成 3D 物体
人工智能·计算机视觉·3d·图像生成
alfiy2 小时前
Elasticsearch学习笔记(五)Elastic stack安全配置二
笔记·学习·elasticsearch
pumpkin845142 小时前
CXO、CRO、CMO、CDMO相关概念
笔记