PEFT documentation

AdaLoRA

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

AdaLoRA

AdaLoRA (Adaptive LoRA) — это метод оптимизации количества обучаемых параметров, выделяемых матрицам весов и слоям. В отличие от LoRA, который распределяет параметры равномерно по всем модулям, AdaLoRA выделяет больше параметров для важных матриц весов и слоёв, а менее важным — меньше. Вы можете контролировать среднее желаемое rank или r матриц, а также то, к каким модулям применять AdaLoRA, с помощью target_modules. Другие важные параметры, которые необходимо задать, — это lora_alpha (коэффициент масштабирования) и modules_to_save (модули, помимо слоёв AdaLoRA, которые нужно обучить и сохранить). Все эти параметры, а также другие, можно найти в AdaLoraConfig.

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

Дообучение крупных предобученных языковых моделей на задачах нижнего уровня стало важной парадигмой в NLP. Однако в обычной практике дообучаются все параметры предобученной модели, что становится недопустимо затратным при наличии большого числа задач нижнего уровня. Поэтому предложено множество методов дообучения, которые обучают инкрементальные обновления предобученных весов с высокой эффективностью по параметрам, например, с использованием приращений низкого ранга. Эти методы часто равномерно распределяют бюджет инкрементальных обновлений по всем матрицам предобученных весов, игнорируя различную важность отдельных весовых параметров. В результате качество дообучения оказывается неоптимальным. Чтобы восполнить этот пробел, мы предлагаем AdaLoRA, который адаптивно распределяет бюджет параметров между матрицами весов в соответствии с их оценкой важности. В частности, AdaLoRA параметризует инкрементальные обновления в форме разложения по сингулярным значениям. Такой новый подход позволяет эффективно отсекать сингулярные значения неважных обновлений, что по сути означает сокращение их бюджета параметров, но без необходимости интенсивных точных вычислений SVD. Мы провели обширные эксперименты с несколькими предобученными моделями на задачах обработки естественного языка, ответов на вопросы и генерации естественного языка, чтобы подтвердить эффективность AdaLoRA. Результаты показывают, что AdaLoRA демонстрирует значительное улучшение по сравнению с базовыми методами, особенно в условиях малого бюджета. Наш код доступен по адресу https://github.com/QingruZhang/AdaLoRA.

У AdaLoRA есть метод update_and_allocate(), который следует вызывать на каждом шаге обучения для обновления бюджета параметров и маски, иначе шаг адаптации не будет выполнен. Для этого необходимо написать собственный цикл обучения или создать подкласс Trainer, чтобы включить этот метод. В качестве примера посмотрите на этот собственный цикл обучения.

AdaLoRA управляет бюджетом параметров, введённым в LoRA, выделяя больше параметров — другими словами, более высокий ранг r - для важных матриц весов, которые лучше адаптированы для задачи, и удаляя менее важные. Ранг контролируется методом, похожим на разложение по сингулярным значениям (SVD). Матрица ΔW\Delta W параметризуется с помощью двух ортогональных матриц и диагональной матрицы, содержащей сингулярные значения. Этот метод параметризации позволяет избежать итеративного применения SVD, которое вычислительно дорого. На основе этого метода ранг матрицы ΔW\Delta W корректируется в соответствии с оценкой важности. ΔW\Delta W разбивается на тройки, и каждая тройка оценивается по её вкладу в производительность модели. Тройки с низкой оценкой важности удаляются, а тройки с высокой оценкой важности сохраняются для дообучения.

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

Приветствуем вклад: Этот раздел нуждается в уточнении.

Неясно, как измеряется значимость. Пояснения также несколько избыточны и могли бы быть объединены. См. здесь, как внести вклад.

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

Использование

from peft import AdaLoraConfig, get_peft_model

config = AdaLoraConfig(
    r=8,
    init_r=12,
    tinit=200,
    tfinal=1000,
    deltaT=10,
    target_modules=["query", "value"],
    modules_to_save=["classifier"],
)
model = get_peft_model(model, config)
model.print_healthcheck()

[... training code ...]

model.update_and_allocate(step_idx)

API

AdaLoraConfig

класс peft.AdaLoraConfig

< >

