PEFT documentation

Fusión de modelos

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

Fusión de modelos

Entrenar un modelo para cada tarea puede ser costoso, ocupar espacio de almacenamiento y los modelos no son capaces de aprender nueva información para mejorar su rendimiento. El aprendizaje multitarea puede superar algunas de estas limitaciones entrenando un modelo para aprender varias tareas, pero es costoso de entrenar y diseñar un conjunto de datos para ello es un desafío. La fusión de modelos ofrece una solución a estos desafíos al combinar varios modelos preentrenados en un solo modelo, dotándolo de las capacidades combinadas de cada modelo individual sin ningún entrenamiento adicional.

PEFT ofrece varios métodos para fusionar modelos, como una combinación lineal o SVD. Esta guía se centra en dos métodos que son más eficientes para fusionar adaptadores LoRA al eliminar parámetros redundantes:

  • TIES - TrIm, Elect, and Merge (TIES) es un método de tres pasos para fusionar modelos. Primero, se recortan los parámetros redundantes; a continuación, se resuelven las señales en conflicto en un vector agregado; y finalmente, se promedian los parámetros cuya señal coincide con la señal agregada. Este método tiene en cuenta que algunos valores (redundancia y desacuerdo de señal) pueden degradar el rendimiento del modelo fusionado.
  • DARE - Drop And REscale es un método que se puede utilizar para preparar el terreno para otros métodos de fusión de modelos, como TIES. Funciona eliminando aleatoriamente parámetros según una tasa de eliminación y reescalando los parámetros restantes. Esto ayuda a reducir el número de parámetros redundantes y potencialmente interferentes entre varios modelos.

Los modelos se combinan con el método add_weighted_adapter(), y el método específico de combinación de modelos se especifica en el parámetro combination_type.

Método de fusión

Con TIES y DARE, la fusión se habilita estableciendo combination_type y density en un valor de los pesos que se conservarán de los modelos individuales. Por ejemplo, fusionemos tres modelos TinyLlama/TinyLlama-1.1B-intermediate-step-1431k-3T afinados: tinyllama_lora_nobots, tinyllama_lora_sql y tinyllama_lora_adcopy.

Cuando intentes fusionar modelos completamente entrenados con TIES, debes tener en cuenta los tokens especiales que cada modelo haya añadido a la capa de embeddings y que no formen parte del vocabulario del checkpoint original. Esto puede causar un problema porque cada modelo puede haber añadido un token especial a la misma posición de embedding. Si este es el caso, debes usar el método resize_token_embeddings para evitar fusionar los tokens especiales en el mismo índice de embedding.


Esto no debería ser un problema si solo estás fusionando adaptadores LoRA entrenados a partir del mismo modelo base.

Cargue un modelo base y puede usar el método load_adapter() para cargar y asignar un nombre a cada adaptador:

from peft import PeftConfig, PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

config = PeftConfig.from_pretrained("smangrul/tinyllama_lora_norobots")
model = AutoModelForCausalLM.from_pretrained(config.base_model_name_or_path, load_in_4bit=True, device_map="auto").eval()
tokenizer = AutoTokenizer.from_pretrained("smangrul/tinyllama_lora_norobots")

model.config.vocab_size = 32005
model.resize_token_embeddings(32005)

model = PeftModel.from_pretrained(model, "smangrul/tinyllama_lora_norobots", adapter_name="norobots")
_ = model.load_adapter("smangrul/tinyllama_lora_sql", adapter_name="sql")
_ = model.load_adapter("smangrul/tinyllama_lora_adcopy", adapter_name="adcopy")

Establece los adaptadores, los pesos, adapter_name, combination_type y density con el método add_weighted_adapter().

TIES
DARE

Los valores de peso mayores que 1.0 suelen producir mejores resultados porque preservan la escala correcta. Un buen valor inicial por defecto para los pesos es establecer todos los valores en 1.0.

adapters = ["norobots", "adcopy", "sql"]
weights = [2.0, 1.0, 1.0]
adapter_name = "merge"
density = 0.2
model.add_weighted_adapter(adapters, weights, adapter_name, combination_type="ties", density=density)

Establezca el modelo recién fusionado como modelo activo con el método set_adapter().

model.set_adapter("merge")

Ahora puedes usar el modelo fusionado como un modelo ajustado con instrucciones para escribir textos publicitarios o consultas SQL.

instruct
texto publicitario
SQL
device = torch.accelerator.current_accelerator().type if hasattr(torch, "accelerator") else "cuda"
messages = [
    {"role": "user", "content": "Write an essay about Generative AI."},
]
text = tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=False)
inputs = tokenizer(text, return_tensors="pt")
inputs = {k: v.to(device) for k, v in inputs.items()}
outputs = model.generate(**inputs, max_new_tokens=256, do_sample=True, top_p=0.95, temperature=0.2, repetition_penalty=1.2, eos_token_id=tokenizer.eos_token_id)
print(tokenizer.decode(outputs[0]))

Fusión de modelos (IA)³

Los modelos (IA)³ facilitan la fusión lineal de adaptadores. Para fusionar adaptadores en un modelo (IA)³, utilice el método add_weighted_adapter de la clase IA3Model. Este método es análogo al método add_weighted_adapter utilizado en LoraModel, con la diferencia clave de que no incluye el parámetro combination_type. Por ejemplo, para fusionar tres adaptadores (IA)³ en un modelo PEFT, debe proceder de la siguiente manera:

adapters = ["adapter1", "adapter2", "adapter3"]
weights = [0.4, 0.3, 0.3]
adapter_name = "merge"
model.add_weighted_adapter(adapters, weights, adapter_name)

Se recomienda que la suma de los pesos sea 1.0 para preservar la escala del modelo. A continuación, el modelo fusionado puede establecerse como el modelo activo mediante el método set_adapter:

model.set_adapter("merge")
Update on GitHub