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 } ,
}