00270 PEFT - Quicktour


前言

PEFT(参数高效微调)是一个库,它能够高效地将大型预训练模型适配到各种下游应用,而无需微调模型的所有参数,因为这样做成本过高。PEFT方法仅微调少量(额外)的模型参数,显著降低计算和存储成本,同时还能达到与完全微调模型相当的性能。这使得在消费级硬件上训练和存储大型语言模型(LLMs)变得更加可行。

PEFT与Transformers、Diffusers和Accelerate库集成,提供了一种更快、更简单的方法来加载、训练和使用大型模型进行推理。

PEFT为微调大型预训练模型提供了参数高效的方法。传统的范式是为每个下游任务微调模型的所有参数,但由于当今模型中参数的数量极其庞大,这种方法变得极其昂贵且不切实际。相反,更有效的方法是训练较少的提示参数,或使用重新参数化方法,如低秩适应(LoRA),以减少可训练参数的数量。

这个快速教程将向您展示PEFT的主要特性,以及您如何能够在消费级设备上通常无法访问的大型模型上进行训练或运行推理。

huggingface: https://huggingface.co/PEFT

github huggingface/peft: https://github.com/huggingface/peft

src link: https://huggingface.co/docs/peft/quicktour

Operating System: Ubuntu 22.04.4 LTS

参考文档

  1. PEFT - Docs
  2. PEFT - Quicktour

训练

每个PEFT方法都由一个PeftConfig类定义,该类存储构建PeftModel的所有重要参数。例如,要使用LoRA进行训练,请加载并创建一个LoraConfig类,并指定以下参数:

  • task_type: 要训练的任务类型(在这种情况下是序列到序列的语言建模)
  • inference_mode: 您是否正在使用模型进行推理
  • r: 低秩矩阵的维度
  • lora_alpha: 低秩矩阵的缩放因子
  • lora_dropout: LoRA层的丢弃概率
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的120亿参数中,您只需要训练其中的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!

存储在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。

  3. 然后您可以根据自己的喜好进行训练!要加载PEFT模型进行推理,您可以使用AutoPeftModel类。

如果您对使用其他PEFT方法针对特定任务(如语义分割、多语言自动语音识别、DreamBooth、令牌分类等)训练模型感兴趣,也可以随时查看任务指南。

结语

第二百七十篇博文写完,开心!!!!

今天,也是充满希望的一天。


文章作者: LuYF-Lemon-love
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 LuYF-Lemon-love !
  目录