PEFT documentation

VB-LoRA: Экстремально эффективная дообучение с использованием банков векторов

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

VB-LoRA: Экстремально эффективная дообучение с использованием банков векторов

Обзор

VB-LoRA — это метод эффективной дообучения, расширяющий LoRA за счёт обучения схеме разделения параметров на уровне подвекторов, что обеспечивает значительно более высокую эффективность использования параметров. Это делает VB-LoRA особенно полезным в сценариях, где критичны затраты на хранение и передачу данных. Метод работает путём разложения матриц низкого ранга из разных слоёв и модулей, таких как K, Q, V и FFN, на подвекторы, которые затем глобально разделяются через банк векторов.

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

По мере того как внедрение больших языковых моделей расширяется, а потребность в кастомизации моделей для конкретного пользователя или задачи возрастает, методы параметрически эффективной дообучения (PEFT), такие как адаптация низкого ранга (LoRA) и её варианты, несут значительные затраты на хранение и передачу данных. Чтобы дополнительно сократить количество хранимых параметров, мы вводим парадигму «разделяй и делись», которая преодолевает ограничения низкорангового разложения по размерностям матриц, модулям и слоям за счёт глобального обмена параметрами через векторный банк. В качестве реализации этой парадигмы для LoRA наше предложенное VB-LoRA компонирует все низкоранговые матрицы LoRA из общего векторного банка с использованием дифференцируемого модуля top-k смешивания. VB-LoRA достигает экстремальной параметрической эффективности, сохраняя при этом сопоставимые или лучшие результаты по сравнению с передовыми методами PEFT. Многочисленные эксперименты демонстрируют эффективность VB-LoRA на задачах понимания естественного языка, генерации естественного языка и дообучения по инструкциям. При дообучении модели Llama2-13B VB-LoRA использует лишь 0,4% хранимых параметров LoRA, при этом достигая превосходных результатов.

Советы по использованию

  • VB-LoRA использует разреженный модуль top-k для обучения механизму шаринга. При сохранении параметров адаптера можно сохранить только веса top-k и их индексы, установив save_only_topk_weights = True в VBLoRAConfig, или сохранить все обучаемые логиты, установив это значение в False. Включение save_only_topk_weights = True значительно сокращает занимаемое место; например, для Llama2-7B размер файла хранения уменьшается с 308 МБ до 2,5 МБ. Обратите внимание, что модели, сохранённые с save_only_topk_weights = True, предназначены только для слияния или инференса и не могут использоваться для возобновления обучения.

  • У VB-LoRA есть два набора параметров обучения: параметры векторного банка и параметры логитов. На практике мы обнаружили, что для параметров логитов требуется более высокая скорость обучения, а для параметров векторного банка — более низкая. При использовании оптимизатора AdamW типичные значения скорости обучения составляют 0.01 для логитов и 0.001 для параметров векторного банка.

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

API

VBLoRAConfig

класс peft.VBLoRAConfig

< >

( 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 = Falser: int = 4num_vectors: int = 256vector_length: int = 256topk: int = 2target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonesave_only_topk_weights: bool = Falsevblora_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_vector_bank_bound: float = 0.02init_logits_std: float = 0.1layers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = None )

