PEFT documentation

Configuraciones y modelos de PEFT

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

Configuraciones y modelos de PEFT

El enorme tamaño de los grandes modelos preentrenados actuales, que comúnmente tienen miles de millones de parámetros, plantea un desafío significativo para el entrenamiento, ya que requieren más espacio de almacenamiento y más potencia de cálculo para realizar todas esas operaciones. Se necesita acceso a GPUs o TPUs potentes para entrenar estos grandes modelos preentrenados, lo cual es costoso, no está ampliamente disponible para todos, no es ecológico y no es muy práctico. Los métodos PEFT abordan muchos de estos desafíos. Existen varios tipos de métodos PEFT (soft prompting, descomposición de matrices, adaptadores), pero todos se centran en lo mismo: reducir el número de parámetros entrenables. Esto hace que sea más accesible entrenar y almacenar modelos grandes en hardware de consumo.

La biblioteca PEFT está diseñada para ayudarte a entrenar rápidamente modelos grandes en GPUs gratuitas o de bajo costo, y en este tutorial aprenderás a configurar una configuración para aplicar un método PEFT a un modelo base preentrenado para su entrenamiento. Una vez que la configuración de PEFT esté lista, puedes usar cualquier marco de entrenamiento que prefieras (la clase Trainer de Transformers, Accelerate, un bucle de entrenamiento personalizado de PyTorch).

Configuraciones de PEFT

Obtenga más información sobre los parámetros que puede configurar para cada método de PEFT en su respectiva página de referencia de la API.

Una configuración almacena los parámetros importantes que especifican cómo debe aplicarse un método PEFT en particular.

Por ejemplo, observe la siguiente LoraConfig para aplicar LoRA y la PromptEncoderConfig para aplicar p-tuning (estos archivos de configuración ya están serializados en JSON). Cada vez que cargue un adaptador PEFT, es buena idea comprobar si tiene un archivo adapter_config.json asociado, que es obligatorio.

LoraConfig
PromptEncoderConfig
{
  "base_model_name_or_path": "facebook/opt-350m", #base model to apply LoRA to
  "bias": "none",
  "fan_in_fan_out": false,
  "inference_mode": true,
  "init_lora_weights": true,
  "layers_pattern": null,
  "layers_to_transform": null,
  "lora_alpha": 32,
  "lora_dropout": 0.05,
  "modules_to_save": null,
  "peft_type": "LORA", #PEFT method type
  "r": 16,
  "revision": null,
  "target_modules": [
    "q_proj", #model modules to apply LoRA to (query and value projection layers)
    "v_proj"
  ],
  "task_type": "CAUSAL_LM" #type of task to train model on
}

Puedes crear tu propia configuración para el entrenamiento inicializando un LoraConfig.

from peft import LoraConfig, TaskType

lora_config = LoraConfig(
    r=16,
    target_modules=["q_proj", "v_proj"],
    task_type=TaskType.CAUSAL_LM,
    lora_alpha=32,
    lora_dropout=0.05
)

Modelos PEFT

Con una configuración de PEFT en mano, ahora puede aplicarla a cualquier modelo preentrenado para crear un PeftModel. Elija entre cualquiera de los modelos de última generación de la biblioteca Transformers, un modelo personalizado e incluso nuevas arquitecturas de transformers no admitidas.

Para este tutorial, cargue un modelo base facebook/opt-350m para ajustarlo.

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("facebook/opt-350m")

Use la función get_peft_model() para crear un PeftModel a partir del modelo base facebook/opt-350m y la lora_config que creó anteriormente.

from peft import get_peft_model

lora_model = get_peft_model(model, lora_config)
lora_model.print_healthcheck()

Al llamar a get_peft_model(), el modelo base se modificará in-place. Esto significa que, al llamar a get_peft_model() en un modelo que ya se había modificado de la misma manera antes, dicho modelo se mutará aún más. Por lo tanto, si deseas modificar tu configuración de PEFT después de haber llamado a get_peft_model() previamente, primero debes descargar el modelo con unload() y luego llamar a get_peft_model() con tu nueva configuración. Alternativamente, puedes reinicializar el modelo para garantizar un estado fresco y no modificado antes de aplicar una nueva configuración de PEFT.

Ahora puedes entrenar el PeftModel con tu marco de entrenamiento preferido. Después del entrenamiento, puedes guardar tu modelo localmente con save_pretrained() o subirlo al Hub con el método push_to_hub.

# save locally
lora_model.save_pretrained("your-name/opt-350m-lora")

# push to Hub
lora_model.push_to_hub("your-name/opt-350m-lora")

Para cargar un PeftModel para inferencia, deberá proporcionar el PeftConfig utilizado para crearlo y el modelo base del que se entrenó.

from peft import PeftModel, PeftConfig

config = PeftConfig.from_pretrained("ybelkada/opt-350m-lora")
model = AutoModelForCausalLM.from_pretrained(config.base_model_name_or_path)
lora_model = PeftModel.from_pretrained(model, "ybelkada/opt-350m-lora")

Por defecto, el PeftModel se configura para inferencia, pero si deseas entrenar el adaptador un poco más, puedes establecer is_trainable=True.

lora_model = PeftModel.from_pretrained(model, "ybelkada/opt-350m-lora", is_trainable=True)

El método PeftModel.from_pretrained() es la forma más flexible de cargar un PeftModel porque no importa qué marco de trabajo de modelos se haya utilizado (Transformers, timm, un modelo genérico de PyTorch). Otras clases, como AutoPeftModel, son simplemente un envoltorio conveniente alrededor del PeftModel base, y facilitan la carga de modelos PEFT directamente desde el Hub o localmente, donde se almacenan los pesos PEFT.

from peft import AutoPeftModelForCausalLM

lora_model = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora")

Echa un vistazo a la referencia de la API de AutoPeftModel para aprender más sobre las clases AutoPeftModel.

Próximos pasos

Con la PeftConfig adecuada, puedes aplicarla a cualquier modelo preentrenado para crear un PeftModel y entrenar modelos grandes y potentes más rápido en GPUs de libre disponibilidad. Para obtener más información sobre las configuraciones y modelos de PEFT, la siguiente guía puede ser útil:

Update on GitHub