# FRoD: Эффективная дообучение полного ранга с вращательными степенями

FRoD — это метод эффективной по параметрам дообучения, который объединяет общую базу полного ранга с разреженными обучаемыми степенями свободы вращения. Обновление адаптера выражается через фиксированные тензоры проекции и обучаемые коэффициенты, что позволяет FRoD применять обновления полного ранга, сохраняя при этом небольшое количество обучаемых параметров.

Статья: [Full-Rank Efficient Fine-Tuning with Rotational Degrees](https://doi.org/10.1609/aaai.v40i31.39813).

При сохранении параметров адаптера можно избежать хранения тензоров проекций, установив `save_projection=False` в `FrodConfig`. В этом случае проекции восстанавливаются из весов базовой модели и фиксированного случайного ключа из `projection_prng_key`. Это уменьшает размер контрольной точки, но по умолчанию установлено `save_projection=True`, чтобы загрузка контрольной точки не зависела от деталей регенерации.

В отличие от LoRA, FRoD позволяет выражать обновление полного ранга в каждом адаптируемом линейном слое, обучая при этом только диагональные коэффициенты и разреженный набор внедиагональных коэффициентов вращения. Это может быть полезно, когда обновление низкого ранга оказывается слишком ограничительным. Компромисс состоит в том, что FRoD вычисляет фиксированные тензоры проекции из базовых весов во время инъекции адаптера, что делает настройку более затратной, а реализацию — менее широко поддерживаемой по сравнению с LoRA.

Инициализация проекций может занимать много времени на больших моделях, так как FRoD выполняет разложение матриц по категориям целевых модулей перед внедрением адаптеров. По умолчанию отображается индикатор прогресса, который можно отключить с помощью `FrodConfig(progressbar=False)`.

Для обучения с ограниченной памятью параметр `runtime_offload_base_weight=True` сохраняет базовые веса целевой модели на CPU, когда активный путь FRoD в них не нуждается. Эта опция включается явно, так как методы PEFT обычно удерживают все базовые параметры на ускорителе после перемещения модели и после прямых проходов.

В настоящее время FRoD имеет следующее ограничение:

- Поддерживаются только слои `nn.Linear` и `transformers.pytorch_utils.Conv1D`.

## Быстрый старт

```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)
```

[Источник](https://github.com/huggingface/peft/blob/main/src/peft/tuners/frod/config.py#L24)

**Параметры:**

target_modules (`Union[List[str], str]`) : Имена модулей, к которым следует применить FRoD. Поддерживаются только линейные слои.

projection_prng_key (`int`) : Случайное зерно, используемое при инициализации разреженного паттерна FRoD COO.

save_projection (`bool`) : Сохранять ли тензоры проекции FRoD в state dict. Это увеличивает размер контрольной точки, но делает перезагрузку адаптера независимой от локального кэша. По умолчанию `True`.

frod_dropout (`float`) : Вероятность dropout для слоёв FRoD.

fan_in_fan_out (`bool`) : Установите это значение в True, если заменяемый слой хранит веса в формате (fan_in, fan_out). Например, gpt-2 использует `Conv1D`, который хранит веса в формате (fan_in, fan_out), поэтому это значение должно быть установлено в `True`.

bias (`str`) : Тип смещения для FRoD. Допустимые значения: 'none', 'all' или 'frod_only'. Если указано 'all' или 'frod_only', соответствующие смещения будут обновляться во время обучения. Обратите внимание, что это означает: даже при отключении адаптеров модель не будет выдавать тот же результат, что и базовая модель без адаптации.

modules_to_save (`List[str]`) : Список модулей, кроме слоёв FRoD, которые должны быть установлены как обучаемые и сохранены в итоговый контрольный пункт.

init_weights (`bool`) : Инициализировать ли веса слоёв FRoD с использованием их начальной инициализации по умолчанию. Не изменяйте этот параметр, если вы точно не знаете, что делаете.

layers_to_transform (`Union[List[int],int]`) : Индексы слоёв для преобразования. Если этот аргумент указан, преобразования FRoD применяются к слоям с индексами, указанными в этом списке. Если передано одно целое число, преобразования FRoD применяются к слою с этим индексом.

layers_pattern (`Optional[Union[List[str], str]]`) : Имя шаблона слоя, используется только в том случае, если `layers_to_transform` отличается от `None`. Это должно указывать на `nn.ModuleList` модели, который часто называется `'layers'` или `'h'`.

sparse_rate (`float`) : Доля внедиагональных элементов в разреженной обучаемой матрице вращения. Более высокие значения увеличивают ёмкость и количество обучаемых параметров; более низкие значения дешевле. По умолчанию `0.01`.

regularization_alpha (`float`) : Малое положительное значение, используемое при построении общего базиса из базовых весов. Оно стабилизирует обратную матрицу, когда слои в одной категории имеют коррелированные веса. По умолчанию `1e-3`.

progressbar (`bool`) : Показывать ли индикатор прогресса при построении проекций FRoD. Инициализация проекций может занимать много времени на больших моделях, так как выполняется разложение матриц по категориям целевых модулей. По умолчанию `True`.

runtime_offload_base_weight (`bool`) : Указывает, следует ли хранить целевые базовые веса на CPU, если активный путь FRoD в них не нуждается. Это позволяет снизить потребление памяти GPU, поскольку FRoD напрямую восстанавливает адаптированный вес, однако нарушает стандартное соглашение PEFT, согласно которому все базовые параметры остаются на ускорителе после перемещения модели или выполнения прямого прохода. По умолчанию `False`.

Это класс конфигурации для хранения конфигурации модели [FrodModel](/docs/peft/main/ru/package_reference/frod#peft.FrodModel).

Статья: 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)
```

[Источник](https://github.com/huggingface/peft/blob/main/src/peft/tuners/frod/model.py#L101)

