PEFT documentation
PEFT 集成
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