PEFT documentation
LoKr
LoKr

Метод низкорангового произведения Кронекера (LoKr) представляет собой вариант LoRA, который аппроксимирует большую матрицу весов с помощью двух низкоранговых матриц и объединяет их с помощью произведения Кронекера. LoKr также предоставляет опциональную третью низкоранговую матрицу для более точного контроля в процессе дообучения. Выражая матрицу обновления весов как разложение произведения Кронекера и формируя блочную матрицу, LoKr сохраняет ранг исходной матрицы весов. Размер меньших матриц определяется их рангом или r. Ещё одно преимущество произведения Кронекера состоит в том, что его можно векторизовать, складывая столбцы матрицы. Это ускоряет процесс, поскольку исключает необходимость полного восстановления ∆W.
Аннотация из статьи:
Генеративные модели «текст в изображение» привлекли огромное внимание благодаря своей способности создавать изображения высокого качества по текстовым запросам. Среди них Stable Diffusion выделяется как ведущая модель с открытым исходным кодом в этой быстро развивающейся области. Однако тонкости дообучения этих моделей создают множество проблем, от интеграции новых методологий до систематической оценки. Решая эти задачи, в данной статье представлена LyCORIS Lora beYond Conventional methods, Other Rank adaptation Implementations for Stable diffusion — библиотека с открытым исходным кодом, предлагающая широкий выбор методологий дообучения для Stable Diffusion. Кроме того, мы представляем тщательный фреймворк для систематической оценки различных техник дообучения. Этот фреймворк использует разнообразный набор метрик и рассматривает множество аспектов дообучения, включая настройку гиперпараметров и оценку с использованием разных типов запросов в различных категориях концептов. Благодаря этому комплексному подходу наша работа дает важные представления о тонких эффектах параметров дообучения, сокращая разрыв между передовыми исследованиями и практическим применением.
Использование
from peft import LoKrConfig, get_peft_model
config = LoKrConfig(
r=16,
alpha=16,
target_modules=["query", "value"],
module_dropout=0.1,
modules_to_save=["classifier"],
)
model = get_peft_model(model, config)
model.print_healthcheck()Обзор бенчмарков
API
LoKrConfig
класс peft.LoKrConfig
< source >( task_type: Optional[Union[str, TaskType]] = Nonepeft_type: Optional[Union[str, PeftType]] = Noneauto_mapping: Optional[dict] = Nonepeft_version: Optional[str] = Nonebase_model_name_or_path: Optional[str] = Nonerevision: Optional[str] = Noneinference_mode: bool = Falserank_pattern: Optional[dict] = <factory>alpha_pattern: Optional[dict] = <factory>r: int = 8alpha: int = 8rank_dropout: float = 0.0module_dropout: float = 0.0use_effective_conv2d: bool = Falsedecompose_both: bool = Falsedecompose_factor: int = -1rank_dropout_scale: bool = Falsetarget_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Noneinit_weights: Union[bool, Literal['lycoris']] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonemodules_to_save: Optional[list[str]] = None )
Параметры
- r (
int) — ранг LoKr. - alpha (
int) — Параметр alpha для масштабирования LoKr. - rank_dropout (
float) — Вероятность dropout для размерности rank во время обучения. - module_dropout (
float) — Вероятность dropout для отключения модулей LoKr во время обучения. - use_effective_conv2d (
bool) — Использовать параметр effective decomposition для Conv2d (и Conv1d) с ksize > 1 («Proposition 3» из статьи FedPara). - decompose_both (
bool) — Выполняет разложение по рангу левой матрицы кронекера. - decompose_factor (
int) — Фактор разложения по произведению Кронекера. - rank_dropout_scale (‘bool) —
Определяет, следует ли масштабировать dropout ранга во время обучения. По умолчанию
False. - target_modules (
Optional[Union[List[str], str]]) — Имена модулей, к которым следует применить адаптер. Если это значение указано, будут заменены только модули с указанными именами. При передаче строки выполняется сопоставление по регулярному выражению. При передаче списка строк выполняется точное совпадение или проверяется, заканчивается ли имя модуля каким-либо из переданных строк. Если это значение указано как ‘all-linear’, выбираются все линейные/Conv1D модули, за исключением выходного слоя. Если это значение не указано, модули выбираются в соответствии с архитектурой модели. Если архитектура неизвестна, будет выброшена ошибка — в этом случае следует указать целевые модули вручную. - exclude_modules (
Optional[Union[List[str], str]]) — Имена модулей, к которым не следует применять адаптер. При передаче строки выполняется сопоставление по регулярному выражению. При передаче списка строк выполняется точное совпадение или проверяется, заканчивается ли имя модуля каким-либо из переданных строк. - init_weights (
bool) — Определяет, следует ли выполнять инициализацию весов адаптера. По умолчанию установлено значениеTrue. Используйте “lycoris”, чтобы инициализировать веса в стиле репозитория LYCORIS. Передача значенияFalseне рекомендуется. - layers_to_transform (
Union[List[int], int]) — Индексы слоёв, подлежащих трансформации. Если передан список целых чисел, адаптер будет применён к слоям с индексами, указанными в этом списке. Если передано одно целое число, трансформации будут применены к слою с этим индексом. - layers_pattern (
Optional[Union[List[str], str]]) — Имя шаблона слоя, используется только в том случае, еслиlayers_to_transformотличается отNone. Этот параметр должен указывать наnn.ModuleListмодели, который часто называется'layers'или'h'. - rank_pattern (
dict) — Соответствие между именами слоёв или регулярными выражениями и рангами, отличными от ранга по умолчанию, заданного параметромr. Например,{'^model.decoder.layers.0.encoder_attn.k_proj': 16}. - alpha_pattern (
dict) — Соответствие между именами слоёв или регулярными выражениями и значениями alpha, отличными от значения alpha по умолчанию, заданного параметромalpha. Например,{'^model.decoder.layers.0.encoder_attn.k_proj': 16}. - modules_to_save (
Optional[List[str]]) — Список модулей, помимо адаптерных слоёв, которые нужно сделать обучаемыми и сохранить в итоговой контрольной точке.
Класс конфигурации LoKrModel.
LoKrModel
класс peft.LoKrModel
< source >( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None ) → torch.nn.Module
Параметры
- model (
torch.nn.Module) — Модель, к которой будут прикреплены слои адаптивного тюнера. - config (LoKrConfig) — конфигурация модели LoKr.
- adapter_name (
str) — имя адаптера, по умолчанию"default". - low_cpu_mem_usage (
bool,optional, по умолчаниюFalse) — Создаёт пустые веса адаптера на meta-устройстве. Полезно для ускорения процесса загрузки.
Возвращает
torch.nn.Module
Модель LoKr.
Создаёт модель Low-Rank Kronecker Product на основе предобученной модели. Оригинальный метод частично описан в https://huggingface.co/papers/2108.06098 и в https://huggingface.co/papers/2309.14859 Текущая реализация сильно заимствует код из https://github.com/KohakuBlueleaf/LyCORIS/blob/eb460098187f752a5d66406d3affade6f0a07ece/lycoris/modules/lokr.py
Пример:
>>> from diffusers import StableDiffusionPipeline
>>> from peft import LoKrModel, LoKrConfig
>>> config_te = LoKrConfig(
... r=8,
... lora_alpha=32,
... target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
... rank_dropout=0.0,
... module_dropout=0.0,
... init_weights=True,
... )
>>> config_unet = LoKrConfig(
... r=8,
... lora_alpha=32,
... target_modules=[
... "proj_in",
... "proj_out",
... "to_k",
... "to_q",
... "to_v",
... "to_out.0",
... "ff.net.0.proj",
... "ff.net.2",
... ],
... rank_dropout=0.0,
... module_dropout=0.0,
... init_weights=True,
... use_effective_conv2d=True,
... )
>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = LoKrModel(model.text_encoder, config_te, "default")
>>> model.unet = LoKrModel(model.unet, config_unet, "default")Атрибуты:
- model (
~torch.nn.Module) — Модель, подлежащая адаптации. - peft_config (LoKrConfig): конфигурация модели LoKr.