PEFT documentation

PEFT 集成

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.21.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

PEFT 集成

PEFT 的实际优势也延伸到了 Diffusers 和 Transformers 等其他 Hugging Face 库。PEFT 的主要优势之一是,由 PEFT 方法生成的适配器文件远小于原始模型,这使得管理和使用多个适配器变得极其简单。你只需加载一个针对当前任务微调的新适配器,就可以用一个预训练的基础模型来处理多个任务。或者,你可以将多个适配器与文本到图像的扩散模型结合,以创建新的效果。

本教程将展示 PEFT 如何帮助你在 Diffusers 和 Transformers 中管理适配器。

Diffusers

Diffusers 是一个用于通过扩散模型从文本或图像生成图像和视频的生成式 AI 库。LoRA 是扩散模型中一种特别流行的训练方法,因为你可以非常快速地训练并分享扩散模型,以生成具有新风格的图像。为了更轻松地使用和尝试多个 LoRA 模型,Diffusers 使用 PEFT 库来帮助管理用于推理的不同适配器。

例如,加载一个基础模型,然后使用 load_lora_weights 方法加载 artificialguybr/3DRedmond-V1 适配器以进行推理。加载方法中的 adapter_name 参数由 PEFT 启用,允许你为适配器设置一个名称,以便于引用。

import torch
from diffusers import DiffusionPipeline

device = torch.accelerator.current_accelerator().type if hasattr(torch, "accelerator") else "cuda"

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
).to(device)
pipeline.load_lora_weights(
    "peft-internal-testing/artificialguybr__3DRedmond-V1", 
    weight_name="3DRedmond-3DRenderStyle-3DRenderAF.safetensors", 
    adapter_name="3d"
)
image = pipeline("sushi rolls shaped like kawaii cat faces").images[0]
image

现在让我们尝试另一个很酷的 LoRA 模型,ostris/super-cereal-sdxl-lora。你只需要使用 adapter_name 加载并命名这个新的适配器,然后使用 set_adapters 方法将其设置为当前激活的适配器。

pipeline.load_lora_weights(
    "ostris/super-cereal-sdxl-lora", 
    weight_name="cereal_box_sdxl_v1.safetensors", 
    adapter_name="cereal"
)
pipeline.set_adapters("cereal")
image = pipeline("sushi rolls shaped like kawaii cat faces").images[0]
image

最后,您可以调用 disable_lora 方法来恢复基础模型。

pipeline.disable_lora()

有关 PEFT 如何支持 Diffusers 的更多信息,请参阅 使用 PEFT 进行推理 教程。

Transformers

🤗 Transformers 是一个涵盖所有模态和各类任务的预训练模型集合。您可以加载这些模型用于训练或推理。其中许多模型是大语言模型(LLM),因此将 PEFT 与 Transformers 集成以管理和训练适配器是合理的。

加载一个基础预训练模型以进行训练。

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("facebook/opt-350m")

接下来,添加一个适配器配置以指定如何调整模型参数。调用 add_adapter() 方法将该配置添加到基础模型中。

from peft import LoraConfig

peft_config = LoraConfig(
    lora_alpha=16,
    lora_dropout=0.1,
    r=64,
    bias="none",
    task_type="CAUSAL_LM"
)
model.add_adapter(peft_config)

现在,您可以使用 Transformers 的 Trainer 类或您偏好的任何训练框架来训练模型。

要将新训练的模型用于推理,AutoModel 类在后台使用 PEFT 将适配器权重和配置文件加载到基础预训练模型中。

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("peft-internal-testing/opt-350m-lora")

或者,您可以使用 transformers 的 Pipelines 来加载模型,以便方便地运行推理:

from transformers import pipeline

model = pipeline("text-generation", "peft-internal-testing/opt-350m-lora")
print(model("Hello World"))

如果您对比较或使用多个适配器感兴趣,可以调用 add_adapter() 方法将适配器配置添加到基础模型中。唯一的要求是适配器类型必须相同(不能混合使用 LoRA 和 LoHa 适配器)。

from transformers import AutoModelForCausalLM
from peft import LoraConfig

model = AutoModelForCausalLM.from_pretrained("facebook/opt-350m")
model.add_adapter(lora_config_1, adapter_name="adapter_1")

再次调用 add_adapter() 以将新的适配器附加到基础模型。

model.add_adapter(lora_config_2, adapter_name="adapter_2")

然后,您可以使用 set_adapter() 来设置当前激活的适配器。

model.set_adapter("adapter_1")
output = model.generate(**inputs)
print(tokenizer.decode(output_disabled[0], skip_special_tokens=True))

要禁用适配器,请调用 disable_adapters 方法。

model.disable_adapters()

可以使用 enable_adapters 重新启用适配器。

如果您感兴趣,请查看 使用 PEFT 加载和训练适配器 教程以了解更多信息。

Update on GitHub