TL;DR : Teils durch FLAN und teils durch InstructPix2Pix motiviert, erforschen wir eine Möglichkeit, die stabile Diffusion durch Anweisungen abzustimmen. Dies ermöglicht es uns, unser Modell mithilfe eines Eingabebilds und einer „Anweisung“ zu veranlassen, z. B. – Wenden Sie einen Cartoon-Filter auf das natürliche Bild an .
Weitere Einzelheiten erfahren Sie in unserem Blogbeitrag.
? Motivation
? Datenaufbereitung
? Ausbildung
? Modelle, Datensätze, Demo
️ Schlussfolgerung
? Ergebnisse
? Danksagungen
Bei der Instruction-Tuning handelt es sich um eine überwachte Methode, Sprachmodellen beizubringen, Anweisungen zur Lösung einer Aufgabe zu befolgen. Es wurde in Fine-tuned Language Models Are Zero-Shot Learners (FLAN) von Google eingeführt. Aus jüngster Zeit erinnern Sie sich vielleicht an Werke wie Alpaca und FLAN V2, die gute Beispiele dafür sind, wie nützlich die Optimierung von Anweisungen für verschiedene Aufgaben sein kann.
Andererseits wurde die Idee, Stable Diffusion beizubringen, Benutzeranweisungen zum Durchführen von Bearbeitungen an Eingabebildern zu befolgen, in „InstructPix2Pix: Learning to Follow Image Editing Instructions“ eingeführt.
Unsere Motivation für diese Arbeit stammt zum Teil aus der FLAN-Reihe und zum Teil aus InstructPix2Pix. Wir wollten untersuchen, ob es möglich ist, Stable Diffusion mit spezifischen Anweisungen und Eingabebildern aufzufordern, diese gemäß unseren Anforderungen zu verarbeiten.
Unsere Hauptidee besteht darin, zunächst einen Datensatz mit Anweisungen zu erstellen (wie in unserem Blog beschrieben) und dann ein Training im InstructPix2Pix-Stil durchzuführen. Das Endziel besteht darin, Stable Diffusion bei der Befolgung spezifischer Anweisungen zu verbessern, die Vorgänge im Zusammenhang mit der Bildtransformation erfordern.
Unser Datenaufbereitungsprozess ist von FLAN inspiriert. Weitere Einzelheiten finden Sie in den folgenden Abschnitten.
data_preparation
.Tipp
Wenn Sie benutzerdefinierte Datensätze verwenden, müssen Sie den Datensatz nach Ihren Wünschen konfigurieren, solange Sie das hier dargestellte Format beibehalten. Möglicherweise müssen Sie Ihren Dataloader und Ihre Dataset-Klasse konfigurieren, falls Sie die datasets
-Bibliothek nicht nutzen möchten. In diesem Fall müssen Sie möglicherweise die Trainingsskripte entsprechend anpassen.
Wir empfehlen hierfür die Verwendung einer virtuellen Python-Umgebung. Hier können Sie gerne Ihren Favoriten verwenden.
Wir haben unsere Experimente mit PyTorch 1.13.1 (CUDA 11.6) und einer einzelnen A100-GPU durchgeführt. Da die Installation von PyTorch hardwareabhängig sein kann, verweisen wir Sie auf die offiziellen Dokumente zur Installation von PyTorch.
Sobald PyTorch installiert ist, können wir die restlichen Abhängigkeiten installieren:
pip install -r requirements.txt
Darüber hinaus empfehlen wir die Installation von xformers, um ein speichereffizientes Training zu ermöglichen.
Hinweis : Wenn Sie PyTorch 2.0 verwenden, müssen Sie xformers nicht zusätzlich installieren. Dies liegt daran, dass wir in Diffusers standardmäßig einen speichereffizienten Aufmerksamkeitsprozessor verwenden, wenn PyTorch 2.0 verwendet wird.
Unser Schulungscode nutzt ? Diffusoren, ? beschleunigen, und ? Transformatoren. Insbesondere erweitern wir dieses Trainingsbeispiel entsprechend unseren Bedürfnissen.
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
Hinweis : Nach InstructPix2Pix trainieren wir mit der Auflösung 256 x 256, und das scheint die Endqualität nicht allzu sehr zu beeinträchtigen, wenn wir die Inferenz mit der Auflösung 512 x 512 durchführen.
Sobald das Training erfolgreich gestartet ist, werden die Protokolle automatisch mithilfe von Gewichtungen und Verzerrungen verfolgt. Abhängig davon, wie Sie checkpointing_steps
und max_train_steps
angegeben haben, gibt es auch Zwischenprüfpunkte. Am Ende des Trainings können Sie ein Verzeichnis (nämlich OUTPUT_DIR
) erwarten, das die Zwischenprüfpunkte und die endgültigen Pipeline-Artefakte enthält.
Wenn --push_to_hub
angegeben ist, wird der Inhalt von OUTPUT_DIR
in ein Repository auf dem Hugging Face Hub übertragen.
Hier ist eine beispielhafte Ausführungsseite zu Gewichtungen und Verzerrungen. Hier ist ein Beispiel dafür, wie das Pipeline-Repository auf dem Hugging Face Hub aussehen würde.
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
Probieren Sie die Modelle interaktiv OHNE Setup aus: Demo
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" )
Hinweis : Da die oben genannten Pipelines im Wesentlichen vom Typ
StableDiffusionInstructPix2PixPipeline
sind, können Sie mehrere Argumente anpassen, die die Pipeline verfügbar macht. Weitere Einzelheiten finden Sie in den offiziellen Dokumenten.
Weitere Diskussionen zu Ergebnissen und offenen Fragen finden Sie in unserem Blogbeitrag.
Vielen Dank an Alara Dirik und Zhengzhong Tu für die hilfreichen Diskussionen.
@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 } ,
}