# LoRA

> [!WARNING]
> Bu deneyseldir ve API gelecekte değişebilir.

[LoRA (Low-Rank Adaptation of Large Language Models)](https://hf.co/papers/2106.09685), eğitilebilir parametre sayısını önemli ölçüde azaltan popüler ve hafif bir eğitim tekniğidir. Modelin içine daha az sayıda yeni ağırlık ekleyerek ve yalnızca bunları eğiterek çalışır. Bu sayede LoRA ile eğitim çok daha hızlı ve bellek verimli hale gelir; ayrıca depolaması ve paylaşması daha kolay olan daha küçük model ağırlıkları (birkaç yüz MB) üretilir. LoRA, eğitimi hızlandırmak için DreamBooth gibi diğer eğitim teknikleriyle de birleştirilebilir.

> [!TIP]
> LoRA çok yönlüdür ve [DreamBooth](https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/train_dreambooth_lora.py), [Kandinsky 2.2](https://github.com/huggingface/diffusers/blob/main/examples/kandinsky2_2/text_to_image/train_text_to_image_lora_decoder.py), [Stable Diffusion XL](https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/train_text_to_image_lora_sdxl.py) ve [metinden görüntüye](https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/train_text_to_image_lora.py) için desteklenmektedir.

Bu kılavuz, [train_text_to_image_lora.py](https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/train_text_to_image_lora.py) betiğini inceleyerek onu daha yakından tanımanıza ve kendi kullanım senaryonuza nasıl uyarlayabileceğinize 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 .
```

Eğitim betiği içeren örnek klasörüne gidin ve kullandığınız betiğin gerektirdiği 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.

> [!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_lora.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 parametreye sahiptir. Tüm parametreler ve açıklamaları [`parse_args()`](https://github.com/huggingface/diffusers/blob/dd9a5caf61f04d11c0fa9f3947b69ab0010c9a0f/examples/text_to_image/train_text_to_image_lora.py#L85) fonksiyonunda bulunur. Çoğu parametre için oldukça iyi çalışan varsayılan değerler sağlanmıştır, ancak isterseniz kendi değerlerinizi eğitim komutunda da ayarlayabilirsiniz.

Örneğin, eğitim için epoch sayısını artırmak için:

```bash
accelerate launch train_text_to_image_lora.py \
  --num_train_epochs=150 \
```

Ç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 LoRA ile ilgili parametrelere odaklanmaktadır:

- `--rank`: eğitilecek düşük rütbeli matrislerin iç boyutu; daha yüksek rütbe, daha fazla eğitilebilir parametre anlamına gelir
- `--learning_rate`: varsayılan öğrenme oranı 1e-4'tür ancak LoRA ile daha yüksek bir öğrenme oranı kullanabilirsiniz

## Eğitim betiği

Veri seti ön işleme kodu ve eğitim döngüsü [`main()`](https://github.com/huggingface/diffusers/blob/dd9a5caf61f04d11c0fa9f3947b69ab0010c9a0f/examples/text_to_image/train_text_to_image_lora.py#L371) fonksiyonunda bulunur ve eğitim betiğini uyarlamanız gerekiyorsa değişikliklerinizi burada yaparsınız.

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 LoRA ile ilgili kısımlarına odaklanmaktadır.

Diffusers, LoRA adaptörünün parametrelerini (örneğin rank, alpha ve LoRA ağırlıklarının hangi modüllere yerleştirileceği) ayarlamak için [PEFT](https://hf.co/docs/peft) kütüphanesinden [LoraConfig](https://huggingface.co/docs/peft/main/en/package_reference/lora#peft.LoraConfig) sınıfını kullanır. Adaptör UNet'e eklenir ve `lora_layers` içinde yalnızca LoRA katmanları optimizasyon için filtrelenir.

```py
unet_lora_config = LoraConfig(
    r=args.rank,
    lora_alpha=args.rank,
    init_lora_weights="gaussian",
    target_modules=["to_k", "to_q", "to_v", "to_out.0"],
)

unet.add_adapter(unet_lora_config)
lora_layers = filter(lambda p: p.requires_grad, unet.parameters())
```

Diffusers, gerektiğinde (örneğin Stable Diffusion XL (SDXL) için ince ayar yaparken) [PEFT](https://hf.co/docs/peft) kütüphanesiyle metin kodlayıcısının LoRA ile ince ayarını da destekler. [LoraConfig](https://huggingface.co/docs/peft/main/en/package_reference/lora#peft.LoraConfig), LoRA adaptörünün parametrelerini yapılandırmak için kullanılır; bu parametreler metin kodlayıcıya eklenir ve eğitim için yalnızca LoRA katmanları filtrelenir.

```py
text_lora_config = LoraConfig(
    r=args.rank,
    lora_alpha=args.rank,
    init_lora_weights="gaussian",
    target_modules=["q_proj", "k_proj", "v_proj", "out_proj"],
)

text_encoder_one.add_adapter(text_lora_config)
text_encoder_two.add_adapter(text_lora_config)
text_lora_parameters_one = list(filter(lambda p: p.requires_grad, text_encoder_one.parameters()))
text_lora_parameters_two = list(filter(lambda p: p.requires_grad, text_encoder_two.parameters()))
```

[optimizer](https://github.com/huggingface/diffusers/blob/e4b8f173b97731686e290b2eb98e7f5df2b1b322/examples/text_to_image/train_text_to_image_lora.py#L529), yalnızca optimize edilecek ağırlıklar olduğu için `lora_layers` ile başlatılır:

```py
optimizer = optimizer_cls(
    lora_layers,
    lr=args.learning_rate,
    betas=(args.adam_beta1, args.adam_beta2),
    weight_decay=args.adam_weight_decay,
    eps=args.adam_epsilon,
)
```

LoRA katmanlarını yapılandırmak dışında, eğitim scripti büyük ölçüde train_text_to_image.py ile aynıdır!

## 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. `MODEL_NAME` ve `DATASET_NAME` ortam değişkenlerini sırasıyla model ve veri setine ayarlayın. Ayrıca modelin nereye kaydedileceğini `OUTPUT_DIR` ile ve Hub'a kaydedilecek modelin adını `HUB_MODEL_ID` ile belirtmelisiniz. Betik, repozitorinize aşağıdaki dosyaları oluşturur ve kaydeder:

- kaydedilen model denetim noktaları
- `pytorch_lora_weights.safetensors` (eğitilmiş LoRA ağırlıkları)

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

> [!WARNING]
> Tam bir eğitim çalışması, 11 GB VRAM'li bir 2080 Ti GPU üzerinde yaklaşık 5 saat sürer.

```bash
export MODEL_NAME="stable-diffusion-v1-5/stable-diffusion-v1-5"
export OUTPUT_DIR="/sddata/finetune/lora/naruto"
export HUB_MODEL_ID="naruto-lora"
export DATASET_NAME="lambdalabs/naruto-blip-captions"

accelerate launch --mixed_precision="fp16"  train_text_to_image_lora.py \
  --pretrained_model_name_or_path=$MODEL_NAME \
  --dataset_name=$DATASET_NAME \
  --dataloader_num_workers=8 \
  --resolution=512 \
  --center_crop \
  --random_flip \
  --train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --max_train_steps=15000 \
  --learning_rate=1e-04 \
  --max_grad_norm=1 \
  --lr_scheduler="cosine" \
  --lr_warmup_steps=0 \
  --output_dir=${OUTPUT_DIR} \
  --push_to_hub \
  --hub_model_id=${HUB_MODEL_ID} \
  --report_to=wandb \
  --checkpointing_steps=500 \
  --validation_prompt="A naruto with blue eyes." \
  --seed=1337
```

Eğitim tamamlandıktan sonra, modelinizi çıkarım için kullanabilirsiniz:

```py
from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.load_lora_weights("path/to/lora/model", weight_name="pytorch_lora_weights.safetensors")
image = pipeline("A naruto with blue eyes").images[0]
```

## Sonraki adımlar

LoRA ile yeni bir model 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:

- Kohya ve TheLastBen gibi topluluk eğitimcileri kullanılarak eğitilmiş [farklı LoRA biçimlerini](../tutorials/using_peft_for_inference) nasıl yükleyeceğinizi öğrenin.
- PEFT ile çıkarım için birden fazla LoRA'yı nasıl kullanıp [birleştireceğinizi](../tutorials/using_peft_for_inference) öğrenin.

