快速入门
PEFT 提供了用于微调大型预训练模型的参数高效方法。传统的范式是为每个下游任务微调模型的所有参数,但由于当今模型参数数量巨大,这种方法正变得越来越昂贵且不切实际。相反,训练更少的提示参数或使用低秩自适应 (LoRA) 等重新参数化方法来减少可训练参数的数量,会更有效率。
本快速入门将向您展示 PEFT 的主要功能,以及如何训练或对大型模型进行推理,这些模型通常无法在消费类设备上访问。
训练
每个 PEFT 方法都由一个 PeftConfig 类定义,该类存储构建 PeftModel 的所有重要参数。例如,要使用 LoRA 进行训练,请加载并创建一个 LoraConfig 类并指定以下参数
task_type
:要训练的任务(在本例中为序列到序列语言建模)inference_mode
:您是否正在将模型用于推理r
:低秩矩阵的维度lora_alpha
:低秩矩阵的缩放因子lora_dropout
: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,其中包含有关如何配置模型以使用 LoRA 进行训练的参数。
加载您要微调的基础模型。
from transformers import AutoModelForSeq2SeqLM
model = AutoModelForSeq2SeqLM.from_pretrained("bigscience/mt0-large")
使用get_peft_model() 函数包装基础模型和peft_config
以创建PeftModel。要了解模型中可训练参数的数量,请使用print_trainable_parameters
方法。
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 亿个参数中,您只需训练其中的 0.19%!
就是这样🎉!现在您可以使用 Transformers 的Trainer、Accelerate 或任何自定义 PyTorch 训练循环来训练模型。
例如,要使用Trainer 类进行训练,请使用一些训练超参数设置TrainingArguments 类。
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,
eval_strategy="epoch",
save_strategy="epoch",
load_best_model_at_end=True,
)
将模型、训练参数、数据集、标记器以及任何其他必要组件传递给Trainer,并调用train 以开始训练。
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()
保存模型
模型训练完成后,您可以使用save_pretrained 函数将模型保存到目录中。
model.save_pretrained("output_dir")
您还可以使用push_to_hub 函数将模型保存到 Hub(请确保您已登录到您的 Hugging Face 帐户)。
from huggingface_hub import notebook_login
notebook_login()
model.push_to_hub("your-name/bigscience/mt0-large-lora")
这两种方法只保存训练过的额外 PEFT 权重,这意味着存储、传输和加载非常高效。例如,这个使用 LoRA 训练的facebook/opt-350m 模型仅包含两个文件:adapter_config.json
和adapter_model.safetensors
。adapter_model.safetensors
文件仅有 6.3MB!
推理
查看AutoPeftModel API 参考以获取可用AutoPeftModel
类的完整列表。
使用AutoPeftModel 类和from_pretrained 方法轻松加载任何经过 PEFT 训练的模型以进行推理。
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."
对于没有使用AutoPeftModelFor
类明确支持的其他任务(例如自动语音识别),您仍然可以使用基础AutoPeftModel 类加载该任务的模型。
from peft import AutoPeftModel
model = AutoPeftModel.from_pretrained("smangrul/openai-whisper-large-v2-LORA-colab")
后续步骤
既然您已经了解了如何使用其中一种 PEFT 方法训练模型,我们鼓励您尝试其他一些方法,例如提示微调。步骤与快速入门中显示的步骤非常相似。
- 为 PEFT 方法准备一个PeftConfig
- 使用get_peft_model() 方法从配置和基础模型创建PeftModel
然后您可以根据需要进行训练!要加载用于推理的 PEFT 模型,您可以使用AutoPeftModel 类。
如果您有兴趣使用另一种 PEFT 方法为特定任务(例如语义分割、多语言自动语音识别、DreamBooth、令牌分类等)训练模型,也可以查看任务指南。
< > 在 GitHub 上更新