PEFT documentation

TinyLoRA: Обучение рассуждениям на 13 параметрах

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

TinyLoRA: Обучение рассуждениям на 13 параметрах

TinyLoRA — это крайне параметрически эффективный метод дообучения, основанный на подходе LoRA-XS, который использует разложение SVD замороженных весов и проецирует крошечный обучаемый вектор через фиксированные случайные тензоры. В сочетании с методами обучения с подкреплением (RL), такими как GRPO, TinyLoRA способен обеспечить конкурентоспособную производительность всего с 1–13 обучаемыми параметрами.

Ключевая инновация TinyLoRA заключается в замене обучаемой матрицы низкого ранга R на взвешенную сумму фиксированных матриц случайного проецирования: R = Σᵢ vᵢ Pᵢ, где v ∈ R^u — небольшой обучаемый вектор размерности u, а Pᵢ — фиксированные случайные матрицы. Это значительно сокращает количество обучаемых параметров, сохраняя при этом конкурентоспособную производительность.

TinyLoRA поддерживает связывание весов с помощью параметра weight_tying — отношения от 0.0 до 1.0, которое определяет, сколько модулей разделяют один и тот же обучаемый вектор v. Значение weight_tying=0.0 (по умолчанию) означает отсутствие разделения, а weight_tying=1.0 — полное разделение между всеми целевыми модулями, что обеспечивает предельную эффективность по параметрам благодаря единственному вектору из u обучаемых параметров для всей модели.

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

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

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

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

Недавние исследования показали, что языковые модели способны обучаться рассуждению, часто с использованием обучения с подкреплением. Некоторые работы даже обучают параметризации низкого ранга для рассуждений, однако стандартный LoRA не масштабируется ниже размерности модели. Мы ставим под сомнение необходимость даже LoRA с рангом=1 для обучения рассуждению и предлагаем TinyLoRA — метод масштабирования адаптеров низкого ранга до размеров, составляющих всего один параметр. В рамках нашей новой параметризации нам удалось обучить модель Qwen2.5 с 8 млрд параметров до точности 91% на GSM8K, используя всего 13 обучаемых параметров в bf16 (26 байт суммарно). Мы обнаружили, что эта тенденция сохраняется в целом: нам удалось восстановить 90% прироста производительности, обучая в 1000 раз меньше параметров на наборе более сложных бенчмарков обучения рассуждению, таких как AIME, AMC и MATH500. Примечательно, что столь высокую производительность нам удалось достичь только с использованием RL: модели, обученные с помощью SFT, требуют обновлений в 100–1000 раз больших для достижения аналогичного результата.

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

API

TinyLoraConfig

класс peft.TinyLoraConfig

< >

( 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 = 2u: int = 64weight_tying: float = 0.0projection_seed: int = 42save_projection: bool = Trueinit_v_bound: float = 0.02target_modules: Optional[Union[list[str], str]] = Nonetinylora_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_weights: Union[bool, str] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = None )

