PEFT documentation

RandLora: Penyesuaian halus parameter-efisien peringkat penuh untuk model besar

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

RandLora: Penyesuaian halus parameter-efisien peringkat penuh untuk model besar

RandLora adalah teknik fine-tuning yang efisien dalam hal parameter, mirip dengan LoRA dan VeRA, tetapi melakukan pembaruan rank penuh untuk meningkatkan kinerja. RandLora dapat sangat berguna saat menyesuaikan model besar untuk tugas-tugas sulit yang memerlukan pembaruan kompleks sambil mempertahankan efisiensi parameter dari LoRA. Pembaruan rank penuh pada RandLora dicapai dengan menskalakan basis acak secara linear. Basis acak adalah kumpulan beberapa matriks rank rendah sehingga jumlah rank mereka sama dengan atau lebih besar dari rank penuh matriks parameter. Parameter yang dapat dilatih pada RandLora adalah dua matriks diagonal (vektor) yang dikalikan dengan basis acak rank rendah di sisi kanan, dengan cara yang serupa dengan pembaruan VeRA. Untuk menjaga penggunaan memori tetap rendah, RandLora menggunakan fungsi khusus yang mencegah penyimpanan basis yang tidak perlu di memori untuk backpropagation.

RandLora menunjukkan perbedaan yang signifikan, yaitu bertentangan dengan algoritma PEFT serupa LoRA lainnya, meningkatkan rank basis acak RandLora akan meningkatkan jumlah parameter yang dapat dilatih. Karena jumlah basis x rank basis bersifat konstan dalam RandLora, mengurangi rank akan meningkatkan jumlah basis acak, sehingga meningkatkan jumlah basis diagonal yang dapat dilatih dan spesifik untuk setiap basis.

Karena mengurangi rank dari basis acak RandLora akan meningkatkan jumlahnya, RandLora dapat menjadi lebih lambat untuk dilatih daripada LoRA untuk rank yang sangat kecil, di mana biasanya rank di bawah 4 akan menyebabkan peningkatan waktu pelatihan yang besar. Hal ini tidak memengaruhi inferensi, karena adapter RandLora dapat digabungkan ke dalam matriks bobot pra-terlatih.

RandLora juga mendukung pelatihan dengan basis acak yang jarang dan ternary (hanya berisi -1, 0, dan 1). Basis-basis ini dijelaskan dalam Bingham et al. dan Ping et al. dan secara teoretis dapat digunakan untuk mengurangi kebutuhan komputasi dengan melakukan agregasi alih-alih perkalian matriks untuk membuat pembaruan bobot. Hal ini belum didukung saat ini. Meskipun tidak mengurangi komputasi saat ini, penggunaan basis acak yang jarang dalam RandLora dapat mengurangi overfitting dalam beberapa kasus. Bagi pengguna yang tertarik menggunakan basis ternary yang jarang, opsi sparse direkomendasikan dibandingkan opsi very_sparse yang dapat mengurangi kinerja.

Sama seperti VeRA, saat menyimpan parameter RandLora, Anda dapat memilih untuk tidak menyimpan matriks rank rendah dengan mengatur save_projection=False pada VeraConfig. Dalam kasus tersebut, matriks-matriks ini akan dipulihkan berdasarkan seed acak tetap dari argumen projection_prng_key. Hal ini mengurangi ukuran checkpoint, tetapi kami tidak dapat menjamin reproduktibilitas di semua perangkat dan untuk semua versi PyTorch di masa depan. Jika Anda ingin memastikan reproduktibilitas, atur save_projection=True (yang merupakan nilai default).

Seperti pada Vera dan untuk menangani bentuk lapisan yang diadaptasi yang berbeda, RandLora menginisialisasi matriks A dan B yang dibagikan dengan ukuran terbesar yang diperlukan untuk setiap dimensi. Selama jalur maju, submatriks A dan B untuk lapisan tertentu dipotong dari matriks bersama ini dan digunakan seperti yang dijelaskan dalam makalah. Sebagai contoh, mengadaptasi dua lapisan linear dengan bentuk (100, 20) dan (80, 50) akan membuat matriks A dan B dengan bentuk (rank, 50) dan (100, rank) masing-masing. Kemudian, untuk mengadaptasi lapisan dengan bentuk (100, 20), submatriks A dan B dengan bentuk (rank, 20) dan (100, rank) akan diekstrak.

