PEFT documentation

LoKr

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

LoKr

Navigating Text-To-Image Customization: From LyCORIS Fine-Tuning to Model Evaluation

Low-Rank Kronecker Product(LoKr)는 큰 가중치 행렬을 두 개의 저랭크 행렬로 근사하고 Kronecker product로 결합하는 LoRA 변형 방법입니다. LoKr은 파인튜닝 과정에서 더 나은 제어를 제공하기 위해 선택적인 세 번째 저랭크 행렬도 제공합니다. 가중치 업데이트 행렬을 Kronecker product 분해로 표현하고 블록 행렬을 생성함으로써, LoKr은 원래 가중치 행렬의 랭크를 보존할 수 있습니다. 작은 행렬의 크기는 rank 또는 r에 의해 결정됩니다. Kronecker product의 또 다른 이점은 행렬의 열을 쌓아 벡터화할 수 있다는 것입니다. 이는 ∆W를 완전히 재구성하는 과정을 피할 수 있으므로 프로세스를 가속화할 수 있습니다.

해당 논문의 초록은 다음과 같습니다:

텍스트에서 이미지를 생성하는 생성 모델은 텍스트 프롬프트로부터 고해상도 이미지를 생성할 수 있는 능력으로 인해 큰 주목을 받고 있습니다. 이 중 Stable Diffusion은 이 빠르게 성장하는 분야에서 선두를 달리고 있는 오픈소스 모델로 자리매김하고 있습니다. 그러나 이러한 모델을 파인튜닝하는 과정은 새로운 방법론 통합부터 체계적인 평가에 이르기까지 여러 가지 과제를 안고 있습니다. 이러한 문제를 해결하기 위해, 본 논문은 Stable Diffusion을 위한 다양한 파인튜닝 방법론을 폭넓게 제공하는 오픈소스 라이브러리인 LyCORIS Lora beYond Conventional methods, Other Rank adaptation Implementations for 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

< >

( 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) — LoKr 스케일링에 사용되는 alpha 매개변수입니다.
  • rank_dropout (float) — 학습 중 랭크 차원의 드롭아웃 확률입니다.
  • module_dropout (float) — 학습 중 LoKr 모듈을 비활성화할 때 사용할 dropout 확률입니다.
  • use_effective_conv2d (bool) — ksize > 1인 Conv2d(및 Conv1d)에 대해 effective decomposition 매개변수를 사용합니다(FedPara 논문에서 “Proposition 3”).
  • decompose_both (bool) — 왼쪽 크로네커 곱 행렬에 대해 랭크 분해를 수행합니다.
  • decompose_factor (int) — Kronecker product 분해 인자.
  • rank_dropout_scale (‘bool) — 학습 중에 rank dropout을 스케일링할지 여부. 기본값은 False입니다.
  • target_modules (Optional[Union[List[str], str]]) — 어댑터를 적용할 모듈의 이름입니다. 이 값이 지정되면, 지정된 이름을 가진 모듈만 교체됩니다. 문자열을 전달하면 정규식 매칭이 수행됩니다. 문자열 목록을 전달하면 정확한 매칭이 수행되거나, 모듈 이름이 전달된 문자열 중 하나로 끝나는지 확인됩니다. 이 값이 ‘all-linear’로 지정되면, 출력 레이어를 제외한 모든 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로 지정된 기본 rank와 다른 rank를 가지는 레이어 이름 또는 정규식 표현식에서 해당 rank로의 매핑입니다. 예를 들어, {'^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

< >

( 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) — 메타 디바이스에 빈 어댑터 가중치를 생성합니다. 로딩 프로세스를 가속하는 데 유용합니다.

반환값

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 모델의 구성입니다.
Update on GitHub