Diffusers documentation

Stable Diffusion XL

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Stable Diffusion XL

Bu script deneyseldir ve aşırı öğrenme (overfitting) ile katastrofik unutma gibi sorunlarla karşılaşmak kolaydır. Veri setinizde en iyi sonuçları almak için farklı hiperparametreleri denemenizi öneririz.

Stable Diffusion XL (SDXL), Stable Diffusion modelinin daha büyük ve daha güçlü bir sürümüdür ve daha yüksek çözünürlüklü görseller üretme kapasitesine sahiptir.

SDXL’in UNet’i 3 kat daha büyüktür ve model mimariye ikinci bir metin kodlayıcı ekler. Kullanılabilir donanımınıza bağlı olarak bu, çok yüksek hesaplama yoğunluğuna sahip olabilir ve Tesla T4 gibi bir tüketici GPU’sunda çalışmayabilir. Bu daha büyük modeli belleğe sığdırmak ve eğitimi hızlandırmak için gradient_checkpointing, mixed_precision ve gradient_accumulation_steps’i etkinleştirmeyi deneyin. xFormers ile bellek verimli dikkati etkinleştirerek ve bitsandbytes’ 8-bit optimizatörünü kullanarak bellek kullanımınızı daha da azaltabilirsiniz.

Bu kılavuz, train_text_to_image_sdxl.py eğitim betiğini inceleyerek onu daha yakından tanımanıza ve kendi kullanım senaryonuza nasıl uyarlayabileceğinizi göstermenize yardımcı olacaktır.

Betik çalıştırmadan önce, kütüphanenin kaynak kodundan yüklendiğinden emin olun:

git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .

Ardından, eğitim betiğini içeren örnek klasörüne gidin ve kullandığınız betik için gerekli bağımlılıkları yükleyin:

cd examples/text_to_image
pip install -r requirements_sdxl.txt

🤗 Accelerate, birden fazla GPU/TPU ile veya karma hassasiyetle eğitim yapmanıza yardımcı olmak için tasarlanmış bir kütüphanedir. Donanımınıza ve ortamınıza göre eğitim kurulumunuzu otomatik olarak yapılandırır. Daha fazla bilgi edinmek için 🤗 Accelerate Hızlı tur sayfasına göz atın.

Bir 🤗 Accelerate ortamı başlatın:

accelerate config

Herhangi bir yapılandırma seçmeden varsayılan bir 🤗 Accelerate ortamı kurmak için:

accelerate config default

Ya da ortamınız, bir notebook gibi, etkileşimli bir kabuğu desteklemiyorsa, şunu kullanabilirsiniz:

from accelerate.utils import write_basic_config

write_basic_config()

Son olarak, kendi veri setiniz üzerinde bir model eğitmek istiyorsanız, eğitim scriptiyle uyumlu bir veri seti oluşturma yöntemini öğrenmek için Eğitim için veri seti oluşturma kılavuzuna göz atın.

Betik parametreleri

Aşağıdaki bölümler, betiğin nasıl değiştirileceğini anlamak için önemli olan eğitim betiğinin kısımlarını vurgular, ancak betiğin her yönünü ayrıntılı olarak kapsamaz. Daha fazla bilgi edinmek isterseniz, betiği okumaktan çekinmeyin ve herhangi bir sorunuz veya endişeniz varsa bize bildirin.

Eğitim betiği, eğitim çalışmanızı özelleştirmenize yardımcı olmak için birçok parametre sağlar. Tüm parametreler ve açıklamaları parse_args() fonksiyonunda bulunur. Bu fonksiyon, eğitim batch boyutu ve öğrenme oranı gibi her parametre için varsayılan değerler sağlar, ancak isterseniz kendi değerlerinizi eğitim komutunda da belirleyebilirsiniz.

Örneğin, bf16 biçimini kullanarak karma hassasiyetle eğitimi hızlandırmak için eğitim komutuna --mixed_precision parametresini ekleyin:

accelerate launch train_text_to_image_sdxl.py \
  --mixed_precision="bf16"

