Diffusers documentation
LoRA
LoRA
Bu deneyseldir ve API gelecekte değişebilir.
LoRA (Low-Rank Adaptation of Large Language Models), 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.
LoRA çok yönlüdür ve DreamBooth, Kandinsky 2.2, Stable Diffusion XL ve metinden görüntüye için desteklenmektedir.
Bu kılavuz, 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:
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 betik için gerekli bağımlılıkları yükleyin:
cd examples/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 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 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() 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:
accelerate launch train_text_to_image_lora.py \ --num_train_epochs=150 \
Çok temel ve önemli parametreler Metinden görüntüye 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() 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 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 kütüphanesinden 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.
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 kütüphanesiyle metin kodlayıcısının LoRA ile ince ayarını da destekler. 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.
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, yalnızca optimize edilecek ağırlıklar olduğu için lora_layers ile başlatılır:
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 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.
Tam bir eğitim çalışması, 11 GB VRAM'li bir 2080 Ti GPU üzerinde yaklaşık 5 saat sürer.
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=1337Eğitim tamamlandıktan sonra, modelinizi çıkarım için kullanabilirsiniz:
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 nasıl yükleyeceğinizi öğrenin.
- PEFT ile çıkarım için birden fazla LoRA’yı nasıl kullanıp birleştireceğinizi öğrenin.