Buckets:

hf-doc-build/doc / diffusers /main /fr /training /text_inversion.md
mishig's picture
|
download
raw
12.5 kB
# Inversion textuelle
[Textual Inversion](https://hf.co/papers/2208.01618) est une technique d’entraînement permettant de personnaliser les modèles de génération d’images à partir de quelques images d’exemple de ce que vous souhaitez qu’ils apprennent. Cette technique fonctionne en apprenant et en mettant à jour les embeddings de texte (les nouveaux embeddings sont liés à un mot spécial que vous devez utiliser dans le prompt) afin qu’ils correspondent aux images d’exemple que vous fournissez.
Pour l'inférence avec des embeddings entraînés, voir [Inférence par inversion textuelle](../using-diffusers/legacy_adapters#textual-inversion).
Si vous entraînez sur un GPU doté d’une vRAM limitée, vous devriez essayer d’activer les paramètres `gradient_checkpointing` et `mixed_precision` dans la commande d’entraînement. Vous pouvez également réduire votre empreinte mémoire en utilisant une attention efficace en mémoire avec [xFormers](../optimization/attention_backends).
Ce guide examine le script [textual_inversion.py](https://github.com/huggingface/diffusers/blob/main/examples/textual_inversion/textual_inversion.py) afin de vous familiariser avec celui-ci et de vous montrer comment l'adapter à votre propre cas d'usage.
Avant d'exécuter le script, assurez-vous d'installer la bibliothèque à partir du code source :
```bash
git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .
```
Accédez au dossier d'exemple contenant le script d'entraînement et installez les dépendances requises pour le script que vous utilisez :
```bash
cd examples/textual_inversion
pip install -r requirements.txt
```
> [!TIP]
> 🤗 Accelerate est une bibliothèque qui vous aide à entraîner sur plusieurs GPU/TPU ou avec une précision mixte. Elle configure automatiquement votre configuration d'entraînement en fonction de votre matériel et de votre environnement. Consultez le [tour rapide](https://huggingface.co/docs/accelerate/quicktour) de 🤗 Accelerate pour en savoir plus.
Initialiser un environnement 🤗 Accelerate :
```bash
accelerate config
```
Pour configurer un environnement 🤗 Accelerate par défaut sans choisir de configuration :
```bash
accelerate config default
```
Sinon, si votre environnement ne prend pas en charge un shell interactif, comme un notebook, vous pouvez utiliser :
```py
from accelerate.utils import write_basic_config
write_basic_config()
```
Enfin, si vous souhaitez entraîner un modèle sur votre propre jeu de données, consultez le guide [Create a dataset for training](create_dataset) pour apprendre à créer un jeu de données compatible avec le script d'entraînement.
> [!TIP]
> Les sections suivantes mettent en évidence les parties du script d'entraînement importantes pour comprendre comment le modifier, mais elles ne couvrent pas tous les aspects du script en détail. Si vous souhaitez en savoir plus, n'hésitez pas à lire le [script](https://github.com/huggingface/diffusers/blob/main/examples/textual_inversion/textual_inversion.py) et à nous faire part de vos questions ou préoccupations.
## Paramètres du script
Le script d’entraînement comporte de nombreux paramètres pour vous aider à adapter l’exécution d’entraînement à vos besoins. Tous les paramètres et leurs descriptions sont répertoriés dans la fonction [`parse_args()`](https://github.com/huggingface/diffusers/blob/839c2a5ece0af4e75530cb520d77bc7ed8acf474/examples/textual_inversion/textual_inversion.py#L176). Lorsque cela est applicable, Diffusers fournit des valeurs par défaut pour chaque paramètre, telles que la taille du lot d’entraînement et le taux d’apprentissage, mais n’hésitez pas à modifier ces valeurs dans la commande d’entraînement si vous le souhaitez.
Par exemple, pour augmenter le nombre d'étapes d'accumulation des gradients au-delà de la valeur par défaut de 1 :
```bash
accelerate launch textual_inversion.py \
--gradient_accumulation_steps=4
```
Parmi les autres paramètres de base et importants à spécifier, on trouve :
- `--pretrained_model_name_or_path` : le nom du modèle sur le Hub ou un chemin local vers le modèle pré-entraîné
- `--train_data_dir` : chemin vers un dossier contenant le jeu de données d'entraînement (images d'exemple)
- `--output_dir` : l’endroit où enregistrer le modèle entraîné
- `--push_to_hub` : indique s'il faut pousser le modèle entraîné sur le Hub
- `--checkpointing_steps` : fréquence de sauvegarde d'un point de contrôle pendant l'entraînement du modèle ; cela est utile si l'entraînement est interrompu pour une raison quelconque, car vous pouvez reprendre l'entraînement à partir de ce point de contrôle en ajoutant `--resume_from_checkpoint` à votre commande d'entraînement
- `--num_vectors` : le nombre de vecteurs utilisés pour apprendre les embeddings ; augmenter ce paramètre aide le modèle à mieux apprendre, mais cela entraîne des coûts de formation plus élevés
- `--placeholder_token` : le mot spécial à associer aux embeddings appris (vous devez utiliser ce mot dans votre prompt pour l'inférence)
- `--initializer_token` : un mot unique qui décrit approximativement l'objet ou le style sur lequel vous essayez d'entraîner le modèle
- `--learnable_property` : indiquez si vous entraînez le modèle à apprendre un nouveau « style » (par exemple, le style de peinture de Van Gogh) ou un « objet » (par exemple, votre chien)
## Script d'entraînement
Contrairement à certains autres scripts d’entraînement, textual_inversion.py possède une classe de jeu de données personnalisée, [`TextualInversionDataset`](https://github.com/huggingface/diffusers/blob/b81c69e489aad3a0ba73798c459a33990dc4379c/examples/textual_inversion/textual_inversion.py#L487), pour créer un jeu de données. Vous pouvez personnaliser la taille des images, le jeton de substitution, la méthode d’interpolation, l’application d’un recadrage, et bien plus encore. Si vous devez modifier la façon dont le jeu de données est créé, vous pouvez modifier `TextualInversionDataset`.
Ensuite, vous trouverez le code de prétraitement du jeu de données et la boucle d'entraînement dans la fonction [`main()`](https://github.com/huggingface/diffusers/blob/839c2a5ece0af4e75530cb520d77bc7ed8acf474/examples/textual_inversion/textual_inversion.py#L573).
Le script commence par charger le [tokenizer](https://github.com/huggingface/diffusers/blob/b81c69e489aad3a0ba73798c459a33990dc4379c/examples/textual_inversion/textual_inversion.py#L616), le [scheduler et le modèle](https://github.com/huggingface/diffusers/blob/b81c69e489aad3a0ba73798c459a33990dc4379c/examples/textual_inversion/textual_inversion.py#L622) :
```py
# Load tokenizer
if args.tokenizer_name:
tokenizer = CLIPTokenizer.from_pretrained(args.tokenizer_name)
elif args.pretrained_model_name_or_path:
tokenizer = CLIPTokenizer.from_pretrained(args.pretrained_model_name_or_path, subfolder="tokenizer")
# Load scheduler and models
noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder="scheduler")
text_encoder = CLIPTextModel.from_pretrained(
args.pretrained_model_name_or_path, subfolder="text_encoder", revision=args.revision
)
vae = AutoencoderKL.from_pretrained(args.pretrained_model_name_or_path, subfolder="vae", revision=args.revision)
unet = UNet2DConditionModel.from_pretrained(
args.pretrained_model_name_or_path, subfolder="unet", revision=args.revision
)
```
Le [jeton de substitution](https://github.com/huggingface/diffusers/blob/b81c69e489aad3a0ba73798c459a33990dc4379c/examples/textual_inversion/textual_inversion.py#L632) spécial est ajouté à côté du tokenizer, et l'embedding est réajusté pour prendre en compte le nouveau jeton.
Ensuite, le script [crée un jeu de données](https://github.com/huggingface/diffusers/blob/b81c69e489aad3a0ba73798c459a33990dc4379c/examples/textual_inversion/textual_inversion.py#L716) à partir de `TextualInversionDataset` :
```py
train_dataset = TextualInversionDataset(
data_root=args.train_data_dir,
tokenizer=tokenizer,
size=args.resolution,
placeholder_token=(" ".join(tokenizer.convert_ids_to_tokens(placeholder_token_ids))),
repeats=args.repeats,
learnable_property=args.learnable_property,
center_crop=args.center_crop,
set="train",
)
train_dataloader = torch.utils.data.DataLoader(
train_dataset, batch_size=args.train_batch_size, shuffle=True, num_workers=args.dataloader_num_workers
)
```
Enfin, la [boucle d'entraînement](https://github.com/huggingface/diffusers/blob/b81c69e489aad3a0ba73798c459a33990dc4379c/examples/textual_inversion/textual_inversion.py#L784) gère tout le reste, de la prédiction du résidu bruité à la mise à jour des poids d'intégration du jeton de remplacement spécial.
Si vous souhaitez en savoir plus sur le fonctionnement de la boucle d’entraînement, consultez le tutoriel [Comprendre les pipelines, les modèles et les planificateurs](../using-diffusers/write_own_pipeline), qui détaille le schéma de base du processus de débruitage.
## Lancer le script
Une fois que vous avez apporté toutes vos modifications ou que vous êtes satisfait de la configuration par défaut, vous êtes prêt à lancer le script d'entraînement ! 🚀
Pour ce guide, vous téléchargerez quelques images d'un [jouet pour chat](https://huggingface.co/datasets/diffusers/cat_toy_example) et les stockerez dans un répertoire. Mais rappelez-vous que vous pouvez créer et utiliser votre propre jeu de données si vous le souhaitez (voir le guide [Créer un jeu de données pour l'entraînement](create_dataset)).
```py
from huggingface_hub import snapshot_download
local_dir = "./cat"
snapshot_download(
"diffusers/cat_toy_example", local_dir=local_dir, repo_type="dataset", ignore_patterns=".gitattributes"
)
```
Définissez la variable d’environnement `MODEL_NAME` sur un identifiant de modèle du Hub ou un chemin vers un modèle local, et `DATA_DIR` sur le chemin où vous venez de télécharger les images de chats. Le script crée et enregistre les fichiers suivants dans votre dépôt :
- `learned_embeds.bin` : les vecteurs d'incrustation appris correspondant à vos images d'exemple
- `token_identifier.txt` : le jeton de substitution spécial
- `type_of_concept.txt` : le type de concept sur lequel vous entraînez le modèle (soit « object », soit « style »)
> [!WARNING]
> Une session d'entraînement complète prend environ 1 heure sur un GPU V100 unique.
Une dernière chose avant de lancer le script. Si vous souhaitez suivre le processus d’entraînement, vous pouvez enregistrer périodiquement les images générées au fil de l’entraînement. Ajoutez les paramètres suivants à la commande d’entraînement :
```bash
--validation_prompt="A <cat-toy> train"
--num_validation_images=4
--validation_steps=100
```
```bash
export MODEL_NAME="stable-diffusion-v1-5/stable-diffusion-v1-5"
export DATA_DIR="./cat"
accelerate launch textual_inversion.py \
--pretrained_model_name_or_path=$MODEL_NAME \
--train_data_dir=$DATA_DIR \
--learnable_property="object" \
--placeholder_token="<cat-toy>" \
--initializer_token="toy" \
--resolution=512 \
--train_batch_size=1 \
--gradient_accumulation_steps=4 \
--max_train_steps=3000 \
--learning_rate=5.0e-04 \
--scale_lr \
--lr_scheduler="constant" \
--lr_warmup_steps=0 \
--output_dir="textual_inversion_cat" \
--push_to_hub
```
Une fois l’entraînement terminé, vous pouvez utiliser votre modèle nouvellement entraîné pour l’inférence comme suit :
```py
from diffusers import StableDiffusionPipeline
import torch
pipeline = StableDiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16).to("cuda") # or "mps", "xpu", "cpu"
pipeline.load_textual_inversion("sd-concepts-library/cat-toy")
image = pipeline("A <cat-toy> train", num_inference_steps=50).images[0]
image.save("cat-train.png")
```
## Étapes suivantes
Félicitations pour l’entraînement de votre propre modèle de Textual Inversion ! 🎉 Pour en savoir plus sur l’utilisation de votre nouveau modèle, les guides suivants peuvent vous être utiles :
- Apprenez à [charger des embeddings Textual Inversion](../using-diffusers/legacy_adapters#textual-inversion) et à les utiliser également en tant qu'embeddings négatifs.

Xet Storage Details

Size:
12.5 kB
·
Xet hash:
b209a9b71f1de3ee18bb9a6c2508baf00d8b61d469809e199b6d845579ec8ebc

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.