PEFT documentation

RandLora: параметрически эффективная дообучение больших моделей с полным рангом

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

RandLora: параметрически эффективная дообучение больших моделей с полным рангом

RandLora — это метод эффективной по параметрам дообучения, похожий на LoRA и VeRA, но выполняющий обновления полного ранга для повышения качества. RandLora может быть особенно полезен при адаптации больших моделей к сложным задачам, требующим сложных обновлений, при сохранении параметрической эффективности LoRA. Обновление полного ранга в RandLora достигается за счёт линейного масштабирования случайных баз. Случайные базы представляют собой набор нескольких матриц низкого ранга, сумма рангов которых больше или равна полному рангу матриц параметров. Обучаемыми параметрами RandLora являются две диагональные матрицы (векторы), которые умножаются на правые случайные базы низкого ранга, аналогично обновлению в VeRA. Для поддержания низкого потребления памяти RandLora использует собственную функцию, которая предотвращает сохранение в памяти ненужных баз для обратного распространения ошибки.

RandLora отличается тем, что, в отличие от других PEFT-алгоритмов, похожих на LoRA, увеличение случайных базовых рангов RandLora приводит к увеличению количества обучаемых параметров. Поскольку произведение числа баз на ранг баз в RandLora является константой, уменьшение ранга увеличивает количество случайных баз, а следовательно, и количество обучаемых диагональных баз, специфичных для каждой базы.

Поскольку снижение ранга случайных баз RandLora приводит к увеличению их количества, обучение RandLora может оказаться медленнее, чем обучение LoRA, при очень малых рангах: как правило, ранги ниже 4 приводят к значительному увеличению времени обучения. На инференс это не влияет, так как адаптеры RandLora можно объединить с предобученными матрицами весов.

RandLora также поддерживает обучение с использованием разреженных тернарных случайных баз (содержащих только -1, 0 и 1). Эти базы описаны в работах Bingham et al. и Ping et al. и теоретически могут использоваться для снижения вычислительных затрат за счёт выполнения агрегаций вместо матричных умножений при создании обновления весов. В настоящее время это не поддерживается. Хотя это пока не снижает вычислительные затраты, использование разреженных случайных баз в RandLora может уменьшить переобучение в некоторых случаях. Пользователям, заинтересованным в использовании разреженных тернарных баз, рекомендуется опция sparse, а не very_sparse, которая может снизить производительность.

Аналогично VeRA, при сохранении параметров RandLora можно отказаться от хранения матриц низкого ранга, установив save_projection=False в VeraConfig. В этом случае эти матрицы будут восстановлены на основе фиксированного случайного зерна из аргумента projection_prng_key. Это уменьшает размер контрольной точки, но мы не можем гарантировать воспроизводимость на всех устройствах и во всех будущих версиях PyTorch. Если вы хотите обеспечить воспроизводимость, установите save_projection=True (это значение по умолчанию).

Как и в Vera, для обработки различных форм адаптируемых слоёв RandLora инициализирует общие матрицы A и B максимальным требуемым размером для каждого измерения. Во время прямого прохода подматрицы A и B для данного слоя вырезаются из этих общих матриц и используются, как описано в статье. Например, адаптация двух линейных слоёв форм (100, 20) и (80, 50) создаст матрицы A и B форм (rank, 50) и (100, rank) соответственно. Затем, чтобы адаптировать слой формы (100, 20), будут извлечены подматрицы A и B форм (rank, 20) и (100, rank).

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

  • Поддерживаются только слои nn.Linear.

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

Метод адаптации низкого ранга (LoRA) и его варианты продемонстрировали впечатляющие результаты в сокращении количества обучаемых параметров и требований к памяти для больших трансформерных сетей при сохранении качества дообучения. Однако низкоранговый характер обновления весов по своей природе ограничивает выразительную способность дообученных моделей, что потенциально может ухудшить их производительность на сложных задачах. Это поднимает критически важный вопрос: когда наблюдается разрыв в производительности между LoRA и стандартным дообучением, является ли его причиной уменьшенное количество обучаемых параметров или недостаточный ранг? В данной статье мы стремимся ответить на этот вопрос, представив RandLora — параметрически эффективный метод, выполняющий обновления полного ранга с использованием обучаемых линейных комбинаций низкоранговых необучаемых случайных матриц. Наш метод ограничивает количество обучаемых параметров, сужая оптимизацию до диагональных матриц масштабирования, применяемых к фиксированным случайным матрицам. Это позволяет нам эффективно преодолеть ограничения низкого ранга, сохраняя при этом параметрическую и память-эффективность во время обучения. Проведя обширные эксперименты на бенчмарках в области зрения, языка и зрительно-языковых задач, мы систематически оценили ограничения LoRA и существующих методов со случайным базисом. Наши результаты показывают, что обновления полного ранга полезны как для задач зрения, так и для задач языка по отдельности, а для зрительно-языковых задач — еще более значимо: RandLora значительно сокращает, а иногда и полностью устраняет разрыв в производительности между стандартным дообучением и LoRA, демонстрируя свою эффективность.

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

