PEFT documentation
HiRA
HiRA
High-Rank Adaptation (HiRA) — это метод PEFT, расширяющий подход LoRA за счёт применения поэлементной модуляции к исходной матрице весов. Вместо прямого добавления обновления низкого ранга HiRA вычисляет:
где — базовый вес, а — факторы низкого ранга с рангом $r \ll \min(\text{in_features}, \text{out_features})$. Такая формулировка позволяет HiRA адаптировать существующие веса с помощью мультипликативной, зависящей от входных данных модуляции, что часто повышает эффективность дообучения на задачах нижнего уровня.
Аннотация из статьи HiRA:
Мы предлагаем Hadamard High-Rank Adaptation (HiRA) — метод параметрически эффективной дообучения (PEFT), повышающий адаптивность больших языковых моделей (LLM). Хотя Low-rank Adaptation (LoRA) широко применяется для снижения требований к ресурсам, её обновления низкого ранга могут ограничивать выразительность модели при решении новых задач. HiRA решает эту проблему, используя произведение Хадамарда для сохранения параметров обновлений высокого ранга, что увеличивает ёмкость модели. Экспериментально показано, что HiRA превосходит LoRA и её варианты на нескольких задачах, а обширные исследования абляции подтверждают его эффективность.
Примеры
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import get_peft_model
from peft.tuners.hira import HiraConfig
# Example 1: HiRA on opt-125m for causal language modeling
model_id = "facebook/opt-125m"
base_model = AutoModelForCausalLM.from_pretrained(model_id)
tokenizer = AutoTokenizer.from_pretrained(model_id)
# Define HiRA configuration: apply to the MLP dense layers in each transformer block
hira_config = HiraConfig(
r=32,
target_modules=["k_proj", "q_proj", "v_proj", "fc1", "fc2"],
hira_dropout=0.0,
init_weights=True,
)
peft_model = get_peft_model(base_model, hira_config)
peft_model.print_healthcheck()Обзор бенчмарков
Цитирование:
Если вы нашли HiRA полезным, пожалуйста, цитируйте HiRA следующим образом:
@inproceedings{
huang2025hira,
title={Hi{RA}: Parameter-Efficient Hadamard High-Rank Adaptation for Large Language Models},
author={Qiushi Huang and Tom Ko and Zhan Zhuang and Lilian Tang and Yu Zhang},
booktitle={The Thirteenth International Conference on Learning Representations},
year={2025},
url={https://openreview.net/forum?id=TwJrTz9cRS}
}API
HiraConfig
класс peft.HiraConfig
< 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 = Falser: int = 32target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonehira_dropout: float = 0.0fan_in_fan_out: bool = Falsemodules_to_save: Optional[list[str]] = Noneinit_weights: bool | Literal['gaussian'] | None = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonerank_pattern: Optional[dict] = <factory> )
Параметры
- r (
int) — Ранг низко-ранговой компоненты в HiRA. Хотя HiRA обеспечивает адаптацию высокого ранга посредством гадамаровского слияния, это значение определяет размерность базовой низко-ранговой факторизации (матрицы A и B). - target_modules (
Optional[Union[List[str], str]]) — Имена модулей, к которым следует применить адаптер. Если это значение указано, будут заменены только модули с указанными именами. При передаче строки выполняется сопоставление по регулярному выражению. При передаче списка строк выполняется точное совпадение или проверяется, заканчивается ли имя модуля каким-либо из переданных строк. Если это значение указано как ‘all-linear’, выбираются все линейные/Conv1D модули (если модель является PreTrainedModel, выходной слой исключается). Если это значение не указано, модули выбираются в соответствии с архитектурой модели. Если архитектура неизвестна, будет выброшена ошибка — в этом случае следует указать целевые модули вручную. - exclude_modules (
Optional[Union[List[str], str]]) — Имена модулей, к которым не следует применять адаптер. При передаче строки выполняется сопоставление по регулярному выражению. При передаче списка строк выполняется точное совпадение или проверяется, заканчивается ли имя модуля каким-либо из переданных строк. - hira_dropout (
float) — Вероятность dropout для слоёв HiRA. - fan_in_fan_out (
bool) — Установите это значение в True, если заменяемый слой хранит веса в формате (fan_in, fan_out). Например, gpt-2 используетConv1D, который хранит веса в формате (fan_in, fan_out), поэтому это значение должно быть установлено вTrue. - modules_to_save (
List[str]) — Список модулей, помимо адаптерных слоёв, которые нужно сделать обучаемыми и сохранить в итоговой контрольной точке. - init_weights (
bool|Literal["gaussian"]) — Способ инициализации весов слоев HiRA. Передача True (по умолчанию) приводит к стандартной инициализации, при которой вес HiRA B устанавливается в 0. Это означает, что без дополнительной обучения адаптер HiRA будет являться no-op. Установка значения False приводит к случайной инициализации HiRA A и B, что означает, что HiRA не является no-op до обучения; этот вариант предназначен для отладки. Передача'gaussian'приводит к гауссовой инициализации, масштабированной рангом HiRA для линейных слоев. - layers_to_transform (
Union[List[int], int]) — Индексы слоёв, подлежащих трансформации. Если передан список целых чисел, адаптер будет применён к слоям с индексами, указанными в этом списке. Если передано одно целое число, трансформации будут применены к слою с этим индексом. - layers_pattern (
Optional[Union[List[str], str]]) — Имя шаблона слоя, используется только в том случае, еслиlayers_to_transformотличается отNone. Этот параметр должен указывать наnn.ModuleListмодели, который часто называется'layers'или'h'. - rank_pattern (
dict) — Соответствие между именами слоёв или регулярными выражениями и рангами, отличными от ранга по умолчанию r, заданного параметромr. Например,{'^model.decoder.layers.0.encoder_attn.k_proj': 16}.
Это класс конфигурации для хранения конфигурации модели HiraModel.
HiraModel
класс peft.HiraModel
< 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 (HiraConfig) — конфигурация модели HiRA.
- adapter_name (
str) — имя адаптера, по умолчанию"default". - low_cpu_mem_usage (
bool,optional, по умолчаниюFalse) — Создаёт пустые веса адаптера на meta-устройстве. Полезно для ускорения процесса загрузки.
Возвращает
torch.nn.Module
Модель HiRA.
Создаёт модель HiRA Adapter на основе предобученной модели transformers.
Метод подробно описан в https://openreview.net/pdf?id=TwJrTz9cRS.
Пример:
>>> from transformers import AutoModelForSeq2SeqLM
>>> from peft import HiraConfig, get_peft_model
>>> config = HiraConfig(
... task_type="SEQ_2_SEQ_LM",
... r=32,
... target_modules=["q", "v"],
... hira_dropout=0.01,
... )
>>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
>>> hira_model = get_peft_model(model, config)>>> import torch
>>> import transformers
>>> from peft import HiraConfig, get_peft_model, prepare_model_for_kbit_training
>>> rank = ...
>>> target_modules = ["q_proj", "k_proj", "v_proj", "out_proj", "fc_in", "fc_out", "wte"]
>>> config = HiraConfig(r=32, target_modules=target_modules, hira_dropout=0.1, task_type="CAUSAL_LM")
>>> quantization_config = transformers.BitsAndBytesConfig(load_in_8bit=True)
>>> tokenizer = transformers.AutoTokenizer.from_pretrained(
... "kakaobrain/kogpt",
... revision="KoGPT6B-ryan1.5b-float16", # or float32 version: revision=KoGPT6B-ryan1.5b
... bos_token="[BOS]",
... eos_token="[EOS]",
... unk_token="[UNK]",
... pad_token="[PAD]",
... mask_token="[MASK]",
... )
>>> model = transformers.GPTJForCausalLM.from_pretrained(
... "kakaobrain/kogpt",
... revision="KoGPT6B-ryan1.5b-float16", # or float32 version: revision=KoGPT6B-ryan1.5b
... pad_token_id=tokenizer.eos_token_id,
... use_cache=False,
... device_map={"": rank},
... torch_dtype=torch.float16,
... quantization_config=quantization_config,
... )
>>> model = prepare_model_for_kbit_training(model)
>>> hira_model = get_peft_model(model, config)Атрибуты:
- model (PreTrainedModel) — Модель, подлежащая адаптации.
- peft_config (HiraConfig): конфигурация модели HiRA.
Основные слои
HiraLayer
класс peft.tuners.hira.HiraLayer
< source >( base_layer: nn.Moduleephemeral_gpu_offload: bool = False**kwargs )
Linear Adapter
класс peft.tuners.hira.Linear
< source >( base_layeradapter_name: strconfig: HiraConfigr: int = 0fan_in_fan_out: bool = Falseis_target_conv_1d_layer: bool = False**kwargs )
get_delta_weight
< source >( adapter )
Вычислите дельта-веса для указанного адаптера.
merge
< source >( safe_merge: bool = Falseadapter_names: Optional[list[str]] = None )
Параметры
- safe_merge (
bool, необязательный) — Если True, операция слияния выполняется на копии исходных весов и проверяет наличие NaN перед слиянием весов. Это полезно, если вы хотите проверить, приведет ли операция слияния к появлению NaN. По умолчаниюFalse. - adapter_names (
list[str], необязательный) — Список имён адаптеров, которые необходимо объединить. Если значение равно None, будут объединены все активные адаптеры. По умолчаниюNone.
Слейте веса активного адаптера с базовыми весами
Этот метод отменяет слияние всех слоёв адаптеров из базовых весов.
Адаптер встраиваний
класс peft.tuners.hira.Embedding
< source >( base_layer: nn.Moduleadapter_name: strconfig: HiraConfigr: int = 0fan_in_fan_out: bool = False**kwargs )
HiRA forward для слоя Embedding. Поддерживает смешанные адаптеры в одном батче или одиночный адаптер.
get_delta_weight
< source >( adapter )
Вычислите дельта-веса для указанного адаптера.
merge
< source >( safe_merge: bool = Falseadapter_names: Optional[list[str]] = None )
Параметры
- safe_merge (
bool, необязательный) — Если True, операция слияния выполняется на копии исходных весов и проверяет наличие NaN перед слиянием весов. Это полезно, если вы хотите проверить, приведет ли операция слияния к появлению NaN. По умолчаниюFalse. - adapter_names (
list[str], необязательный) — Список имён адаптеров, которые необходимо объединить. Если значение равно None, будут объединены все активные адаптеры. По умолчаниюNone.
Слейте веса активного адаптера с базовыми весами
Этот метод отменяет слияние всех слоёв адаптеров из базовых весов.
Свёрточные адаптеры
[[autodoc]] tuners.hira.layer.Conv1d [[autodoc]] tuners.hira.layer.Conv2d [[autodoc]] tuners.hira.layer.ConvNd
Update on GitHub