PEFT documentation

LoHa

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

LoHa

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

Low-Rank Hadamard Product (LoHa) mirip dengan LoRA, kecuali bahwa metode ini mengaproksimasi matriks bobot besar dengan lebih banyak matriks ber-rank rendah dan menggabungkannya dengan produk Hadamard. Metode ini bahkan lebih efisien dalam hal parameter dibandingkan LoRA dan mencapai kinerja yang sebanding. LoHa awalnya diusulkan untuk federated learning (FedPara), tetapi berfungsi dengan baik sebagai metode PEFT umum, dan sangat populer untuk fine-tuning model generasi gambar seperti Stable Diffusion.

Catatan: LoHa adalah bagian dari keluarga adapter LyCORIS. Kerabat dekatnya, LoKr, menggunakan produk Kronecker alih-alih produk Hadamard.

Abstrak dari makalah tersebut adalah:

Dalam karya ini, kami mengusulkan parameterisasi yang efisien dalam komunikasi, FedPara, untuk pembelajaran federasi (FL) guna mengatasi beban dari unggah dan unduh model yang sering. Metode kami memparameterisasi ulang parameter bobot lapisan menggunakan bobot ber-rank rendah yang diikuti oleh produk Hadamard. Dibandingkan dengan parameterisasi ber-rank rendah konvensional, metode FedPara kami tidak dibatasi oleh kendala ber-rank rendah, sehingga memiliki kapasitas yang jauh lebih besar. Sifat ini memungkinkan pencapaian kinerja yang sebanding sambil membutuhkan biaya komunikasi 3 hingga 10 kali lebih rendah daripada model dengan lapisan asli, yang tidak dapat dicapai oleh metode ber-rank rendah tradisional. Efisiensi metode kami dapat ditingkatkan lebih lanjut dengan dikombinasikan dengan optimizer FL efisien lainnya. Selain itu, kami memperluas metode kami ke aplikasi FL personalisasi, pFedPara, yang memisahkan parameter menjadi global dan lokal. Kami menunjukkan bahwa pFedPara melampaui metode FL personalisasi kompetitor dengan lebih dari tiga kali lebih sedikit parameter.

Dekomposisi rank rendah dapat memengaruhi kinerja karena pembaruan bobot dibatasi pada ruang rank rendah, yang dapat membatasi ekspresivitas model. Namun, Anda tidak selalu ingin menggunakan rank yang lebih besar karena hal itu meningkatkan jumlah parameter yang dapat dilatih. Untuk mengatasi hal ini, LoHa diterapkan pada model difusi di mana kemampuan untuk menghasilkan gambar yang beragam merupakan pertimbangan penting. LoHa juga seharusnya dapat bekerja dengan jenis model umum, tetapi dukungan untuk lapisan embedding saat ini belum diimplementasikan di PEFT.

