Stable Diffusion XL (SDXL) Kurulumu ve Kullanımı

GPU’nun fanı çılgınca dönmeye başladığında, monitörden gerçek zamanlı olarak üretilen görüntüleri izlemek hâlâ o eski heyecanı veriyor. Stable Diffusion XL ile çalışmaya başladığımda, önceki nesil SD 1.5’e kıyasla farkı ilk promptta anladım. Ama bu noktaya gelmek, birkaç saatlik kurulum çilesini ve “neden çalışmıyor” sorularını gerektirdi. Bu yazıda o süreci baştan sona aktaracağım.

Stable Diffusion XL Nedir, Neden Önemli?

SDXL, Stability AI’ın 2023 yılında çıkardığı, önceki SD modellerine kıyasla çok daha yüksek kaliteli görüntüler üretebilen difüzyon modelidir. Temel farklar şunlar:

  • Çift model mimarisi: Base model ve refiner model birlikte çalışarak önce genel kompozisyonu, sonra detayları oluşturur
  • 1024×1024 native çözünürlük: SD 1.5’in 512×512 native çözünürlüğüne kıyasla 4 kat daha fazla piksel
  • Daha iyi prompt anlama: Uzun ve karmaşık promptlara daha tutarlı yanıt verir
  • Gelişmiş VAE: Renk ve kontrast açısından çok daha doğal sonuçlar

Ama bu gelişmeler bedavaya gelmiyor. SDXL, SD 1.5’e kıyasla bellek açısından çok daha açgözlü. Minimum 8GB VRAM öneriyorum, 6GB ile de çalışır ama optimizasyon gerektirir.

Sistem Gereksinimleri ve Hazırlık

Kuruluma geçmeden önce ortamı netleştirelim. Ben bu rehberi Ubuntu 22.04 üzerinde, RTX 3080 10GB ile test ettim. Windows kullanıcıları için önemli farklılıkları ayrıca belirteceğim.

Donanım gereksinimleri:

  • GPU: NVIDIA 8GB+ VRAM (RTX 3060 minimum önerim), AMD ROCm ile de çalışır ama kurulum daha karmaşık
  • RAM: 16GB minimum, 32GB ideal
  • Disk: Model dosyaları için en az 20GB boş alan (base + refiner = ~13GB)
  • CPU: Herhangi bir modern işlemci, GPU yoksa CPU inference da mümkün ama çok yavaş

Yazılım gereksinimleri:

  • Python 3.10 veya 3.11 (3.12 ile bazı kütüphanelerde uyumsuzluk var)
  • CUDA 11.8 veya 12.x
  • Git

Önce CUDA sürümünü kontrol edelim:

nvidia-smi
nvcc --version

Eğer nvcc komutu bulunamazsa CUDA toolkit kurulu değildir. nvidia-smi çalışıyorsa driver mevcuttur, toolkit ayrıca kurulmalıdır:

# CUDA 12.1 kurulumu (Ubuntu 22.04)
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-1

Python Ortamı Kurulumu

Sistem Python’unu kirletmemenin altını çizmek istiyorum. Her AI projesinde ayrı sanal ortam kullanmak, ileride bağımlılık cehennemine girmemek için şart.

# Python 3.10 kurulu değilse
sudo apt-get install python3.10 python3.10-venv python3.10-dev

# Proje dizini oluştur
mkdir ~/sdxl-workspace
cd ~/sdxl-workspace

# Sanal ortam oluştur
python3.10 -m venv sdxl-env

# Aktif et
source sdxl-env/bin/activate

# pip'i güncelle
pip install --upgrade pip setuptools wheel

Windows kullanıcıları için:

# Windows PowerShell
python -m venv sdxl-env
.sdxl-envScriptsActivate.ps1
pip install --upgrade pip

AUTOMATIC1111 WebUI ile Kurulum

Stable Diffusion’ı kullanmak için birkaç farklı yol var: ham Python kodu, ComfyUI, veya AUTOMATIC1111 WebUI. Yeni başlayanlar ve hızlı sonuç isteyenler için AUTOMATIC1111 WebUI en pratik çözüm. Ben genellikle üretim ortamlarında ComfyUI’yi, denemeler için WebUI’yi tercih ediyorum.

