PEFT documentation

VeRA: Adaptación de matrices aleatorias basada en vectores

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

VeRA: Adaptación de matrices aleatorias basada en vectores

VeRA es una técnica de ajuste fino eficiente en parámetros que es similar a LoRA, pero que requiere aún menos parámetros adicionales mientras promete un rendimiento similar o incluso mejor. Por lo tanto, es especialmente útil cuando el presupuesto de parámetros es muy limitado, por ejemplo, al escalar a modelos muy grandes. La reducción del número de parámetros entrenables se logra compartiendo las mismas matrices de bajo rango entre todas las capas y entrenando solo dos vectores adicionales por capa.

Cómo funciona VeRA

LoRA actualiza un modelo base congelado aprendiendo dos matrices pequeñas de bajo rango para cada capa adaptada. El rango es la dimensión interna de estas matrices y controla la capacidad del adaptador. En LoRA, aumentar r o adaptar más capas aumenta rápidamente el número de parámetros entrenables porque cada capa adaptada aprende su propio par de matrices de bajo rango.

VeRA mantiene la misma idea de adaptación de bajo rango, pero cambia qué parámetros se entrenan. En lugar de aprender matrices de bajo rango separadas para cada capa, VeRA utiliza un par de matrices de bajo rango congeladas e inicializadas aleatoriamente, A y B, que se comparten entre capas. Cada capa adaptada solo aprende dos vectores de escalado, vera_lambda_d y vera_lambda_b, que reescalan las matrices compartidas para producir una actualización específica de la capa. Dado que vera_lambda_d tiene tamaño r, la cantidad de parámetros entrenables de VeRA sigue aumentando con r y con el número de capas adaptadas. Sin embargo, crece mucho más lentamente que la de LoRA, porque las matrices grandes A y B se comparten y se congelan en lugar de aprenderse por separado para cada capa.

Por eso VeRA puede usar menos parámetros entrenables que LoRA. En el recuento simplificado de parámetros del artículo, LoRA escala con 2 * L_tuned * d_model * r, donde L_tuned es el número de capas adaptadas, d_model es la dimensión del modelo y r es el rango. VeRA escala con L_tuned * (d_model + r) porque las matrices de bajo rango grandes se comparten y se mantienen congeladas, mientras que solo se entrenan los vectores más pequeños por capa.

Al guardar los parámetros del adaptador, es posible evitar el almacenamiento de las matrices de bajo rango estableciendo save_projection=False en VeraConfig. En ese caso, estas matrices se restaurarán en función de la semilla aleatoria fija del argumento projection_prng_key. Esto reduce el tamaño del punto de control, pero no podemos garantizar la reproducibilidad en todos los dispositivos ni en todas las versiones futuras de PyTorch. Si deseas asegurar la reproducibilidad, establece save_projection=True (que es el valor predeterminado).

Para manejar diferentes formas de las capas adaptadas, VeRA inicializa las matrices compartidas A y B con el tamaño máximo requerido para cada dimensión. Durante la pasada hacia adelante, las submatrices A y B para una capa dada se extraen de estas matrices compartidas y se utilizan tal como se describe en el artículo. Por ejemplo, adaptar dos capas lineales de formas (100, 20) y (80, 50) creará matrices A y B de formas (rank, 50) y (100, rank) respectivamente. Luego, para adaptar una capa de forma (100, 20), se extraerán submatrices A y B de formas (rank, 20) y (100, rank).

VeRA tiene actualmente la siguiente restricción:

  • Solo se admiten capas nn.Linear.

El resumen del artículo es:

La adaptación de bajo rango (LoRA) es un método popular que reduce el número de parámetros entrenables al realizar el ajuste fino de modelos de lenguaje grandes, pero aún enfrenta desafíos agudos de almacenamiento al escalar a modelos aún más grandes o al desplegar numerosos modelos adaptados por usuario o por tarea. En este trabajo, presentamos la Adaptación de Matrices Aleatorias Basada en Vectores (VeRA), que reduce significativamente el número de parámetros entrenables en comparación con LoRA, pero mantiene el mismo rendimiento. Lo logra utilizando un único par de matrices de bajo rango compartido entre todas las capas y aprendiendo vectores de escalado pequeños en su lugar. Demostramos su efectividad en los benchmarks GLUE y E2E, en tareas de clasificación de imágenes, y mostramos su aplicación en el ajuste de instrucciones de modelos de lenguaje de 7B y 13B.

Cuándo usar VeRA

VeRA es una buena opción cuando:

  • Desea minimizar el número de parámetros entrenables manteniendo un rendimiento comparable al de LoRA.
  • Necesita almacenar o desplegar muchos adaptadores específicos para cada tarea, donde los puntos de control de adaptadores más pequeños reducen los requisitos de almacenamiento.
  • Estás ajustando modelos de lenguaje muy grandes con presupuestos estrictos de memoria o parámetros.