Saat ini, RandLora memiliki batasan berikut:

  • Hanya lapisan nn.Linear yang didukung.

Abstrak dari makalah tersebut adalah:

Low-Rank Adaptation (LoRA) dan variasinya telah menunjukkan hasil yang mengesankan dalam mengurangi jumlah parameter yang dapat dilatih serta kebutuhan memori pada jaringan transformer besar, sambil tetap mempertahankan kinerja fine-tuning. Namun, sifat low-rank dari pembaruan bobot secara inheren membatasi kekuatan representasi model yang telah di-fine-tune, sehingga berpotensi mengompromikan kinerja pada tugas-tugas kompleks. Hal ini menimbulkan pertanyaan kritis: ketika kesenjangan kinerja antara LoRA dan fine-tuning standar diamati, apakah hal tersebut disebabkan oleh berkurangnya jumlah parameter yang dapat dilatih atau oleh defisiensi rank? Kertas kerja ini bertujuan untuk menjawab pertanyaan tersebut dengan memperkenalkan RandLora, sebuah metode yang efisien secara parameter yang melakukan pembaruan full-rank menggunakan kombinasi linear yang dipelajari dari matriks acak low-rank yang tidak dapat dilatih. Metode kami membatasi jumlah parameter yang dapat dilatih dengan membatasi optimasi pada matriks penskalaan diagonal yang diterapkan pada matriks acak yang tetap. Hal ini memungkinkan kami untuk secara efektif mengatasi keterbatasan low-rank sambil mempertahankan efisiensi parameter dan memori selama pelatihan. Melalui eksperimen yang luas di berbagai benchmark visi, bahasa, dan visi-bahasa, kami mengevaluasi secara sistematis keterbatasan LoRA dan metode basis acak yang ada. Temuan kami mengungkapkan bahwa pembaruan full-rank bermanfaat secara individual pada tugas-tugas visi dan bahasa, dan bahkan lebih lagi untuk tugas-tugas visi-bahasa, di mana RandLora secara signifikan mengurangi---dan terkadang menghilangkan---kesenjangan kinerja antara fine-tuning standar dan LoRA, sehingga menunjukkan efektivitasnya.

Ikhtisar benchmark

API

RandLoraConfig

kelas peft.RandLoraConfig

< >

( 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 = Falser: int = 32target_modules: list[str] | str | None = Noneprojection_prng_key: int = 0save_projection: bool = Truesparse: bool = Falsevery_sparse: bool = Falserandlora_dropout: float = 0.0fan_in_fan_out: bool = Falserandlora_alpha: int = 640bias: str = 'none'modules_to_save: list[str] | None = Noneinit_weights: bool = Truelayers_to_transform: list[int] | int | None = Nonelayers_pattern: str | None = None )

