PEFT 文档

快速入门

Hugging Face's logo
加入 Hugging Face 社区

并获得增强文档体验

开始使用

快速入门

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

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

然后您可以根据需要进行训练!要加载用于推理的 PEFT 模型,您可以使用AutoPeftModel 类。

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

< > 在 GitHub 上更新