Diffusers documentation
PEFT
PEFT
Diffusers поддерживает загрузку адаптеров, таких как LoRA, с помощью библиотеки PEFT и класса PeftAdapterMixin. Это позволяет классам моделирования в Diffusers, таким как UNet2DConditionModel и SD3Transformer2DModel, работать с адаптером.
См. учебник Inference with PEFT для обзора того, как использовать PEFT в Diffusers для инференса.
PeftAdapterMixin
Класс, содержащий все функции для загрузки и использования весов адаптеров, поддерживаемых в библиотеке PEFT. Более подробную информацию об адаптерах и их внедрении в базовую модель см. в документации PEFT.
Установите последнюю версию PEFT и используйте этот миксин, чтобы:
- Подключите новые адаптеры к модели.
- Подключайте несколько адаптеров и последовательно активируйте/деактивируйте их.
- Активировать/деактивировать все адаптеры из модели.
- Получите список активных адаптеров.
Получает текущий список активных адаптеров модели.
Если вы не знакомы с адаптерами и методами PEFT, мы приглашаем вас прочитать о них подробнее в документации PEFT.
add_adapter
< source >( adapter_configadapter_name: str = 'default' )
Добавляет новый адаптер к текущей модели для обучения. Если имя адаптера не передано, ему назначается имя по умолчанию в соответствии с конвенцией библиотеки PEFT.
Если вы не знакомы с адаптерами и методами PEFT, мы приглашаем вас прочитать о них подробнее в документации PEFT.
delete_adapters
< source >( adapter_names: list[str] | str )
Удалите слои LoRA адаптера из базовой модели.
Пример:
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
).to("cuda")
pipeline.load_lora_weights(
"jbilcke-hf/sdxl-cinematic-1", weight_name="pytorch_lora_weights.safetensors", adapter_names="cinematic"
)
pipeline.unet.delete_adapters("cinematic")Отключите все адаптеры, подключенные к модели, и вернитесь к инференсу только с базовой моделью.
Если вы не знакомы с адаптерами и методами PEFT, мы приглашаем вас прочитать о них подробнее в документации PEFT.
Отключает активные слои LoRA базовой модели.
Пример:
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
).to("cuda")
pipeline.load_lora_weights(
"jbilcke-hf/sdxl-cinematic-1", weight_name="pytorch_lora_weights.safetensors", adapter_name="cinematic"
)
pipeline.unet.disable_lora()Включает адаптеры, привязанные к модели. Модель использует self.active_adapters() для получения списка адаптеров, которые необходимо включить.
Если вы не знакомы с адаптерами и методами PEFT, мы приглашаем вас прочитать о них подробнее в документации PEFT.
Включает активные слои LoRA базовой модели.
Пример:
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
).to("cuda")
pipeline.load_lora_weights(
"jbilcke-hf/sdxl-cinematic-1", weight_name="pytorch_lora_weights.safetensors", adapter_name="cinematic"
)
pipeline.unet.enable_lora()enable_lora_hotswap
< source >( target_rank: int = 128check_compiled: typing.Literal['error', 'warn', 'ignore'] = 'error' )
Параметры
- target_rank (
int, необязательный, по умолчанию128) — Наибольший ранг среди всех адаптеров, которые будут загружены. - check_compiled (
str, необязательный, по умолчанию"error") — Как обрабатывать ситуацию, когда модель уже скомпилирована (в целом этого следует избегать). Варианты:- “error” (по умолчанию): вызывать ошибку
- “warn”: выдать предупреждение
- “ignore”: ничего не делать
Включает возможность горячей замены адаптеров LoRA.
Вызов этого метода необходим только при горячей замене адаптеров, если модель скомпилирована или если ранги загруженных адаптеров различаются.
load_lora_adapter
< source >( pretrained_model_name_or_path_or_dictprefix = 'transformer'hotswap: bool = False**kwargs )
Параметры
- pretrained_model_name_or_path_or_dict (
strилиos.PathLikeилиdict) — Может быть одним из следующих:- Строка, идентификатор модели (например,
google/ddpm-celebahq-256) предобученной модели, размещенной на Hub. - Путь к каталогу (например,
./my_model_directory), содержащему веса модели, сохранённые с помощью ModelMixin.save_pretrained(). - Словарь состояния torch.
- Строка, идентификатор модели (например,
- prefix (
str, необязательный) — Префикс для фильтрации state dict. - cache_dir (
str | os.PathLike, необязательный) — Путь к каталогу, в котором кэшируется загруженная конфигурация предобученной модели, если стандартный кэш не используется. - force_download (
bool, необязательный, по умолчаниюFalse) — Следует ли принудительно (пере)скачивать веса модели и файлы конфигурации, игнорируя кэшированные версии, если они существуют. - proxies (
dict[str, str], необязательный) — Словарь прокси-серверов, используемых по протоколу или конечной точке, например,{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}. Прокси применяются при каждом запросе. - local_files_only (
bool, необязательный, по умолчаниюFalse) — Определяет, следует ли загружать только локальные веса модели и файлы конфигурации. Если установлено значениеTrue, модель не будет скачана с Hub. - token (
strили bool, необязательный) — Токен, используемый в качестве HTTP bearer-авторизации для удалённых файлов. ЕслиTrue, используется токен, сгенерированный командойdiffusers-cli login(сохранённый в~/.huggingface). - revision (
str, необязательный, по умолчанию"main") — Конкретная версия модели, которую следует использовать. Может быть именем ветки, именем тега, идентификатором коммита или любым другим идентификатором, поддерживаемым Git. - subfolder (
str, необязательный, по умолчанию"") — Расположение подпапки файла модели внутри более крупного репозитория моделей на Hub или локально. - network_alphas (
dict[str, float]) — Значение альфы сети, используемое для стабильного обучения и предотвращения подтекания. Это значение имеет тот же смысл, что и опция--network_alphaв скрипте тренера kohya-ss. См. эту ссылку. - low_cpu_mem_usage (
bool, необязательный) — Ускоряет загрузку модели, загружая только предобученные веса LoRA и не инициализируя случайные веса. - hotswap — (
bool, необязательный) По умолчаниюFalse. Определяет, следует ли заменить существующий адаптер (LoRA) на новый загруженный адаптер на месте. Это означает, что вместо загрузки дополнительного адаптера будут взяты веса существующего адаптера и заменены весами нового адаптера. Это может быть быстрее и экономнее по памяти. Однако главное преимущество hotswap заключается в том, что при компиляции модели с помощью torch.compile загрузка нового адаптера не требует повторной компиляции модели. При использовании hotswap переданныйadapter_nameдолжен быть именем уже загруженного адаптера. Если у нового и старого адаптеров разные ранги и/или значения LoRA alpha (т.е. масштабирование), перед загрузкой адаптера необходимо вызвать дополнительный метод: pipeline = ... # загрузить пайплайн diffusers max_rank = ... # максимальный ранг среди всех LoRA, которые вы хотите загрузить # вызвать *до* компиляции и загрузки адаптера LoRA pipeline.enable_lora_hotswap(target_rank=max_rank) pipeline.load_lora_weights(file_name) # при необходимости скомпилировать модель сейчас Обратите внимание, что hotswap адаптеров текстового кодировщика пока не поддерживается. У этой техники есть некоторые дополнительные ограничения, которые описаны здесь: https://huggingface.co/docs/peft/main/en/package_reference/hotswapЕсли у нового адаптера и старого адаптера разные ранги и/или значения LoRA alpha (т. е. масштабирование), перед загрузкой адаптера необходимо вызвать дополнительный метод:
pipeline = ... # load diffusers pipeline max_rank = ... # the highest rank among all LoRAs that you want to load # call *before* compiling and loading the LoRA adapter pipeline.enable_lora_hotswap(target_rank=max_rank) pipeline.load_lora_weights(file_name) # optionally compile the model nowОбратите внимание, что горячая замена адаптеров текстового кодировщика пока не поддерживается. У этого метода есть дополнительные ограничения, описанные здесь: https://huggingface.co/docs/peft/main/en/package_reference/hotswap
- metadata —
метаданные адаптера LoRA. Если указаны, метаданные, выведенные из state dict, не используются для
инициализации
LoraConfig.
Загружает адаптер LoRA в базовую модель.
save_lora_adapter
< source >( save_directoryadapter_name: str = 'default'upcast_before_saving: bool = Falsesafe_serialization: bool = Trueweight_name: str | None = None )
Параметры
- save_directory (
stroros.PathLike) — Каталог для сохранения параметров LoRA. Будет создан, если не существует. - adapter_name — (
str, по умолчанию “default”): имя адаптера, который нужно сериализовать. Полезно, если в базовой модели загружено несколько адаптеров. - upcast_before_saving (
bool, по умолчаниюFalse) — Следует ли привести базовую модель к типуtorch.float32перед сериализацией. - safe_serialization (
bool, необязательный, по умолчаниюTrue) — Определяет, сохранять ли модель с помощьюsafetensorsили традиционным способом PyTorch с использованиемpickle. - weight_name — (
str, необязательный, по умолчаниюNone): Имя файла, в который сериализуется state dict.
Сохраните параметры LoRA, соответствующие базовой модели.
set_adapter
< source >( adapter_name: str | list[str] )
Устанавливает конкретный адаптер, принудительно заставляя модель использовать только его и отключая остальные адаптеры.
Если вы не знакомы с адаптерами и методами PEFT, мы приглашаем вас прочитать о них подробнее в документации PEFT.
set_adapters
< source >( adapter_names: list[str] | strweights: float | dict | list[float] | list[dict] | list[None] | None = None )
Установите адаптеры, активные в данный момент, для использования в диффузионной сети (например, unet, transformer и т. д.).
Пример:
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
).to("cuda")
pipeline.load_lora_weights(
"jbilcke-hf/sdxl-cinematic-1", weight_name="pytorch_lora_weights.safetensors", adapter_name="cinematic"
)
pipeline.load_lora_weights("nerijs/pixel-art-xl", weight_name="pixel-art-xl.safetensors", adapter_name="pixel")
pipeline.unet.set_adapters(["cinematic", "pixel"], weights=[0.5, 0.5])