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 распространяются и на другие библиотеки 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