PEFT documentation
PaCA: Adaptasi Koneksi Parsial
PaCA: Adaptasi Koneksi Parsial
PaCA (ICLR 2025) adalah metode PEFT yang menargetkan kecepatan pelatihan dan memori aktivasi. Metode ini melakukan fine-tuning pada r kolom input yang dipilih secara acak (“partial connections”) dari setiap bobot pretrained yang ditargetkan. Satu-satunya parameter yang dapat dilatih adalah pembaruan dari kolom-kolom tersebut; berbeda dengan LoRA, PaCA tidak menambahkan matriks low-rank tambahan.
Metode seperti LoRA menjalankan cabang ber-rank rendah yang kecil di samping setiap lapisan pretrained. Cabang ini membutuhkan sedikit FLOPs, tetapi dieksekusi secara berurutan dengan lapisan pretrained dan menyimpan salinan sendiri dari aktivasi input untuk langkah mundur (backward pass). PaCA menghindari keduanya:
- Satu GEMM per lapisan. Kolom yang diadaptasi ditulis ke dalam bobot pretrained tepat sebelum matmul-nya dan dipulihkan tepat setelahnya, sehingga forward dan backward masing-masing menjalankan satu matmul, persis seperti lapisan base yang dibekukan.
- Aktivasi parsial. Gradien dari kolom yang diadaptasi hanya bergantung pada
rsaluran input yang sesuai, sehingga hanya saluran-saluran tersebut yang disimpan untuk langkah mundur (backward pass), bukan input lengkap.
Dari segi bobot yang dihasilkan, adapter PaCA ekuivalen dengan adapter LoRA ber-rank r yang matriks A-nya adalah pemilih kolom tetap: W' = W + delta @ S, di mana S memilih r kolom. Oleh karena itu, adapter ini dapat dikonversi menjadi adapter LoRA ber-rank r tanpa kehilangan informasi melalui convert_to_lora(), misalnya untuk menjalankannya dengan stack inferensi LoRA.
Kapan menggunakan PaCA:
- Anda menginginkan akurasi setingkat LoRA tetapi langkah fine-tuning yang lebih cepat dan memori aktivasi yang lebih rendah, misalnya untuk menyesuaikan urutan yang lebih panjang atau batch yang lebih besar pada GPU yang sama.
- Anda menginginkan adapter yang digabungkan tepat ke dalam bobot dasar (pembaruannya adalah pembaruan kolom biasa).
Batasan saat ini:
- Hanya lapisan
nn.Linear(termasuk lapisan linear yang dikuantisasi) yang didukung. - PaCA menjalankan matmul itu sendiri alih-alih memanggil
forwarddari lapisan dasar, sehingga forward hook yang terdaftar pada lapisan dasar tidak dipanggil (sebuah peringatan akan dikeluarkan). Daftarkan hook pada lapisan PaCA sebagai gantinya. - Batch adapter campuran (argumen
adapter_names) tidak didukung. - Pelatihan dengan bobot terbagi (FSDP, DeepSpeed ZeRO-3) belum diuji.
torch.compiledidukung: saat kompilasi, pertukaran kolom, matmul, dan restore dijalankan sebagai op kustom yang tidak transparan (torch.ops.peft.paca_linear_forward/_backward), sehingga kompilator tidak menyalin bobot dasar. Hal ini memerlukantorch.library.custom_op(PyTorch >= 2.4); jika tidak, implementasi eager akan ditelusuri.paca_alpha / rmenskalakan pembaruan kolom dan karenanya bertindak sebagai pengali dari laju pembelajaran efektif.- Untuk inferensi, gabungkan adapter (
merge_and_unload()); forward yang belum digabungkan masih menukar kolom masuk dan keluar pada setiap pemanggilan.
Penggunaan
from transformers import AutoModelForCausalLM
from peft import PacaConfig, get_peft_model
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-3B")
config = PacaConfig(r=16, paca_alpha=16, target_modules="all-linear", random_seed=0)
model = get_peft_model(model, config)
model.print_trainable_parameters()Secara default, setiap lapisan yang ditargetkan melakukan fine-tuning pada r kolom yang dipilih secara acak; dalam makalah, hal ini memberikan performa yang setara dengan memilih kolom berdasarkan norma bobot atau berdasarkan gradien yang terakumulasi. Untuk memilih kolom Anda sendiri, misalnya untuk mencoba strategi pemilihan lain atau untuk menggunakan jumlah kolom per lapisan yang berbeda, berikan paca_indices_pattern. Kunci-kuncinya adalah nama lapisan atau ekspresi reguler, seperti pada rank_pattern LoRA:
config = PacaConfig(
r=16,
paca_alpha=16,
target_modules=["q_proj", "v_proj"],
paca_indices_pattern={"layers.0.self_attn.q_proj": [0, 2, 4, 6], "layers.1.self_attn.v_proj": list(range(32))},
)Layers yang cocok dengan kunci menyesuaikan kolom yang diberikan, sedangkan semua layer target lainnya memilih r kolom acak. Skalanya adalah paca_alpha / r dengan r dari config di setiap layer, sehingga paca_alpha memiliki arti yang sama untuk semua layer.
Abstrak dari makalah tersebut adalah:
Algoritma fine-tuning yang efisien secara parameter (PEFT) sebelumnya mengurangi penggunaan memori dan biaya komputasi dari fine-tuning model jaringan saraf besar dengan hanya melatih beberapa parameter adapter tambahan, bukan seluruh model. Namun, pengurangan biaya komputasi akibat PEFT tidak selalu berbanding lurus dengan pengurangan waktu pelatihan; meskipun biaya komputasi lapisan adapter jauh lebih kecil daripada lapisan pretrained, diketahui bahwa kedua jenis lapisan tersebut diproses secara berurutan pada GPU, yang menghasilkan overhead latensi yang signifikan. LoRA dan variasinya menghindari overhead latensi ini dengan menggabungkan matriks adapter rank rendah dengan bobot pretrained selama inferensi. Namun, lapisan-lapisan tersebut tidak dapat digabungkan selama pelatihan karena bobot pretrained harus tetap beku sementara matriks adapter rank rendah diperbarui secara terus-menerus selama proses pelatihan. Selain itu, LoRA dan variasinya tidak mengurangi memori aktivasi, karena matriks adapter rank rendah pertama masih memerlukan aktivasi input ke bobot pretrained untuk menghitung gradien bobot. Untuk memitigasi masalah ini, kami mengusulkan Partial Connection Adaptation (PaCA), yang melakukan fine-tuning pada koneksi parsial yang dipilih secara acak di dalam bobot pretrained, alih-alih memperkenalkan lapisan adapter ke dalam model. PaCA tidak hanya meningkatkan kecepatan pelatihan dengan menghilangkan overhead waktu akibat pemrosesan berurutan lapisan adapter dan lapisan pretrained, tetapi juga mengurangi memori aktivasi karena hanya aktivasi parsial, bukan aktivasi penuh, yang perlu disimpan untuk komputasi gradien. Dibandingkan dengan LoRA, PaCA mengurangi waktu pelatihan sebesar 22% dan penggunaan memori total sebesar 16%, sambil mempertahankan akurasi yang sebanding di berbagai skenario fine-tuning, seperti fine-tuning pada dataset MMLU dan instruction tuning pada dataset Oasst1. PaCA juga dapat dikombinasikan dengan kuantisasi, memungkinkan fine-tuning model besar seperti LLaMA3.1-70B. Selain itu, PaCA memungkinkan pelatihan dengan urutan 23% lebih panjang dan meningkatkan throughput sebesar 16% pada NVIDIA A100 GPU dan INTEL Gaudi2 HPU dibandingkan dengan LoRA.
Ikhtisar benchmark
API
PacaConfig
kelas peft.PacaConfig
< 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 = 8paca_alpha: int = 8target_modules: list[str] | str | None = Noneexclude_modules: list[str] | str | None = Nonelayers_to_transform: list[int] | int | None = Nonelayers_pattern: list[str] | str | None = Nonerandom_seed: int | None = Nonepaca_indices_pattern: dict | None = <factory>init_weights: bool = Truemodules_to_save: list[str] | None = None )
Parameter
- r (
int, opsional, default8) — Jumlah kolom input (koneksi parsial) yang dihaluskan (fine-tuned) pada setiap lapisan yang ditargetkan. Untuk bobot dengan bentuk(out_features, in_features), PaCA melatihr * out_featuresparameter, jumlah yang sama dengan matriksBdari adapter LoRA dengan rankr. Nilai ini tidak boleh melebihiin_features. - paca_alpha (
int, opsional, default8) — Faktor penskalaan. Pembaruan kolom yang dipilih adalahpaca_alpha / r * delta. Sepertilora_alpha, ini bertindak sebagai pengali dari laju pembelajaran efektif adapter. - target_modules (
Union[list[str], str], opsional) — Daftar nama modul atau ekspresi regex dari nama modul yang akan diganti dengan PaCA. Sebagai contoh,['q_proj', 'v_proj']atau'.*decoder.*(SelfAttention|EncDecAttention).*(q|v)$'. Jika ini ditentukan sebagai'all-linear', semua modul linear kecuali lapisan output akan dipilih. Hanya lapisannn.Linearyang didukung. - exclude_modules (
Union[list[str], str], opsional) — Nama-nama modul yang tidak akan diterapkan adapter. Saat meneruskan string, pencocokan regex akan dilakukan. Saat meneruskan daftar string, pencocokan persis akan dilakukan atau diperiksa apakah nama modul berakhiran dengan salah satu string yang diteruskan. - layers_to_transform (
Union[list[int], int], opsional) — Indeks layer yang akan ditransformasi. Jika argumen ini ditentukan, PEFT hanya akan mentransformasi indeks layer yang ditentukan di dalam daftar ini. Jika satu bilangan bulat tunggal diberikan, PEFT hanya akan mentransformasi layer pada indeks ini. - layers_pattern (
Optional[Union[list[str], str]], opsional) — Nama pola layer, hanya digunakan jikalayers_to_transformberbeda dariNone. Ini harus menargetkannn.ModuleListdari model, yang sering disebut'layers'atau'h'. - random_seed (
int, opsional, defaultnyaNone) — Seed yang digunakan untuk memilih koneksi parsial. Setiap lapisan menggunakan pilihan berbeda yang diturunkan dari seed ini dan nama lapisan. JikaNone, generator angka acak global torch akan digunakan. Indeks yang dipilih selalu disimpan dalam checkpoint adapter, sehingga seed tidak diperlukan untuk memuat adapter yang telah dilatih. - paca_indices_pattern (
dict, opsional) — Pemetaan opsional dari nama layer atau ekspresi regexp ke indeks kolom input yang dihalus-sesuaikan (fine-tuned) pada layer yang cocok, alih-alihrkolom yang dipilih secara acak, misalnya{'^model.layers.0.self_attn.q_proj': [0, 2, 4]}. Hal ini juga memungkinkan jumlah kolom yang berbeda untuk setiap layer. Indeks dari suatu layer harus unik dan lebih kecil dariin_features. Penskalaannya adalahpaca_alpha / rdenganrdari konfigurasi ini di semua layer, terlepas dari jumlah indeks yang diberikan. Layer target yang tidak cocok dengan kunci mana pun menggunakanrkolom yang dipilih secara acak. - init_weights (
bool, opsional, defaultTrue) — JikaTrue, pembaruan kolom yang dipilih diinisialisasi ke nol, yaitu model yang diadaptasi identik dengan model dasar pada inisialisasi. Atur keFalseuntuk menginisialisasi dengan nilai acak; ini hanya ditujukan untuk pengujian. - modules_to_save (
list[str], opsional) — Daftar modul selain lapisan PaCA yang akan disetel sebagai trainable dan disimpan dalam checkpoint akhir. Sebagai contoh, pada tugas Sequence Classification atau Token Classification, lapisan akhirclassifier/scorediinisialisasi secara acak sehingga perlu dibuat trainable dan disimpan.
Ini adalah kelas konfigurasi untuk menyimpan konfigurasi dari PacaModel.
PaCA (Partial Connection Adaptation, https://huggingface.co/papers/2503.01905) melakukan fine-tuning pada r kolom input yang dipilih secara acak (koneksi parsial) dari setiap bobot pretrained yang ditargetkan. Parameter yang dapat dilatih hanyalah pembaruan dari kolom-kolom tersebut; berbeda dengan LoRA, PaCA tidak menambahkan matriks low-rank tambahan. Tepat sebelum matmul, kolom-kolom yang telah diadaptasi ditukar ke dalam bobot pretrained dan dikembalikan tepat setelahnya, sehingga forward dan backward masing-masing hanya menjalankan satu GEMM, dan hanya r saluran input yang dipilih yang disimpan di memori untuk backward pass.
PacaModel
kelas peft.PacaModel
< 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 (PacaConfig) — Konfigurasi model PaCA.
- 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 PaCA.
Membuat model Partial Connection Adaptation (PaCA) dari model pretrained. Metode ini dijelaskan dalam https://huggingface.co/papers/2503.01905.
Contoh:
>>> from transformers import AutoModelForCausalLM
>>> from peft import PacaConfig, get_peft_model
>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = PacaConfig(r=16, paca_alpha=16, target_modules="all-linear")
>>> model = get_peft_model(base_model, config)Atribut:
- model (PreTrainedModel) — Model yang akan diadaptasi.
- peft_config (PacaConfig): Konfigurasi model PaCA.