Diffusers documentation
T2I-Adapter
T2I-Adapter
T2I-Adapter, 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 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:
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/t2i_adapter
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 parametre sunar. Tüm parametreler ve açıklamaları parse_args() 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:
accelerate launch train_t2i_adapter_sdxl.py \ ----gradient_accumulation_steps=4
Çok temel ve önemli parametreler Metinden görüntüye 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 belirtme imkanı tanır--crops_coords_top_left_hve--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 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 ve görüntüler ile koşullandırma görüntülerine dönüşümlerin uygulanmasını içerir.
conditioning_image_transforms = transforms.Compose(
[
transforms.Resize(args.resolution, interpolation=transforms.InterpolationMode.BILINEAR),
transforms.CenterCrop(args.resolution),
transforms.ToTensor(),
]
)main() işlevi içinde T2I-Adapter, önceden eğitilmiş bir adaptörden yüklenir ya da rastgele başlatılır:
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, T2I-Adapter parametreleri için başlatılır:
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, adaptör koşullu görüntü ve metin gömüleri, gürültü artığını tahmin etmek için UNet'e iletilir:
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,
).sampleEğ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 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 veri setini kullanacaksınız. İsterseniz kendi veri setinizi oluşturup kullanabilirsiniz (Eğitim için veri seti oluşturma 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:
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
Eğitim ilerlemesini Weights & Biases ile izlemek için eğitim komutuna
--report_to=wandbparametresini ekleyin. Sonuçları takip etmek için eğitim komutuna ayrıca--validation_image,--validation_promptve--validation_stepsparametrelerini de eklemeniz gerekir. Bu, modeli hata ayıklamak ve ara sonuçları görüntülemek için gerçekten faydalı olabilir.
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_hubEğitim tamamlandığında, T2I-Adapter'ınızı çıkarım için kullanabilirsiniz:
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 blog yazısını okuyun.