# C3A: Эффективное по параметрам дообучение с помощью круговой свёртки

[C3A](https://huggingface.co/papers/2407.19342) — это метод дообучения с высокой эффективностью по параметрам, который использует свёртку по кругу (Circular Convolution) для достижения адаптации высокого ранга в рамках разумных ограничений ресурсов.

Обратите внимание, что для C3A следует использовать значительно более высокую скорость обучения (LR), чем для других методов. Например, LR 1e-1 для C3A является хорошей отправной точкой. Кроме того, следует использовать значительно меньшее значение weight decay. Дополнительные сведения можно найти в папке `method_comparison`.

Для `block_size` он влияет на настраиваемые параметры и производительность. Для начала можно выбрать $\mathrm{gcd}(d_1,d_2)$, близкое к $\frac{\sqrt{d_1 \times d_2}}{r}$, где $r$ — это ранг LoRA, который вы планируете использовать для этой задачи.

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

- Поддерживаются только слои `nn.Linear`.
- Квантованные слои не поддерживаются.
- Размер блока должен быть общим делителем как входного, так и выходного размеров целевых слоёв.

Если эти ограничения не подходят для вашего сценария использования, рассмотрите другие методы.

Аннотация из статьи:

> Метод Low-Rank Adaptation (LoRA) получил широкое распространение для дообучения крупных базовых моделей, используя матрицы низкого ранга $\mathbf{A}$ и $\mathbf{B}$ для представления изменений весов (то есть $\Delta \mathbf{W} = \mathbf{B} \mathbf{A}$). Этот подход сокращает количество обучаемых параметров и снижает значительное потребление памяти, связанное с полными матрицами дельт, за счет последовательного умножения $\mathbf{A}$ и $\mathbf{B}$ на активации. Несмотря на свою эффективность, внутренняя характеристика низкого ранга может ограничивать производительность. Хотя было предложено несколько вариантов для решения этой проблемы, они часто упускают из виду критически важную вычислительную и энергетическую эффективность, обеспечиваемую LoRA. В данной статье мы предлагаем метод Circular Convolution Adaptation (C3A), который не только обеспечивает адаптацию высокого ранга с улучшенной производительностью, но и превосходит по показателям вычислительной мощности и использования памяти. Многочисленные эксперименты демонстрируют, что C3A стабильно превосходит LoRA и его варианты на различных задачах дообучения.

## Обзор бенчмарков

<iframe src="https://peft-internal-testing-peft-method-comparison-embed.hf.space/?highlight[type]=C3A" frameborder="0" width="850" height="1000"
>

# API

## C3AConfig[[peft.C3AConfig]]

#### peft.C3AConfig[[peft.C3AConfig]]

```python
peft.C3AConfig(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, block_size: int = 256, target_modules: Optional[Union[list[str], str]] = None, bias: str = 'none', modules_to_save: Optional[list[str]] = None, layers_to_transform: Optional[Union[list[int], int]] = None, layers_pattern: Optional[Union[list[str], str]] = None, block_size_pattern: Optional[dict] = <factory>, init_weights: Optional[Union[bool, Literal['gaussian', 'kaiming_uniform', 'xavier_uniform']]] = 'xavier_uniform')
```

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

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

block_size (`int`) : размер блока для C3A, должен делиться нацело и на размер входа, и на размер выхода целевого слоя. Если вы не знаете, какое значение block_size использовать, установите его равным наибольшему общему делителю всех размеров входов и выходов ваших целевых слоев. Увеличение этого значения приведет к уменьшению количества параметров.

target_modules (`Union[list[str],str]`) : Имена модулей, к которым следует применить C3A.

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

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

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

layers_pattern (`str`) : Имя шаблона слоя, используется только если `layers_to_transform` отличается от `None` и если шаблон слоя не входит в число общих шаблонов слоёв.

block_size_pattern (`dict`) : Соответствие от имён слоёв или регулярных выражений к block_size, отличным от значения по умолчанию. Например, `{"model.decoder.layers.0.encoder_attn.k_proj": 1280`}

init_weights (`Union[bool, Literal["gaussian", "kaiming_uniform", "xavier_uniform"]]`) : По умолчанию 'xavier_uniform'. Если установить это значение в `False`, также будет использован 'xavier_uniform'. Чтобы установить веса в нули (чтобы сделать C3A no-op), установите значение в `True`.

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

## C3AModel[[peft.C3AModel]]

#### peft.C3AModel[[peft.C3AModel]]

```python
peft.C3AModel(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/c3a/model.py#L29)

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

model (`torch.nn.Module`) : модель, подлежащая адаптации.

config ([C3AConfig](/docs/peft/main/ru/package_reference/c3a#peft.C3AConfig)) : конфигурация модели C3A.

adapter_name (`str`) : Имя адаптера, по умолчанию `"default"`.

**Возвращает:** `torch.nn.Module`

Модель C3A.

Создаёт модель C3A из предобученной модели transformers.

Метод подробно описан в https://huggingface.co/papers/2407.19342.

**Атрибуты**:
- **model** ([PreTrainedModel](https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.PreTrainedModel)) -- Модель, подлежащая адаптации.
- **peft_config** ([C3AConfig](/docs/peft/main/ru/package_reference/c3a#peft.C3AConfig)): конфигурация модели C3A.

