Diffusers documentation

Kandinsky 2.2

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

Kandinsky 2.2

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.

Kandinsky 2.2, daha fotogerçekçi görseller üretebilen çok dilli metinden görselle modelidir. Model, metin istemlerinden görsel gömme (embedding) oluşturmak için bir görsel öncül (prior) modeli ve öncül modelin gömelerine dayalı olarak görseller üreten bir çözücü (decoder) modeli içerir. Bu nedenle Diffusers içinde Kandinsky 2.2 için iki ayrı betik bulacaksınız: biri öncül modeli eğitmek için, diğeri çözücü modelini eğitmek için. Her iki modeli ayrı ayrı eğitebilirsiniz ancak en iyi sonuçları almak için hem öncül hem de çözücü modellerini eğitmeniz gerekir.

GPU'nuzun türüne bağlı olarak, modeli belleğe sığdırmak ve eğitimi hızlandırmak için gradient_checkpointing (⚠️ önceki model için desteklenmiyor!), mixed_precision ve gradient_accumulation_steps özelliklerini etkinleştirmeniz gerekebilir. xFormers ile bellek verimli dikkati (attention) etkinleştirerek bellek kullanımınızı daha da azaltabilirsiniz (v0.0.16 sürümü bazı GPU'larda eğitim sırasında başarısız olur, bu nedenle bunun yerine bir geliştirme sürümünü yüklemeniz gerekebilir).

Bu kılavuz, train_text_to_image_prior.py ve train_text_to_image_decoder.py betiklerini inceleyerek bu betiklere daha aşina olmanıza ve kendi kullanım senaryonuza nasıl uyarlayabileceğinizi göstermenize yardımcı olur.

Betikleri ç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/kandinsky2_2/text_to_image
pip install -r requirements.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.

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

Betik parametreleri

Eğitim betikleri, eğitim çalışmanızı özelleştirmenize yardımcı olmak için birçok parametre sunar. Tüm parametreler ve açıklamaları parse_args() fonksiyonunda bulunur. Eğitim betikleri, 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, fp16 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_prior.py \
  --mixed_precision="fp16"

Parametrelerin çoğu Metinden görüntüye eğitim kılavuzundaki parametrelerle aynıdır, bu yüzden Kandinsky eğitim betiklerinin adım adım incelemesine doğrudan geçelim!

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_prior.py \
  --snr_gamma=5.0

Eğitim betiği

Eğitim betiği, Metinden görüntüye eğitim kılavuzuna benzer; ancak öncül ve çözücü modellerinin eğitimini destekleyecek şekilde değiştirilmiştir. Bu kılavuz, Kandinsky 2.2 eğitim betiklerine özgü kodlara odaklanır.

önceki model
decoder modeli

main() fonksiyonu, veri setini hazırlama ve modeli eğitme kodlarını içerir.

Hemen fark edeceğiniz ana farklardan biri, eğitim betiğinin görüntüleri ön işlemek için bir CLIPImageProcessor ve görüntüleri kodlamak için bir CLIPVisionModelWithProjection modeli yüklemesidir - bir zamanlayıcı ve belirteçleyicinin yanı sıra:

noise_scheduler = DDPMScheduler(beta_schedule="squaredcos_cap_v2", prediction_type="sample")
image_processor = CLIPImageProcessor.from_pretrained(
    args.pretrained_prior_model_name_or_path, subfolder="image_processor"
)
tokenizer = CLIPTokenizer.from_pretrained(args.pretrained_prior_model_name_or_path, subfolder="tokenizer")

with ContextManagers(deepspeed_zero_init_disabled_context_manager()):
    image_encoder = CLIPVisionModelWithProjection.from_pretrained(
        args.pretrained_prior_model_name_or_path, subfolder="image_encoder", dtype=weight_dtype
    ).eval()
    text_encoder = CLIPTextModelWithProjection.from_pretrained(
        args.pretrained_prior_model_name_or_path, subfolder="text_encoder", dtype=weight_dtype
    ).eval()

