PEFT documentation
HiRA
HiRA
High-Rank Adaptation (HiRA) es un método PEFT que extiende el enfoque de LoRA aplicando una modulación elemento a elemento sobre la matriz de pesos original. En lugar de añadir una actualización de bajo rango directamente, HiRA calcula:
donde es el peso base, y son factores de bajo rango con rango $r \ll \min(\text{in_features}, \text{out_features})$. Esta formulación permite a HiRA adaptar los pesos existentes con una modulación multiplicativa y dependiente de la entrada, lo que a menudo mejora la eficiencia del fine-tuning en tareas posteriores.
El resumen del artículo HiRA es:
Proponemos Hadamard High-Rank Adaptation (HiRA), un método de ajuste fino eficiente en parámetros (PEFT) que mejora la adaptabilidad de los Modelos de Lenguaje Grandes (LLMs). Si bien Low-rank Adaptation (LoRA) se utiliza ampliamente para reducir la demanda de recursos, sus actualizaciones de bajo rango pueden limitar su expresividad para nuevas tareas. HiRA aborda esto utilizando un producto de Hadamard para retener parámetros de actualización de alto rango, mejorando la capacidad del modelo. Empíricamente, HiRA supera a LoRA y sus variantes en varias tareas, con estudios de ablatión extensos que validan su efectividad.
Ejemplos
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()Resumen de las pruebas de rendimiento
Cita:
Si encontraste que HiRA es útil, por favor cita HiRA como:
@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
clase 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> )
Parámetros
- r (
int) — Rango del componente de bajo rango en HiRA. Aunque HiRA logra una adaptación de alto rango mediante la fusión de Hadamard, este valor define la dimensión de la factorización de bajo rango subyacente (matrices A y B). - target_modules (
Optional[Union[List[str], str]]) — Los nombres de los módulos a los que se aplicará el adaptador. Si se especifica, solo se reemplazarán los módulos con los nombres indicados. Al pasar una cadena de caracteres, se realizará una coincidencia mediante expresión regular. Al pasar una lista de cadenas de caracteres, se realizará una coincidencia exacta o se verificará si el nombre del módulo termina con alguna de las cadenas pasadas. Si se especifica como ‘all-linear’, se seleccionarán todos los módulos lineales/Conv1D (si el modelo es un PreTrainedModel, excluyendo la capa de salida). Si no se especifica, los módulos se elegirán según la arquitectura del modelo. Si la arquitectura no es conocida, se generará un error; en este caso, debe especificar los módulos objetivo manualmente. - exclude_modules (
Optional[Union[List[str], str]]) — Los nombres de los módulos a los que no se aplicará el adaptador. Al pasar una cadena de caracteres, se realizará una coincidencia mediante expresión regular. Al pasar una lista de cadenas de caracteres, se realizará una coincidencia exacta o se comprobará si el nombre del módulo termina con alguna de las cadenas de caracteres pasadas. - hira_dropout (
float) — La probabilidad de dropout para las capas HiRA. - fan_in_fan_out (
bool) — Establezca este valor en True si la capa que se va a reemplazar almacena los pesos como (fan_in, fan_out). Por ejemplo, gpt-2 utilizaConv1D, que almacena los pesos como (fan_in, fan_out), por lo que este valor debe establecerse enTrue. - modules_to_save (
List[str]) — Lista de módulos, aparte de las capas de adaptador, que se configurarán como entrenables y se guardarán en el punto de control final. - init_weights (
bool|Literal["gaussian"]) — Cómo inicializar los pesos de las capas HiRA. Pasar True (valor predeterminado) resulta en la inicialización predeterminada, con el peso B de HiRA establecido en 0. Esto significa que, sin entrenamiento adicional, el adaptador HiRA será una operación sin efecto (no-op). Establecer la inicialización en False lleva a una inicialización aleatoria de HiRA A y B, lo que significa que HiRA no es una operación sin efecto antes del entrenamiento; esta configuración está destinada a fines de depuración. Pasar'gaussian'resulta en una inicialización gaussiana escalada por el rango de HiRA para las capas lineales. - layers_to_transform (
Union[List[int], int]) — Los índices de las capas a transformar. Si se pasa una lista de enteros, se aplicará el adaptador a los índices de capa especificados en esta lista. Si se pasa un solo entero, se aplicarán las transformaciones a la capa en este índice. - layers_pattern (
Optional[Union[List[str], str]]) — El nombre del patrón de capas, utilizado solo silayers_to_transformes diferente deNone. Esto debe apuntar alnn.ModuleListdel modelo, que a menudo se llama'layers'o'h'. - rank_pattern (
dict) — El mapeo de nombres de capas o expresiones regulares a los rangos que difieren del r predeterminado especificado porr. Por ejemplo,{'^model.decoder.layers.0.encoder_attn.k_proj': 16}.
Esta es la clase de configuración para almacenar la configuración de un HiraModel.
HiraModel
clase 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
Parámetros
- model (
torch.nn.Module) — El modelo que se va a adaptar. - config (HiraConfig) — La configuración del modelo HiRA.
- adapter_name (
str) — El nombre del adaptador, por defecto es"default". - low_cpu_mem_usage (
bool,optional, defaults toFalse) — Crea pesos de adaptador vacíos en el dispositivo meta. Útil para acelerar el proceso de carga.
Devuelve
torch.nn.Module
El modelo HiRA.
Crea un modelo HiRA Adapter a partir de un modelo de transformers preentrenado.
El método se describe en detalle en https://openreview.net/pdf?id=TwJrTz9cRS.
Ejemplo:
>>> 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)Atributos:
- model (PreTrainedModel) — El modelo que se va a adaptar.
- peft_config (HiraConfig): La configuración del modelo HiRA.
Capas principales
HiraLayer
clase peft.tuners.hira.HiraLayer
< source >( base_layer: nn.Moduleephemeral_gpu_offload: bool = False**kwargs )
Linear Adapter
clase 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 )
Calcule el peso delta para el adaptador dado.
merge
< source >( safe_merge: bool = Falseadapter_names: Optional[list[str]] = None )
Parámetros
- safe_merge (
bool, opcional) — Si es True, la operación de fusión se realizará en una copia de los pesos originales y se verificarán los NaN antes de fusionar los pesos. Esto es útil si deseas comprobar si la operación de fusión producirá NaN. El valor predeterminado esFalse. - adapter_names (
list[str], opcional) — La lista de nombres de adaptadores que deben fusionarse. Si es None, se fusionarán todos los adaptadores activos. El valor predeterminado esNone.
Fusiona los pesos del adaptador activo en los pesos base
Este método desune todas las capas de adaptador fusionadas de los pesos base.
Adaptador de incrustación
clase peft.tuners.hira.Embedding
< source >( base_layer: nn.Moduleadapter_name: strconfig: HiraConfigr: int = 0fan_in_fan_out: bool = False**kwargs )
HiRA forward para la capa de Embedding. Admite adaptadores mixtos por lote o un solo adaptador.
get_delta_weight
< source >( adapter )
Calcule el peso delta para el adaptador dado.
merge
< source >( safe_merge: bool = Falseadapter_names: Optional[list[str]] = None )
Parámetros
- safe_merge (
bool, opcional) — Si es True, la operación de fusión se realizará en una copia de los pesos originales y se verificarán los NaN antes de fusionar los pesos. Esto es útil si deseas comprobar si la operación de fusión producirá NaN. El valor predeterminado esFalse. - adapter_names (
list[str], opcional) — La lista de nombres de adaptadores que deben fusionarse. Si es None, se fusionarán todos los adaptadores activos. El valor predeterminado esNone.
Fusiona los pesos del adaptador activo en los pesos base
Este método desune todas las capas de adaptador fusionadas de los pesos base.
Adaptadores convolucionales
[[autodoc]] tuners.hira.layer.Conv1d [[autodoc]] tuners.hira.layer.Conv2d [[autodoc]] tuners.hira.layer.ConvNd
Update on GitHub