Buckets:

mishig's picture
|
download
raw
16.2 kB

Kandinsky 2.2

Bu script deneyseldir ve aşırı öğrenme (overfitting) ile katastrofik unutma gibi sorunlara düşmek 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'ta 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 sağlar. 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.

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.

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

Önceki modelin aksine, decoder, latentsleri görüntülere dönüştürmek için bir VQModel başlatır ve bir UNet2DConditionModel kullanır:

with ContextManagers(deepspeed_zero_init_disabled_context_manager()):
    vae = VQModel.from_pretrained(
        args.pretrained_decoder_model_name_or_path, subfolder="movq", dtype=weight_dtype
    ).eval()
    image_encoder = CLIPVisionModelWithProjection.from_pretrained(
        args.pretrained_prior_model_name_or_path, subfolder="image_encoder", dtype=weight_dtype
    ).eval()
unet = UNet2DConditionModel.from_pretrained(args.pretrained_decoder_model_name_or_path, subfolder="unet")

Ardından, betik birkaç görüntü dönüşümü ve bu dönüşümleri görüntülere uygulayıp piksel değerlerini döndüren bir ön işleme işlevi içerir:

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

Son olarak, eğitim döngüsü görüntüleri latentlere dönüştürmeyi, gürültü eklemeyi ve gürültü artığını tahmin etmeyi yönetir.

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.

model_pred = unet(noisy_latents, timesteps, None, added_cond_kwargs=added_cond_kwargs).sample[:, :4]

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. Hub'daki veri setinin adını DATASET_NAME ortam değişkenine ayarlayın veya kendi dosyalarınız üzerinde eğitim yapıyorsanız, TRAIN_DIR ortam değişkenini 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.

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"
export DATASET_NAME="lambdalabs/naruto-blip-captions"

accelerate launch --mixed_precision="fp16"  train_text_to_image_decoder.py \
  --dataset_name=$DATASET_NAME \
  --resolution=768 \
  --train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --gradient_checkpointing \
  --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-decoder-naruto-model"

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

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!

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained("path/to/saved/model", dtype=torch.float16)
pipeline.enable_model_cpu_offload()

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

Dekoder modeli için, ara sonuçları görüntülemek için faydalı olabilecek kaydedilmiş bir kontrol noktasından (checkpoint) çıkarım (inference) da gerçekleştirebilirsiniz. Bu durumda, kontrol noktasını UNet'e yükleyin:

from diffusers import AutoPipelineForText2Image, UNet2DConditionModel

unet = UNet2DConditionModel.from_pretrained("path/to/saved/model" + "/checkpoint-<N>/unet")

pipeline = AutoPipelineForText2Image.from_pretrained("kandinsky-community/kandinsky-2-2-decoder", unet=unet, dtype=torch.float16)
pipeline.enable_model_cpu_offload()

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

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!

Xet Storage Details

Size:
16.2 kB
·
Xet hash:
4d23a73fb641939a979fe6535c801c0845fbb550cbec531f825486323ab368dd

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.