PEFT 文档

快速入门

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

快速入门

PEFT 为微调大型预训练模型提供了参数高效的方法。传统的范式是为每个下游任务微调模型的所有参数,但这正变得极其昂贵且不切实际,因为如今模型中的参数数量庞大。相反,训练少量 prompt 参数或使用像低秩适配 (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 库加载)和包含如何配置模型以使用 LoRA 进行训练的参数的 LoraConfig

加载您要微调的基础模型。

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,
)

将模型、训练参数、数据集、tokenizer 和任何其他必要组件传递给 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.jsonadapter_model.safetensorsadapter_model.safetensors 文件仅有 6.3MB!

存储在 Hub 上的 opt-350m 模型的适配器权重仅约 6MB,而完整模型权重的大小可能约为 700MB。

推理

请查看 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 方法之一训练模型,我们鼓励您尝试其他方法,例如 prompt 调优。步骤与快速入门中显示的步骤非常相似:

  1. 为 PEFT 方法准备一个 PeftConfig
  2. 使用 get_peft_model() 方法从配置和基础模型创建一个 PeftModel

然后您可以随意训练它!要加载 PEFT 模型以进行推理,您可以使用 AutoPeftModel 类。

如果您有兴趣使用另一种 PEFT 方法训练模型以执行特定任务(例如语义分割、多语言自动语音识别、DreamBooth、token 分类等),请随时查看任务指南。

< > 在 GitHub 上更新