Параметры

  • r (int) — Ранг инкрементальных матриц.
  • num_vectors (int) — Количество векторов в векторном банке. Используйте более высокие значения при увеличении размера модели.
  • vector_length (int) — Длина векторов в векторном банке. Длина векторов должна делиться на размерность скрытого слоя модели.
  • topk (int) — Значение K для отбора top-K. Увеличение значения K приводит к росту размера сохраняемой модели. На практике установка K=2 обычно обеспечивает наилучшее сочетание производительности и эффективности по параметрам. Подробнее см. обсуждение в статье.
  • target_modules (Union[List[str], str]) — Имена модулей, к которым следует применить адаптер. Если это значение указано, будут заменены только модули с указанными именами. При передаче строки выполняется сопоставление по регулярному выражению. При передаче списка строк выполняется точное совпадение или проверяется, заканчивается ли имя модуля каким-либо из переданных строк. Если это значение указано как ‘all-linear’, выбираются все линейные/Conv1D модули, за исключением выходного слоя. Если это значение не указано, модули выбираются в соответствии с архитектурой модели. Если архитектура неизвестна, будет выброшена ошибка — в этом случае следует указать целевые модули вручную.
  • exclude_modules (Optional[Union[List[str], str]]) — Имена модулей, к которым не следует применять адаптер. При передаче строки выполняется сопоставление по регулярному выражению. При передаче списка строк выполняется точное совпадение или проверяется, заканчивается ли имя модуля каким-либо из переданных строк.
  • save_only_topk_weights (bool) — Сохранять только веса topk. Установка save_only_topk_weights = True значительно уменьшает объем занимаемого места. Однако модели, сохраненные в этом режиме, можно использовать только для слияния или инференса, но не для возобновления обучения.
  • vblora_dropout (float) — Вероятность dropout для слоёв VBLoRA.
  • fan_in_fan_out (bool) — Установите это значение в True, если заменяемый слой хранит веса в формате (fan_in, fan_out). Например, gpt-2 использует Conv1D, который хранит веса в формате (fan_in, fan_out), поэтому это значение должно быть установлено в True.
  • bias (str) — Тип смещения для VBLoRA. Может принимать значения ‘none’, ‘all’ или ‘vblora_only’. Если указано ‘all’ или ‘vblora_only’, соответствующие смещения будут обновляться во время обучения. Обратите внимание, что это означает: даже при отключении адаптеров модель не будет выдавать тот же результат, что и базовая модель без адаптации.
  • modules_to_save (List[str]) — Список модулей, помимо слоёв VBLoRA, которые нужно сделать обучаемыми и сохранить в итоговой контрольной точке.
  • init_vector_bank_bound (float) — Векторный банк инициализируется равномерным распределением между -init_vector_bank_bound и init_vector_bank_bound. Избегайте инициализации векторного банка нулями, чтобы предотвратить нулевые градиенты. Как правило, эффективны небольшие значения, например 0.02. Инициализация с большим значением может привести к нестабильности обучения.
  • init_logits_std (float) — Логиты инициализируются с помощью нормального распределения со стандартным отклонением init_logits_std. По умолчанию равно 0.1.
  • layers_to_transform (Union[List[int],int]) — Индексы слоев, которые необходимо преобразовать. Если передан список целых чисел, адаптер будет применен к слоям с индексами, указанными в этом списке. Если передано одно целое число, преобразования будут применены к слою с этим индексом.
  • layers_pattern (Optional[Union[List[str], str]]) — Имя шаблона слоя, используется только в том случае, если layers_to_transform отличается от None. Этот параметр должен указывать на nn.ModuleList модели, который часто называется 'layers' или 'h'.

Это класс конфигурации для хранения настроек модели VBLoRAModel.

Статья: https://huggingface.co/papers/2405.15179

VBLoRAModel

класс peft.VBLoRAModel

< >

( 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 (PreTrainedModel) — Модель, подлежащая адаптации.
  • config (VBLoRAConfig) — конфигурация модели VBLoRA.
  • adapter_name (str) — имя адаптера, по умолчанию "default".
  • low_cpu_mem_usage (bool, optional, по умолчанию False) — Создаёт пустые веса адаптера на meta-устройстве. Полезно для ускорения процесса загрузки.

Возвращает

torch.nn.Module

Модель VBLoRA.

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

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

Пример:

>>> from transformers import AutoModelForCausalLM
>>> from peft import VBLoRAConfig, get_peft_model

>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = VBLoRAConfig(
...     task_type="SEQ_CLS",
...     r=4,
...     target_modules=["fc1", "fc2", "k_proj", "out_proj", "q_proj", "v_proj"],
...     num_vectors=60,
...     vector_length=256,
...     save_only_topk_weights=True,
... )
>>> model = get_peft_model(base_model, config)

Атрибуты:

  • model (PreTrainedModel) — Модель, подлежащая адаптации.
  • peft_config (VBLoRAConfig): конфигурация модели VBLoRAConfig.

get_nb_savable_parameters

< >

( adapter = 'default' )

Возвращает количество сохраняемых параметров VB-LoRA и других сохраняемых параметров.

print_savable_parameters

< >

( )

Выводит количество сохраняемых параметров VB-LoRA и общее количество сохраняемых параметров.

Update on GitHub