PEFT documentation
MiSS
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ónout_features, controlado pormini_r. Esto reduce aún más los parámetros entrenables. Al usar este modo,mini_rdebe estar definido yout_featuresdebe ser divisible pormini_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
< 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 = 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 establecesinit_weights=mini, debes configurarmini_r. Asegúrate de queout_featuressea divisible pormini_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 silayers_to_transformes diferente deNone. - 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
< 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 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 toFalse) — 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.