Cuándo no usar VeRA

VeRA puede no ser la mejor opción cuando:

  • Se requieren matrices de bajo rango independientes para cada capa adaptada, lo que proporciona mayor flexibilidad en los parámetros del adaptador aprendido.
  • Su modelo requiere adaptar tipos de módulos distintos de nn.Linear, ya que VeRA actualmente solo admite capas lineales.
  • Su modelo contiene capas lineales adaptadas con dimensiones de entrada y salida muy diferentes. Dado que VeRA comparte un único par de matrices de proyección entre todas las capas adaptadas, estas matrices deben dimensionarse para la forma más grande. Por lo tanto, los modelos con una gran variación en las formas de las capas (por ejemplo, las capas de proyección ascendente y descendente de un transformer) pueden requerir una sobreprovisión de las matrices de proyección compartidas, lo que reduce parte de la ventaja de eficiencia de parámetros de VeRA.

Resumen de las pruebas de rendimiento

API

VeRAConfig

clase peft.VeraConfig

< >

( 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 = 256target_modules: Optional[Union[list[str], str]] = Noneprojection_prng_key: int = 0save_projection: bool = Truevera_dropout: float = 0.0d_initial: float = 0.1fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_weights: bool = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = None )

Parámetros

  • r (int, opcional, valor predeterminado 256) — Dimensión del parámetro de VeRA (“rank”). Elija valores más altos que los rangos de LoRA aquí, ya que VeRA utiliza muchos menos parámetros que LoRA (véase la Tabla 1).
  • target_modules (Union[List[str], str]) — Los nombres de los módulos a los que se aplicará Vera. Solo se admiten capas lineales.
  • projection_prng_key (int) — Clave de inicialización del PRNG de Vera. Se utiliza para inicializar vera_A y vera_B en modelos nuevos o al cargar un punto de control que no incluyera estas proyecciones. El valor predeterminado es 0.
  • save_projection (bool) — Si se deben guardar las proyecciones vera_A / vera_B en el state dict junto con los pesos lambda_b / lambda_d por capa. Esto aumentará el tamaño del checkpoint, pero garantiza que podamos recargar el checkpoint en todas las configuraciones de sistema. El valor predeterminado es True.
  • vera_dropout (float) — La probabilidad de dropout para las capas de Vera.
  • d_initial (float, opcional, valor predeterminado 0.1) — Valor inicial de inicialización para el vector vera_lambda_d utilizado al inicializar los parámetros de VeRA. Se recomiendan valores pequeños (<=0.1) (véase la Tabla 6c del artículo).
  • 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 utiliza Conv1D, que almacena los pesos como (fan_in, fan_out), por lo que este valor debe establecerse en True.
  • bias (str) — Tipo de sesgo para Vera. Puede ser ‘none’, ‘all’ o ‘vera_only’. Si es ‘all’ o ‘vera_only’, los sesgos correspondientes se actualizarán durante el entrenamiento. Tenga en cuenta que esto significa que, incluso al deshabilitar los adaptadores, el modelo no producirá la misma salida que habría producido el modelo base sin adaptación.
  • modules_to_save (List[str]) — Lista de módulos, aparte de las capas Vera, que se configurarán como entrenables y se guardarán en el punto de control final.
  • init_weights (bool) — Si se deben inicializar los pesos de las capas de Vera con su inicialización predeterminada. No cambies esta configuración, a menos que sepas exactamente lo que estás haciendo.
  • layers_to_transform (Union[List[int],int]) — Los índices de las capas a transformar. Si se especifica este argumento, se aplicarán las transformaciones de Vera a los índices de capa indicados en esta lista. Si se pasa un solo entero, se aplicarán las transformaciones de Vera a la capa en ese índice.
  • layers_pattern (Optional[Union[List[str], str]]) — El nombre del patrón de capas, utilizado solo si layers_to_transform es diferente de None. Esto debe apuntar al nn.ModuleList del modelo, que a menudo se llama 'layers' o 'h'.

Esta es la clase de configuración para almacenar la configuración de un VeraModel.

Artículo: https://huggingface.co/papers/2310.11454.

VeRAModel

clase peft.VeraModel

< >

( 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 (PreTrainedModel) — El modelo que se va a adaptar.
  • config (VeraConfig) — La configuración del modelo Vera.
  • adapter_name (str) — El nombre del adaptador, por defecto es "default".
  • low_cpu_mem_usage (bool, optional, defaults to False) — Crea pesos de adaptador vacíos en el dispositivo meta. Útil para acelerar el proceso de carga.

Devuelve

torch.nn.Module

El modelo Vera.

Crea un modelo de Adaptación de Matrices Aleatorias Basada en Vectores (Vera) a partir de un modelo de transformers preentrenado.

Ejemplo:

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

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

Atributos:

Update on GitHub