# FRoD: Fine-Tuning Efisien Penuh-Rang dengan Derotasi

FRoD adalah metode fine-tuning yang efisien secara parameter, yang menggabungkan basis full-rank bersama dengan derajat rotasi yang dapat dipelajari secara sparse. Pembaruan adapter diekspresikan melalui tensor proyeksi tetap dan koefisien yang dapat dilatih, yang memungkinkan FRoD untuk menerapkan pembaruan full-rank sambil tetap menjaga jumlah parameter yang dilatih tetap kecil.

Paper: [Full-Rank Efficient Fine-Tuning with Rotational Degrees](https://doi.org/10.1609/aaai.v40i31.39813).

Saat menyimpan parameter adapter, Anda dapat menghindari penyimpanan tensor proyeksi dengan mengatur `save_projection=False` pada `FrodConfig`. Dalam kasus tersebut, proyeksi dipulihkan dari bobot model dasar dan seed acak tetap dari `projection_prng_key`. Hal ini mengurangi ukuran checkpoint, tetapi nilai defaultnya adalah `save_projection=True` agar pemuatan checkpoint tidak bergantung pada detail regenerasi.

Dibandingkan dengan LoRA, FRoD dapat mengekspresikan pembaruan ber-rank penuh pada setiap lapisan linear yang diadaptasi, sementara hanya melatih koefisien diagonal dan himpunan koefisien rotasi off-diagonal yang jarang. Hal ini dapat berguna ketika pembaruan ber-rank rendah terlalu restriktif. Komprominya adalah FRoD menghitung tensor proyeksi tetap dari bobot dasar selama injeksi adapter, yang membuat setup lebih mahal dan implementasinya kurang didukung secara luas dibandingkan LoRA.

Inisialisasi proyeksi dapat berjalan lambat pada model besar karena FRoD menjalankan dekomposisi matriks di atas kategori modul target sebelum menyuntikkan adapter. Bar progres ditampilkan secara default dan dapat dinonaktifkan dengan `FrodConfig(progressbar=False)`.

Untuk pelatihan dengan keterbatasan memori, `runtime_offload_base_weight=True` menjaga bobot dasar target tetap di CPU ketika jalur FRoD aktif tidak membutuhkannya. Opsi ini bersifat opt-in karena metode PEFT biasanya mempertahankan semua parameter dasar di akselerator setelah model dipindahkan dan setelah jalur maju (forward passes) dilakukan.

FRoD saat ini memiliki batasan berikut:

- Hanya lapisan `nn.Linear` dan `transformers.pytorch_utils.Conv1D` yang didukung.

## Mulai Cepat

```python
from transformers import AutoModelForSequenceClassification

from peft import FrodConfig, TaskType, get_peft_model

model = AutoModelForSequenceClassification.from_pretrained("google-bert/bert-base-uncased", num_labels=2)

peft_config = FrodConfig(
    task_type=TaskType.SEQ_CLS,
    target_modules=["query", "value"],
    modules_to_save=["classifier"],
    sparse_rate=0.02,
    frod_dropout=0.0,
    runtime_offload_base_weight=True,
)

model = get_peft_model(model, peft_config)
model.print_healthcheck()
```

## FrodConfig[[peft.FrodConfig]]

#### peft.FrodConfig[[peft.FrodConfig]]

```python
peft.FrodConfig(task_type: Optional[Union[str, TaskType]] = None, peft_type: Optional[Union[str, PeftType]] = None, auto_mapping: Optional[dict] = None, peft_version: Optional[str] = None, base_model_name_or_path: Optional[str] = None, revision: Optional[str] = None, inference_mode: bool = False, target_modules: Optional[Union[list[str], str]] = None, projection_prng_key: int = 0, save_projection: bool = True, frod_dropout: float = 0.0, fan_in_fan_out: bool = False, bias: str = 'none', modules_to_save: Optional[list[str]] = None, init_weights: bool = True, layers_to_transform: Optional[Union[list[int], int]] = None, layers_pattern: Optional[Union[list[str], str]] = None, sparse_rate: float = 0.01, regularization_alpha: float = 0.001, progressbar: bool = True, runtime_offload_base_weight: bool = False)
```

[Sumber](https://github.com/huggingface/peft/blob/main/src/peft/tuners/frod/config.py#L24)

**Parameter:**

target_modules (`Union[List[str], str]`) : Nama-nama modul yang akan diterapkan FRoD. Hanya lapisan linear yang didukung.

projection_prng_key (`int`) : Benang acak (random seed) yang digunakan saat menginisialisasi pola FRoD COO sparse.

save_projection (`bool`) : Apakah tensor proyeksi FRoD akan disimpan dalam state dict. Hal ini meningkatkan ukuran checkpoint tetapi membuat pemuatan ulang adapter tidak bergantung pada regenerasi cache lokal. Nilai defaultnya adalah `True`.

frod_dropout (`float`) : Probabilitas dropout untuk lapisan FRoD.

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 disetel ke `True`.

bias (`str`) : Jenis bias untuk FRoD. Bisa berupa 'none', 'all', atau 'frod_only'. Jika 'all' atau 'frod_only', bias yang sesuai akan diperbarui selama pelatihan. Perhatikan bahwa ini berarti, bahkan saat adapter dinonaktifkan, model tidak akan menghasilkan output yang sama seperti model dasar tanpa adaptasi.

modules_to_save (`List[str]`) : Daftar modul di luar lapisan FRoD yang akan diatur sebagai dapat dilatih dan disimpan dalam checkpoint akhir.

init_weights (`bool`) : Apakah akan menginisialisasi bobot lapisan FRoD dengan inisialisasi defaultnya. Jangan ubah pengaturan ini, kecuali Anda tahu persis apa yang Anda lakukan.

layers_to_transform (`Union[List[int],int]`) : Indeks lapisan yang akan ditransformasi. Jika argumen ini ditentukan, transformasi FRoD akan diterapkan pada indeks lapisan yang ditentukan dalam daftar ini. Jika satu bilangan bulat tunggal diberikan, transformasi FRoD akan diterapkan pada lapisan di indeks tersebut.

layers_pattern (`Optional[Union[List[str], str]]`) : Nama pola layer, hanya digunakan jika `layers_to_transform` berbeda dari `None`. Ini harus menargetkan `nn.ModuleList` dari model, yang sering disebut `'layers'` atau `'h'`.

sparse_rate (`float`) : Fraksi entri non-diagonal pada matriks rotasi trainable yang sparse. Nilai yang lebih tinggi meningkatkan kapasitas dan parameter trainable; nilai yang lebih rendah lebih hemat. Defaultnya adalah `0.01`.

regularization_alpha (`float`) : Nilai positif kecil yang digunakan saat membangun basis bersama dari bobot dasar. Nilai ini menstabilkan invers matriks ketika lapisan dalam kategori yang sama memiliki bobot yang berkorelasi. Nilai defaultnya adalah `1e-3`.

progressbar (`bool`) : Apakah menampilkan bilah kemajuan saat membangun proyeksi FRoD. Inisialisasi proyeksi dapat lambat pada model besar karena menjalankan dekomposisi matriks di atas kategori modul target. Bawaan adalah `True`.

runtime_offload_base_weight (`bool`) : Apakah mempertahankan bobot basis target di CPU ketika jalur FRoD aktif tidak membutuhkannya. Hal ini dapat mengurangi memori GPU karena FRoD merekonstruksi bobot yang telah diadaptasi secara langsung, tetapi mengubah konvensi PEFT yang lazim di mana semua parameter basis tetap berada di akselerator setelah memindahkan model atau menjalankan forward. Nilai default adalah `False`.

Ini adalah kelas konfigurasi untuk menyimpan konfigurasi dari [FrodModel](/docs/peft/main/id/package_reference/frod#peft.FrodModel).

Makalah: https://doi.org/10.1609/aaai.v40i31.39813.

## FrodModel[[peft.FrodModel]]

#### peft.FrodModel[[peft.FrodModel]]

```python
peft.FrodModel(model, peft_config: Union[PeftConfig, dict[str, PeftConfig]], adapter_name: str, low_cpu_mem_usage: bool = False, state_dict: Optional[dict[str, torch.Tensor]] = None)
```

[Sumber](https://github.com/huggingface/peft/blob/main/src/peft/tuners/frod/model.py#L101)

