PEFT documentation

AdaLoRA

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

AdaLoRA

AdaLoRA (Adaptive LoRA) adalah metode untuk mengoptimalkan jumlah parameter yang dapat dilatih agar dialokasikan ke matriks bobot dan lapisan, berbeda dengan LoRA yang mendistribusikan parameter secara merata ke semua modul. Parameter lebih banyak dialokasikan untuk matriks bobot dan lapisan yang penting, sementara yang kurang penting menerima lebih sedikit parameter. Anda dapat mengatur rata-rata rank atau r matriks yang diinginkan, serta modul mana yang akan diterapkan AdaLoRA melalui target_modules. Parameter penting lainnya yang perlu diatur adalah lora_alpha (faktor penskalaan), dan modules_to_save (modul di luar lapisan AdaLoRA yang akan dilatih dan disimpan). Semua parameter ini - dan lainnya - dapat ditemukan di AdaLoraConfig.

Abstrak dari makalah tersebut adalah:

Fine-tuning model bahasa besar yang telah dilatih sebelumnya pada tugas turunan telah menjadi paradigma penting dalam NLP. Namun, praktik umum melakukan fine-tuning pada semua parameter dalam model yang telah dilatih sebelumnya, yang menjadi tidak layak ketika terdapat sejumlah besar tugas turunan. Oleh karena itu, banyak metode fine-tuning diusulkan untuk mempelajari pembaruan inkremental dari bobot yang telah dilatih sebelumnya dengan cara yang efisien secara parameter, misalnya, inkremen ber-rank rendah. Metode-metode ini sering kali mendistribusikan anggaran pembaruan inkremental secara merata di antara semua matriks bobot yang telah dilatih sebelumnya, dan mengabaikan pentingnya yang bervariasi dari parameter bobot yang berbeda. Akibatnya, kinerja fine-tuning menjadi suboptimal. Untuk menjembatani kesenjangan ini, kami mengusulkan AdaLoRA, yang secara adaptif mengalokasikan anggaran parameter di antara matriks bobot berdasarkan skor pentingnya. Secara khusus, AdaLoRA memparameterisasi pembaruan inkremental dalam bentuk dekomposisi nilai singular. Pendekatan baru ini memungkinkan kami untuk memangkas nilai singular dari pembaruan yang tidak penting secara efektif, yang pada dasarnya mengurangi anggaran parameter mereka tetapi menghindari komputasi SVD eksak yang intensif. Kami melakukan eksperimen yang luas dengan beberapa model yang telah dilatih sebelumnya pada pemrosesan bahasa alami, penjawaban pertanyaan, dan generasi bahasa alami untuk memvalidasi efektivitas AdaLoRA. Hasil menunjukkan bahwa AdaLoRA menunjukkan peningkatan yang signifikan dibandingkan baseline, terutama dalam pengaturan anggaran rendah. Kode kami tersedia secara publik di https://github.com/QingruZhang/AdaLoRA.

AdaLoRA memiliki metode update_and_allocate() yang harus dipanggil pada setiap langkah pelatihan untuk memperbarui anggaran parameter dan mask, jika tidak langkah adaptasi tidak akan dilakukan. Hal ini memerlukan penulisan loop pelatihan kustom atau subclassing Trainer untuk mengintegrasikan metode ini. Sebagai contoh, lihat loop pelatihan kustom ini.

AdaLoRA mengelola anggaran parameter yang diperkenalkan dari LoRA dengan mengalokasikan lebih banyak parameter - dengan kata lain, rank yang lebih tinggi r - untuk matriks bobot penting yang lebih baik diadaptasi untuk tugas tertentu dan memangkas yang kurang penting. Rank dikendalikan oleh metode yang mirip dengan dekomposisi nilai singular (SVD). Ξ”W\Delta W diparameterisasi dengan dua matriks ortogonal dan satu matriks diagonal yang berisi nilai singular. Metode parameterisasi ini menghindari penerapan SVD secara iteratif yang mahal secara komputasi. Berdasarkan metode ini, rank dari Ξ”W\Delta W disesuaikan sesuai dengan skor kepentingan. Ξ”W\Delta W dibagi menjadi triplet dan setiap triplet diberi skor berdasarkan kontribusinya terhadap kinerja model. Triplet dengan skor kepentingan rendah dipangkas dan triplet dengan skor kepentingan tinggi dipertahankan untuk finetuning.

