TL;DR : Motivados en parte por FLAN y en parte por InstructPix2Pix, exploramos una forma de ajustar las instrucciones de difusión estable. Esto nos permite indicarle a nuestro modelo usando una imagen de entrada y una "instrucción", como: Aplicar un filtro de dibujos animados a la imagen natural .
Puedes leer nuestra entrada de blog para conocer más detalles.
? Motivación
? Preparación de datos
? Capacitación
? Modelos, conjuntos de datos, demostración.
️ Inferencia
? Resultados
? Expresiones de gratitud
El ajuste de instrucciones es una forma supervisada de enseñar a los modelos de lenguaje a seguir instrucciones para resolver una tarea. Fue introducido en Los modelos de lenguaje optimizados son estudiantes sin posibilidades (FLAN) de Google. De tiempos recientes, quizás recuerdes trabajos como Alpaca y FLAN V2, que son buenos ejemplos de lo beneficioso que puede ser el ajuste de instrucciones para diversas tareas.
Por otro lado, la idea de enseñar a Stable Diffusion a seguir las instrucciones del usuario para realizar ediciones en imágenes de entrada se introdujo en InstructPix2Pix: Aprender a seguir las instrucciones de edición de imágenes.
Nuestra motivación detrás de este trabajo proviene en parte de la línea de trabajos FLAN y en parte de InstructPix2Pix. Queríamos explorar si es posible solicitar Stable Diffusion con instrucciones específicas e imágenes de entrada para procesarlas según nuestras necesidades.
Nuestra idea principal es crear primero un conjunto de datos con instrucciones (como se describe en nuestro blog y luego realizar una capacitación de estilo InstructPix2Pix. El objetivo final es hacer que Stable Diffusion sea mejor en el seguimiento de instrucciones específicas que implican operaciones relacionadas con la transformación de imágenes.
Nuestro proceso de preparación de datos está inspirado en FLAN. Consulte las secciones siguientes para obtener más detalles.
data_preparation
.Consejo
En caso de utilizar conjuntos de datos personalizados, es necesario configurar el conjunto de datos según su elección, siempre y cuando mantenga el formato presentado aquí. Es posible que deba configurar su cargador de datos y su clase de conjunto de datos en caso de que no desee utilizar la biblioteca datasets
. Si lo hace, es posible que deba ajustar los guiones de capacitación en consecuencia.
Recomendamos utilizar un entorno virtual Python para esto. Siéntete libre de usar tu favorito aquí.
Realizamos nuestros experimentos con PyTorch 1.13.1 (CUDA 11.6) y una única GPU A100. Dado que la instalación de PyTorch puede depender del hardware, lo remitimos a los documentos oficiales para instalar PyTorch.
Una vez instalado PyTorch, podemos instalar el resto de dependencias:
pip install -r requirements.txt
Además, también recomendamos instalar xformers para permitir un entrenamiento con memoria eficiente.
Nota : si está utilizando PyTorch 2.0, no necesita instalar xformers adicionalmente. Esto se debe a que utilizamos de forma predeterminada un procesador de atención con eficiencia de memoria en Difusores cuando se utiliza PyTorch 2.0.
¿Nuestro código de formación aprovecha? difusores, ? acelerar, y ? transformadores. En particular, ampliamos este ejemplo de capacitación para adaptarlo a nuestras necesidades.
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
Nota : Siguiendo InstructPix2Pix, entrenamos con la resolución de 256x256 y eso no parece afectar demasiado la calidad final cuando realizamos inferencias con la resolución de 512x512.
Una vez que el entrenamiento se haya iniciado con éxito, los registros se rastrearán automáticamente mediante pesos y sesgos. Dependiendo de cómo haya especificado checkpointing_steps
y max_train_steps
, también habrá puntos de control intermedios. Al final de la capacitación, puede esperar un directorio (es decir, OUTPUT_DIR
) que contiene los puntos de control intermedios y los artefactos finales de la canalización.
Si se especifica --push_to_hub
, el contenido de OUTPUT_DIR
se enviará a un repositorio en Hugging Face Hub.
A continuación se muestra una página de ejecución de ejemplo sobre pesos y sesgos. A continuación se muestra un ejemplo de cómo se vería el repositorio de canalizaciones en 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
Pruebe los modelos de forma interactiva SIN ninguna configuración: Demostración
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" )
Nota : Dado que las canalizaciones anteriores son esencialmente del tipo
StableDiffusionInstructPix2PixPipeline
, puede personalizar varios argumentos que expone la canalización. Consulte los documentos oficiales para obtener más detalles.
Consulte nuestra publicación de blog para obtener más discusiones sobre resultados y preguntas abiertas.
Gracias a Alara Dirik y Zhengzhong Tu por las útiles discusiones.
@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 } ,
}