Parametrelerin çoğu Metinden görüntüye eğitim kılavuzundaki parametrelerle aynıdır, bu nedenle bu kılavuzda SDXL eğitimine ilişkin parametrelere odaklanacaksınız.

  • --pretrained_vae_model_name_or_path: önceden eğitilmiş bir VAE'nin yolu; SDXL VAE'sinin sayısal kararsızlıktan muzdarip olduğu bilinmektedir, bu nedenle bu parametre size daha iyi bir VAE belirtme imkanı tanır
  • --proportion_empty_prompts: boş dizgilerle değiştirilecek görsel istemlerin oranı
  • --timestep_bias_strategy: timestep içinde (daha erken mi yoksa daha geç mi) önyargı uygulanacağı konum; bu, modelin düşük veya yüksek frekanslı detayları öğrenmesini teşvik edebilir
  • --timestep_bias_multiplier: timestep'e uygulanacak sapmanın ağırlığı
  • --timestep_bias_begin: sapmanın uygulanmaya başlanacağı zaman adımı
  • --timestep_bias_end: sapmanın uygulanmasının sona ereceği zaman adımı
  • --timestep_bias_portion: önyargının uygulanacağı zaman adımlarının oranı

Min-SNR ağırlıklandırma

Min-SNR ağırlıklandırma stratejisi, kaybı yeniden dengeleyerek daha hızlı yakınsama elde edilmesine yardımcı olarak eğitime katkıda bulunabilir. Eğitim betiği, epsilon (gürültü) veya v_prediction tahmin etmeyi destekler, ancak Min-SNR her iki tahmin türüyle de uyumludur. Bu ağırlıklandırma stratejisi yalnızca PyTorch tarafından desteklenir.

--snr_gamma parametresini ekleyin ve önerilen değer olan 5.0 olarak ayarlayın:

accelerate launch train_text_to_image_sdxl.py \
  --snr_gamma=5.0

Eğitim betiği

Eğitim betiği, Metinden görüntüye eğitim kılavuzuna benzer, ancak SDXL eğitimini destekleyecek şekilde değiştirilmiştir. Bu kılavuz, SDXL eğitim betiğine özgü koda odaklanacaktır.

İşlevler oluşturarak başlar: istemleri belirteçlere ayırmak için istem gömme değerlerini hesaplamak ve VAE ile görüntü gömme değerlerini hesaplamak için. Ardından, uygulanacak adım sayısı ve adım sapma stratejisine bağlı olarak adım ağırlıklarını üretmek için bir işlev oluşturacaksınız.

main() işlevi içinde, bir tokenizer yüklenmesinin yanı sıra, SDXL mimarisi her birinden iki adet kullandığı için ikinci bir tokenizer ve metin kodlayıcı da yüklenir:

tokenizer_one = AutoTokenizer.from_pretrained(
    args.pretrained_model_name_or_path, subfolder="tokenizer", revision=args.revision, use_fast=False
)
tokenizer_two = AutoTokenizer.from_pretrained(
    args.pretrained_model_name_or_path, subfolder="tokenizer_2", revision=args.revision, use_fast=False
)

text_encoder_cls_one = import_model_class_from_model_name_or_path(
    args.pretrained_model_name_or_path, args.revision
)
text_encoder_cls_two = import_model_class_from_model_name_or_path(
    args.pretrained_model_name_or_path, args.revision, subfolder="text_encoder_2"
)

