TL;DR : 部分的には FLAN によって、部分的には InstructPix2Pix によって動機付けられ、私たちは Stable Diffusion の命令を調整する方法を模索しています。これにより、入力画像と「自然画像に漫画フィルターを適用する」などの「命令」を使用してモデルにプロンプトを表示することができます。
詳細については、ブログ投稿をご覧ください。
?モチベーション
?データの準備
?トレーニング
?モデル、データセット、デモ
️推理
?結果
?謝辞
命令チューニングは、タスクを解決するための命令に従うように言語モデルを教える教師ありの方法です。これは、Google の Fine-tuned Language Models Are Zero-Shot Learners (FLAN) で紹介されました。最近では、Alpaca や FLAN V2 などの作品を思い出されるかもしれません。これらは、さまざまなタスクに対して命令チューニングがいかに有益であるかを示す好例です。
一方、Stable Diffusion にユーザーの指示に従って入力画像の編集を実行するよう教えるというアイデアは、「InstructPix2Pix: 画像編集指示に従う方法の学習」で導入されました。
この取り組みの背後にある私たちの動機は、部分的には FLAN の一連の作品から、そして部分的には InstructPix2Pix から来ています。私たちは、特定の指示で安定した拡散を促し、画像を入力してニーズに応じて処理できるかどうかを検討したいと考えました。
私たちの主なアイデアは、まず命令プロンプト データセット (ブログで説明されているように) を作成し、次に InstructPix2Pix スタイルのトレーニングを実施することです。最終的な目的は、画像変換関連の操作を必要とする特定の命令に Stable Diffusion がよりよく従うようにすることです。
当社のデータ準備プロセスは 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 が使用されている場合、ディフューザーでメモリ効率の高いアテンション プロセッサがデフォルトで使用されるためです。
私たちのトレーニング コードは ? を活用しています。ディフューザー、?加速して?トランスフォーマー。特に、このトレーニングの例をニーズに合わせて拡張します。
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 と Zhengzhong Tu に感謝します。
@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 } ,
}