# Sanal ortamın aktif olduğundan emin ol
# AUTOMATIC1111 WebUI'yi klonla
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
cd stable-diffusion-webui

SDXL model dosyalarını indirmek için Hugging Face CLI kullanacağız:

pip install huggingface_hub

# Base model indir (~6.7GB)
huggingface-cli download stabilityai/stable-diffusion-xl-base-1.0 
    --include "*.safetensors" 
    --local-dir ./models/Stable-diffusion/sdxl-base

# Refiner model indir (~6.1GB)
huggingface-cli download stabilityai/stable-diffusion-xl-refiner-1.0 
    --include "*.safetensors" 
    --local-dir ./models/Stable-diffusion/sdxl-refiner

Model indirme işlemi internet hızınıza göre uzun sürebilir. İndirme sırasında kesinti olursa huggingface-cli download komutu kaldığı yerden devam eder, bu büyük bir kolaylık.

Şimdi WebUI’yi başlatalım:

# İlk çalıştırma, bağımlılıkları otomatik kurar
./webui.sh --xformers --no-half-vae

# Veya VRAM kısıtlıysa (6-8GB arası)
./webui.sh --xformers --medvram

# 4-6GB VRAM için
./webui.sh --xformers --lowvram

--xformers bayrağı, memory-efficient attention mekanizması için kritik. Olmadan VRAM kullanımı belirgin şekilde artıyor.

Diffusers Kütüphanesi ile Programatik Kullanım

WebUI işin arayüz kısmını hallediyor, ama otomasyona veya özelleştirilmiş pipeline’lara ihtiyaç duyulduğunda doğrudan Python kodu yazmak gerekiyor. Diffusers kütüphanesi burada devreye giriyor.

pip install diffusers transformers accelerate xformers
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121

Temel bir SDXL inference scripti:

# sdxl_basic.py
import torch
from diffusers import StableDiffusionXLPipeline, StableDiffusionXLImg2ImgPipeline
from diffusers import DPMSolverMultistepScheduler

# Base pipeline yükle
base_pipe = StableDiffusionXLPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16,
    use_safetensors=True,
    variant="fp16"
)

# Scheduler ayarla (DPM++ 2M Karras genellikle en iyi sonucu verir)
base_pipe.scheduler = DPMSolverMultistepScheduler.from_config(
    base_pipe.scheduler.config,
    use_karras_sigmas=True
)

base_pipe = base_pipe.to("cuda")
base_pipe.enable_xformers_memory_efficient_attention()

prompt = "a detailed photograph of a Turkish bazaar at sunset, cinematic lighting, 8k"
negative_prompt = "blurry, low quality, distorted, ugly, bad anatomy"

# Görüntü üret
image = base_pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=30,
    guidance_scale=7.5,
    width=1024,
    height=1024,
).images[0]

image.save("output_base.png")
print("Base görüntü oluşturuldu.")

Bu scripti çalıştırdığınızda model Hugging Face’den otomatik indirilir ve ~/.cache/huggingface altına kaydedilir. Önceden indirdiyseniz aynı cache kullanılır.

Base + Refiner Pipeline Kullanımı

SDXL’in gerçek gücü, base ve refiner modelini birlikte kullandığınızda ortaya çıkıyor. Base model genel yapıyı ve kompozisyonu oluştururken, refiner yüksek frekanslı detayları ekliyor. Bu iki aşamalı süreç, tek model kullanımına kıyasla belirgin kalite artışı sağlıyor.

# sdxl_pipeline_full.py
import torch
from diffusers import StableDiffusionXLPipeline, StableDiffusionXLImg2ImgPipeline

# Her iki modeli ayrı GPU'lara yüklemek ideal ama tek GPU varsa
# model_cpu_offload kullan
base_pipe = StableDiffusionXLPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16,
    variant="fp16",
    use_safetensors=True,
)
base_pipe.enable_model_cpu_offload()

