# T2I-Adapter

[T2I-Adapter](https://hf.co/papers/2302.08453), görüntü üretimini daha iyi kontrol etmek için ek bir koşullandırma giriş görüntüsü (hat çizimi, canny, eskiz, derinlik, poz) sağlayan hafif bir adaptör modelidir. ControlNet'e benzer, ancak ağırlıkları UNet'e kopyalayıp eğitmek yerine yalnızca içine eklediği için çok daha küçüktür (~77M parametre ve ~300MB dosya boyutu).

T2I-Adapter yalnızca Stable Diffusion XL (SDXL) modeliyle eğitim için kullanılabilir.

Bu kılavuz, [train_t2i_adapter_sdxl.py](https://github.com/huggingface/diffusers/blob/main/examples/t2i_adapter/train_t2i_adapter_sdxl.py) eğitim betiğini inceleyerek onu tanımanıza ve kendi kullanım senaryonuza nasıl uyarlayabileceğinizi göstermek için hazırlanmıştı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/t2i_adapter
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.

> [!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/t2i_adapter/train_t2i_adapter_sdxl.py) okumaktan çekinmeyin ve herhangi bir sorunuz veya endişeniz varsa bize bildirin.

## Betik parametreleri

Eğitim betiği, eğitim çalışmanızı özelleştirmenize yardımcı olmak için birçok parametre sunar. Tüm parametreler ve açıklamaları [`parse_args()`](https://github.com/huggingface/diffusers/blob/aab6de22c33cc01fb7bc81c0807d6109e2c998c9/examples/t2i_adapter/train_t2i_adapter_sdxl.py#L233) fonksiyonunda bulunur. Eğitim komut boyutu ve öğrenme oranı gibi her parametre için varsayılan değerler sağlar, ancak isterseniz eğitim komutunda kendi değerlerinizi de ayarlayabilirsiniz.

Örneğin, gradyan birikimini etkinleştirmek için eğitim komutuna `--gradient_accumulation_steps` parametresini ekleyin:

```bash
accelerate launch train_t2i_adapter_sdxl.py \
  ----gradient_accumulation_steps=4
```

Çok temel ve önemli parametreler [Metinden görüntüye](text2image#script-parameters) eğitim kılavuzunda anlatıldığından, bu kılavuz yalnızca ilgili T2I-Adapter parametrelerine odaklanmaktadır:

- `--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](https://huggingface.co/madebyollin/sdxl-vae-fp16-fix) belirtme imkanı tanır
- `--crops_coords_top_left_h` ve `--crops_coords_top_left_w`: SDXL'in kırpma koordinat gömülerine dahil edilecek yükseklik ve genişlik koordinatları
- `--conditioning_image_column`: veri setindeki koşullandırma görüntülerinin sütunu
- `--proportion_empty_prompts`: boş dizgilerle değiştirilecek görsel istemlerin oranı

## Eğitim betiği

Betik parametrelerinde olduğu gibi, eğitim betiğinin adım adım açıklaması [Metinden görüntüye](text2image#training-script) eğitim kılavuzunda sunulmaktadır. Bunun yerine bu kılavuz, betiğin T2I-Adapter ile ilgili bölümlerine odaklanmaktadır.

Eğitim betiği, veri setini hazırlayarak başlar. Bu, istemin [tokenize edilmesini](https://github.com/huggingface/diffusers/blob/aab6de22c33cc01fb7bc81c0807d6109e2c998c9/examples/t2i_adapter/train_t2i_adapter_sdxl.py#L674) ve görüntüler ile koşullandırma görüntülerine [dönüşümlerin uygulanmasını](https://github.com/huggingface/diffusers/blob/aab6de22c33cc01fb7bc81c0807d6109e2c998c9/examples/t2i_adapter/train_t2i_adapter_sdxl.py#L714) içerir.

```py
conditioning_image_transforms = transforms.Compose(
    [
        transforms.Resize(args.resolution, interpolation=transforms.InterpolationMode.BILINEAR),
        transforms.CenterCrop(args.resolution),
        transforms.ToTensor(),
    ]
)
```

[`main()`](https://github.com/huggingface/diffusers/blob/aab6de22c33cc01fb7bc81c0807d6109e2c998c9/examples/t2i_adapter/train_t2i_adapter_sdxl.py#L770) işlevi içinde T2I-Adapter, önceden eğitilmiş bir adaptörden yüklenir ya da rastgele başlatılır:

```py
if args.adapter_model_name_or_path:
    logger.info("Loading existing adapter weights.")
    t2iadapter = T2IAdapter.from_pretrained(args.adapter_model_name_or_path)
else:
    logger.info("Initializing t2iadapter weights.")
    t2iadapter = T2IAdapter(
        in_channels=3,
        channels=(320, 640, 1280, 1280),
        num_res_blocks=2,
        downscale_factor=16,
        adapter_type="full_adapter_xl",
    )
```

[optimizer](https://github.com/huggingface/diffusers/blob/aab6de22c33cc01fb7bc81c0807d6109e2c998c9/examples/t2i_adapter/train_t2i_adapter_sdxl.py#L952), T2I-Adapter parametreleri için başlatılır:

```py
params_to_optimize = t2iadapter.parameters()
optimizer = optimizer_class(
    params_to_optimize,
    lr=args.learning_rate,
    betas=(args.adam_beta1, args.adam_beta2),
    weight_decay=args.adam_weight_decay,
    eps=args.adam_epsilon,
)
```

Son olarak, [eğitim döngüsünde](https://github.com/huggingface/diffusers/blob/aab6de22c33cc01fb7bc81c0807d6109e2c998c9/examples/t2i_adapter/train_t2i_adapter_sdxl.py#L1086), adaptör koşullu görüntü ve metin gömüleri, gürültü artığını tahmin etmek için UNet'e iletilir:

```py
t2iadapter_image = batch["conditioning_pixel_values"].to(dtype=weight_dtype)
down_block_additional_residuals = t2iadapter(t2iadapter_image)
down_block_additional_residuals = [
    sample.to(dtype=weight_dtype) for sample in down_block_additional_residuals
]

model_pred = unet(
    inp_noisy_latents,
    timesteps,
    encoder_hidden_states=batch["prompt_ids"],
    added_cond_kwargs=batch["unet_added_conditions"],
    down_block_additional_residuals=down_block_additional_residuals,
).sample
```

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](../using-diffusers/write_own_pipeline) eğitim materyaline göz atın.

## Betik başlat

Şimdi eğitim betiğini başlatmaya hazırsınız! 🚀

Bu örnek eğitim için [fusing/fill50k](https://huggingface.co/datasets/fusing/fill50k) veri setini kullanacaksınız. İsterseniz kendi veri setinizi oluşturup kullanabilirsiniz ([Eğitim için veri seti oluşturma](create_dataset) kılavuzuna bakın).

Ortam değişkeni `MODEL_DIR`'i Hub'daki bir model kimliğine veya yerel bir modele giden yola, `OUTPUT_DIR`'i ise modelin kaydedilmesini istediğiniz konuma ayarlayın.

Eğitiminizi koşullandırmak için aşağıdaki görüntüleri indirin:

```bash
wget https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/controlnet_training/conditioning_image_1.png
wget https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/controlnet_training/conditioning_image_2.png
```

> [!TIP]
> 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 ayrıca `--validation_image`, `--validation_prompt` ve `--validation_steps` parametrelerini de eklemeniz gerekir. Bu, modeli hata ayıklamak ve ara sonuçları görüntülemek için gerçekten faydalı olabilir.

```bash
export MODEL_DIR="stabilityai/stable-diffusion-xl-base-1.0"
export OUTPUT_DIR="path to save model"

accelerate launch train_t2i_adapter_sdxl.py \
 --pretrained_model_name_or_path=$MODEL_DIR \
 --output_dir=$OUTPUT_DIR \
 --dataset_name=fusing/fill50k \
 --mixed_precision="fp16" \
 --resolution=1024 \
 --learning_rate=1e-5 \
 --max_train_steps=15000 \
 --validation_image "./conditioning_image_1.png" "./conditioning_image_2.png" \
 --validation_prompt "red circle with blue background" "cyan circle with brown floral background" \
 --validation_steps=100 \
 --train_batch_size=1 \
 --gradient_accumulation_steps=4 \
 --report_to="wandb" \
 --seed=42 \
 --push_to_hub
```

Eğitim tamamlandığında, T2I-Adapter'ınızı çıkarım için kullanabilirsiniz:

```py
from diffusers import StableDiffusionXLAdapterPipeline, T2IAdapter, EulerAncestralDiscreteSchedulerTest
from diffusers.utils import load_image
import torch

adapter = T2IAdapter.from_pretrained("path/to/adapter", dtype=torch.float16)
pipeline = StableDiffusionXLAdapterPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", adapter=adapter, dtype=torch.float16
)

pipeline.scheduler = EulerAncestralDiscreteSchedulerTest.from_config(pipe.scheduler.config)
pipeline.enable_xformers_memory_efficient_attention()
pipeline.enable_model_cpu_offload()

control_image = load_image("./conditioning_image_1.png")
prompt = "pale golden rod circle with old lace background"

generator = torch.manual_seed(0)
image = pipeline(
    prompt, image=control_image, generator=generator
).images[0]
image.save("./output.png")
```

## Sonraki adımlar

Bir T2I-Adapter modeli eğittiğiniz için tebrikler! 🎉 Daha fazla bilgi edinmek için:

- T2I-Adapter ekibinin deneysel sonuçlarına ilişkin daha fazla ayrıntı için [Efficient Controllable Generation for SDXL with T2I-Adapters](https://huggingface.co/blog/t2i-sdxl-adapters) blog yazısını okuyun.

