PEFT documentation

MiSS

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

MiSS

MiSS (Matrix Shard Sharing) es un método de PEFT que logra un buen equilibrio entre el rendimiento del modelo y la eficiencia computacional. Solo requiere una matriz entrenable e introduce un mecanismo de compartición de fragmentos (shard-sharing) distinto al de LoRA.

El resumen del artículo es:

Los métodos de ajuste fino eficiente en parámetros (PEFT), en particular la adaptación de bajo rango (LoRA), reducen eficazmente el número de parámetros entrenables en los modelos de lenguaje grandes (LLM). Sin embargo, a medida que la escala de los modelos sigue creciendo, la demanda de recursos computacionales sigue siendo un desafío importante. Las variantes existentes de LoRA a menudo luchan por lograr un equilibrio óptimo entre la adaptabilidad (rendimiento del modelo y velocidad de convergencia) y la eficiencia (sobrecarga computacional, uso de memoria y tiempo de inicialización). Este artículo presenta MiSS (Matrix Shard Sharing), un enfoque PEFT novedoso que aborda este compromiso mediante un mecanismo simple de compartición de fragmentos. MiSS aprovecha el hecho de que una adaptación de bajo rango puede lograrse descomponiendo la matriz de pesos en múltiples matrices de fragmentos y utilizando un fragmento común compartido y entrenable. Este método construye la matriz de actualización de bajo rango mediante la replicación de estos fragmentos compartidos y particionados. También proponemos una implementación eficiente en hardware y de amplia aplicabilidad para MiSS. Experimentos extensos realizados en una variedad de tareas, junto con un análisis sistemático del rendimiento computacional, demuestran la superioridad de MiSS. Los resultados muestran que MiSS supera significativamente a LoRA estándar y a sus variantes destacadas tanto en las métricas de rendimiento del modelo como en la eficiencia computacional, incluida la velocidad de inicialización y el rendimiento de entrenamiento. Al equilibrar eficazmente el poder expresivo y la utilización de recursos, MiSS ofrece una solución convincente para adaptar de manera eficiente modelos a gran escala.

Resumen de las pruebas de rendimiento

Cuándo usar MiSS

MiSS es una buena opción cuando:

  • Deseas una inicialización más rápida y un mayor rendimiento de entrenamiento que los esquemas avanzados de inicialización de LoRA que utilizan configuraciones costosas (como PiSSA, LoRA-GA u OLoRA).
  • Desea una alternativa directa a LoRA con cambios mínimos de configuración.

Si necesita una expresividad mayor a costa de cierta eficiencia, considere la variante de inicialización bat (véase más abajo).

modos de init_weights

MiSS admite tres modos de inicialización mediante el parámetro init_weights:

  • True (predeterminado): inicialización estándar de MiSS. Punto de partida óptimo para la mayoría de los casos de uso.
  • "bat": Permite actualizaciones no lineales entre distintos fragmentos. Produce mejores resultados que MiSS estándar, pero utiliza más memoria y es aproximadamente el doble de lento. Utilice esta opción cuando el rendimiento sea prioritario sobre la eficiencia.
  • "mini": Utiliza un rango más pequeño a lo largo de la dimensión out_features, controlado por mini_r. Esto reduce aún más los parámetros entrenables. Al usar este modo, mini_r debe estar definido y out_features debe ser divisible por mini_r.

Inicio rápido

import torch
from peft import MissConfig, get_peft_model
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    torch_dtype=torch.bfloat16,
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
tokenizer.pad_token_id = tokenizer.eos_token_id

# Standard MiSS
config = MissConfig(
    r=64,
    miss_dropout=0.01,
    task_type="CAUSAL_LM"
)

# BAT variant — better performance, more memory
# config = MissConfig(
#     r=64,
#     init_weights="bat",
#     task_type="CAUSAL_LM"
# )

# Mini variant — fewer trainable parameters
# config = MissConfig(
#     r=64,
#     init_weights="mini",
#     mini_r=8,
#     task_type="CAUSAL_LM"
# )

model = get_peft_model(model, config)
model.print_healthcheck()

Para un ejemplo completo de ajuste fino que incluye entrenamiento e inferencia, consulte el ejemplo de ajuste fino de MiSS.

API

MissConfig

clase peft.MissConfig

< >

( 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 = 64miss_dropout: float = 0.0mini_r: int = 1target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Noneinit_weights: bool | Literal['bat', 'mini'] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[str] = Nonebias: str = 'none'modules_to_save: Optional[list[str]] = None )

Parámetros

  • r (int) — El rango de MiSS entre las diferentes capas. Es mejor establecer ‘r’ en un número par; de lo contrario, el método de inicialización predeterminado no funcionará. El rango de MiSS corresponde a una descomposición de bajo rango a lo largo de la dimensión in_features.
  • miss_dropout (float) — La probabilidad de dropout para las capas MiSS.
  • mini_r (int) — El rango de MiSS corresponde a una descomposición de bajo rango a lo largo de la dimensión out_features. Cuando estableces init_weights=mini, debes configurar mini_r. Asegúrate de que out_features sea divisible por mini_r.
  • 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, 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.
  • init_weights (bool | Literal[“bat”, “mini”]) — Las distintas inicializaciones corresponden a distintas variantes de MiSS. Por defecto (balance), se utilizará el método más eficiente y general de MiSS. ‘bat’: En este modo, se pueden habilitar actualizaciones no lineales entre distintos shards. ‘mini’: En este modo, se puede establecer un rango menor para usar menos parámetros entrenables, pero se recomienda mantener out_features % mini_r == 0.
  • 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 (str) — El nombre del patrón de capas, utilizado solo si layers_to_transform es diferente de None.
  • bias (str) — Tipo de sesgo para MiSS. Puede ser 'none', 'all' o 'MiSS_only'.
  • 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.

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

MissModel

clase peft.MissModel

< >

( 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 al que se adjuntarán las capas del afinador de adaptadores.
  • config (MissConfig) — La configuración del modelo MiSS.
  • 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 MiSS.

Crea un modelo de adaptación de reflexión de Householder (MiSS) a partir de un modelo preentrenado. El método se describe en https://huggingface.co/papers/2409.15371

Ejemplo:

>>> from diffusers import StableDiffusionPipeline
>>> from peft import MissModel, MissConfig

>>> config_te = MissConfig(
...     r=8,
...     target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
...     init_weights=True,
... )
>>> config_unet = MissConfig(
...     r=8,
...     target_modules=[
...         "proj_in",
...         "proj_out",
...         "to_k",
...         "to_q",
...         "to_v",
...         "to_out.0",
...         "ff.net.0.proj",
...         "ff.net.2",
...     ],
...     init_weights=True,
... )

>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = MissModel(model.text_encoder, config_te, "default")
>>> model.unet = MissModel(model.unet, config_unet, "default")

Atributos:

  • model (~torch.nn.Module) — El modelo que se va a adaptar.
  • peft_config (MissConfig): La configuración del modelo MiSS.
Update on GitHub