refiner_pipe = StableDiffusionXLImg2ImgPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-refiner-1.0",
    text_encoder_2=base_pipe.text_encoder_2,
    vae=base_pipe.vae,
    torch_dtype=torch.float16,
    variant="fp16",
    use_safetensors=True,
)
refiner_pipe.enable_model_cpu_offload()

prompt = "a majestic eagle soaring over the Bosphorus, golden hour, hyperrealistic"
negative_prompt = "cartoon, painting, illustration, (worst quality, low quality, normal quality:2)"

# Adım 1: Base model ile latent üret
# denoising_end=0.8 ile toplam adımların %80'ini base yapar
n_steps = 40
high_noise_frac = 0.8

base_image = base_pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=n_steps,
    denoising_end=high_noise_frac,
    output_type="latent",  # Latent uzayda tut, decode etme
).images

# Adım 2: Refiner ile detaylandır
final_image = refiner_pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=n_steps,
    denoising_start=high_noise_frac,
    image=base_image,
).images[0]

final_image.save("output_refined.png")
print("Refined görüntü kaydedildi.")

text_encoder_2=base_pipe.text_encoder_2 ve vae=base_pipe.vae satırları kritik. Bu şekilde ortak ağırlıkları paylaştırarak bellek kullanımını ciddi oranda azaltıyoruz.

VRAM Optimizasyonu ve Performans Ayarları

En sık sorulan soru şu oluyor: “8GB VRAM var ama out of memory hatası alıyorum.” Bu çok normal, birkaç teknikle üstesinden gelebilirsiniz.

Bellek optimizasyon seçenekleri:

  • enable_model_cpu_offload(): Kullanılmayan katmanları RAM’e taşır, VRAM tasarrufu sağlar ama yavaşlar
  • enable_sequential_cpu_offload(): Daha agresif CPU offloading, çok yavaş ama minimal VRAM
  • enable_xformers_memory_efficient_attention(): Attention hesaplamalarını optimize eder
  • torch.float16: FP32 yerine FP16 kullanımı, belleği yarıya indirir
# Sistem bellek kullanımını izlemek için
watch -n 1 nvidia-smi

# Python içinden GPU bellek durumu
python3 -c "
import torch
print(f'Toplam VRAM: {torch.cuda.get_device_properties(0).total_memory / 1024**3:.2f} GB')
print(f'Boş VRAM: {torch.cuda.memory_reserved(0) / 1024**3:.2f} GB')
"

Üretimde batch inference yapıyorsanız, her üretimden sonra cache’i temizlemek önemli:

# Her inference sonrası bellek temizleme
import gc
import torch

def clear_gpu_memory():
    gc.collect()
    torch.cuda.empty_cache()
    torch.cuda.synchronize()

# Kullanım
image = pipe(prompt=prompt).images[0]
clear_gpu_memory()

LoRA ve Fine-tuning Modellerini Kullanmak

SDXL base modeli tek başına güçlü, ama özelleştirilmiş stiller veya belirli konular için LoRA (Low-Rank Adaptation) ağırlıkları kullanmak sonuçları dramatik şekilde değiştiriyor. Civitai.com sitesi SDXL uyumlu binlerce LoRA barındırıyor.

# sdxl_with_lora.py
from diffusers import StableDiffusionXLPipeline
import torch

pipe = StableDiffusionXLPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16,
    variant="fp16",
).to("cuda")

# LoRA ağırlığını yükle
# safetensors formatındaki LoRA dosyasını models/Lora/ dizinine koy
pipe.load_lora_weights(
    "./models/Lora/",
    weight_name="my_style_lora.safetensors"
)

# LoRA scale: 0.0 (etki yok) ile 1.0 (tam etki) arası
pipe.fuse_lora(lora_scale=0.8)

prompt = "portrait of a woman, <lora:my_style_lora:0.8>, masterpiece"
image = pipe(
    prompt=prompt,
    num_inference_steps=25,
    guidance_scale=6.5,
).images[0]

image.save("lora_output.png")

# Birden fazla LoRA yüklemek için unfuse edip tekrar yükle
pipe.unfuse_lora()
pipe.unload_lora_weights()

Toplu Görüntü Üretimi için Bash Scripti

