PEFT documentation

BOFT

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

BOFT

Orthogonal Butterfly (BOFT) adalah metode generik yang dirancang untuk finetuning model fondasi. Metode ini meningkatkan efisiensi parameter dari paradigma finetuning — Orthogonal Finetuning (OFT), dengan mengambil inspirasi dari transformasi Fourier cepat Cooley-Tukey, dan menunjukkan hasil yang menguntungkan dalam finetuning berbagai model fondasi, termasuk large vision transformers, large language models, dan model difusi teks-ke-gambar.

Abstrak dari makalah tersebut adalah:

Model fondasi besar semakin umum digunakan, tetapi melatihnya dari awal sangat mahal. Oleh karena itu, mengadaptasi model-model yang kuat ini ke tugas turunan secara efisien menjadi semakin penting. Dalam makalah ini, kami mempelajari paradigma penyesuaian halus (finetuning) yang berprinsip — Orthogonal Finetuning (OFT) — untuk adaptasi tugas turunan. Meskipun menunjukkan kemampuan generalisasi yang baik, OFT masih menggunakan sejumlah parameter yang dapat dilatih yang cukup besar karena dimensi tinggi dari matriks ortogonal. Untuk mengatasi hal ini, kami memulai dengan memeriksa OFT dari perspektif transmisi informasi, dan kemudian mengidentifikasi beberapa kriteria utama yang memungkinkan efisiensi parameter yang lebih baik. Terinspirasi oleh cara algoritma transformasi Fourier cepat Cooley-Tukey memungkinkan transmisi informasi yang efisien, kami mengusulkan parameterisasi ortogonal yang efisien menggunakan struktur kupu-kupu (butterfly). Kami menerapkan parameterisasi ini ke OFT, menciptakan metode penyesuaian halus yang efisien parameter, yang disebut Orthogonal Butterfly (BOFT). Dengan menyerap OFT sebagai kasus khusus, BOFT memperkenalkan kerangka kerja penyesuaian halus ortogonal yang digeneralisasi. Terakhir, kami melakukan studi empiris yang luas tentang adaptasi transformer visi besar, model bahasa besar, dan model difusi teks-ke-gambar ke berbagai tugas turunan dalam visi dan bahasa.

BOFT berfokus pada pelestarian kemampuan generatif model pra-terlatih sambil menjadi jauh lebih efisien parameter dibandingkan OFT standar. Seperti OFT, BOFT mempertahankan kemiripan kosinus (hyperspherical energy) yang sama antara semua pasangan neuron dalam suatu lapisan dengan menerapkan transformasi ortogonal pada matriks bobot pra-terlatih, sehingga memastikan hubungan semantik di antara neuron tetap terjaga.

Alih-alih menggunakan matriks ortogonal blok-diagonal, BOFT memfaktorkan transformasi ortogonal menjadi hasil kali dari matriks kupu-kupu jarang (yang awalnya diperkenalkan dalam Cooley–Tukey FFT). Berbeda dengan rotasi blok-diagonal OFT yang hanya mencampur input di dalam setiap blok, struktur kupu-kupu menjamin bahwa setiap input dapat memengaruhi setiap output, menghasilkan konektivitas padat dengan hanya O(d log d) parameter. Faktorisasi ini mempertahankan ekspresivitas sambil mengurangi jumlah parameter secara drastis dibandingkan OFT (dengan mengorbankan waktu komputasi).

Dalam praktiknya, BOFT mengalikan setiap matriks bobot pralatih dengan rangkaian faktor ortogonal berstruktur kupu-kupu, memungkinkan rotasi neuron yang efisien dan ekspresif. Hal ini menjadikan BOFT sangat cocok untuk generasi yang dapat dikendalikan dan tugas di mana mempertahankan representasi subjek dari model pralatih sangat penting, sekaligus mampu diskalakan ke model yang lebih besar dengan overhead memori dan komputasi yang lebih rendah.

BOFT dapat diterapkan pada subset matriks bobot mana pun dalam jaringan saraf untuk mengurangi jumlah parameter yang dapat dilatih. Dengan diberikan lapisan target untuk menyuntikkan parameter BOFT, jumlah parameter yang dapat dilatih dapat ditentukan berdasarkan ukuran matriks bobot.

Ikhtisar benchmark

Menggabungkan bobot BOFT ke dalam model dasar

