TL;DR :部分受到 FLAN 和部分 InstructPix2Pix 的推动,我们探索了一种指令调整稳定扩散的方法。这使我们能够使用输入图像和“指令”来提示我们的模型,例如 -对自然图像应用卡通滤镜。
您可以阅读我们的博客文章以了解更多详细信息。
?动机
?数据准备
?训练
?模型、数据集、演示
️ 推论
?结果
?致谢
指令调优是一种指导语言模型遵循指令解决任务的监督方式。它是在 Google 的微调语言模型是零样本学习者 (FLAN) 中引入的。最近,您可能还记得 Alpaca 和 FLAN V2 等作品,它们是说明指令调整对各种任务有多么有益的好例子。
另一方面,《InstructPix2Pix:学习遵循图像编辑指令》中介绍了教导稳定扩散遵循用户指令对输入图像进行编辑的想法。
我们这项工作背后的动机部分来自 FLAN 系列工作,部分来自 InstructPix2Pix。我们想探索是否可以通过特定指令和输入图像来提示稳定扩散,以根据我们的需要进行处理。
我们的主要想法是首先创建一个指令提示数据集(如我们的博客中所述),然后进行 InstructPix2Pix 风格的训练。最终目标是使稳定扩散更好地遵循需要图像转换相关操作的特定指令。
我们的数据准备过程受到 FLAN 的启发。请参阅以下部分了解更多详细信息。
data_preparation
目录。提示
如果使用自定义数据集,只要您保持此处提供的格式,就需要根据自己的选择配置数据集。如果您不想使用datasets
集库,您可能必须配置数据加载器和数据集类。如果这样做,您可能必须相应地调整训练脚本。
我们建议为此使用 Python 虚拟环境。请随意在这里使用您最喜欢的一个。
我们使用 PyTorch 1.13.1 (CUDA 11.6) 和单个 A100 GPU 进行实验。由于 PyTorch 安装可能依赖于硬件,因此我们建议您参考官方文档来安装 PyTorch。
一旦安装了 PyTorch,我们就可以安装其余的依赖项:
pip install -r requirements.txt
此外,我们还建议安装 xformers 以实现内存高效的训练。
注意:如果您使用 PyTorch 2.0,则无需额外安装 xformers。这是因为当使用 PyTorch 2.0 时,我们在 Diffusers 中默认使用内存高效的注意力处理器。
我们的培训代码利用?扩散器,?加速,并且?变压器。特别是,我们扩展了这个训练示例以满足我们的需求。
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
注意:在 InstructPix2Pix 之后,我们在 256x256 分辨率上进行训练,当我们使用 512x512 分辨率进行推理时,这似乎不会对最终质量产生太大影响。
训练成功启动后,将使用权重和偏差自动跟踪日志。根据您指定checkpointing_steps
和max_train_steps
的方式,也会有中间检查点。训练结束时,您可以期待一个包含中间检查点和最终管道工件的目录(即OUTPUT_DIR
)。
如果指定了--push_to_hub
,则OUTPUT_DIR
的内容将被推送到 Hugging Face Hub 上的存储库。
这是关于权重和偏差的示例运行页面。以下是管道存储库在 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
无需任何设置即可交互式试用模型:演示
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" )
注意:由于上述管道本质上是
StableDiffusionInstructPix2PixPipeline
类型,因此您可以自定义管道公开的多个参数。请参阅官方文档了解更多详细信息。
请参阅我们的博客文章,了解有关结果和开放问题的更多讨论。
感谢 Alara Dirik 和屠正忠的有益讨论。
@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 } ,
}