Parameter

  • r (int, opsional, default 32) β€” Dimensi rank basis acak RandLora. Berbeda dengan Lora, parameter ini berbanding terbalik dengan jumlah parameter yang dapat dilatih, karena menguranginya akan meningkatkan jumlah parameter yang dapat dilatih.
  • target_modules (Union[list[str], str]) β€” Nama-nama modul yang akan diterapkan RandLora. Hanya lapisan linear yang didukung.
  • projection_prng_key (int) β€” Kunci inisialisasi PRNG RandLora. Digunakan untuk menginisialisasi basis_A dan basis_B untuk model baru atau saat memuat checkpoint yang tidak menyertakan proyeksi ini. Nilai defaultnya adalah 0.
  • save_projection (bool) β€” Apakah akan menyimpan basis acak global basis_A / basis_B dalam state dict bersama matriks diagonal lambda / gamma per layer. Hal ini akan meningkatkan ukuran checkpoint, tetapi menjamin bahwa checkpoint dapat dimuat ulang pada semua konfigurasi sistem. Defaultnya adalah True.
  • sparse (bool) β€” Apakah akan menggunakan basis acak sparse seperti yang dijelaskan dalam paper RandLora. Basis-basis tersebut adalah basis sparse ternary (hanya berisi -1, 0, dan 1) di mana probabilitas atribusinya adalah 1/6 untuk -1 dan 1, serta 2/3 untuk 0. Matriks sparse ini ditujukan untuk digunakan dalam komputasi bebas matmul di masa depan, lihat https://huggingface.co/papers/2406.02528v1 Implementasi saat ini merupakan konsep pembuktian di mana karakteristik sparse-nya belum dimanfaatkan untuk meningkatkan kecepatan atau penggunaan memori. Penggunaan matriks sparse biasanya tidak menurunkan performa dan bahkan dapat membantu mengurangi overfitting. Nilai defaultnya adalah False.
  • very_sparse (bool) β€” Apakah akan menggunakan basis acak yang sangat jarang seperti yang dijelaskan dalam paper RandLora. Basis yang sangat jarang ini adalah basis jarang ternary (hanya berisi -1, 0, dan 1) yang diberikan matriks dengan dimensi terkecil d, probabilitas atribusinya adalah 1/√D untuk -1 dan 1 serta 1- 2/√D untuk 0. Penggunaan matriks jarang ini dapat lebih mengurangi overfitting dibandingkan alternatif sparse tetapi kemungkinan besar akan menurunkan kinerja sebagai akibatnya. Gunakan dengan hati-hati. Defaultnya adalah False.
  • randlora_dropout (float) β€” Probabilitas dropout untuk lapisan RandLora.
  • randlora_alpha (float) β€” Koefisien penskalaan untuk lapisan RandLora, yang biasanya 20 kali rank. Karena koefisien randlora_alpha besar secara default, hal ini dapat menyebabkan ketidakstabilan numerik terutama ketika learning rate tinggi. Jika pelatihan tidak stabil, pertimbangkan untuk mengurangi learning rate atau koefisien randlora_alpha.
  • fan_in_fan_out (bool) β€” Atur ini ke True jika layer yang akan diganti menyimpan bobot seperti (fan_in, fan_out). Misalnya, gpt-2 menggunakan Conv1D yang menyimpan bobot seperti (fan_in, fan_out) sehingga ini harus diatur ke True.
  • bias (str) — Bias type. Can be ‘none’, ‘all’ or ‘randlora_only’. If ‘all’ or ‘randlora_only’, the corresponding biases will be updated during training. Be aware that this means that, even when disabling the adapters, the model will not produce the same output as the base model would have without adaptation.
  • modules_to_save (list[str]) β€” daftar modul selain lapisan RandLora yang akan diset sebagai dapat dilatih dan disimpan dalam checkpoint akhir.
  • init_weights (bool) β€” Apakah akan menginisialisasi bobot lapisan RandLora dengan inisialisasi defaultnya. Jangan ubah pengaturan ini, kecuali Anda tahu persis apa yang Anda lakukan.
  • layers_to_transform (Union[list[int],int]) β€” Indeks layer yang akan ditransformasi. Jika argumen ini ditentukan, transformasi RandLora akan diterapkan pada indeks layer yang ditentukan dalam daftar ini. Jika satu bilangan bulat tunggal diberikan, transformasi RandLora akan diterapkan pada layer di indeks tersebut.
  • layers_pattern (str) β€” Nama pola layer, hanya digunakan jika layers_to_transform berbeda dari None dan jika pola layer tersebut tidak termasuk dalam pola layer umum.

Ini adalah kelas konfigurasi untuk menyimpan konfigurasi dari RandLoraModel.

Makalah: https://huggingface.co/papers/2502.00987.

RandLoraModel

kelas peft.RandLoraModel

< >

( 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 (PreTrainedModel) β€” Model yang akan diadaptasi.
  • config (RandLoraConfig) β€” Konfigurasi model RandLora.
  • 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 RandLora.

Membuat model RandLoRA dari model transformers yang telah dilatih sebelumnya.

Contoh:

>>> from transformers import AutoModelForCausalLM
>>> from peft import RandLoraConfig, get_peft_model

>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = RandLoraConfig(r=32)
>>> model = get_peft_model(base_model, config)

Atribut:

Update on GitHub