Pelatihan dengan AdaLoRA memiliki tiga fase: fase inisialisasi, fase penganggaran, dan fase akhir. Pada fase inisialisasi, penganggaran tidak diterapkan, sehingga rank tidak diubah. Selama fase penganggaran, proses yang dijelaskan di atas diterapkan dan rank didistribusikan ulang sesuai dengan anggaran, dengan tujuan memberikan rank lebih besar pada adapter yang lebih penting dan rank lebih kecil pada lapisan yang kurang penting. Saat mencapai fase akhir, penganggaran telah selesai, rank didistribusikan ulang, tetapi kita dapat melanjutkan pelatihan untuk sementara waktu dengan rank yang telah didistribusikan ulang untuk meningkatkan kinerja lebih lanjut.

Kontribusi disambut: Bagian ini perlu diperjelas.

Cara pengukuran tingkat kepentingan tidak dijelaskan dengan jelas. Penjelasan juga agak redundan dan dapat diuntungkan dari konsolidasi. Lihat di sini tentang cara berkontribusi.

Ikhtisar benchmark

Penggunaan

from peft import AdaLoraConfig, get_peft_model

config = AdaLoraConfig(
    r=8,
    init_r=12,
    tinit=200,
    tfinal=1000,
    deltaT=10,
    target_modules=["query", "value"],
    modules_to_save=["classifier"],
)
model = get_peft_model(model, config)
model.print_healthcheck()

[... training code ...]

model.update_and_allocate(step_idx)

API

AdaLoraConfig

kelas peft.AdaLoraConfig

< >

( 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 = 8target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonelora_alpha: int = 8lora_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: Literal['none', 'all', 'lora_only'] = 'none'use_rslora: bool = Falsemodules_to_save: Optional[list[str]] = Noneinit_lora_weights: bool | Literal['gaussian', 'eva', 'olora', 'pissa', 'pissa_niter_[number of iters]', 'corda', 'astra', 'loftq', 'orthogonal', 'mica', 'nora'] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonerank_pattern: dict | None = Nonealpha_pattern: Optional[dict] = <factory>megatron_config: Optional[dict] = Nonemegatron_core: Optional[str] = 'megatron.core'trainable_token_indices: Optional[Union[list[int], dict[str, list[int]]]] = Noneloftq_config: Union[LoftQConfig, dict] = <factory>eva_config: Optional[EvaConfig] = Nonecorda_config: Optional[CordaConfig] = Noneastra_config: Optional[AstraConfig] = Nonelora_ga_config: Optional[LoraGAConfig] = Noneuse_dora: bool = Falsevelora_config: Optional[Union[VeloraConfig, dict]] = Nonealora_invocation_tokens: Optional[list[int]] = Noneuse_qalora: bool = Falseqalora_group_size: int = 16monteclora_config: Optional[MontecloraConfig] = Nonelayer_replication: Optional[list[tuple[int, int]]] = Noneruntime_config: LoraRuntimeConfig = <factory>lora_bias: bool = Falsetarget_parameters: Optional[list[str]] = Noneuse_bdlora: Optional[BdLoraConfig] = Nonearrow_config: Optional[ArrowConfig] = Nonekasa_config: Optional[KasaConfig] = Noneensure_weight_tying: bool = Falsetarget_r: int = 8init_r: int = 12tinit: int = 0tfinal: int = 0deltaT: int = 1beta1: float = 0.85beta2: float = 0.85orth_reg_weight: float = 0.5total_step: int | None = None )

