Buckets:
InstructPix2Pix
InstructPix2Pix adalah model Stable Diffusion yang dilatih untuk mengedit gambar berdasarkan instruksi dari manusia. Misalnya, prompt Anda bisa berupa "ubah awan menjadi hujan" dan model akan mengedit gambar input sesuai dengan itu. Model ini dikondisikan pada prompt teks (atau instruksi pengeditan) dan gambar input.
Panduan ini akan membahas skrip pelatihan train_instruct_pix2pix.py untuk membantu Anda memahaminya, serta bagaimana Anda dapat menyesuaikannya untuk kasus penggunaan Anda sendiri.
Sebelum menjalankan skrip, pastikan Anda menginstal pustaka dari sumber:
git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .
Lalu, navigasikan ke folder contoh yang berisi skrip pelatihan dan instal dependensi yang diperlukan untuk skrip yang Anda gunakan:
cd examples/instruct_pix2pix
pip install -r requirements.txt
🤗 Accelerate adalah pustaka untuk membantu Anda melatih pada beberapa GPU/TPU atau dengan presisi campuran. Pustaka ini akan mengonfigurasi pengaturan pelatihan Anda secara otomatis berdasarkan perangkat keras dan lingkungan Anda. Lihat Tour singkat 🤗 Accelerate untuk mempelajari lebih lanjut.
Inisialisasi lingkungan 🤗 Accelerate:
accelerate config
Untuk menyiapkan lingkungan 🤗 Accelerate default tanpa memilih konfigurasi apa pun:
accelerate config default
Atau jika lingkungan Anda tidak mendukung shell interaktif, seperti notebook, Anda dapat menggunakan:
from accelerate.utils import write_basic_config
write_basic_config()
Terakhir, jika Anda ingin melatih model pada dataset Anda sendiri, lihat panduan Membuat dataset untuk pelatihan untuk mempelajari cara membuat dataset yang berfungsi dengan skrip pelatihan.
Bagian-bagian berikut menyoroti bagian dari skrip pelatihan yang penting untuk dipahami agar Anda dapat memodifikasinya, namun tidak membahas setiap aspek skrip secara detail. Jika Anda tertarik untuk mempelajari lebih lanjut, silakan membaca skrip tersebut dan beri tahu kami jika Anda memiliki pertanyaan atau kekhawatiran.
Parameter skrip
Skrip pelatihan memiliki banyak parameter untuk membantu Anda menyesuaikan eksekusi pelatihan Anda. Semua parameter dan deskripsinya dapat ditemukan di fungsi parse_args(). Nilai default disediakan untuk sebagian besar parameter yang bekerja cukup baik, tetapi Anda juga dapat mengatur nilai Anda sendiri dalam perintah pelatihan jika Anda mau.
Sebagai contoh, untuk meningkatkan resolusi gambar input:
accelerate launch train_instruct_pix2pix.py \
--resolution=512 \
Banyak parameter dasar dan penting dijelaskan dalam panduan pelatihan Text-to-image, sehingga panduan ini hanya berfokus pada parameter yang relevan untuk InstructPix2Pix:
--original_image_column: gambar asli sebelum pengeditan dilakukan--edited_image_column: gambar setelah pengeditan dilakukan--edit_prompt_column: instruksi untuk mengedit gambar--conditioning_dropout_prob: probabilitas dropout untuk gambar yang diedit dan prompt edit selama pelatihan, yang memungkinkan classifier-free guidance (CFG) untuk satu atau kedua input kondisional
Skrip pelatihan
Kode pra-pemrosesan dataset dan loop pelatihan dapat ditemukan di fungsi main(). Di sinilah Anda akan melakukan perubahan pada skrip pelatihan untuk menyesuaikannya dengan kasus penggunaan Anda sendiri.
Sama seperti parameter skrip, penjelasan langkah demi langkah tentang skrip pelatihan tersedia di panduan pelatihan Text-to-image. Sebagai gantinya, panduan ini membahas bagian-bagian skrip yang relevan dengan InstructPix2Pix.
Skrip dimulai dengan memodifikasi jumlah saluran input pada lapisan konvolusional pertama dari UNet untuk mengakomodasi gambar kondisional tambahan dari InstructPix2Pix:
in_channels = 8
out_channels = unet.conv_in.out_channels
unet.register_to_config(in_channels=in_channels)
with torch.no_grad():
new_conv_in = nn.Conv2d(
in_channels, out_channels, unet.conv_in.kernel_size, unet.conv_in.stride, unet.conv_in.padding
)
new_conv_in.weight.zero_()
new_conv_in.weight[:, :4, :, :].copy_(unet.conv_in.weight)
unet.conv_in = new_conv_in
Parameter UNet ini diperbarui oleh optimizer:
optimizer = optimizer_cls(
unet.parameters(),
lr=args.learning_rate,
betas=(args.adam_beta1, args.adam_beta2),
weight_decay=args.adam_weight_decay,
eps=args.adam_epsilon,
)
Selanjutnya, gambar yang diedit dan instruksi editnya di-praproses dan ditokenisasi. Penting untuk menerapkan transformasi gambar yang sama pada gambar asli dan gambar yang diedit.
def preprocess_train(examples):
preprocessed_images = preprocess_images(examples)
original_images, edited_images = preprocessed_images.chunk(2)
original_images = original_images.reshape(-1, 3, args.resolution, args.resolution)
edited_images = edited_images.reshape(-1, 3, args.resolution, args.resolution)
examples["original_pixel_values"] = original_images
examples["edited_pixel_values"] = edited_images
captions = list(examples[edit_prompt_column])
examples["input_ids"] = tokenize_captions(captions)
return examples
Terakhir, dalam loop pelatihan, proses dimulai dengan mengkodekan gambar yang telah diedit ke ruang laten:
latents = vae.encode(batch["edited_pixel_values"].to(weight_dtype)).latent_dist.sample()
latents = latents * vae.config.scaling_factor
Kemudian, skrip menerapkan dropout pada embedding gambar asli dan instruksi edit untuk mendukung CFG. Hal ini memungkinkan model untuk memodulasi pengaruh instruksi edit dan gambar asli terhadap gambar yang diedit.
encoder_hidden_states = text_encoder(batch["input_ids"])[0]
original_image_embeds = vae.encode(batch["original_pixel_values"].to(weight_dtype)).latent_dist.mode()
if args.conditioning_dropout_prob is not None:
random_p = torch.rand(bsz, device=latents.device, generator=generator)
prompt_mask = random_p < 2 * args.conditioning_dropout_prob
prompt_mask = prompt_mask.reshape(bsz, 1, 1)
null_conditioning = text_encoder(tokenize_captions([""]).to(accelerator.device))[0]
encoder_hidden_states = torch.where(prompt_mask, null_conditioning, encoder_hidden_states)
image_mask_dtype = original_image_embeds.dtype
image_mask = 1 - (
(random_p >= args.conditioning_dropout_prob).to(image_mask_dtype)
* (random_p < 3 * args.conditioning_dropout_prob).to(image_mask_dtype)
)
image_mask = image_mask.reshape(bsz, 1, 1, 1)
original_image_embeds = image_mask * original_image_embeds
Itu sudah hampir selesai! Selain perbedaan yang dijelaskan di sini, bagian lain dari skrip sangat mirip dengan skrip pelatihan Text-to-image, jadi silakan periksa untuk detail lebih lanjut. Jika Anda ingin mempelajari lebih lanjut tentang cara kerja loop pelatihan, lihat tutorial Understanding pipelines, models and schedulers yang menguraikan pola dasar dari proses denoising.
Jalankan skrip
Setelah Anda puas dengan perubahan pada skrip Anda atau jika Anda setuju dengan konfigurasi default, Anda siap untuk meluncurkan skrip pelatihan! 🚀
Panduan ini menggunakan dataset fusing/instructpix2pix-1000-samples, yang merupakan versi lebih kecil dari dataset asli. Anda juga dapat membuat dan menggunakan dataset Anda sendiri jika diinginkan (lihat panduan Membuat dataset untuk pelatihan).
Setel variabel lingkungan MODEL_NAME ke nama model (bisa berupa id model di Hub atau path ke model lokal), dan DATASET_ID ke nama dataset di Hub. Skrip ini membuat dan menyimpan semua komponen (feature extractor, scheduler, text encoder, UNet, dll.) ke subfolder di repositori Anda.
Untuk hasil yang lebih baik, coba jalankan pelatihan lebih lama dengan dataset yang lebih besar. Kami hanya menguji skrip pelatihan ini pada dataset berskala kecil.
Untuk memantau kemajuan pelatihan dengan Weights and Biases, tambahkan parameter
--report_to=wandbke perintah pelatihan dan tentukan gambar validasi dengan--val_image_urlserta prompt validasi dengan--validation_prompt. Hal ini dapat sangat berguna untuk debugging model.
Jika Anda melatih pada lebih dari satu GPU, tambahkan parameter --multi_gpu ke perintah accelerate launch.
accelerate launch --mixed_precision="fp16" train_instruct_pix2pix.py \
--pretrained_model_name_or_path=$MODEL_NAME \
--dataset_name=$DATASET_ID \
--enable_xformers_memory_efficient_attention \
--resolution=256 \
--random_flip \
--train_batch_size=4 \
--gradient_accumulation_steps=4 \
--gradient_checkpointing \
--max_train_steps=15000 \
--checkpointing_steps=5000 \
--checkpoints_total_limit=1 \
--learning_rate=5e-05 \
--max_grad_norm=1 \
--lr_warmup_steps=0 \
--conditioning_dropout_prob=0.05 \
--mixed_precision=fp16 \
--seed=42 \
--push_to_hub
Setelah pelatihan selesai, Anda dapat menggunakan InstructPix2Pix baru Anda untuk inferensi:
import PIL
import requests
import torch
from diffusers import StableDiffusionInstructPix2PixPipeline
from diffusers.utils import load_image
pipeline = StableDiffusionInstructPix2PixPipeline.from_pretrained("your_cool_model", dtype=torch.float16).to("cuda") # or "mps", "xpu", "cpu"
generator = torch.Generator("cuda").manual_seed(0)
image = load_image("https://huggingface.co/datasets/sayakpaul/sample-datasets/resolve/main/test_pix2pix_4.png")
prompt = "add some ducks to the lake"
num_inference_steps = 20
image_guidance_scale = 1.5
guidance_scale = 10
edited_image = pipeline(
prompt,
image=image,
num_inference_steps=num_inference_steps,
image_guidance_scale=image_guidance_scale,
guidance_scale=guidance_scale,
generator=generator,
).images[0]
edited_image.save("edited_image.png")
Anda sebaiknya bereksperimen dengan nilai num_inference_steps, image_guidance_scale, dan guidance_scale yang berbeda untuk melihat bagaimana mereka memengaruhi kecepatan dan kualitas inferensi. Parameter guidance scale sangat berdampak karena mereka mengontrol seberapa besar gambar asli dan instruksi pengeditan memengaruhi gambar yang diedit.
Stable Diffusion XL
Stable Diffusion XL (SDXL) adalah model teks-ke-gambar yang kuat yang menghasilkan gambar resolusi tinggi, dan menambahkan text-encoder kedua ke arsitekturnya. Gunakan skrip train_instruct_pix2pix_sdxl.py untuk melatih model SDXL agar mengikuti instruksi pengeditan gambar.
Skrip pelatihan SDXL dibahas lebih detail dalam panduan pelatihan SDXL.
Langkah selanjutnya
Selamat karena Anda telah melatih model InstructPix2Pix Anda sendiri! 🥳 Untuk mempelajari lebih lanjut tentang model tersebut, mungkin akan membantu jika Anda:
- Baca artikel blog Instruction-tuning Stable Diffusion with InstructPix2Pix untuk mempelajari lebih lanjut tentang beberapa eksperimen yang telah kami lakukan dengan InstructPix2Pix, persiapan dataset, dan hasil untuk berbagai instruksi.
Xet Storage Details
- Size:
- 12.8 kB
- Xet hash:
- c621401612298e274753c45495ee6d98efb14534a53ab0146f2f07babac1642c
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.