İstem ve gömme (embedding) değerleri önce hesaplanır ve bellekte tutulur; bu, daha küçük veri kümeleri için genellikle bir sorun değildir, ancak daha büyük veri kümelerinde bellek sorunlarına yol açabilir. Bu durumda, önceden hesaplanan gömme değerlerini ayrı olarak diske kaydetmeli ve eğitim süreci sırasında belleğe yüklemelisiniz (bu konudaki daha fazla tartışma için bu PR'a bakın).

text_encoders = [text_encoder_one, text_encoder_two]
tokenizers = [tokenizer_one, tokenizer_two]
compute_embeddings_fn = functools.partial(
    encode_prompt,
    text_encoders=text_encoders,
    tokenizers=tokenizers,
    proportion_empty_prompts=args.proportion_empty_prompts,
    caption_column=args.caption_column,
)

train_dataset = train_dataset.map(compute_embeddings_fn, batched=True, new_fingerprint=new_fingerprint)
train_dataset = train_dataset.map(
    compute_vae_encodings_fn,
    batched=True,
    batch_size=args.train_batch_size * accelerator.num_processes * args.gradient_accumulation_steps,
    new_fingerprint=new_fingerprint_for_vae,
)

Gömlemler hesaplandıktan sonra, metin kodlayıcı, VAE ve belirteçleyici, biraz bellek boşaltmak için silinir:

del text_encoders, tokenizers, vae
gc.collect()
torch.cuda.empty_cache()

Son olarak, eğitim döngüsü kalan her şeyi halleder. Bir zaman adımı önyargı stratejisi uygulamayı seçtiyseniz, zaman adımı ağırlıklarının hesaplandığını ve gürültü olarak eklendiğini göreceksiniz:

weights = generate_timestep_weights(args, noise_scheduler.config.num_train_timesteps).to(
        model_input.device
    )
    timesteps = torch.multinomial(weights, bsz, replacement=True).long()

noisy_model_input = noise_scheduler.add_noise(model_input, noise, timesteps)

Eğitim döngüsünün nasıl çalıştığı hakkında daha fazla bilgi edinmek isterseniz, gürültü azaltma sürecinin temel kalıbını açıklayan Understanding pipelines, models and schedulers eğitim materyaline göz atın.

Betik başlat

Tüm değişikliklerinizi yaptıysanız veya varsayılan yapılandırmayla sorununuz yoksa, eğitim betiğini başlatmaya hazırsınız! 🚀

Kendi Naruto karakterlerinizi üretmek için Naruto BLIP captions veri seti üzerinde eğitim yapalım. Modeli ve veri setini (Hub’dan veya yerel bir yoldan) belirtmek için MODEL_NAME ve DATASET_NAME ortam değişkenlerini ayarlayın. Sayısal kararsızlıklardan kaçınmak için SDXL VAE dışında bir VAE’yi (Hub’dan veya yerel bir yoldan) VAE_NAME ile belirtmeniz de gerekir.

Eğitim ilerlemesini Weights & Biases ile izlemek için eğitim komutuna --report_to=wandb parametresini ekleyin. Sonuçları takip etmek için eğitim komutuna --validation_prompt ve --validation_epochs parametrelerini de eklemeniz gerekir. Bu, modeli hata ayıklamak ve ara sonuçları görüntülemek için gerçekten faydalı olabilir.

export MODEL_NAME="stabilityai/stable-diffusion-xl-base-1.0"
export VAE_NAME="madebyollin/sdxl-vae-fp16-fix"
export DATASET_NAME="lambdalabs/naruto-blip-captions"

accelerate launch train_text_to_image_sdxl.py \
  --pretrained_model_name_or_path=$MODEL_NAME \
  --pretrained_vae_model_name_or_path=$VAE_NAME \
  --dataset_name=$DATASET_NAME \
  --enable_xformers_memory_efficient_attention \
  --resolution=512 \
  --center_crop \
  --random_flip \
  --proportion_empty_prompts=0.2 \
  --train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --gradient_checkpointing \
  --max_train_steps=10000 \
  --use_8bit_adam \
  --learning_rate=1e-06 \
  --lr_scheduler="constant" \
  --lr_warmup_steps=0 \
  --mixed_precision="fp16" \
  --report_to="wandb" \
  --validation_prompt="a cute Sundar Pichai creature" \
  --validation_epochs 5 \
  --checkpointing_steps=5000 \
  --output_dir="sdxl-naruto-model" \
  --push_to_hub

Eğitimi tamamladıktan sonra, yeni eğittiğiniz SDXL modelini çıkarım için kullanabilirsiniz!

PyTorch
PyTorch XLA
from diffusers import DiffusionPipeline
import torch

pipeline = DiffusionPipeline.from_pretrained("path/to/your/model", dtype=torch.float16).to("cuda")  # or "mps", "xpu", "cpu"

prompt = "A naruto with green eyes and red legs."
image = pipeline(prompt, num_inference_steps=30, guidance_scale=7.5).images[0]
image.save("naruto.png")

Sonraki adımlar

Bir SDXL modeli eğittiğiniz için tebrikler! Yeni modelinizi nasıl kullanacağınızı öğrenmek için aşağıdaki kılavuzlar size yardımcı olabilir:

  • Çeşitli farklı görevlerde (metinden görüntüye, görüntüden görüntüye, inpainting) nasıl kullanılacağını, refiner modelinin nasıl kullanılacağını ve farklı mikro-konumlama türlerini öğrenmek için Stable Diffusion XL kılavuzunu okuyun.
  • Kişiselleştirilmiş bir SDXL modelini yalnızca birkaç örnek görüntüyle nasıl eğitebileceğinizi öğrenmek için DreamBooth ve LoRA eğitim kılavuzlarını inceleyin. Bu iki eğitim tekniği birleştirilebilir!
Update on GitHub