Parameter

  • target_r (int) β€” Rata-rata target rank dari matriks inkremental.
  • init_r (int) β€” Rank awal untuk setiap matriks inkremental.
  • tinit (int) β€” Langkah-langkah warmup fine-tuning awal.
  • tfinal (int) β€” Jumlah langkah fine-tuning akhir.
  • deltaT (int) β€” Interval waktu antara dua alokasi anggaran.
  • beta1 (float) β€” Hiperparameter EMA untuk perhalusan sensitivitas.
  • beta2 (float) β€” Hiperparameter EMA untuk kuantifikasi ketidakpastian.
  • orth_reg_weight (float) β€” Koefisien regularisasi ortogonal.
  • total_step (int) β€” Total langkah pelatihan yang harus ditentukan sebelum pelatihan.
  • rank_pattern (list) β€” Rank yang dialokasikan untuk setiap matriks bobot oleh RankAllocator.

Ini adalah kelas konfigurasi untuk menyimpan konfigurasi dari AdaLoraModel.

AdaLoRA memiliki tiga fase yang didefinisikan oleh tinit, tfinal, dan total_step.

Fase awal dapat dipahami sebagai langkah untuk pra-melatih adapter sehingga ketika rank-nya dikurangi, sudah ada beberapa informasi yang terenkodasi yang dapat dikurangi, bukan matriks acak. Fase ini didefinisikan dengan menyediakan tinit.

Setelah fase awal berakhir (tinit langkah telah berlalu) dan fase akhir belum dimulai, AdaLoRA mengurangi anggaran jumlah rank yang diizinkan untuk setiap lapisan pada setiap langkah. Di sinilah pengurangan rank terjadi. Proses ini berlanjut hingga total_step - tfinal langkah tercapai.

Fase terakhir, yang dimulai setelah total_step - tfinal langkah tercapai, tidak lagi mengubah peringkat lapisan, tetapi melakukan penyesuaian halus (fine-tuning) pada lapisan berperingkat rendah yang dihasilkan dari fase sebelumnya.

Contoh praktis: tinit adalah 10, tfinal adalah 20, dan total_step adalah 100. Kami menghabiskan 10 langkah untuk pre-training tanpa pengurangan rank karena anggaran kami konstan (fase init), kemudian kami menghabiskan 80 (100-20) langkah di fase pengurangan di mana anggaran kami berkurang secara bertahap, dan akhirnya, 20 langkah di tahap fine-tuning akhir tanpa pengurangan.

AdaLoraModel

kelas peft.AdaLoraModel

< >

( modelconfigadapter_name**kwargs ) β†’ torch.nn.Module

Parameter

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

Membuat model AdaLoRA (Adaptive LoRA) dari model transformers yang sudah dilatih sebelumnya. Paper: https://openreview.net/forum?id=lq62uWRJjiY

Contoh:

>>> from transformers import AutoModelForSeq2SeqLM
>>> from peft import AdaLoraConfig, get_peft_model

>>> config = AdaLoraConfig(
...     peft_type="ADALORA",
...     task_type="SEQ_2_SEQ_LM",
...     init_r=12,
...     lora_alpha=32,
...     target_modules=["q", "v"],
...     lora_dropout=0.01,
...     total_step=1000,
... )
>>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
>>> adalora_model = get_peft_model(model, config)

Atribut:

add_weighted_adapter

< >

( *args**kwargs )

Metode ini tidak didukung untuk AdaLoRA, gunakan LoRA sebagai gantinya.

update_and_allocate

< >

( global_step )

Parameter

  • global_step (int) β€” Langkah pelatihan saat ini, digunakan untuk menghitung anggaran adalora.

Metode ini memperbarui anggaran dan masker Adalora.

Ini harus dipanggil di setiap langkah pelatihan setelah loss.backward() dan sebelum zero_grad().

tinit, tfinal dan deltaT ditangani di dalam metode.

Contoh:

>>> loss = model(**input).loss
>>> loss.backward()
>>> optimizer.step()
>>> model.base_model.update_and_allocate(i_step)
>>> optimizer.zero_grad()
Update on GitHub