API

RandLoraConfig

класс peft.RandLoraConfig

< >

( 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 = 32target_modules: list[str] | str | None = Noneprojection_prng_key: int = 0save_projection: bool = Truesparse: bool = Falsevery_sparse: bool = Falserandlora_dropout: float = 0.0fan_in_fan_out: bool = Falserandlora_alpha: int = 640bias: str = 'none'modules_to_save: list[str] | None = Noneinit_weights: bool = Truelayers_to_transform: list[int] | int | None = Nonelayers_pattern: str | None = None )

Параметры

  • r (int, необязательный, по умолчанию 32) — Размерность случайного базиса для RandLora. В отличие от Lora, этот параметр обратно пропорционален количеству обучаемых параметров, так как его уменьшение увеличивает число обучаемых параметров.
  • target_modules (Union[list[str], str]) — Имена модулей, к которым следует применить RandLora. Поддерживаются только линейные слои.
  • projection_prng_key (int) — Ключ инициализации PRNG для RandLora. Используется для инициализации basis_A и basis_B для новых моделей или при загрузке чекпоинта, в котором не содержались эти проекции. По умолчанию 0.
  • save_projection (bool) — Сохранять ли глобальные случайные базисы basis_A / basis_B в state dict вместе с диагональными матрицами lambda / gamma для каждого слоя. Это увеличит размер контрольной точки, но гарантирует возможность перезагрузки контрольной точки на всех конфигурациях системы. По умолчанию True.
  • sparse (bool) — Использовать ли разреженные случайные базисы, описанные в статье RandLora. Базисы представляют собой троичные разреженные базисы (содержащие только -1, 0 и 1), где вероятность атрибута равна 1/6 для -1 и 1 и 2/3 для 0. Эти разреженные матрицы предназначены для использования в вычислениях без матричного умножения в будущем, см. https://huggingface.co/papers/2406.02528v1 Текущая реализация является концептом, где разреженность не используется для улучшения скорости или использования памяти. Использование разреженных матриц обычно не снижает производительность и даже может помочь уменьшить переобучение. По умолчанию False.
  • very_sparse (bool) — Использовать ли высоко разреженные случайные базисы, описанные в статье RandLora. Очень разреженные базисы — это трёхзначные разреженные базисы (содержащие только -1, 0 и 1), при этом для матрицы с наименьшим измерением d вероятность отнесения к -1 и 1 равна 1/√D, а к 0 — 1- 2/√D. Использование таких разреженных матриц может дальнейше снизить переобучение по сравнению с вариантами sparse, но, скорее всего, приведёт к снижению производительности. Используйте с осторожностью. По умолчанию False.
  • randlora_dropout (float) — Вероятность dropout для слоев RandLora.
  • randlora_alpha (float) — Коэффициент масштабирования для слоёв RandLora, обычно он равен 20, умноженному на ранг. Поскольку коэффициент randlora_alpha по умолчанию имеет большое значение, это может приводить к численной нестабильности, особенно при высоких скоростях обучения. Если обучение нестабильно, рассмотрите возможность уменьшения скорости обучения или коэффициента randlora_alpha.
  • fan_in_fan_out (bool) — Установите это значение в True, если заменяемый слой хранит веса в формате (fan_in, fan_out). Например, gpt-2 использует Conv1D, который хранит веса в формате (fan_in, fan_out), поэтому это значение должно быть установлено в True.
  • bias (str) — Тип смещения. Может принимать значения ‘none’, ‘all’ или ‘randlora_only’. Если указано ‘all’ или ‘randlora_only’, соответствующие смещения будут обновляться в процессе обучения. Обратите внимание, что это означает: даже при отключении адаптеров модель не будет выдавать тот же результат, что и базовая модель без адаптации.
  • modules_to_save (list[str]) — список модулей, помимо слоёв RandLora, которые нужно сделать обучаемыми и сохранить в итоговой контрольной точке.
  • init_weights (bool) — Определяет, следует ли инициализировать веса слоёв RandLora с использованием их начальной инициализации по умолчанию. Не изменяйте этот параметр, если вы точно не знаете, что делаете.
  • layers_to_transform (Union[list[int],int]) — Индексы слоев для преобразования. Если этот аргумент указан, преобразования RandLora применяются к слоям с индексами, указанными в этом списке. Если передано одно целое число, преобразования RandLora применяются к слою с этим индексом.
  • layers_pattern (str) — Имя шаблона слоя, используется только если layers_to_transform отличается от None и если шаблон слоя не входит в число общих шаблонов слоёв.

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

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

RandLoraModel

класс peft.RandLoraModel

< >

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

Возвращает

torch.nn.Module

Модель RandLora.

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

Пример:

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

>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = RandLoraConfig(r=32)
>>> model = get_peft_model(base_model, config)

Атрибуты:

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