# Metinden görüntüye

> [!WARNING]
> Metinden görüntüye betiği 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.

Stable Diffusion gibi metinden görüntüye modeller, bir metin komutu verildiğinde görüntü üretmek üzere koşullandırılmıştır.

Bir model eğitmek donanımınız üzerinde zorlayıcı olabilir, ancak `gradient_checkpointing` ve `mixed_precision` özelliklerini etkinleştirirseniz, bir modeli tek bir 24GB GPU üzerinde eğitmek mümkündür. Daha büyük batch boyutlarıyla eğitim yapıyorsanız veya daha hızlı eğitim almak istiyorsanız, 30GB'tan fazla belleğe sahip GPU'lar kullanmak daha iyidir. [xFormers](../optimization/attention_backends) ile bellek verimli dikkati (memory-efficient attention) etkinleştirerek bellek kullanımınızı azaltabilirsiniz.

Bu kılavuz, [train_text_to_image.py](https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/train_text_to_image.py) eğitim betiğini inceleyerek onu 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:

```bash
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:

```bash
cd examples/text_to_image
pip install -r requirements.txt
```

> [!TIP]
> 🤗 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](https://huggingface.co/docs/accelerate/quicktour) sayfasına göz atın.

Bir 🤗 Accelerate ortamı başlatın:

```bash
accelerate config
```

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

```bash
accelerate config default
```

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

```py
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](create_dataset) kılavuzuna göz atın.

## Betik parametreleri

> [!TIP]
> 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](https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/train_text_to_image.py) 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()`](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L193) 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, fp16 biçimini kullanarak karma hassasiyetle eğitimi hızlandırmak için eğitim komutuna `--mixed_precision` parametresini ekleyin:

```bash
accelerate launch train_text_to_image.py \
  --mixed_precision="fp16"
```

Bazı temel ve önemli parametreler şunlardır:

- `--pretrained_model_name_or_path`: Hub'daki modelin adı veya önceden eğitilmiş modele yerel bir yol
- `--dataset_name`: Hub'daki veri setinin adı veya eğitim için kullanılacak veri setine yerel bir yol
- `--image_column`: eğitim için kullanılacak veri setindeki görüntü sütununun adı
- `--caption_column`: eğitim için kullanılacak veri setindeki metin sütununun adı
- `--output_dir`: eğitilen modelin kaydedileceği yer
- `--push_to_hub`: eğitilen modelin Hub'a gönderilip gönderilmeyeceği
- `--checkpointing_steps`: modelin eğitim sırasında checkpoint kaydetme sıklığı; eğitim herhangi bir nedenle yarıda kesilirse, eğitim komutunuza `--resume_from_checkpoint` ekleyerek bu checkpoint'ten eğitim devam ettirebilirsiniz

### Min-SNR ağırlıklandırma

[Min-SNR](https://huggingface.co/papers/2303.09556) 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:

```bash
accelerate launch train_text_to_image.py \
  --snr_gamma=5.0
```

Farklı `snr_gamma` değerleri için kayıp yüzeylerini bu [Weights and Biases](https://wandb.ai/sayakpaul/text2image-finetune-minsnr) raporunda karşılaştırabilirsiniz. Daha küçük veri kümelerinde, Min-SNR'nin etkileri, daha büyük veri kümelerine kıyasla o kadar belirgin olmayabilir.

## Eğitim betiği

Veri seti ön işleme kodu ve eğitim döngüsü [`main()`](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L490) fonksiyonunda bulunur. Eğitim betiğini uyarlamanız gerekiyorsa, değişikliklerinizi burada yapmanız gerekir.

`train_text_to_image` betiği, [bir zamanlayıcıyı](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L543) ve belirteç ayrıştırıcıyı yükleyerek başlar. İsterseniz burada farklı bir zamanlayıcı kullanmayı seçebilirsiniz:

```py
noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder="scheduler")
tokenizer = CLIPTokenizer.from_pretrained(
    args.pretrained_model_name_or_path, subfolder="tokenizer", revision=args.revision
)
```

Ardından betik [UNet](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L619) modelini yükler:

```py
load_model = UNet2DConditionModel.from_pretrained(input_dir, subfolder="unet")
model.register_to_config(**load_model.config)

