TL;DR : Motivés en partie par FLAN et en partie par InstructPix2Pix, nous explorons un moyen d'ajuster les instructions de diffusion stable. Cela nous permet d'inviter notre modèle à l'aide d'une image d'entrée et d'une « instruction », telle que - Appliquer un filtre de dessin animé à l'image naturelle .
Vous pouvez lire notre article de blog pour en savoir plus.
? Motivation
? Préparation des données
? Entraînement
? Modèles, ensembles de données, démo
️ Inférence
? Résultats
? Remerciements
Le réglage des instructions est une manière supervisée d’enseigner aux modèles de langage à suivre des instructions pour résoudre une tâche. Il a été introduit dans les modèles linguistiques affinés sont des apprenants zéro-shot (FLAN) par Google. Récemment, vous vous souviendrez peut-être de travaux comme Alpaca et FLAN V2, qui sont de bons exemples de la façon dont le réglage des instructions peut être bénéfique pour diverses tâches.
D'un autre côté, l'idée d'apprendre à Stable Diffusion à suivre les instructions de l'utilisateur pour effectuer des modifications sur les images d'entrée a été introduite dans InstructPix2Pix : Apprendre à suivre les instructions d'édition d'images.
Notre motivation derrière ce travail vient en partie de la ligne de travaux FLAN et en partie d'InstructPix2Pix. Nous voulions explorer s'il était possible d'inviter Stable Diffusion avec des instructions spécifiques et des images d'entrée pour les traiter selon nos besoins.
Notre idée principale est de créer d'abord un ensemble de données guidé par des instructions (comme décrit dans notre blog, puis d'effectuer une formation de style InstructPix2Pix. L'objectif final est d'améliorer la diffusion stable dans le suivi d'instructions spécifiques qui impliquent des opérations liées à la transformation d'image.
Notre processus de préparation des données s’inspire du FLAN. Reportez-vous aux sections ci-dessous pour plus de détails.
data_preparation
.Conseil
En cas d'utilisation d'ensembles de données personnalisés, il faut configurer l'ensemble de données selon son choix tant que vous conservez le format présenté ici. Vous devrez peut-être configurer votre chargeur de données et votre classe d'ensemble de données au cas où vous ne souhaiteriez pas utiliser la bibliothèque datasets
. Si vous le faites, vous devrez peut-être ajuster les scripts de formation en conséquence.
Nous vous recommandons d'utiliser un environnement virtuel Python pour cela. N'hésitez pas à utiliser votre préféré ici.
Nous avons mené nos expériences avec PyTorch 1.13.1 (CUDA 11.6) et un seul GPU A100. Étant donné que l'installation de PyTorch peut dépendre du matériel, nous vous renvoyons à la documentation officielle pour installer PyTorch.
Une fois PyTorch installé, nous pouvons installer le reste des dépendances :
pip install -r requirements.txt
De plus, nous vous recommandons également d'installer xformers pour permettre une formation économe en mémoire.
Remarque : Si vous utilisez PyTorch 2.0, vous n'avez pas besoin d'installer xformers en plus. En effet, nous utilisons par défaut un processeur d'attention économe en mémoire dans Diffusers lorsque PyTorch 2.0 est utilisé.
Notre code de formation exploite ? diffuseurs, ? accélérer, et ? transformateurs. En particulier, nous étendons cet exemple de formation pour l’adapter à nos besoins.
export MODEL_ID= " runwayml/stable-diffusion-v1-5 "
export DATASET_ID= " instruction-tuning-sd/cartoonization "
export OUTPUT_DIR= " cartoonization-scratch "
accelerate launch --mixed_precision= " fp16 " train_instruct_pix2pix.py
--pretrained_model_name_or_path= $MODEL_ID
--dataset_name= $DATASET_ID
--use_ema
--enable_xformers_memory_efficient_attention
--resolution=256 --random_flip
--train_batch_size=2 --gradient_accumulation_steps=4 --gradient_checkpointing
--max_train_steps=15000
--checkpointing_steps=5000 --checkpoints_total_limit=1
--learning_rate=5e-05 --lr_warmup_steps=0
--mixed_precision=fp16
--val_image_url= " https://hf.co/datasets/diffusers/diffusers-images-docs/resolve/main/mountain.png "
--validation_prompt= " Generate a cartoonized version of the natural image "
--seed=42
--output_dir= $OUTPUT_DIR
--report_to=wandb
--push_to_hub
Remarque : Suite à InstructPix2Pix, nous nous entraînons sur la résolution 256x256 et cela ne semble pas trop affecter la qualité finale lorsque nous effectuons l'inférence avec la résolution 512x512.
Une fois la formation lancée avec succès, les journaux seront automatiquement suivis à l'aide des poids et des biais. Selon la façon dont vous avez spécifié checkpointing_steps
et max_train_steps
, il y aura également des points de contrôle intermédiaires. A la fin de la formation, vous pouvez vous attendre à un répertoire (à savoir OUTPUT_DIR
) qui contient les points de contrôle intermédiaires et les artefacts finaux du pipeline.
Si --push_to_hub
est spécifié, le contenu de OUTPUT_DIR
sera poussé vers un référentiel sur Hugging Face Hub.
Voici un exemple de page d'exécution sur les poids et les biais. Voici un exemple de ce à quoi ressemblerait le référentiel de pipeline sur le Hugging Face Hub.
export MODEL_ID= " timbrooks/instruct-pix2pix "
export DATASET_ID= " instruction-tuning-sd/cartoonization "
export OUTPUT_DIR= " cartoonization-finetuned "
accelerate launch --mixed_precision= " fp16 " finetune_instruct_pix2pix.py
--pretrained_model_name_or_path= $MODEL_ID
--dataset_name= $DATASET_ID
--use_ema
--enable_xformers_memory_efficient_attention
--resolution=256 --random_flip
--train_batch_size=2 --gradient_accumulation_steps=4 --gradient_checkpointing
--max_train_steps=15000
--checkpointing_steps=5000 --checkpoints_total_limit=1
--learning_rate=5e-05 --lr_warmup_steps=0
--mixed_precision=fp16
--val_image_url= " https://hf.co/datasets/diffusers/diffusers-images-docs/resolve/main/mountain.png "
--validation_prompt= " Generate a cartoonized version of the natural image "
--seed=42
--output_dir= $OUTPUT_DIR
--report_to=wandb
--push_to_hub
export MODEL_ID= " runwayml/stable-diffusion-v1-5 "
export DATASET_ID= " instruction-tuning-sd/low-level-image-proc "
export OUTPUT_DIR= " low-level-img-proc-scratch "
accelerate launch --mixed_precision= " fp16 " train_instruct_pix2pix.py
--pretrained_model_name_or_path= $MODEL_ID
--dataset_name= $DATASET_ID
--original_image_column= " input_image "
--edit_prompt_column= " instruction "
--edited_image_column= " ground_truth_image "
--use_ema
--enable_xformers_memory_efficient_attention
--resolution=256 --random_flip
--train_batch_size=2 --gradient_accumulation_steps=4 --gradient_checkpointing
--max_train_steps=15000
--checkpointing_steps=5000 --checkpoints_total_limit=1
--learning_rate=5e-05 --lr_warmup_steps=0
--mixed_precision=fp16
--val_image_url= " https://hf.co/datasets/sayakpaul/sample-datasets/resolve/main/derain_the_image_1.png "
--validation_prompt= " Derain the image "
--seed=42
--output_dir= $OUTPUT_DIR
--report_to=wandb
--push_to_hub
export MODEL_ID= " timbrooks/instruct-pix2pix "
export DATASET_ID= " instruction-tuning-sd/low-level-image-proc "
export OUTPUT_DIR= " low-level-img-proc-finetuned "
accelerate launch --mixed_precision= " fp16 " finetune_instruct_pix2pix.py
--pretrained_model_name_or_path= $MODEL_ID
--dataset_name= $DATASET_ID
--original_image_column= " input_image "
--edit_prompt_column= " instruction "
--edited_image_column= " ground_truth_image "
--use_ema
--enable_xformers_memory_efficient_attention
--resolution=256 --random_flip
--train_batch_size=2 --gradient_accumulation_steps=4 --gradient_checkpointing
--max_train_steps=15000
--checkpointing_steps=5000 --checkpoints_total_limit=1
--learning_rate=5e-05 --lr_warmup_steps=0
--mixed_precision=fp16
--val_image_url= " https://hf.co/datasets/sayakpaul/sample-datasets/resolve/main/derain_the_image_1.png "
--validation_prompt= " Derain the image "
--seed=42
--output_dir= $OUTPUT_DIR
--report_to=wandb
--push_to_hub
Essayez les modèles de manière interactive SANS aucune configuration : Démo
import torch
from diffusers import StableDiffusionInstructPix2PixPipeline
from diffusers . utils import load_image
model_id = "instruction-tuning-sd/cartoonizer"
pipeline = StableDiffusionInstructPix2PixPipeline . from_pretrained (
model_id , torch_dtype = torch . float16 , use_auth_token = True
). to ( "cuda" )
image_path = "https://hf.co/datasets/diffusers/diffusers-images-docs/resolve/main/mountain.png"
image = load_image ( image_path )
image = pipeline ( "Cartoonize the following image" , image = image ). images [ 0 ]
image . save ( "image.png" )
import torch
from diffusers import StableDiffusionInstructPix2PixPipeline
from diffusers . utils import load_image
model_id = "instruction-tuning-sd/low-level-img-proc"
pipeline = StableDiffusionInstructPix2PixPipeline . from_pretrained (
model_id , torch_dtype = torch . float16 , use_auth_token = True
). to ( "cuda" )
image_path = "https://hf.co/datasets/sayakpaul/sample-datasets/resolve/main/derain%20the%20image_1.png"
image = load_image ( image_path )
image = pipeline ( "derain the image" , image = image ). images [ 0 ]
image . save ( "image.png" )
Remarque : Étant donné que les pipelines ci-dessus sont essentiellement de type
StableDiffusionInstructPix2PixPipeline
, vous pouvez personnaliser plusieurs arguments exposés par le pipeline. Reportez-vous aux documents officiels pour plus de détails.
Reportez-vous à notre article de blog pour plus de discussions sur les résultats et les questions ouvertes.
Merci à Alara Dirik et Zhengzhong Tu pour les discussions utiles.
@article {
Paul2023instruction-tuning-sd,
author = { Paul, Sayak } ,
title = { Instruction-tuning Stable Diffusion with InstructPix2Pix } ,
journal = { Hugging Face Blog } ,
year = { 2023 } ,
note = { https://huggingface.co/blog/instruction-tuning-sd } ,
}