Diffusers documentation
Stable Diffusion XL
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=wandbparametresini ekleyin. Sonuçları takip etmek için eğitim komutuna--validation_promptve--validation_epochsparametrelerini 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_hubEğitimi tamamladıktan sonra, yeni eğittiğiniz SDXL modelini çıkarım için kullanabilirsiniz!
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")PyTorch XLA, PyTorch’u TPU gibi XLA cihazlarında çalıştırmanızı sağlar ve bu daha hızlı olabilir. İlk ısınma adımı, modelin derlenip optimize edilmesi gerektiği için daha uzun sürer. Ancak, orijinal istemle aynı uzunlukta bir girdi üzerinde pipeline’ın sonraki çağrıları, optimize edilmiş grafın yeniden kullanılabilmesi sayesinde çok daha hızlıdır.
from diffusers import DiffusionPipeline
import torch
import torch_xla.core.xla_model as xm
device = xm.xla_device()
pipeline = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0").to(device)
prompt = "A naruto with green eyes and red legs."
start = time()
image = pipeline(prompt, num_inference_steps=inference_steps).images[0]
print(f'Compilation time is {time()-start} sec')
image.save("naruto.png")
start = time()
image = pipeline(prompt, num_inference_steps=inference_steps).images[0]
print(f'Inference time is {time()-start} sec after compilation')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!