PEFT documentation
C3A: Эффективное по параметрам дообучение с помощью круговой свёртки
C3A: Эффективное по параметрам дообучение с помощью круговой свёртки
C3A — это метод дообучения с высокой эффективностью по параметрам, который использует свёртку по кругу (Circular Convolution) для достижения адаптации высокого ранга в рамках разумных ограничений ресурсов.
Обратите внимание, что для C3A следует использовать значительно более высокую скорость обучения (LR), чем для других методов. Например, LR 1e-1 для C3A является хорошей отправной точкой. Кроме того, следует использовать значительно меньшее значение weight decay. Дополнительные сведения можно найти в папке method_comparison.
Для параметра block_size, он влияет на настраиваемые параметры и производительность. Для начала можно выбрать вблизи $\frac{\sqrt{d_1 \times d_2}}{r}$, где — это ранг LoRA, который вы планируете использовать для этой задачи.
В настоящее время C3A имеет следующие ограничения:
- Поддерживаются только слои
nn.Linear. - Квантованные слои не поддерживаются.
- Размер блока должен быть общим делителем как входного, так и выходного размеров целевых слоёв.
Если эти ограничения не подходят для вашего сценария использования, рассмотрите другие методы.
Аннотация из статьи:
Метод Low-Rank Adaptation (LoRA) получил широкое распространение для дообучения крупных базовых моделей, используя матрицы низкого ранга и для представления изменений весов (то есть $\Delta \mathbf{W} = \mathbf{B} \mathbf{A}$). Этот метод сокращает количество обучаемых параметров и снижает значительное потребление памяти, связанное с полными матрицами дельта, за счёт последовательного умножения и на активацию. Несмотря на свою эффективность, внутренняя характеристика низкого ранга может ограничивать производительность. Хотя было предложено несколько вариантов для решения этой проблемы, они часто упускают из виду важную вычислительную и энергетическую эффективность, обеспечиваемую LoRA. В данной статье мы предлагаем Circular Convolution Adaptation (C3A), который не только обеспечивает адаптацию высокого ранга с улучшенной производительностью, но и превосходит по вычислительной мощности и использованию памяти. Многочисленные эксперименты показывают, что C3A стабильно превосходит LoRA и его варианты в различных задачах дообучения.
Обзор бенчмарков
API
C3AConfig
класс peft.C3AConfig
< 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 = Falseblock_size: int = 256target_modules: Optional[Union[list[str], str]] = Nonebias: str = 'none'modules_to_save: Optional[list[str]] = Nonelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Noneblock_size_pattern: Optional[dict] = <factory>init_weights: Optional[Union[bool, Literal['gaussian', 'kaiming_uniform', 'xavier_uniform']]] = 'xavier_uniform' )
Параметры
- 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 нетривиальной операцией), установите значение вTrue.
Это класс конфигурации для хранения конфигурации модели C3AModel.
C3AModel
класс peft.C3AModel
< 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
Параметры
- model (
torch.nn.Module) — Модель, подлежащая адаптации. - config (C3AConfig) — конфигурация модели C3A.
- adapter_name (
str) — имя адаптера, по умолчанию"default".
Возвращает
torch.nn.Module
Модель C3A.
Создаёт модель C3A из предобученной модели transformers.
Метод подробно описан в https://huggingface.co/papers/2407.19342.
Атрибуты:
- model (PreTrainedModel) — Модель, подлежащая адаптации.
- peft_config (C3AConfig): конфигурация модели C3A.