Mirip dengan LoRA, bobot yang dipelajari oleh BOFT dapat diintegrasikan ke dalam matriks bobot pralatih menggunakan fungsi [~BOFTModel.merge_and_unload(). Fungsi ini menggabungkan bobot adapter dengan model dasar, yang memungkinkan Anda menggunakan model gabungan baru secara efektif sebagai model mandiri.

Ini bekerja karena selama pelatihan, matriks bobot ortogonal (R pada diagram di atas) dan matriks bobot prapelatihan terpisah. Namun, begitu pelatihan selesai, bobot-bobot ini sebenarnya dapat digabungkan (dikalikan) menjadi matriks bobot baru yang ekuivalen.

Contoh Penggunaan BOFT

Untuk contoh penerapan metode BOFT pada berbagai tugas turunan, silakan merujuk pada panduan berikut:

Lihat panduan langkah demi langkah berikut tentang cara melakukan finetuning model dengan BOFT:

Untuk tugas klasifikasi gambar, seseorang dapat menginisialisasi konfigurasi BOFT untuk model DinoV2 sebagai berikut:

import transformers
from transformers import AutoModelForSeq2SeqLM, BOFTConfig
from peft import BOFTConfig, get_peft_model

config = BOFTConfig(
    boft_block_size=4,
    boft_n_butterfly_factor=2,
    target_modules=["query", "value", "key", "output.dense", "mlp.fc1", "mlp.fc2"],
    boft_dropout=0.1,
    bias="boft_only",
    modules_to_save=["classifier"],
)

model = transformers.Dinov2ForImageClassification.from_pretrained(
    "facebook/dinov2-large",
    num_labels=100,
)

boft_model = get_peft_model(model, config)

API

BOFTConfig

kelas peft.BOFTConfig

< >

( 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 = Falseboft_block_size: int = 4boft_block_num: int = 0boft_n_butterfly_factor: int = 1target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Noneboft_dropout: float = 0.0fan_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

  • boft_block_size (int) — Ukuran blok matriks BOFT di berbagai lapisan, dinyatakan dalam int. Ukuran blok yang lebih besar menghasilkan matriks pembaruan yang lebih padat dengan lebih banyak parameter yang dapat dilatih. Pilih boft_block_size agar dapat dibagi habis oleh dimensi input sebagian besar lapisan (in_features), misalnya 4, 8, 16. Selain itu, hanya tentukan salah satu dari boft_block_size atau boft_block_num, tetapi jangan keduanya secara bersamaan atau biarkan keduanya bernilai 0, karena boft_block_size x boft_block_num harus sama dengan dimensi input lapisan.
  • boft_block_num (int) — Jumlah blok BOFT per lapisan yang disuntikkan. Nilai boft_block_num yang lebih besar menghasilkan matriks pembaruan yang lebih jarang dengan parameter yang dapat dilatih lebih sedikit. Catatan, pilihlah boft_block_num agar dapat dibagi habis oleh dimensi input sebagian besar lapisan (in_features), misalnya 4, 8, 16. Hanya tentukan salah satu dari boft_block_size atau boft_block_num, tetapi jangan keduanya secara bersamaan atau biarkan keduanya bernilai 0, karena boft_block_size x boft_block_num harus sama dengan dimensi input lapisan.
  • boft_n_butterfly_factor (int) — Jumlah faktor butterfly di berbagai lapisan. Untuk boft_n_butterfly_factor=1, BOFT sama dengan OFT vanilla, sedangkan untuk boft_n_butterfly_factor=2, ukuran blok efektif OFT menjadi dua kali lebih besar dan jumlah blok menjadi setengahnya.
  • target_modules (Union[List[str],str]) — Nama-nama modul yang akan diterapkan adapter-nya.
  • 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.
  • boft_dropout (float) — Probabilitas dropout multiplikatif, dengan mengatur blok OFT menjadi identitas selama pelatihan, serupa dengan lapisan dropout dalam LoRA.
  • fan_in_fan_out (bool) — Setel ini ke True jika layer yang akan diganti menyimpan bobot seperti (fan_in, fan_out). Sebagai contoh, gpt-2 menggunakan Conv1D yang menyimpan bobot seperti (fan_in, fan_out) sehingga ini harus di-setel ke True.
  • bias (str) — Bias type for BOFT. Can be ‘none’, ‘all’ or ‘boft_only’. If ‘all’ or ‘boft_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 BOFT yang akan diatur sebagai dapat dilatih dan disimpan dalam checkpoint akhir.
  • layers_to_transform (Union[List[int],int]) — Indeks layer yang akan ditransformasi. Jika argumen ini ditentukan, transformasi BOFT akan diterapkan pada indeks layer yang tercantum dalam daftar ini. Jika satu bilangan bulat tunggal diberikan, transformasi BOFT akan diterapkan pada layer di indeks tersebut.
  • layers_pattern (Optional[Union[List[str], str]]) — Nama pola layer, hanya digunakan jika layers_to_transform berbeda dari None dan jika pola layer tersebut tidak termasuk dalam pola layer umum. Pola ini harus menargetkan nn.ModuleList dari model, yang sering disebut sebagai 'layers' atau 'h'.

Ini adalah kelas konfigurasi untuk menyimpan konfigurasi dari BOFTModel.

BOFTModel

kelas peft.BOFTModel

< >

( 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 (transformers.PreTrainedModel) — Model yang akan diadaptasi.
  • config (BOFTConfig) — Konfigurasi model BOFT.
  • 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 BOFT.

Membuat model BOFT dan OFT dari model transformers yang telah dilatih sebelumnya. Paper: https://huggingface.co/papers/2311.06243 https://huggingface.co/papers/2306.07280

Contoh:

>>> import transformers
>>> from peft import BOFTConfig, get_peft_model

>>> config = BOFTConfig(
...     boft_block_size=8,
...     boft_n_butterfly_factor=1,
...     target_modules=["query", "value", "key", "output.dense", "mlp.fc1", "mlp.fc2"],
...     boft_dropout=0.1,
...     bias="boft_only",
...     modules_to_save=["classifier"],
... )

>>> model = transformers.Dinov2ForImageClassification.from_pretrained(
...     "facebook/dinov2-large",
...     num_labels=100,
... )
>>> boft_model = get_peft_model(model, config)

Atribut:

Update on GitHub