Diffusers documentation
Latent Tutarlılık Damıtma
Latent Tutarlılık Damıtma
Latent Consistency Models (LCM), yalnızca birkaç adımda yüksek kaliteli görseller üretebilir; bu, birçok pipeline'ın en az 25+ adım gerektirmesi nedeniyle büyük bir ilerleme niteliğindedir. LCM'ler, herhangi bir Stable Diffusion modeline latent tutarlılık damıtma (distillation) yönteminin uygulanmasıyla elde edilir. Bu yöntem, latent uzaya tek aşamalı yönlendirilmiş damıtma uygulayarak ve damıtma sürecini hızlandırmak için zaman adımlarını tutarlı bir şekilde atlamak üzere adım atlama (skipping-step) yöntemini birleştirerek çalışır (daha fazla ayrıntı için makalenin 4.1, 4.2 ve 4.3 bölümlerine bakınız).
Sınırlı vRAM’a sahip bir GPU üzerinde eğitim yapıyorsanız, bellek kullanımını azaltmak ve eğitimi hızlandırmak için gradient_checkpointing, gradient_accumulation_steps ve mixed_precision özelliklerini etkinleştirmeyi deneyin. xFormers ve bitsandbytes’ 8-bit optimizatörü ile bellek verimli dikkati etkinleştirerek bellek kullanımınızı daha da azaltabilirsiniz.
Bu kılavuz, train_lcm_distill_sd_wds.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 .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:
cd examples/consistency_distillation
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.
🤗 Accelerate ortamını başlatın (eğitimi önemli ölçüde hızlandırmak için torch.compile etkinleştirmeyi deneyin):
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.
Betik parametreleri
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.
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() 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:
accelerate launch train_lcm_distill_sd_wds.py \
--mixed_precision="fp16"Parametrelerin çoğu Metinden görüntüye eğitim kılavuzundaki parametrelerle aynıdır, bu nedenle bu kılavuzda latent tutarlılık damıtmasıyla ilgili parametrelere odaklanacaksınız.
--pretrained_teacher_model: öğretmen modeli olarak kullanılacak önceden eğitilmiş latent difüzyon modelinin yolu--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, fp16'da çalışan madebyollin tarafından geliştirilen (örneğin bu VAE) alternatif bir VAE belirtmenize olanak tanır)--w_minve--w_max: rehberlik ölçeği örneklemesi için minimum ve maksimum rehberlik ölçeği değerleri--num_ddim_timesteps: DDIM örneklemesi için zaman adımı sayısı--loss_type: latent consistency distillation için hesaplanacak kayıp türü (L2 veya Huber); Huber kaybı, aykırı değerlere karşı daha dayanıklı olduğu için genellikle tercih edilir--huber_c: Huber kaybı parametresi
Eğitim betiği
Eğitim betiği, görüntülerin ön işlenmesi ve bir eğitim veri setinin oluşturulması için bir veri seti sınıfı olan Text2ImageDataset oluşturarak başlar.
def transform(example):
image = example["image"]
image = TF.resize(image, resolution, interpolation=transforms.InterpolationMode.BILINEAR)
c_top, c_left, _, _ = transforms.RandomCrop.get_params(image, output_size=(resolution, resolution))
image = TF.crop(image, c_top, c_left, resolution, resolution)
image = TF.to_tensor(image)
image = TF.normalize(image, [0.5], [0.5])
example["image"] = image
return exampleBulut ortamında depolanan büyük veri setlerinin okunması ve yazılmasında performansın artırılması için bu betik, dönüştürmeleri uygulamak ve eğitim için bir veri seti ile dataloader oluşturmak üzere bir ön işleme hattı oluşturmak için WebDataset biçimini kullanır. Görseller, önce tam veri setinin indirilmesine gerek kalmadan işlenir ve eğitim döngüsüne aktarılır.
processing_pipeline = [
wds.decode("pil", handler=wds.ignore_and_continue),
wds.rename(image="jpg;png;jpeg;webp", text="text;txt;caption", handler=wds.warn_and_continue),
wds.map(filter_keys({"image", "text"})),
wds.map(transform),
wds.to_tuple("image", "text"),
]main() fonksiyonunda, gürültü zamanlayıcısı, tokenizörler, metin kodlayıcılar ve VAE gibi gerekli tüm bileşenler yüklenir. Öğretmen UNet de burada yüklenir ve ardından öğretmen UNet'ten bir öğrenci UNet oluşturulabilir. Öğrenci UNet, eğitim sırasında optimizatör tarafından güncellenir.
teacher_unet = UNet2DConditionModel.from_pretrained(
args.pretrained_teacher_model, subfolder="unet", revision=args.teacher_revision
)
unet = UNet2DConditionModel(**teacher_unet.config)
unet.load_state_dict(teacher_unet.state_dict(), strict=False)
unet.train()Şimdi UNet parametrelerini güncellemek için optimizer oluşturabilirsiniz:
optimizer = optimizer_class(
unet.parameters(),
lr=args.learning_rate,
betas=(args.adam_beta1, args.adam_beta2),
weight_decay=args.adam_weight_decay,
eps=args.adam_epsilon,
)veri setini oluşturun:
dataset = Text2ImageDataset(
train_shards_path_or_url=args.train_shards_path_or_url,
num_train_examples=args.max_train_samples,
per_gpu_batch_size=args.train_batch_size,
global_batch_size=args.train_batch_size * accelerator.num_processes,
num_workers=args.dataloader_num_workers,
resolution=args.resolution,
shuffle_buffer_size=1000,
pin_memory=True,
persistent_workers=True,
)
train_dataloader = dataset.train_dataloaderArdından, eğitim döngüsünü kurmaya ve latent tutarlılık damıtma yöntemini uygulamaya hazırsınız (daha fazla ayrıntı için makaledeki Algoritma 1'e bakın). Betiğin bu bölümü, latentlere gürültü ekleme, örneklem alma ve yönlendirme ölçeği gömme oluşturma ile gürültüden orijinal görüntüyü tahmin etme işlemlerini ele alır.
pred_x_0 = predicted_origin(
noise_pred,
start_timesteps,
noisy_model_input,
noise_scheduler.config.prediction_type,
alpha_schedule,
sigma_schedule,
)
model_pred = c_skip_start * noisy_model_input + c_out_start * pred_x_0Ardından öğretmen modelinin tahminlerini ve LCM tahminlerini alır, kaybı hesaplar ve ardından bu kaybı LCM'ye geri yayılım (backpropagation) ile iletir.
if args.loss_type == "l2":
loss = F.mse_loss(model_pred.float(), target.float(), reduction="mean")
elif args.loss_type == "huber":
loss = torch.mean(
torch.sqrt((model_pred.float() - target.float()) ** 2 + args.huber_c**2) - args.huber_c
)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 Pipeline, modeller ve zamanlayıcıları anlama eğitimine göz atın.
Betik başlat
Şimdi eğitim betiğini başlatıp damıtma işlemine başlamak için hazırsınız!
Bu kılavuzda, Hub üzerinde burada saklanan Conceptual Captions 12M veri setinin yolunu belirtmek için --train_shards_path_or_url parametresini kullanacaksınız. MODEL_DIR ortam değişkenini öğretmen modelinin adını, OUTPUT_DIR değişkenini ise modelin kaydedilmesini istediğiniz konumu belirtmek üzere ayarlayın.
export MODEL_DIR="stable-diffusion-v1-5/stable-diffusion-v1-5"
export OUTPUT_DIR="path/to/saved/model"
accelerate launch train_lcm_distill_sd_wds.py \
--pretrained_teacher_model=$MODEL_DIR \
--output_dir=$OUTPUT_DIR \
--mixed_precision=fp16 \
--resolution=512 \
--learning_rate=1e-6 --loss_type="huber" --ema_decay=0.95 --adam_weight_decay=0.0 \
--max_train_steps=1000 \
--max_train_samples=4000000 \
--dataloader_num_workers=8 \
--train_shards_path_or_url="pipe:curl -L -s https://huggingface.co/datasets/laion/conceptual-captions-12m-webdataset/resolve/main/data/{00000..01099}.tar?download=true" \
--validation_steps=200 \
--checkpointing_steps=200 --checkpoints_total_limit=10 \
--train_batch_size=12 \
--gradient_checkpointing --enable_xformers_memory_efficient_attention \
--gradient_accumulation_steps=1 \
--use_8bit_adam \
--resume_from_checkpoint=latest \
--report_to=wandb \
--seed=453645634 \
--push_to_hubEğitim tamamlandığında, yeni LCM'nizi çıkarım için kullanabilirsiniz.
from diffusers import UNet2DConditionModel, DiffusionPipeline, LCMScheduler
import torch
unet = UNet2DConditionModel.from_pretrained("your-username/your-model", dtype=torch.float16, variant="fp16")
pipeline = DiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", unet=unet, dtype=torch.float16, variant="fp16")
pipeline.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
pipeline.to("cuda") # or "mps", "xpu", "cpu"
prompt = "sushi rolls in the form of panda heads, sushi platter"
image = pipeline(prompt, num_inference_steps=4, guidance_scale=1.0).images[0]LoRA
LoRA, eğitilebilir parametre sayısını önemli ölçüde azaltmak için kullanılan bir eğitim tekniğidir. Sonuç olarak, eğitim daha hızlıdır ve elde edilen ağırlıklar çok daha küçük (~100MB) olduğu için saklaması daha kolaydır. LoRA ile eğitim yapmak için train_lcm_distill_lora_sd_wds.py veya train_lcm_distill_lora_sdxl.wds.py betiğini kullanın.
LoRA eğitim betiği, LoRA eğitimi kılavuzunda daha ayrıntılı olarak ele alınır.
Stable Diffusion XL
Stable Diffusion XL (SDXL), yüksek çözünürlüklü görüntüler üreten güçlü bir metinden görüntüye modelidir ve mimarisine ikinci bir metin kodlayıcı ekler. Bir SDXL modelini LoRA ile eğitmek için train_lcm_distill_sdxl_wds.py betiğini kullanın.
SDXL eğitim betiği, SDXL eğitimi kılavuzunda daha ayrıntılı olarak ele alınmaktadır.
Sonraki adımlar
Bir LCM modeli damıttığınız için tebrikler! LCM hakkında daha fazla bilgi edinmek için aşağıdakiler faydalı olabilir:
- Metinden görüntüye, görüntüden görüntüye ve LoRA kontrol noktalarıyla LCM'leri çıkarım için nasıl kullanacağınızı öğrenin.
- SDXL LCM-LoRA'ların süper hızlı çıkarım, kalite karşılaştırmaları, ölçümler ve daha fazlası hakkında daha fazla bilgi edinmek için SDXL in 4 steps with Latent Consistency LoRAs blog yazısını okuyun.