DR : Motivado em parte por FLAN e em parte por InstructPix2Pix, exploramos uma maneira de ajustar a difusão estável. Isso nos permite solicitar nosso modelo usando uma imagem de entrada e uma “instrução”, como - Aplicar um filtro de desenho animado à imagem natural .
Você pode ler nossa postagem no blog para saber mais detalhes.
? Motivação
? Preparação de dados
? Treinamento
? Modelos, conjuntos de dados, demonstração
️ Inferência
? Resultados
? Agradecimentos
O ajuste de instrução é uma forma supervisionada de ensinar modelos de linguagem a seguir instruções para resolver uma tarefa. Foi introduzido em Modelos de linguagem ajustados são alunos zero-shot (FLAN) do Google. Recentemente, você deve se lembrar de trabalhos como Alpaca e FLAN V2, que são bons exemplos de como o ajuste de instruções pode ser benéfico para diversas tarefas.
Por outro lado, a ideia de ensinar a Difusão Estável a seguir as instruções do usuário para realizar edições nas imagens de entrada foi introduzida em InstructPix2Pix: Aprendendo a seguir as instruções de edição de imagens.
Nossa motivação por trás deste trabalho vem em parte da linha de trabalhos FLAN e em parte do InstructPix2Pix. Queríamos explorar se é possível solicitar a Difusão Estável com instruções específicas e imagens de entrada para processá-las de acordo com nossas necessidades.
Nossa ideia principal é primeiro criar um conjunto de dados orientado por instruções (conforme descrito em nosso blog e, em seguida, conduzir o treinamento no estilo InstructPix2Pix. O objetivo final é tornar a Difusão Estável melhor no seguimento de instruções específicas que envolvem operações relacionadas à transformação de imagem.
Nosso processo de preparação de dados é inspirado no FLAN. Consulte as seções abaixo para obter mais detalhes.
data_preparation
.Dica
No caso de utilizar conjuntos de dados customizados, é necessário configurar o conjunto de dados conforme sua escolha, desde que mantenha o formato aqui apresentado. Talvez seja necessário configurar seu carregador de dados e classe de conjunto de dados caso não queira usar a biblioteca datasets
. Se você fizer isso, talvez seja necessário ajustar os scripts de treinamento de acordo.
Recomendamos usar um ambiente virtual Python para isso. Sinta-se à vontade para usar o seu favorito aqui.
Conduzimos nossos experimentos com PyTorch 1.13.1 (CUDA 11.6) e uma única GPU A100. Como a instalação do PyTorch pode depender do hardware, recomendamos a documentação oficial para instalação do PyTorch.
Depois que o PyTorch estiver instalado, podemos instalar o restante das dependências:
pip install -r requirements.txt
Além disso, recomendamos a instalação de xformers também para permitir um treinamento com uso eficiente de memória.
Nota : Se você estiver usando o PyTorch 2.0, não precisará instalar o xformers adicionalmente. Isso ocorre porque o padrão é um processador de atenção com uso eficiente de memória nos difusores quando o PyTorch 2.0 está sendo usado.
Nosso código de treinamento aproveita ? difusores, ? acelerar e ? transformadores. Em particular, estendemos este exemplo de treinamento para atender às nossas necessidades.
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 : Seguindo o InstructPix2Pix, treinamos na resolução 256x256 e isso não parece afetar muito a qualidade final quando realizamos inferência com a resolução 512x512.
Assim que o treinamento for iniciado com sucesso, os registros serão rastreados automaticamente usando Pesos e Preconceitos. Dependendo de como você especificou checkpointing_steps
e max_train_steps
, também haverá pontos de verificação intermediários. No final do treinamento, você pode esperar um diretório (ou seja, OUTPUT_DIR
) que contém os pontos de verificação intermediários e os artefatos finais do pipeline.
Se --push_to_hub
for especificado, o conteúdo de OUTPUT_DIR
será enviado para um repositório no Hugging Face Hub.
Aqui está um exemplo de página de execução sobre Pesos e preconceitos. Aqui está um exemplo de como seria o repositório do pipeline no 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
Experimente os modelos interativamente SEM qualquer configuração: 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" )
Nota : Como os pipelines acima são essencialmente do tipo
StableDiffusionInstructPix2PixPipeline
, você pode personalizar vários argumentos que o pipeline expõe. Consulte os documentos oficiais para mais detalhes.
Consulte nossa postagem no blog para mais discussões sobre resultados e perguntas abertas.
Obrigado a Alara Dirik e Zhengzhong Tu pelas discussões úteis.
@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 } ,
}