dw做网站首页,百度扫一扫网页版,网站被别人做了跳转,凡科网官网登录入口1 介绍
PEFT (Parameter-Efficient Fine Tuning) 方法在微调时冻结预训练模型参数#xff0c;并在其上添加少量可训练的参数#xff08;称为适配器#xff09;这些适配器被训练用来学习特定任务的信息。这种方法已被证明在内存效率和计算使用上非常高效#xff0c;同时能产…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 适配器模型
from transformers import AutoModelForCausalLM, AutoTokenizerpeft_model_id ybelkada/opt-350m-lora
model AutoModelForCausalLM.from_pretrained(peft_model_id)2.2 load_adapter加载
from transformers import AutoModelForCausalLMmodel_id facebook/opt-350m
peft_model_id ybelkada/opt-350m-loramodel 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_mapauto 以有效地将模型分配到你的硬件
from transformers import AutoModelForCausalLM, AutoTokenizerpeft_model_id ybelkada/opt-350m-lora
model AutoModelForCausalLM.from_pretrained(peft_model_id, device_mapauto, load_in_8bitTrue)3 添加适配器
from transformers import AutoModelForCausalLM
from peft import LoraConfigmodel_id facebook/opt-350m
model AutoModelForCausalLM.from_pretrained(model_id)
#加载这个模型lora_config LoraConfig(target_modules[q_proj, k_proj],init_lora_weightsFalse
)target_modules 参数指定了将 LoRA 适配器应用于模型的哪些部分这里是 q_proj查询投影和 k_proj键投影init_lora_weights 设置为 False意味着在初始化时不加载 LoRA 权重
model.add_adapter(lora_config, adapter_nameadapter_1)
#使用 add_adapter 方法将之前配置的 LoRA 适配器添加到模型中适配器命名为 adapter_1model.add_adapter(lora_config, adapter_nameadapter_2)
# 附加具有相同配置的新适配器adapter_24 设置使用哪个适配器
# 使用 adapter_1
model.set_adapter(adapter_1)
output model.generate(**inputs)
print(tokenizer.decode(output_disabled[0], skip_special_tokensTrue))# 使用 adapter_2
model.set_adapter(adapter_2)
output_enabled model.generate(**inputs)
print(tokenizer.decode(output_enabled[0], skip_special_tokensTrue))5 启用和禁用适配器
一旦向模型添加了适配器可以启用或禁用适配器模块
from transformers import AutoModelForCausalLM, OPTForCausalLM, AutoTokenizer
from peft import PeftConfigmodel_id facebook/opt-350m
adapter_model_id ybelkada/opt-350m-loratokenizer AutoTokenizer.from_pretrained(model_id)
text Hello
inputs tokenizer(text, return_tensorspt)
#加载分词器和初始化输入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])/sHello------------------
tokenizer.decode(output2[0])/sHello, Im a newbie to this sub. Im looking for a good place to6 训练PEFT适配器
6.1 举例添加lora适配器
6.1.1 定义你的适配器配置
from peft import LoraConfigpeft_config LoraConfig(lora_alpha16,lora_dropout0.1,r64,biasnone,task_typeCAUSAL_LM,
)
lora_alpha16指定 LoRA 层的缩放因子。lora_dropout0.1设置在 LoRA 层中使用的 dropout 比率以避免过拟合。r64设置每个 LoRA 层的秩即低秩矩阵的维度。biasnone指定不在 LoRA 层中使用偏置项。task_typeCAUSAL_LM设定这个 LoRA 配置是为了因果语言模型任务。
6.1.2 将适配器添加到模型
model.add_adapter(peft_config)6.1.3将模型传递给 Trainer以进行训练
from transformers import Trainer
trainer Trainer(modelmodel, ...)
trainer.train()