model.load_state_dict(load_model.state_dict())
```

Ardından, veri setinin metin ve görüntü sütunlarının ön işlenmesi gerekir. [`tokenize_captions`](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L724) işlevi girdilerin tokenizasyonunu ele alır ve [`train_transforms`](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L742) işlevi, görüntüye uygulanacak dönüşümlerin türünü belirtir. Bu iki işlev `preprocess_train` içinde bir araya getirilir:

```py
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["input_ids"] = tokenize_captions(examples)
    return examples
```

Son olarak, [eğitim döngüsü](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L878) her şeyi halleder. Görselleri latent uzaya kodlar, latentlere gürültü ekler, koşul olarak kullanılacak metin gömme değerlerini hesaplar, model parametrelerini günceller ve modeli Hub'a kaydeder ve gönderir. Eğitim döngüsünün nasıl çalıştığını daha ayrıntılı öğrenmek isterseniz, gürültü azaltma sürecinin temel kalıbını açıklayan [Pipeline'ları, modelleri ve zamanlayıcıları anlama](../using-diffusers/write_own_pipeline) 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](https://huggingface.co/datasets/lambdalabs/naruto-blip-captions) veri setinde eğitim yapalım. Ortam değişkenlerini `MODEL_NAME` ve `dataset_name` olarak model ve veri setine (Hub'dan veya yerel bir yoldan) ayarlayın. Birden fazla GPU üzerinde eğitim yapıyorsanız, `accelerate launch` komutuna `--multi_gpu` parametresini ekleyin.

> [!TIP]
> Yerel bir veri setinde eğitim yapmak için `TRAIN_DIR` ve `OUTPUT_DIR` ortam değişkenlerini, veri setinin yoluna ve modelin kaydedileceği konuma ayarlayın.

```bash
export MODEL_NAME="stable-diffusion-v1-5/stable-diffusion-v1-5"
export dataset_name="lambdalabs/naruto-blip-captions"

accelerate launch --mixed_precision="fp16"  train_text_to_image.py \
  --pretrained_model_name_or_path=$MODEL_NAME \
  --dataset_name=$dataset_name \
  --use_ema \
  --resolution=512 --center_crop --random_flip \
  --train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --gradient_checkpointing \
  --max_train_steps=15000 \
  --learning_rate=1e-05 \
  --max_grad_norm=1 \
  --enable_xformers_memory_efficient_attention \
  --lr_scheduler="constant" --lr_warmup_steps=0 \
  --output_dir="sd-naruto-model" \
  --push_to_hub
```

Eğitim tamamlandıktan sonra, yeni eğittiğiniz modeli çıkarım için kullanabilirsiniz:

```py
from diffusers import StableDiffusionPipeline
import torch

pipeline = StableDiffusionPipeline.from_pretrained("path/to/saved_model", dtype=torch.float16, use_safetensors=True).to("cuda")  # or "mps", "xpu", "cpu"

image = pipeline(prompt="yoda").images[0]
image.save("yoda-naruto.png")
```

## Sonraki adımlar

Kendi metinden görüntüye modelinizi 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:

- Modelinizi LoRA ile eğittiyseniz, çıkarım için [LoRA ağırlıklarını yükleme](../tutorials/using_peft_for_inference) yöntemini öğrenin.
- Rehber ölçeği gibi belirli parametrelerin veya prompt ağırlıklandırma gibi tekniklerin çıkarımı nasıl kontrol etmenize yardımcı olabileceğini öğrenmek için [Metinden görüntüye](../using-diffusers/conditional_image_generation) görev kılavuzuna göz atın.

