作者:
时间:20240814
地点:hby
目的:英文版看着还是有障碍,不能像中文一样快速阅读
工具:文心
来源:https://huggingface.co/docs/peft/index
PEFT(参数高效微调)是一个库,旨在高效地使大型预训练模型适应各种下游应用,而无需微调模型的所有参数,因为这样做成本过高。PEFT方法仅微调一小部分(额外的)模型参数——这显著降低了计算和存储成本——同时实现了与完全微调模型相当的性能。这使得在消费级硬件上训练和存储大型语言模型(LLMs)变得更加可行。
PEFT与Transformers、Diffusers和Accelerate库集成,为加载、训练和使用大型模型进行推理提供了一种更快、更简便的方式。
QUICK START
PEFT为微调大型预训练模型提供了参数高效的方法。传统范式是为每个下游任务微调模型的所有参数,但由于当今模型中参数数量庞大,这种方法变得越来越昂贵且不切实际。相反,训练更少数量的提示参数(prompt parameters)或使用低秩适应(LoRA)等重参数化方法来减少可训练参数的数量,是更为高效的选择。
本快速指南将向您展示PEFT的主要功能,以及您如何在通常无法在消费者设备上访问的大型模型上进行训练或推理。
训练
每个PEFT方法都通过一个PeftConfig类来定义,该类存储了构建PeftModel所需的所有重要参数。例如,若要使用LoRA进行训练,您需要加载并创建一个LoraConfig类,并指定以下参数:
task_type:训练的任务类型(在这种情况下是序列到序列的语言建模)
inference_mode:是否使用模型进行推理
r:低秩矩阵的维度
lora_alpha:低秩矩阵的缩放因子
lora_dropout:LoRA层的dropout概率
这些参数对于配置LoRA层的训练和性能至关重要。r的值控制了低秩矩阵的大小,从而影响可训练参数的数量和模型的性能。lora_alpha用于调整低秩矩阵对原始模型权重的贡献程度,而lora_dropout则用于在训练过程中减少过拟合。通过精心调整这些参数,可以在保持较低计算成本的同时,实现接近甚至超过全模型微调的性能。
from peft import LoraConfig, TaskType
peft_config = LoraConfig(task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1)
请参阅LoraConfig的参考文档,以获取更多关于您可以调整的其他参数的详细信息,比如目标模块或偏差类型等。
一旦LoraConfig配置完成,就可以使用get_peft_model()函数来创建一个PeftModel。这个函数接受一个基础模型(你可以从Transformers库中加载这个模型)和LoraConfig作为参数,其中LoraConfig包含了用于配置模型以进行LoRA训练的参数。
简而言之,步骤是这样的:
from peft import get_peft_model
model = get_peft_model(model, peft_config)
model.print_trainable_parameters()
"output: trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282"
在大规模模型bigscience/mt0-large拥有12亿(1.2B)参数的背景下,你仅需要训练其中的0.19%!这是一个非常令人振奋的消息,因为它意味着即使资源有限,你也能有效地对模型进行微调或继续训练。
现在,你可以使用Transformers库的Trainer类、Accelerate库,或者任何自定义的PyTorch训练循环来训练这个模型。这里以使用Trainer类为例,说明如何设置训练过程:
training_args = TrainingArguments(
output_dir="your-name/bigscience/mt0-large-lora",
learning_rate=1e-3,
per_device_train_batch_size=32,
per_device_eval_batch_size=32,
num_train_epochs=2,
weight_decay=0.01,
evaluation_strategy="epoch",
save_strategy="epoch",
load_best_model_at_end=True,
)
传递**模型、数据集、参数、tokenizer还有其他必要的部分给Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["test"],
tokenizer=tokenizer,
data_collator=data_collator,
compute_metrics=compute_metrics,
)
trainer.train()
保存模型
model.save_pretrained("output_dir")
保存模型在hub中
from huggingface_hub import notebook_login
notebook_login()
model.push_to_hub("your-name/bigscience/mt0-large-lora")
这两种方法都仅保存了训练过程中额外的PEFT(Parameter-Efficient Fine-Tuning,参数高效微调)权重,这意味着它们在存储、传输和加载时都非常高效。例如,使用LoRA(Low-Rank Adaptation,低秩适应)训练的facebook/opt-350m模型仅包含两个文件**:adapter_config.json和adapter_model.safetensors**。其中,adapter_model.safetensors文件的大小仅为6.3MB!这显示了参数高效微调技术在处理大型模型时的显著优势,能够在不显著增加模型大小的情况下实现有效的微调。
评:仅保存附着的LR参数,这样确实减少了重复加载模型的时间。
推理
查看相关的微调的API去查看所有有效的微调模型
Easily load any PEFT-trained model for inference with the AutoPeftModel class and the from_pretrained method:
from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
import torch
model = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora")
tokenizer = AutoTokenizer.from_pretrained("facebook/opt-350m")
model = model.to("cuda")
model.eval()
inputs = tokenizer("Preheat the oven to 350 degrees and place the cookie dough", return_tensors="pt")
outputs = model.generate(input_ids=inputs["input_ids"].to("cuda"), max_new_tokens=50)
print(tokenizer.batch_decode(outputs.detach().cpu().numpy(), skip_special_tokens=True)[0])
"Preheat the oven to 350 degrees and place the cookie dough in the center of the oven. In a large bowl, combine the flour, baking powder, baking soda, salt, and cinnamon. In a separate bowl, combine the egg yolks, sugar, and vanilla."
For other tasks that aren’t explicitly supported with an AutoPeftModelFor class - such as automatic speech recognition - you can still use the base AutoPeftModel class to load a model for the task.
评:属于是先用再说呗
from peft import AutoPeftModel
model = AutoPeftModel.from_pretrained("smangrul/openai-whisper-large-v2-LORA-colab")
现在您已经了解了如何使用一种PEFT(Parameter-Efficient Fine-Tuning,参数高效微调)方法来训练模型,我们鼓励您尝试其他方法,比如prompt tuning(提示微调)。步骤与快速入门中展示的非常相似:
准备PEFT方法的PeftConfig:根据您的需求配置PEFT方法的参数。
使用get_peft_model()方法创建PeftModel:从配置和基础模型出发,使用这个方法创建一个PeftModel实例。
训练模型:之后,您可以按照自己喜欢的方式训练模型!
对于加载PEFT模型进行推理,您可以使用AutoPeftModel类。
如果您对使用另一种PEFT方法为特定任务(如语义分割、多语言自动语音识别、DreamBooth、标记分类等)训练模型感兴趣,请随时查看任务指南。这些指南将为您提供更详细的步骤和示例,帮助您更好地理解和应用PEFT技术。