Параметры

  • r (int, необязательный, по умолчанию 2) — ранг SVD для замороженного разложения U, Sigma, V. В статье рекомендуется r=2.
  • u (int, необязательный, по умолчанию 64) — Изменяемая размерность вектора на группу. Этот параметр управляет выразительностью адаптации. Может быть таким низким, как 1-13 для экстремальной параметрической эффективности.
  • weight_tying (float, необязательный, по умолчанию 0.0) — Степень связывания весов между целевыми модулями, выраженная как отношение от 0.0 до 1.0. Определяет, сколько модулей делят один и тот же обучаемый вектор v. Значение 0.0 означает отсутствие общего использования (каждый модуль имеет собственный v). Значение 1.0 означает полное общее использование (все модули делят один v). Промежуточные значения обеспечивают частичное общее использование.
  • projection_seed (int, необязательный, по умолчанию 42) — Случайный сид для генерации фиксированных проекционных матриц P.
  • save_projection (bool, необязательный, по умолчанию True) — Сохранять ли тензоры проекции P в state dict. Если False, они будут перегенерированы из seed при загрузке.
  • init_v_bound (float, необязательный, по умолчанию 0.02) — Граница равномерной инициализации для обучаемого вектора v. Значения инициализируются в диапазоне [-init_v_bound, init_v_bound].
  • target_modules (Union[List[str], str], необязательный) — Имена модулей, к которым следует применить TinyLoRA. Это может быть список имён модулей (например, ['q_proj', 'v_proj']), регулярное выражение (например, '.*decoder.*(q|v)_proj$') или специальное ключевое слово "all-linear" для обработки всех линейных модулей. Поддерживаются только слои nn.Linear, nn.Embedding и transformers.pytorch_utils.Conv1D.
  • tinylora_dropout (float, необязательный, по умолчанию 0.0) — Вероятность dropout для слоев TinyLoRA.
  • fan_in_fan_out (bool, необязательный, по умолчанию False) — Установите это значение в True, если заменяемый слой хранит веса в формате (fan_in, fan_out). Например, gpt-2 использует Conv1D, который хранит веса в формате (fan_in, fan_out).
  • bias (str, необязательный, по умолчанию "none") — Тип смещения для TinyLoRA. Может принимать значения ‘none’, ‘all’ или ‘tinylora_only’.
  • modules_to_save (List[str], необязательный) — Список модулей, помимо слоёв TinyLoRA, которые нужно сделать обучаемыми и сохранить.
  • init_weights (bool | Literal["uniform"], необязательный, по умолчанию True) — Способ инициализации обучаемого вектора v. Передача True (по умолчанию) инициализирует v нулями, превращая адаптер в операцию тождественного преобразования (no-op). Передача "uniform" инициализирует v равномерными случайными значениями в диапазоне [-init_v_bound, init_v_bound]. Передача False оставляет v неинициализированным (для продвинутых сценариев использования).
  • layers_to_transform (Union[List[int], int], необязательный) — Индексы слоев, которые нужно преобразовать. Если указано, адаптируются только эти слои.
  • layers_pattern (Optional[Union[List[str], str]], необязательный) — Имя шаблона слоя, используется только в том случае, если layers_to_transform отличается от None.

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

TinyLoRA — это крайне параметрически эффективный метод дообучения, основанный на статье «Learning to Reason in 13 Parameters» (arXiv:2602.04118). Он использует разложение по сингулярным значениям (SVD) замороженных весов и проецирует небольшой обучаемый вектор через фиксированные случайные тензоры.

Статья: https://arxiv.org/abs/2602.04118

Пример:

from peft import get_peft_model, TinyLoraConfig

config = TinyLoraConfig(
    r=2,  # SVD rank (paper recommends 2)
    u=64,  # Trainable vector dimension
    weight_tying=0.0,  # No weight tying (0.0 = none, 1.0 = full)
    target_modules=["q_proj", "v_proj"],
    projection_seed=42,
)
model = get_peft_model(base_model, config)

TinyLoraModel

класс peft.TinyLoraModel

< >

( modelconfigadapter_namelow_cpu_mem_usage = False**kwargs ) → torch.nn.Module

Параметры

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

Возвращает

torch.nn.Module

Модель TinyLoRA.

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

TinyLoRA — это крайне параметрически эффективный метод дообучения, который использует разложение по сингулярным значениям (SVD) замороженных весов и проецирует небольшой обучаемый вектор через фиксированные случайные тензоры. Основано на статье «Learning to Reason in 13 Parameters» (arXiv:2602.04118).

Пример:

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

>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = TinyLoraConfig(r=2, u=64, target_modules=["q_proj", "v_proj"])
>>> model = get_peft_model(base_model, config)

Атрибуты:

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

delete_adapter

< >

( adapter_name: str )

Удалите адаптер и очистите общие на уровне модели параметры v.

Update on GitHub