LoHa menggunakan produk Hadamard ((produk elemen-per-elemen) alih-alih produk matriks. ΔW\Delta W direpresentasikan oleh empat matriks yang lebih kecil, bukan dua - seperti pada LoRA - dan setiap pasangan matriks ber-rank rendah ini digabungkan dengan produk Hadamard. Akibatnya, ΔW\Delta W dapat memiliki jumlah parameter yang dapat dilatih sama, tetapi dengan rank dan ekspresivitas yang lebih tinggi.

Kapan menggunakan LoHa

LoHa adalah pilihan yang tepat ketika:

  • Anda sedang melakukan fine-tuning pada model generasi gambar (Stable Diffusion UNet atau text encoder), di mana penggunaannya paling luas.
  • Anda menginginkan rank efektif yang lebih tinggi daripada LoRA untuk jumlah parameter yang dapat dilatih yang sama, karena produk Hadamard dari dua matriks ber-rank rendah mencakup subruang yang lebih besar daripada produk ber-rank rendah tunggal.
  • Anda ingin menggabungkan berbagai metode PEFT pada saat inferensi menggunakan PeftMixedModel, misalnya LoHa bersama dengan LoKr.

LoHa mendukung lapisan linear dan Conv2d. Untuk tugas yang juga memerlukan adaptasi lapisan embedding, pertimbangkan LoRA sebagai gantinya.

Penggunaan

from diffusers import StableDiffusionPipeline
from peft import LoHaConfig, get_peft_model

config_unet = LoHaConfig(
    r=8,
    alpha=8,
    target_modules=[
        "to_k",
        "to_q",
        "to_v",
        "to_out.0",
        "proj_in",
        "proj_out",
    ],
    rank_dropout=0.0,
    module_dropout=0.0,
    use_effective_conv2d=True,
)

pipeline = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
pipeline.unet = get_peft_model(pipeline.unet, config_unet)
pipeline.unet.print_healthcheck()

Ikhtisar benchmark

API

LoHaConfig

kelas peft.LoHaConfig

< >

( 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 = Falsetarget_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Noneinit_weights: bool = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonemodules_to_save: Optional[list[str]] = None )

Parameter

  • r (int) — Rank LoHa.
  • alpha (int) — Parameter alpha untuk penskalaan LoHa.
  • rank_dropout (float) — Probabilitas dropout untuk dimensi rank selama pelatihan.
  • module_dropout (float) — Probabilitas dropout untuk menonaktifkan modul LoHa selama pelatihan.
  • use_effective_conv2d (bool) — Gunakan parameter dekomposisi efektif untuk Conv2d (dan Conv1d) dengan ksize > 1 (“Proposition 3” dari paper FedPara).
  • target_modules (Optional[Union[List[str], str]]) — Nama-nama modul yang akan diterapkan adapter-nya. Jika ini ditentukan, hanya modul dengan nama yang ditentukan yang akan diganti. Saat meneruskan string, pencocokan regex akan dilakukan. Saat meneruskan daftar string, pencocokan persis akan dilakukan atau diperiksa apakah nama modul diakhiri dengan salah satu string yang diteruskan. Jika ini ditentukan sebagai ‘all-linear’, maka semua modul linear/Conv1D akan dipilih, kecuali lapisan output. Jika ini tidak ditentukan, modul akan dipilih sesuai dengan arsitektur model. Jika arsitekturnya tidak diketahui, error akan dilempar — dalam hal ini, Anda harus menentukan modul target secara manual.
  • exclude_modules (Optional[Union[List[str], str]]) — Nama-nama modul yang tidak akan diterapkan adapter. Saat melewatkan string, pencocokan regex akan dilakukan. Saat melewatkan daftar string, pencocokan persis akan dilakukan atau diperiksa apakah nama modul berakhiran dengan salah satu string yang dilewatkan.
  • init_weights (bool) — Apakah akan melakukan inisialisasi bobot adapter. Nilai defaultnya adalah True, dan memberikan False tidak disarankan.
  • layers_to_transform (Union[List[int], int]) — Indeks layer yang akan ditransformasi. Jika daftar int yang dilewatkan, adapter akan diterapkan pada indeks layer yang ditentukan dalam daftar ini. Jika satu integer yang dilewatkan, transformasi akan diterapkan pada layer di indeks ini.
  • layers_pattern (Optional[Union[List[str], str]]) — Nama pola layer, hanya digunakan jika layers_to_transform berbeda dari None. Ini harus menargetkan nn.ModuleList dari model, yang sering disebut 'layers' atau 'h'.
  • rank_pattern (dict) — Pemetaan dari nama layer atau ekspresi regexp ke rank yang berbeda dari rank default yang ditentukan oleh r. Sebagai contoh, {'^model.decoder.layers.0.encoder_attn.k_proj': 16}.
  • alpha_pattern (dict) — Pemetaan dari nama layer atau ekspresi regexp ke alphas yang berbeda dari alpha default yang ditentukan oleh alpha. Sebagai contoh, {'^model.decoder.layers.0.encoder_attn.k_proj': 16}.
  • modules_to_save (Optional[List[str]]) — Daftar modul selain lapisan adapter yang akan diatur sebagai dapat dilatih dan disimpan dalam checkpoint akhir.

Ini adalah kelas konfigurasi untuk menyimpan konfigurasi dari LoHaModel.

LoHaModel

kelas peft.LoHaModel

< >

( 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

Parameter

  • model (torch.nn.Module) — Model tempat lapisan tuner adapter akan dilampirkan.
  • config (LoHaConfig) — Konfigurasi model LoHa.
  • adapter_name (str) — Nama adapter, secara default "default".
  • low_cpu_mem_usage (bool, optional, defaults to False) — Membuat bobot adapter kosong pada perangkat meta. Berguna untuk mempercepat proses pemuatan.

Mengembalikan

torch.nn.Module

Model LoHa.

Membuat model Low-Rank Hadamard Product dari model pretrained. Metode ini dijelaskan sebagian di https://huggingface.co/papers/2108.06098 Implementasi saat ini banyak meminjam dari https://github.com/KohakuBlueleaf/LyCORIS/blob/eb460098187f752a5d66406d3affade6f0a07ece/lycoris/modules/loha.py

Contoh:

>>> from diffusers import StableDiffusionPipeline
>>> from peft import LoHaModel, LoHaConfig

>>> config_te = LoHaConfig(
...     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 = LoHaConfig(
...     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 = LoHaModel(model.text_encoder, config_te, "default")
>>> model.unet = LoHaModel(model.unet, config_unet, "default")

Atribut:

  • model (~torch.nn.Module) — Model yang akan diadaptasi.
  • peft_config (LoHaConfig): Konfigurasi model LoHa.
Update on GitHub