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()
相关推荐
Y1nhl11 分钟前
搜广推校招面经八十一
开发语言·人工智能·pytorch·深度学习·机器学习·推荐算法·搜索算法
胡攀峰11 分钟前
第12章 微调生成模型
人工智能·大模型·llm·sft·强化学习·rlhf·指令微调
yuanlaile12 分钟前
AI大模型自然语言处理能力案例演示
人工智能·ai·自然语言处理
小白白搭建16 分钟前
WordPress AI 原创文章自动生成插件 24小时全自动生成SEO原创文章 | 多语言支持 | 智能配图与排版
人工智能
Jamence18 分钟前
多模态大语言模型arxiv论文略读(三十九)
人工智能·语言模型·自然语言处理
ai大模型木子42 分钟前
嵌入模型(Embedding Models)原理详解:从Word2Vec到BERT的技术演进
人工智能·自然语言处理·bert·embedding·word2vec·ai大模型·大模型资料
细心的莽夫42 分钟前
SpringCloud 微服务复习笔记
java·spring boot·笔记·后端·spring·spring cloud·微服务
BOB-wangbaohai2 小时前
Flowable7.x学习笔记(十三)查看部署流程图
笔记·学习·流程图
普if加的帕3 小时前
java Springboot使用扣子Coze实现实时音频对话智能客服
java·开发语言·人工智能·spring boot·实时音视频·智能客服
KoiC3 小时前
Dify接入RAGFlow无返回结果
人工智能·ai应用