PEFT documentation
Adaptadores de rango alto dispersos
Adaptadores de rango alto dispersos
Los adaptadores de alto rango disperso o SHiRA son un tipo alternativo de adaptador y se ha demostrado que presentan ventajas significativas frente a los adaptadores de bajo rango. En concreto, SHiRA logra una mayor precisión que LoRA en una variedad de tareas de visión y lenguaje. Además, ofrece una fusión de múltiples adaptadores más simple y de mayor calidad al reducir significativamente la pérdida de conceptos, un problema común al que se enfrentan los adaptadores de bajo rango. SHiRA ajusta directamente un pequeño número de parámetros del modelo base para ajustar el modelo a cualquier tarea de adaptación.
SHiRA tiene actualmente la siguiente restricción:
- Solo se admiten capas
nn.Linear.
El resumen del artículo es:
Low Rank Adaptation (LoRA) ha captado una atención masiva en la investigación reciente de IA generativa. Una de las principales ventajas de LoRA es su capacidad para fusionarse con modelos preentrenados, sin añadir sobrecarga durante la inferencia. Sin embargo, desde el punto de vista del despliegue en dispositivos móviles, podemos evitar la sobrecarga de inferencia en el modo fusionado, pero perdemos la capacidad de cambiar de adaptadores rápidamente, o bien soportar una latencia de inferencia significativa (hasta un 30 % mayor) mientras se habilita el cambio rápido en el modo no fusionado. LoRA también presenta pérdida de conceptos cuando se utilizan varios adaptadores de forma concurrente. En este artículo, proponemos Sparse High Rank Adapters (SHiRA), un nuevo paradigma que no incurre en sobrecarga de inferencia, permite el cambio rápido y reduce significativamente la pérdida de conceptos. Específicamente, SHiRA se puede entrenar ajustando directamente solo el 1-2 % de los pesos del modelo base, dejando los demás sin cambios. Esto da como resultado un adaptador altamente disperso que se puede cambiar directamente en el modo fusionado. Además, proporcionamos perspectivas teóricas y empíricas sobre cómo la alta dispersión en SHiRA puede ayudar a la fusión de múltiples adaptadores reduciendo la pérdida de conceptos. Nuestros extensos experimentos con LVMs y LLMs demuestran que el ajuste fino de solo una pequeña fracción de los parámetros del modelo base supera significativamente a LoRA, al mismo tiempo que permite tanto el cambio rápido como la fusión de múltiples adaptadores. Finalmente, proporcionamos una implementación de SHiRA eficiente en latencia y memoria basada en la biblioteca Parameter-Efficient Finetuning (PEFT), que entrena a una velocidad casi igual a la de LoRA mientras consume hasta un 16 % menos de memoria GPU pico, lo que hace que SHiRA sea fácil de adoptar para casos de uso prácticos. Para demostrar las ventajas del cambio rápido durante la inferencia, mostramos que cargar SHiRA en un modelo base puede ser de 5 a 16 veces más rápido que la fusión de LoRA en una CPU.
Resumen de las pruebas de rendimiento
API
ShiraConfig
clase peft.ShiraConfig
< 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 = 32mask_type: Literal['random'] = 'random'random_seed: Optional[int] = Nonetarget_modules: Optional[Union[list[str], str]] = Nonefan_in_fan_out: bool = Falseinit_weights: bool = Truemodules_to_save: Optional[list[str]] = None )
Parámetros
- r (
int, opcional, valor predeterminado32) — Para un módulo objetivo dado, el número de parámetros de SHiRA se calcula como r(m+n), donde las dimensiones del tensor original son m x n. Esto significa que el número de parámetros de SHiRA es el mismo que el de un adaptador LoRA. SHiRA es un adaptador de alto rango. Establecer este parámetro r no restringe el rango a este valor. - mask_type (
str, defaults torandom) — Type of mask function. Defaults to a random sparse mask. An optional user-defined mask_fn to compute the mask value can also be supplied by instantiatingconfig = ShiraConfig(...)and then settingconfig.mask_fn = <your custom mask function>. For a pretrained weight with shape m x n, the custom mask function must return only one mask (shape: m x n) which must be binary 0 or 1 with num_shira_parameters = r(m + n) for linear layers. Device and dtype of mask must be same as base layer’s weight’s device and dtype. Please see mask_functions.py for more details and to see the default random sparse mask implementation. - random_seed (
int, opcional, valor predeterminadoNone) — semilla aleatoria para el generador de torch para random_mask. - target_modules (
Union[List[str], str]) — Lista de nombres de módulos o expresión regular de los nombres de módulos a reemplazar con SHiRA. Por ejemplo, [‘q’, ‘v’] o ‘.decoder.(SelfAttention|EncDecAttention).*(q|v)$‘. Solo se admiten capas lineales. - 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. - init_weights (
bool, por defectoTrue) — Inicializa el peso de SHiRA con valores cero. Si se establece en False, los pesos de SHiRA se inicializan con valores randn en lugar de ceros, y esto se utiliza solo para pruebas. - modules_to_save (
List[str]) — Lista de módulos, aparte de las capas SHiRA, que se configurarán como entrenables y se guardarán en el punto de control final.
Esta es la clase de configuración para almacenar la configuración de un ShiraModel.
ShiraModel
clase peft.ShiraModel
< 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 (PreTrainedModel) — El modelo que se va a adaptar.
- config (ShiraConfig) — La configuración del modelo SHiRA.
- adapter_name (
str) — El nombre del adaptador, por defecto es"default".
Devuelve
torch.nn.Module
El modelo SHiRA.
Crea un modelo Sparse High Rank Adapter (SHiRA) a partir de un modelo preentrenado.
Ejemplo:
>>> from transformers import AutoModelForCausalLM
>>> from peft import ShiraConfig, get_peft_model
>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = ShiraConfig(r=32)
>>> model = get_peft_model(base_model, config)Atributos:
- model (PreTrainedModel) — El modelo que se va a adaptar.
- peft_config (ShiraConfig): La configuración del modelo SHiRA.