PEFT documentation
VeRA: Adaptasi Matriks Acak Berbasis Vektor
VeRA: Adaptasi Matriks Acak Berbasis Vektor
VeRA adalah teknik fine-tuning yang efisien dalam hal parameter, mirip dengan LoRA tetapi membutuhkan parameter tambahan yang bahkan lebih sedikit sambil menjanjikan kinerja yang serupa atau bahkan lebih baik. Oleh karena itu, teknik ini sangat berguna ketika anggaran parameter sangat terbatas, misalnya saat menskalakan ke model yang sangat besar. Pengurangan jumlah parameter yang dapat dilatih dicapai dengan berbagi matriks ber-rank rendah yang sama di semua lapisan, dan hanya melatih dua vektor tambahan per lapisan.
Cara kerja VeRA
LoRA memperbarui model dasar yang dibekukan dengan mempelajari dua matriks kecil ber-rank rendah untuk setiap lapisan yang diadaptasi. Rank adalah dimensi dalam dari matriks-matriks ini, dan mengontrol seberapa besar kapasitas yang dimiliki adapter. Dalam LoRA, meningkatkan r atau mengadaptasi lebih banyak lapisan akan meningkatkan jumlah parameter yang dapat dilatih dengan cepat karena setiap lapisan yang diadaptasi mempelajari pasangannya sendiri dari matriks ber-rank rendah.
VeRA mempertahankan ide adaptasi rank rendah yang sama tetapi mengubah parameter mana yang dilatih. Alih-alih mempelajari matriks rank rendah terpisah untuk setiap lapisan, VeRA menggunakan satu pasangan matriks rank rendah yang dibekukan dan diinisialisasi secara acak, A dan B, yang dibagikan di antara lapisan. Setiap lapisan yang diadaptasi hanya mempelajari dua vektor penskalaan, vera_lambda_d dan vera_lambda_b, yang menskalakan ulang matriks bersama untuk menghasilkan pembaruan yang spesifik untuk lapisan tersebut. Karena vera_lambda_d memiliki ukuran r, jumlah parameter yang dapat dilatih pada VeRA tetap meningkat seiring dengan r dan jumlah lapisan yang diadaptasi. Namun, pertumbuhannya jauh lebih lambat daripada LoRA karena matriks A dan B yang besar dibagikan dan dibekukan, bukan dipelajari secara terpisah untuk setiap lapisan.
Inilah mengapa VeRA dapat menggunakan lebih sedikit parameter yang dapat dilatih dibandingkan LoRA. Dalam penghitungan parameter yang disederhanakan dari makalah tersebut, LoRA
skala dengan 2 * L_tuned * d_model * r, di mana L_tuned adalah jumlah lapisan yang diadaptasi, d_model adalah dimensi
model, dan r adalah rank. VeRA skala dengan L_tuned * (d_model + r) karena matriks rank rendah yang besar
dibagikan dan dibekukan, sementara hanya vektor per lapisan yang lebih kecil yang dilatih.
Saat menyimpan parameter adapter, Anda dapat memilih untuk tidak menyimpan matriks rank rendah dengan mengatur save_projection=False pada VeraConfig. Dalam kasus tersebut, 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).
Untuk menangani bentuk lapisan yang diadaptasi yang berbeda, VeRA menginisialisasi matriks A dan B bersama 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.
VeRA saat ini memiliki batasan berikut:
- Hanya lapisan
nn.Linearyang didukung.
Abstrak dari makalah tersebut adalah:
Adaptasi peringkat rendah (LoRA) adalah metode populer yang mengurangi jumlah parameter yang dapat dilatih saat melakukan penyesuaian halus (finetuning) pada model bahasa besar, namun masih menghadapi tantangan penyimpanan yang serius saat diskalakan ke model yang lebih besar lagi atau saat mendeploikan banyak model yang telah diadaptasi per pengguna atau per tugas. Dalam karya ini, kami memperkenalkan Adaptasi Matriks Acak Berbasis Vektor (VeRA), yang secara signifikan mengurangi jumlah parameter yang dapat dilatih dibandingkan dengan LoRA, namun tetap mempertahankan kinerja yang sama. Hal ini dicapai dengan menggunakan satu pasang matriks peringkat rendah yang dibagikan di semua lapisan dan mempelajari vektor penskalaan kecil sebagai gantinya. Kami mendemonstrasikan efektivitasnya pada benchmark GLUE dan E2E, tugas klasifikasi gambar, serta menunjukkan penerapannya dalam penyetelan instruksi (instruction-tuning) pada model bahasa 7B dan 13B.
Kapan menggunakan VeRA
VeRA adalah pilihan yang tepat ketika:
- Anda ingin meminimalkan jumlah parameter yang dapat dilatih sambil mempertahankan kinerja yang sebanding dengan LoRA.
- Anda perlu menyimpan atau mendeploy banyak adapter yang spesifik untuk tugas tertentu, di mana checkpoint adapter yang lebih kecil mengurangi kebutuhan penyimpanan.
- Anda sedang melakukan fine-tuning pada model bahasa yang sangat besar dengan anggaran memori atau parameter yang ketat.
Kapan tidak menggunakan VeRA
VeRA mungkin bukan pilihan terbaik ketika:
- Anda memerlukan matriks ber-rank rendah yang independen untuk setiap lapisan yang diadaptasi, sehingga memberikan fleksibilitas yang lebih besar pada parameter adapter yang dipelajari.
- Model Anda memerlukan penyesuaian tipe modul selain
nn.Linear, karena VeRA saat ini hanya mendukung lapisan linear. - Model Anda berisi lapisan linear yang diadaptasi dengan dimensi input dan output yang sangat berbeda. Karena VeRA berbagi satu pasang matriks proyeksi di seluruh lapisan yang diadaptasi, matriks ini harus berukuran sesuai dengan bentuk terbesar. Model dengan variasi bentuk lapisan yang besar (misalnya, lapisan proyeksi up dan down pada transformer) dapat memerlukan over-provisioning matriks proyeksi bersama, sehingga mengurangi sebagian keunggulan efisiensi parameter VeRA.
Ikhtisar benchmark
API
VeRAConfig
kelas peft.VeraConfig
< 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 = Falser: int = 256target_modules: Optional[Union[list[str], str]] = Noneprojection_prng_key: int = 0save_projection: bool = Truevera_dropout: float = 0.0d_initial: float = 0.1fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_weights: bool = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = None )
Parameter
- r (
int, opsional, default256) β Dimensi parameter VeRA (βrankβ). Pilih nilai yang lebih tinggi daripada rank LoRA di sini, karena VeRA menggunakan jauh lebih sedikit parameter daripada LoRA (lihat Tabel 1). - target_modules (
Union[List[str], str]) β Nama-nama modul yang akan diterapkan Vera. Hanya lapisan linear yang didukung. - projection_prng_key (
int) β Kunci inisialisasi Vera PRNG. Digunakan untuk menginisialisasi vera_A dan vera_B untuk model baru atau saat memuat checkpoint yang tidak menyertakan proyeksi ini. Nilai defaultnya adalah0. - save_projection (
bool) β Apakah akan menyimpan proyeksi vera_A / vera_B dalam state dict bersama bobot lambda_b / lambda_d per layer. Hal ini akan meningkatkan ukuran checkpoint, tetapi menjamin bahwa checkpoint dapat dimuat ulang di semua konfigurasi sistem. Defaultnya adalahTrue. - vera_dropout (
float) β Probabilitas dropout untuk lapisan Vera. - d_initial (
float, opsional, default0.1) β Nilai inisialisasi awal untuk vektorvera_lambda_dyang digunakan saat menginisialisasi parameter VeRA. Nilai kecil (<=0.1) direkomendasikan (lihat Tabel 6c di makalah). - fan_in_fan_out (
bool) β Atur ini ke True jika layer yang akan diganti menyimpan bobot seperti (fan_in, fan_out). Misalnya, gpt-2 menggunakanConv1Dyang menyimpan bobot seperti (fan_in, fan_out) sehingga ini harus diatur keTrue. - bias (
str) — Bias type for Vera. Can be ‘none’, ‘all’ or ‘vera_only’. If ‘all’ or ‘vera_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 di luar lapisan Vera yang akan diset sebagai trainable dan disimpan dalam checkpoint akhir. - init_weights (
bool) β Apakah akan menginisialisasi bobot lapisan Vera 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 Vera akan diterapkan pada indeks layer yang tercantum dalam daftar ini. Jika satu bilangan bulat tunggal diberikan, transformasi Vera akan diterapkan pada layer di indeks tersebut. - layers_pattern (
Optional[Union[List[str], str]]) β Nama pola layer, hanya digunakan jikalayers_to_transformberbeda dariNone. Ini harus menargetkannn.ModuleListdari model, yang sering disebut'layers'atau'h'.
Ini adalah kelas konfigurasi untuk menyimpan konfigurasi dari VeraModel.
Makalah: https://huggingface.co/papers/2310.11454.
VeRAModel
kelas peft.VeraModel
< 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
Parameter
- model (PreTrainedModel) β Model yang akan diadaptasi.
- config (VeraConfig) β Konfigurasi model Vera.
- adapter_name (
str) β Nama adapter, secara default"default". - low_cpu_mem_usage (
bool,optional, defaults toFalse) β Membuat bobot adapter kosong pada perangkat meta. Berguna untuk mempercepat proses pemuatan.
Mengembalikan
torch.nn.Module
Model Vera.
Membuat model Vector-based Random Matrix Adaptation (Vera) dari model transformers yang sudah dilatih sebelumnya.
Contoh:
>>> from transformers import AutoModelForCausalLM
>>> from peft import VeraConfig, get_peft_model
>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = VeraConfig(r=128)
>>> model = get_peft_model(base_model, config)Atribut:
- model (PreTrainedModel) β Model yang akan diadaptasi.
- peft_config (VeraConfig): Konfigurasi model Vera.