PEFT documentation

Intégrations 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

Intégrations PEFT

Les avantages pratiques de PEFT s’étendent à d’autres bibliothèques Hugging Face comme Diffusers et Transformers. L’un des principaux atouts de PEFT est qu’un fichier d’adaptateur généré par une méthode PEFT est beaucoup plus léger que le modèle d’origine, ce qui facilite grandement la gestion et l’utilisation de plusieurs adaptateurs. Vous pouvez utiliser un même modèle de base pré-entraîné pour plusieurs tâches en chargeant simplement un nouvel adaptateur fine-tuné pour la tâche à résoudre. Vous pouvez également combiner plusieurs adaptateurs avec un modèle de diffusion texte-image pour créer de nouveaux effets.

Ce tutoriel vous montre comment PEFT peut vous aider à gérer les adaptateurs dans Diffusers et Transformers.

Diffusers

Diffusers est une bibliothèque d’IA générative permettant de créer des images et des vidéos à partir de texte ou d’images grâce à des modèles de diffusion. LoRA est une méthode d’entraînement particulièrement populaire pour les modèles de diffusion, car elle permet d’entraîner et de partager très rapidement des modèles de diffusion générant des images dans de nouveaux styles. Pour faciliter l’utilisation et l’essai de plusieurs modèles LoRA, Diffusers s’appuie sur la bibliothèque PEFT afin de gérer différents adaptateurs pour l’inférence.

Par exemple, chargez un modèle de base puis chargez l’adaptateur artificialguybr/3DRedmond-V1 pour l’inférence à l’aide de la méthode load_lora_weights. L’argument adapter_name de la méthode de chargement, activé par PEFT, vous permet d’attribuer un nom à l’adaptateur afin de le référencer plus facilement.

import torch
from diffusers import DiffusionPipeline

device = torch.accelerator.current_accelerator().type if hasattr(torch, "accelerator") else "cuda"

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
).to(device)
pipeline.load_lora_weights(
    "peft-internal-testing/artificialguybr__3DRedmond-V1", 
    weight_name="3DRedmond-3DRenderStyle-3DRenderAF.safetensors", 
    adapter_name="3d"
)
image = pipeline("sushi rolls shaped like kawaii cat faces").images[0]
image

Passons maintenant à un autre modèle LoRA intéressant, ostris/super-cereal-sdxl-lora. Il suffit de charger et de nommer ce nouvel adaptateur avec adapter_name, puis d’utiliser la méthode set_adapters pour le définir comme adaptateur actif.

pipeline.load_lora_weights(
    "ostris/super-cereal-sdxl-lora", 
    weight_name="cereal_box_sdxl_v1.safetensors", 
    adapter_name="cereal"
)
pipeline.set_adapters("cereal")
image = pipeline("sushi rolls shaped like kawaii cat faces").images[0]
image

Enfin, vous pouvez appeler la méthode disable_lora pour restaurer le modèle de base.

pipeline.disable_lora()

En savoir plus sur la prise en charge de Diffusers par PEFT dans le tutoriel Inference with PEFT.

Transformers

🤗 Transformers est une collection de modèles préentraînés pour tous les types de tâches et toutes les modalités. Vous pouvez charger ces modèles pour l'entraînement ou l'inférence. De nombreux modèles sont des grands modèles de langage (LLM), il est donc logique d'intégrer PEFT à Transformers pour gérer et entraîner des adaptateurs.

Charger un modèle pré-entraîné de base pour l'entraînement.

from transformers import AutoModelForCausalLM

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

Ensuite, ajoutez une configuration d’adaptateur pour spécifier comment adapter les paramètres du modèle. Appelez la méthode add_adapter() pour ajouter la configuration au modèle de base.

from peft import LoraConfig

peft_config = LoraConfig(
    lora_alpha=16,
    lora_dropout=0.1,
    r=64,
    bias="none",
    task_type="CAUSAL_LM"
)
model.add_adapter(peft_config)

Vous pouvez maintenant entraîner le modèle avec la classe Trainer de Transformers ou avec le framework d’entraînement de votre choix.

Pour utiliser le modèle nouvellement entraîné pour l'inférence, la classe AutoModel utilise PEFT en arrière-plan pour charger les poids de l'adaptateur et le fichier de configuration dans un modèle pré-entraîné de base.

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("peft-internal-testing/opt-350m-lora")

Sinon, vous pouvez utiliser les Pipelines de transformers pour charger le modèle et effectuer l'inférence de manière pratique :

from transformers import pipeline

model = pipeline("text-generation", "peft-internal-testing/opt-350m-lora")
print(model("Hello World"))

Si vous souhaitez comparer ou utiliser plus d’un adaptateur, vous pouvez appeler la méthode add_adapter() pour ajouter la configuration de l’adaptateur au modèle de base. La seule exigence est que le type d’adaptateur soit identique (vous ne pouvez pas mélanger un adaptateur LoRA et un adaptateur LoHa).

from transformers import AutoModelForCausalLM
from peft import LoraConfig

model = AutoModelForCausalLM.from_pretrained("facebook/opt-350m")
model.add_adapter(lora_config_1, adapter_name="adapter_1")

Appelez à nouveau add_adapter() pour attacher un nouvel adaptateur au modèle de base.

model.add_adapter(lora_config_2, adapter_name="adapter_2")

Vous pouvez ensuite utiliser set_adapter() pour définir l'adaptateur actuellement actif.

model.set_adapter("adapter_1")
output = model.generate(**inputs)
print(tokenizer.decode(output_disabled[0], skip_special_tokens=True))

Pour désactiver l'adaptateur, appelez la méthode disable_adapters.

model.disable_adapters()

enable_adapters peut être utilisé pour réactiver les adaptateurs.

Si vous êtes curieux, consultez le tutoriel Charger et entraîner des adaptateurs avec PEFT pour en savoir plus.

Update on GitHub