Kandinsky, gömme (embedding) üretmek için PriorTransformer kullanır; bu nedenle optimizatörü, prior modunun parametrelerini öğrenmesi için yapılandırmanız gerekir.

prior = PriorTransformer.from_pretrained(args.pretrained_prior_model_name_or_path, subfolder="prior")
prior.train()
optimizer = optimizer_cls(
    prior.parameters(),
    lr=args.learning_rate,
    betas=(args.adam_beta1, args.adam_beta2),
    weight_decay=args.adam_weight_decay,
    eps=args.adam_epsilon,
)

Ardından, giriş açıklamaları tokenize edilir ve görüntüler CLIPImageProcessor tarafından ön işlenir:

def preprocess_train(examples):
    images = [image.convert("RGB") for image in examples[image_column]]
    examples["clip_pixel_values"] = image_processor(images, return_tensors="pt").pixel_values
    examples["text_input_ids"], examples["text_mask"] = tokenize_captions(examples)
    return examples

Son olarak, eğitim döngüsü girdi görüntülerini latentlere dönüştürür, görüntü gömümlerine gürültü ekler ve bir tahmin yapar:

model_pred = prior(
    noisy_latents,
    timestep=timesteps,
    proj_embedding=prompt_embeds,
    encoder_hidden_states=text_encoder_hidden_states,
    attention_mask=text_mask,
).predicted_image_embedding

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 yapacaksınız, ancak Create a dataset for training kılavuzunu izleyerek kendi veri setinizi oluşturup üzerinde eğitim de yapabilirsiniz. Ortam değişkenini DATASET_NAME olarak Hub’daki veri setinin adını belirleyin veya kendi dosyalarınız üzerinde eğitim yapıyorsanız, ortam değişkenini TRAIN_DIR olarak veri setinize giden bir yola ayarlayın.

Birden fazla GPU üzerinde eğitim yapıyorsanız, accelerate launch komutuna --multi_gpu parametresini ekleyin.

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

önceki model
decoder modeli
export DATASET_NAME="lambdalabs/naruto-blip-captions"

accelerate launch --mixed_precision="fp16"  train_text_to_image_prior.py \
  --dataset_name=$DATASET_NAME \
  --resolution=768 \
  --train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --max_train_steps=15000 \
  --learning_rate=1e-05 \
  --max_grad_norm=1 \
  --checkpoints_total_limit=3 \
  --lr_scheduler="constant" \
  --lr_warmup_steps=0 \
  --validation_prompts="A robot naruto, 4k photo" \
  --report_to="wandb" \
  --push_to_hub \
  --output_dir="kandi2-prior-naruto-model"

Eğitim tamamlandığında, yeni eğittiğiniz modeli çıkarım için kullanabilirsiniz!

önceki model
decoder modeli
from diffusers import AutoPipelineForText2Image, DiffusionPipeline
import torch

prior_pipeline = DiffusionPipeline.from_pretrained(output_dir, dtype=torch.float16)
prior_components = {"prior_" + k: v for k,v in prior_pipeline.components.items()}
pipeline = AutoPipelineForText2Image.from_pretrained("kandinsky-community/kandinsky-2-2-decoder", **prior_components, dtype=torch.float16)

pipe.enable_model_cpu_offload()
prompt="A robot naruto, 4k photo"
image = pipeline(prompt=prompt, negative_prompt=negative_prompt).images[0]

Kendi eğittiğiniz decoder checkpoint'i ile kandinsky-community/kandinsky-2-2-decoder yerini değiştirmekten çekinmeyin!

Sonraki adımlar

Bir Kandinsky 2.2 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, interpolasyon) nasıl kullanılacağını ve bir ControlNet ile nasıl birleştirilebileceğini öğrenmek için Kandinsky kılavuzunu okuyun.
  • Kişiselleştirilmiş bir Kandinsky 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