Gerçek dünya senaryolarında genellikle tek tek görüntü üretmiyoruz. Bir prompt listesinden toplu üretim yapan basit ama işlevsel bir script:

#!/bin/bash
# batch_generate.sh

PROMPTS_FILE="prompts.txt"
OUTPUT_DIR="./batch_output"
LOG_FILE="./generation.log"

mkdir -p "$OUTPUT_DIR"

echo "Toplu görüntü üretimi başlıyor: $(date)" >> "$LOG_FILE"

while IFS= read -r prompt; do
    # Boş satırları atla
    [[ -z "$prompt" ]] && continue
    
    # Prompt'tan dosya adı oluştur
    filename=$(echo "$prompt" | tr ' ' '_' | tr -cd '[:alnum:]_' | cut -c1-50)
    timestamp=$(date +%Y%m%d_%H%M%S)
    output_file="${OUTPUT_DIR}/${timestamp}_${filename}.png"
    
    echo "Üretiliyor: $prompt" | tee -a "$LOG_FILE"
    
    python3 sdxl_basic.py 
        --prompt "$prompt" 
        --output "$output_file" 
        --steps 30 
        --guidance 7.5 2>> "$LOG_FILE"
    
    if [ $? -eq 0 ]; then
        echo "Tamamlandi: $output_file" >> "$LOG_FILE"
    else
        echo "HATA: $prompt icin uretim basarisiz" >> "$LOG_FILE"
    fi
    
    # GPU'nun soğuması için kısa bekleme (opsiyonel)
    sleep 2
    
done < "$PROMPTS_FILE"

echo "Islem tamamlandi: $(date)" >> "$LOG_FILE"
echo "Tum goruntuler $OUTPUT_DIR dizininde."

Bu scripti gerçek projelerde sıklıkla kullanıyorum, özellikle gece boyunca büyük bir prompt setini işletmek gerektiğinde.

Sık Karşılaşılan Hatalar ve Çözümleri

Birkaç yıldır bu araçlarla çalışırken tekrar tekrar karşılaştığım sorunlar ve çözümleri:

CUDA out of memory hatası:

  • --medvram veya --lowvram bayraklarını dene
  • enable_model_cpu_offload() kullan
  • Batch size’ı 1’e düşür
  • torch.cuda.empty_cache() çağır

“Weights are not tied” uyarısı:

  • Bu bir hata değil, uyarı. Güvenle görmezden gelebilirsin.

Safetensors format hatası:

  • pip install safetensors --upgrade ile güncelle

xformers kurulum hatası:

# CUDA versiyonuna uygun xformers kur
pip install xformers==0.0.22 --index-url https://download.pytorch.org/whl/cu121

Model dosyası bulunamadı hatası:

# Cache dizinini kontrol et
ls ~/.cache/huggingface/hub/
# Veya model yolunu açıkça belirt
export HF_HOME="/data/huggingface_cache"

Sonuç

SDXL kurulumu ilk bakışta göz korkutucu görünebilir, özellikle bağımlılık yönetimi ve VRAM optimizasyonu konularında. Ama temel mimariyi bir kez anladıktan sonra, her şey mantıklı bir şekilde yerine oturuyor.

Önerim şu sırayla ilerlemek: Önce WebUI ile başlayıp modelin nasıl çalıştığını görsel olarak anla. Sonra diffusers ile script yazmaya geç, pipeline’ı özelleştirmeye başla. Son aşamada LoRA’ları, ControlNet’i ve diğer uzantıları işin içine kat.

Üretim ortamı kuruyorsanız, model dosyalarını merkezi bir NFS paylaşımında tutmak ve her servis instance’ının aynı cache’i kullanmasını sağlamak disk kullanımını önemli ölçüde azaltıyor. GPU sunucu cluster’larında bu mimariye geçmek, depolama maliyetlerinde ciddi tasarruf sağlıyor.

SDXL ekosistemi hâlâ hızla gelişiyor. Turbo ve Lightning gibi distilasyon modelleri, 4-8 adımda kaliteli görüntü üretmeyi mümkün kıldı. O konu için ayrı bir yazı gerekiyor.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir