PEFT documentation

Configurations et modèles 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

Configurations et modèles PEFT

La taille considérable des grands modèles pré-entraînés d’aujourd’hui – qui comptent couramment des milliards de paramètres – représente un défi majeur pour l’entraînement, car ils nécessitent davantage d’espace de stockage et de puissance de calcul pour effectuer toutes ces opérations. Il faut disposer de GPU ou de TPU puissants pour entraîner ces grands modèles pré-entraînés, ce qui est coûteux, peu accessible à tous, peu respectueux de l’environnement et peu pratique. Les méthodes PEFT répondent à bon nombre de ces défis. Il existe plusieurs types de méthodes PEFT (soft prompting, décomposition de matrices, adaptateurs), mais elles se concentrent toutes sur le même objectif : réduire le nombre de paramètres entraînables. Cela rend l’entraînement et le stockage de grands modèles plus accessibles sur du matériel grand public.

La bibliothèque PEFT est conçue pour vous aider à entraîner rapidement de grands modèles sur des GPU gratuits ou à faible coût. Dans ce tutoriel, vous apprendrez à configurer un paramétrage pour appliquer une méthode PEFT à un modèle de base pré-entraîné en vue de l’entraînement. Une fois la configuration PEFT en place, vous pouvez utiliser le framework d’entraînement de votre choix (la classe Trainer de Transformers, Accelerate, une boucle d’entraînement PyTorch personnalisée).

Configurations PEFT

En savoir plus sur les paramètres que vous pouvez configurer pour chaque méthode PEFT sur leur page de référence API respective.

Une configuration stocke les paramètres importants qui spécifient la manière dont une méthode PEFT particulière doit être appliquée.

Par exemple, examinez la configuration LoraConfig suivante pour appliquer LoRA et la configuration PromptEncoderConfig pour appliquer p-tuning (ces fichiers de configuration sont déjà sérialisés en JSON). Chaque fois que vous chargez un adaptateur PEFT, il est judicieux de vérifier qu'il est associé à un fichier adapter_config.json, qui est requis.

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
}

Vous pouvez créer votre propre configuration pour l'entraînement en initialisant 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
)

Modèles PEFT

Une fois la configuration PEFT en main, vous pouvez l’appliquer à n’importe quel modèle pré-entraîné pour créer un PeftModel. Choisissez parmi les modèles de pointe de la bibliothèque Transformers, un modèle personnalisé, voire de nouvelles architectures de transformeurs non prises en charge.

Pour ce tutoriel, chargez un modèle de base facebook/opt-350m à affiner.

from transformers import AutoModelForCausalLM

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

Utilisez la fonction get_peft_model() pour créer un PeftModel à partir du modèle de base facebook/opt-350m et de la configuration lora_config que vous avez créée précédemment.

from peft import get_peft_model

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

Lors de l’appel de get_peft_model(), le modèle de base est modifié in-place. Cela signifie que si vous appelez get_peft_model() sur un modèle qui a déjà été modifié de la même manière auparavant, ce modèle sera encore davantage altéré. Par conséquent, si vous souhaitez modifier votre configuration PEFT après avoir appelé get_peft_model() précédemment, vous devez d’abord décharger le modèle avec unload() puis appeler get_peft_model() avec votre nouvelle configuration. Alternativement, vous pouvez réinitialiser le modèle pour vous assurer d’un état neuf et non modifié avant d’appliquer une nouvelle configuration PEFT.

Vous pouvez maintenant entraîner le PeftModel avec votre framework d’entraînement préféré ! Une fois l’entraînement terminé, vous pouvez enregistrer votre modèle localement avec save_pretrained() ou le téléverser sur le Hub à l’aide de la méthode 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")

Pour charger un PeftModel pour l'inférence, vous devez fournir le PeftConfig utilisé pour le créer ainsi que le modèle de base à partir duquel il a été entraîné.

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")

Par défaut, le PeftModel est configuré pour l’inférence, mais si vous souhaitez entraîner davantage l’adaptateur, vous pouvez définir is_trainable=True.

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

La méthode PeftModel.from_pretrained() est la manière la plus flexible de charger un PeftModel, car le framework de modèle utilisé (Transformers, timm, un modèle PyTorch générique) n’a pas d’importance. Les autres classes, comme AutoPeftModel, ne sont qu’un wrapper pratique autour de la classe de base PeftModel, et facilitent le chargement direct des modèles PEFT depuis le Hub ou localement, là où les poids PEFT sont stockés.

from peft import AutoPeftModelForCausalLM

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

Consultez la référence de l’API AutoPeftModel pour en savoir plus sur les classes AutoPeftModel.

Étapes suivantes

Avec la PeftConfig appropriée, vous pouvez l’appliquer à n’importe quel modèle pré-entraîné pour créer un PeftModel et entraîner de grands modèles puissants plus rapidement sur des GPU librement disponibles ! Pour en savoir plus sur les configurations et les modèles PEFT, le guide suivant peut s’avérer utile :

Update on GitHub