PEFT documentation
MiSS
MiSS
MiSS (Matrix Shard Sharing) adalah metode PEFT yang mencapai keseimbangan yang baik antara kinerja model dan efisiensi komputasi. Metode ini hanya memerlukan satu matriks yang dapat dilatih dan memperkenalkan mekanisme berbagi shard yang berbeda dari LoRA.
Abstrak dari makalah tersebut adalah:
Metode Fine-Tuning yang Efisien Parameter (PEFT), khususnya Low-Rank Adaptation (LoRA), secara efektif mengurangi jumlah parameter yang dapat dilatih pada Large Language Models (LLM). Namun, seiring terus membesarnya skala model, kebutuhan akan sumber daya komputasi tetap menjadi tantangan signifikan. Varian LoRA yang ada sering kali kesulitan mencapai keseimbangan optimal antara kemampuan adaptasi (kinerja model dan kecepatan konvergensi) dan efisiensi (beban komputasi, penggunaan memori, dan waktu inisialisasi). Kertas kerja ini memperkenalkan MiSS (Matrix Shard Sharing), pendekatan PEFT baru yang mengatasi trade-off ini melalui mekanisme berbagi shard yang sederhana. MiSS memanfaatkan wawasan bahwa adaptasi low-rank dapat dicapai dengan mendekomposisi matriks bobot menjadi beberapa matriks fragmen dan memanfaatkan fragmen bersama yang dapat dilatih. Metode ini membangun matriks pembaruan low-rank melalui replikasi shard-partisi bersama ini. Kami juga mengusulkan implementasi yang efisien secara hardware dan luas penerapannya untuk MiSS. Eksperimen ekstensif yang dilakukan pada berbagai tugas, bersama dengan analisis sistematis kinerja komputasi, menunjukkan keunggulan MiSS. Hasilnya menunjukkan bahwa MiSS secara signifikan melampaui LoRA standar dan variannya yang menonjol dalam metrik kinerja model maupun efisiensi komputasi, termasuk kecepatan inisialisasi dan throughput pelatihan. Dengan menyeimbangkan kekuatan ekspresif dan pemanfaatan sumber daya secara efektif, MiSS menawarkan solusi yang menarik untuk mengadaptasi model berskala besar secara efisien.
Ikhtisar benchmark
Kapan menggunakan MiSS
MiSS adalah pilihan yang tepat ketika:
- Anda menginginkan inisialisasi yang lebih cepat dan throughput pelatihan yang lebih tinggi daripada skema inisialisasi LoRA lanjutan yang menggunakan setup mahal (seperti PiSSA, LoRA-GA, atau OLoRA).
- Anda menginginkan alternatif drop-in untuk LoRA dengan perubahan konfigurasi yang minimal.
Jika Anda membutuhkan ekspresivitas yang lebih kuat dengan mengorbankan sedikit efisiensi, pertimbangkan varian inisialisasi bat (lihat di bawah).
mode init_weights
MiSS mendukung tiga mode inisialisasi melalui parameter init_weights:
True(default): Inisialisasi MiSS standar. Titik awal terbaik untuk sebagian besar kasus penggunaan."bat": Mengaktifkan pembaruan nonlinier di antara shard yang berbeda. Menghasilkan hasil yang lebih baik daripada MiSS standar, tetapi menggunakan lebih banyak memori dan sekitar dua kali lebih lambat. Gunakan ini ketika performa menjadi prioritas di atas efisiensi."mini": Menggunakan rank yang lebih kecil di sepanjang dimensiout_features, dikendalikan olehmini_r. Hal ini mengurangi jumlah parameter yang dapat dilatih lebih lanjut. Saat menggunakan mode ini,mini_rharus diatur danout_featuresharus dapat dibagi habis olehmini_r.
Mulai cepat
import torch
from peft import MissConfig, get_peft_model
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf",
torch_dtype=torch.bfloat16,
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
tokenizer.pad_token_id = tokenizer.eos_token_id
# Standard MiSS
config = MissConfig(
r=64,
miss_dropout=0.01,
task_type="CAUSAL_LM"
)
# BAT variant β better performance, more memory
# config = MissConfig(
# r=64,
# init_weights="bat",
# task_type="CAUSAL_LM"
# )
# Mini variant β fewer trainable parameters
# config = MissConfig(
# r=64,
# init_weights="mini",
# mini_r=8,
# task_type="CAUSAL_LM"
# )
model = get_peft_model(model, config)
model.print_healthcheck()Untuk contoh fine-tuning lengkap yang mencakup pelatihan dan inferensi, lihat contoh fine-tuning MiSS.
API
MissConfig
kelas peft.MissConfig
< 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 = 64miss_dropout: float = 0.0mini_r: int = 1target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Noneinit_weights: bool | Literal['bat', 'mini'] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[str] = Nonebias: str = 'none'modules_to_save: Optional[list[str]] = None )
Parameter
- r (
int) β Rank dari MiSS di berbagai lapisan. Disarankan untuk mengatur βrβ ke bilangan genap; jika tidak, metode inisialisasi default tidak akan berfungsi. Rank dari MiSS sesuai dengan dekomposisi low-rank di sepanjang dimensi in_features. - miss_dropout (
float) β Probabilitas dropout untuk lapisan MiSS. - mini_r (
int) β Rank dari MiSS sesuai dengan dekomposisi low-rank sepanjang dimensi out_features. Ketika Anda mengaturinit_weights=mini, Anda perlu mengaturmini_r. Pastikan bahwaout_featuresdapat dibagi habis olehmini_r. - 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 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 | Literal[βbatβ, βminiβ]) β
Inisialisasi yang berbeda sesuai dengan varian MiSS yang berbeda. Secara default (balance), metode yang paling efisien dan umum dalam MiSS akan digunakan. βbatβ: Dalam mode ini, Anda dapat mengaktifkan pembaruan nonlinier di antara shard yang berbeda. βminiβ: Dalam mode ini, Anda dapat mengatur rank yang lebih kecil untuk menggunakan parameter yang dapat dilatih lebih sedikit, tetapi disarankan untuk menjaga
out_features % mini_r == 0. - 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 (
str) β Nama pola layer, hanya digunakan jikalayers_to_transformberbeda dariNone. - bias (
str) — Bias type for MiSS. Can be'none','all'or'MiSS_only'. - modules_to_save (
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 MissModel.
MissModel
kelas peft.MissModel
< 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 (
torch.nn.Module) β Model tempat lapisan tuner adapter akan dilampirkan. - config (MissConfig) β Konfigurasi dari model MiSS.
- 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 MiSS.
Membuat model adaptasi refleksi Householder (MiSS) dari model pretrained. Metode ini dijelaskan dalam https://huggingface.co/papers/2409.15371
Contoh:
>>> from diffusers import StableDiffusionPipeline
>>> from peft import MissModel, MissConfig
>>> config_te = MissConfig(
... r=8,
... target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
... init_weights=True,
... )
>>> config_unet = MissConfig(
... r=8,
... target_modules=[
... "proj_in",
... "proj_out",
... "to_k",
... "to_q",
... "to_v",
... "to_out.0",
... "ff.net.0.proj",
... "ff.net.2",
... ],
... init_weights=True,
... )
>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = MissModel(model.text_encoder, config_te, "default")
>>> model.unet = MissModel(model.unet, config_unet, "default")Atribut:
- model (
~torch.nn.Module) β Model yang akan diadaptasi. - peft_config (MissConfig): Konfigurasi model MiSS.