( 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 = 8target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonelora_alpha: int = 8lora_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: Literal['none', 'all', 'lora_only'] = 'none'use_rslora: bool = Falsemodules_to_save: Optional[list[str]] = Noneinit_lora_weights: bool | Literal['gaussian', 'eva', 'olora', 'pissa', 'pissa_niter_[number of iters]', 'corda', 'astra', 'loftq', 'orthogonal', 'mica', 'nora'] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonerank_pattern: dict | None = Nonealpha_pattern: Optional[dict] = <factory>megatron_config: Optional[dict] = Nonemegatron_core: Optional[str] = 'megatron.core'trainable_token_indices: Optional[Union[list[int], dict[str, list[int]]]] = Noneloftq_config: Union[LoftQConfig, dict] = <factory>eva_config: Optional[EvaConfig] = Nonecorda_config: Optional[CordaConfig] = Noneastra_config: Optional[AstraConfig] = Nonelora_ga_config: Optional[LoraGAConfig] = Noneuse_dora: bool = Falsevelora_config: Optional[Union[VeloraConfig, dict]] = Nonealora_invocation_tokens: Optional[list[int]] = Noneuse_qalora: bool = Falseqalora_group_size: int = 16monteclora_config: Optional[MontecloraConfig] = Nonelayer_replication: Optional[list[tuple[int, int]]] = Noneruntime_config: LoraRuntimeConfig = <factory>lora_bias: bool = Falsetarget_parameters: Optional[list[str]] = Noneuse_bdlora: Optional[BdLoraConfig] = Nonearrow_config: Optional[ArrowConfig] = Nonekasa_config: Optional[KasaConfig] = Noneensure_weight_tying: bool = Falsetarget_r: int = 8init_r: int = 12tinit: int = 0tfinal: int = 0deltaT: int = 1beta1: float = 0.85beta2: float = 0.85orth_reg_weight: float = 0.5total_step: int | None = None )

Параметры

  • target_r (int) — Целевое среднее ранговое число инкрементальной матрицы.
  • init_r (int) — Начальный ранг для каждой инкрементальной матрицы.
  • tinit (int) — Количество шагов начальной разминки при дообучении.
  • tfinal (int) — Количество шагов финальной дообучения.
  • deltaT (int) — интервал времени между двумя выделенными бюджетами.
  • beta1 (float) — гиперпараметр EMA для сглаживания чувствительности.
  • beta2 (float) — гиперпараметр EMA для количественной оценки неопределённости.
  • orth_reg_weight (float) — Коэффициент ортогональной регуляризации.
  • total_step (int) — Общее количество шагов обучения, которое должно быть указано перед началом обучения.
  • rank_pattern (list) — назначенный ранг для каждой матрицы весов, определённый RankAllocator.

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

AdaLoRA имеет три фазы, определяемые tinit, tfinal и total_step.

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

После завершения начальной фазы (прошло tinit шагов) и до начала финальной фазы AdaLoRA с каждым шагом сокращает бюджет, определяющий максимальный ранг, допустимый для каждого слоя. Именно на этом этапе происходит снижение ранга. Этот процесс продолжается до тех пор, пока не будет достигнуто total_step - tfinal шагов.

Последняя фаза, начинающаяся после достижения total_step - tfinal шагов, больше не изменяет ранги слоёв, а выполняет дообучение слоёв с пониженным рангом, полученных на предыдущей фазе.

Практический пример: tinit равно 10, tfinal равно 20, total_step равно 100. Мы тратим 10 шагов на предварительное обучение без снижения ранга, так как наш бюджет постоянен (фаза инициализации), затем 80 (100-20) шагов на фазе снижения, где наш бюджет уменьшается пошагово, и, наконец, 20 шагов на финальной стадии дообучения без снижения.

AdaLoraModel

класс peft.AdaLoraModel

< >

( modelconfigadapter_name**kwargs ) → torch.nn.Module

Параметры

  • model (transformers.PreTrainedModel) — Модель, подлежащая адаптации.
  • config (AdaLoraConfig) — Конфигурация модели AdaLora.
  • adapter_name (str) — имя адаптера, по умолчанию "default".
  • low_cpu_mem_usage (bool, optional, по умолчанию False) — Создаёт пустые веса адаптера на meta-устройстве. Полезно для ускорения процесса загрузки.

Возвращает

torch.nn.Module

Модель AdaLora.

Создаёт модель AdaLoRA (Adaptive LoRA) на основе предобученной модели transformers. Статья: https://openreview.net/forum?id=lq62uWRJjiY

Пример:

>>> from transformers import AutoModelForSeq2SeqLM
>>> from peft import AdaLoraConfig, get_peft_model

>>> config = AdaLoraConfig(
...     peft_type="ADALORA",
...     task_type="SEQ_2_SEQ_LM",
...     init_r=12,
...     lora_alpha=32,
...     target_modules=["q", "v"],
...     lora_dropout=0.01,
...     total_step=1000,
... )
>>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
>>> adalora_model = get_peft_model(model, config)

Атрибуты:

add_weighted_adapter

< >

( *args**kwargs )

Этот метод не поддерживается для AdaLoRA, используйте LoRA вместо него.

update_and_allocate

< >

( global_step )

Параметры

  • global_step (int) — Текущий шаг обучения, используется для расчёта бюджета adalora.

Этот метод обновляет бюджет и маску Adalora.

Это следует вызывать на каждом шаге обучения после loss.backward() и перед zero_grad().

tinit, tfinal и deltaT обрабатываются внутри метода.

Пример:

>>> loss = model(**input).loss
>>> loss.backward()
>>> optimizer.step()
>>> model.base_model.update_and_allocate(i_step)
>>> optimizer.zero_grad()
Update on GitHub