PEFT documentation
Интеграции PEFT
Интеграции PEFT
Практические преимущества PEFT распространяются и на другие библиотеки Hugging Face, такие как Diffusers и Transformers. Одно из ключевых достоинств PEFT состоит в том, что файл адаптера, созданный методом PEFT, значительно меньше исходной модели, что делает управление несколькими адаптерами и их использование крайне простыми. Вы можете использовать одну предобученную базовую модель для выполнения нескольких задач, просто загружая новый адаптер, дообученный под конкретную задачу. Либо вы можете объединять несколько адаптеров с диффузионной моделью text-to-image, чтобы создавать новые эффекты.
В этом руководстве показано, как PEFT помогает управлять адаптерами в Diffusers и Transformers.
Diffusers
Diffusers — это библиотека генеративного ИИ для создания изображений и видео из текста или изображений с помощью диффузионных моделей. LoRA — особенно популярный метод обучения диффузионных моделей, поскольку с его помощью можно очень быстро обучать и распространять диффузионные модели для генерации изображений в новых стилях. Чтобы упростить использование и тестирование нескольких моделей LoRA, Diffusers использует библиотеку PEFT для управления различными адаптерами при инференсе.
Например, загрузите базовую модель, а затем загрузите адаптер artificialguybr/3DRedmond-V1 для инференса с помощью метода load_lora_weights. Аргумент 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, читайте в учебнике Inference with 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)Теперь вы можете обучать модель с помощью класса Trainer из Transformers или любой другой системы обучения по вашему выбору.
Чтобы использовать вновь обученную модель для инференса, класс AutoModel использует PEFT на бэкенде для загрузки весов адаптера и файла конфигурации в базовую предобученную модель.
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("peft-internal-testing/opt-350m-lora")В качестве альтернативы вы можете использовать Pipelines из transformers для загрузки модели и удобного выполнения инференса:
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