TL;DR : FLAN과 InstructPix2Pix의 일부를 바탕으로 Stable Diffusion을 조정하는 방법을 모색합니다. 이를 통해 입력 이미지와 다음과 같은 "명령"을 사용하여 모델에 메시지를 표시할 수 있습니다. - 자연 이미지에 만화 필터 적용 .
자세한 내용은 블로그 게시물을 참조하세요.
? 동기 부여
? 데이터 준비
? 훈련
? 모델, 데이터세트, 데모
️ 추론
? 결과
? 감사의 말
지침 조정은 작업을 해결하기 위해 지침을 따르도록 언어 모델을 가르치는 감독 방식입니다. 이는 Google의 Fine-tuned Language Models Are Zero-Shot Learners(FLAN)에서 소개되었습니다. 최근에는 학습 조정이 다양한 작업에 얼마나 유익한지를 보여주는 좋은 예인 Alpaca 및 FLAN V2와 같은 작업을 기억하실 수 있습니다.
반면, 입력 이미지에 대한 편집을 수행하기 위해 사용자 지침을 따르도록 Stable Diffusion을 가르치는 아이디어는 InstructPix2Pix: 이미지 편집 지침을 따르는 방법 학습에서 소개되었습니다.
이 작업에 대한 우리의 동기는 부분적으로는 FLAN 작업 라인에서, 부분적으로는 InstructPix2Pix에서 나왔습니다. 우리는 특정 지침과 입력 이미지를 사용하여 Stable Diffusion을 요청하여 필요에 따라 처리할 수 있는지 알아보고 싶었습니다.
우리의 주요 아이디어는 먼저 블로그에 설명된 대로 명령 프롬프트 데이터 세트를 생성한 다음 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 } ,
}