Diffusers documentation

Stable Diffusion XL

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Stable Diffusion XL

هذا النص برمجي تجريبي، ومن السهل أن يحدث فيه ملاءمة زائدة (overfitting) أو أن تواجه مشاكل مثل النسيان الكارثي (catastrophic forgetting). جرّب استكشاف معاملات فائقة (hyperparameters) مختلفة للحصول على أفضل النتائج على مجموعة البيانات الخاصة بك.

Stable Diffusion XL (SDXL) هو إصدار أكبر وأكثر قوة من نموذج Stable Diffusion، قادر على إنتاج صور بدقة أعلى.

UNet في SDXL أكبر بثلاث مرات، ويضيف النموذج مشفّر نصي ثانٍ إلى البنية. اعتمادًا على العتاد المتاح لك، قد يكون هذا مكلفًا حسابيًا للغاية وقد لا يعمل على وحدة معالجة رسومية استهلاكية مثل Tesla T4. لمساعدة هذا النموذج الأكبر على الاستيعاب في الذاكرة وتسريع التدريب، جرّب تفعيل gradient_checkpointing وmixed_precision وgradient_accumulation_steps. يمكنك تقليل استهلاك الذاكرة بشكل أكبر عن طريق تفعيل الانتباه الموفّر للذاكرة باستخدام xFormers واستخدام مُحسّن 8-بت من bitsandbytes.

This guide will explore the train_text_to_image_sdxl.py training script to help you become more familiar with it, and how you can adapt it for your own use-case.

قبل تشغيل السكربت، تأكد من تثبيت المكتبة من المصدر:

git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .

ثم انتقل إلى مجلد المثال الذي يحتوي على سكربت التدريب وقم بتثبيت التبعيات المطلوبة للسكربت الذي تستخدمه:

cd examples/text_to_image
pip install -r requirements_sdxl.txt

🤗 Accelerate هي مكتبة تساعدك على التدريب على عدة وحدات معالجة رسومية (GPU) أو وحدات معالجة مخصصة (TPU) أو باستخدام دقة مختلطة. ستقوم تلقائيًا بإعداد بيئة التدريب الخاصة بك بناءً على عتادك وبيئتك. اطّلع على جولة سريعة في 🤗 Accelerate لمعرفة المزيد.

قم بتهيئة بيئة 🤗 Accelerate:

accelerate config

لإعداد بيئة 🤗 Accelerate افتراضية دون اختيار أي تكوينات:

accelerate config default

أو إذا لم يدعم بيئتك shell تفاعليًا، كما هو الحال في notebook، يمكنك استخدام:

from accelerate.utils import write_basic_config

write_basic_config()

أخيرًا، إذا كنت ترغب في تدريب نموذج على مجموعة بياناتك الخاصة، فاطّلع على دليل إنشاء مجموعة بيانات للتدريب لمعرفة كيفية إنشاء مجموعة بيانات تعمل مع سكربت التدريب.

معاملات السكربت

تسلّط الأقسام التالية الضوء على أجزاء من سكربت التدريب التي تُعدّ مهمة لفهم كيفية تعديله، لكنها لا تغطي كل جانب من جوانب السكربت بالتفصيل. إذا كنت مهتمًا بالتعلّم أكثر، فلا تتردد في الاطلاع على السكربت وإعلامنا بأي أسئلة أو مخاوف لديك.

يوفر سكربت التدريب العديد من المعلمات لمساعدتك على تخصيص عملية التدريب. يمكنك العثور على جميع المعلمات ووصفاتها في الدالة parse_args(). توفر هذه الدالة قيمًا افتراضية لكل معلمة، مثل حجم الدفعة التدريبية ومعدل التعلم، لكن يمكنك أيضًا تعيين قيمك الخاصة في أمر التدريب إذا رغبت في ذلك.

على سبيل المثال، لتسريع التدريب باستخدام الدقة المختلطة بتنسيق bf16، أضف معامل --mixed_precision إلى أمر التدريب:

accelerate launch train_text_to_image_sdxl.py \
  --mixed_precision="bf16"

معظم المعلمات متطابقة مع المعلمات في دليل تدريب النص إلى صورة، لذا ستركّز على المعلمات ذات الصلة بتدريب SDXL في هذا الدليل.

  • --pretrained_vae_model_name_or_path: المسار إلى نموذج VAE مُدرَّب مسبقًا؛ يُعرف أن VAE الخاص بـ SDXL يعاني من عدم استقرار عددي، لذا يتيح لك هذا المعامل تحديد VAE أفضل
  • --proportion_empty_prompts: نسبة أوامر الصور التي سيتم استبدالها بنصوص فارغة
  • --timestep_bias_strategy: تحديد موضع (في وقت مبكر أو متأخر) تطبيق انحياز ضمن خطوة الزمن، مما قد يشجع النموذج على تعلم تفاصيل ذات تردد منخفض أو مرتفع
  • --timestep_bias_multiplier: وزن التحيز المطبَّق على خطوة الزمن
  • --timestep_bias_begin: خطوة الزمن التي يبدأ عندها تطبيق الانحياز
  • --timestep_bias_end: خطوة الزمن التي ينتهي عندها تطبيق التحيز
  • --timestep_bias_portion: نسبة الخطوات الزمنية التي يُطبَّق عليها التحيز

وزن Min-SNR

يمكن لاستراتيجية وزن Min-SNR أن تساعد في التدريب من خلال إعادة موازنة الخسارة لتحقيق تقارب أسرع. يدعم سكربت التدريب التنبؤ إما بـ epsilon (الضوضاء) أو v_prediction، لكن Min-SNR متوافق مع كلا نوعي التنبؤ. لا تدعم هذه الاستراتيجية وزن إلا بواسطة PyTorch.

أضف معامل --snr_gamma واضبطه على القيمة الموصى بها وهي 5.0:

accelerate launch train_text_to_image_sdxl.py \
  --snr_gamma=5.0

سكربت التدريب

يُشبه سكربت التدريب أيضًا دليل تدريب النص إلى صورة، لكنه تم تعديله لدعم تدريب SDXL. سيركز هذا الدليل على الكود الفريد في سكربت تدريب SDXL.

يبدأ الأمر بإنشاء دوال لـ تجزئة الأوامر لحساب تضمينات الأوامر، ولحساب تضمينات الصور باستخدام VAE. ثم ستقوم بإنشاء دالة لـ توليد أوزان الخطوات الزمنية اعتماداً على عدد الخطوات الزمنية واستراتيجية انحياز الخطوة الزمنية المراد تطبيقها.

داخل الدالة main()، بالإضافة إلى تحميل مُرمِّز (tokenizer)، يقوم السكربت بتحميل مُرمِّز ثانٍ ومُشفِّر نصوص (text encoder) لأن بنية SDXL تستخدم اثنين من كل منهما:

tokenizer_one = AutoTokenizer.from_pretrained(
    args.pretrained_model_name_or_path, subfolder="tokenizer", revision=args.revision, use_fast=False
)
tokenizer_two = AutoTokenizer.from_pretrained(
    args.pretrained_model_name_or_path, subfolder="tokenizer_2", revision=args.revision, use_fast=False
)

text_encoder_cls_one = import_model_class_from_model_name_or_path(
    args.pretrained_model_name_or_path, args.revision
)
text_encoder_cls_two = import_model_class_from_model_name_or_path(
    args.pretrained_model_name_or_path, args.revision, subfolder="text_encoder_2"
)

تُحسب تضمينات النص الموجه والصورة أولاً وتُحفظ في الذاكرة، وهو ما لا يُشكّل عادةً مشكلةً في حالة مجموعات البيانات الأصغر، لكنّه قد يؤدي إلى مشاكل في الذاكرة عند التعامل مع مجموعات بيانات أكبر. وإذا كان هذا هو الحال، فيجب عليك حفظ التضمينات المحسوبة مسبقًا على القرص بشكل منفصل، ثم تحميلها إلى الذاكرة أثناء عملية التدريب (راجع هذا طلب الدمج لمزيد من النقاش حول هذا الموضوع).

text_encoders = [text_encoder_one, text_encoder_two]
tokenizers = [tokenizer_one, tokenizer_two]
compute_embeddings_fn = functools.partial(
    encode_prompt,
    text_encoders=text_encoders,
    tokenizers=tokenizers,
    proportion_empty_prompts=args.proportion_empty_prompts,
    caption_column=args.caption_column,
)

train_dataset = train_dataset.map(compute_embeddings_fn, batched=True, new_fingerprint=new_fingerprint)
train_dataset = train_dataset.map(
    compute_vae_encodings_fn,
    batched=True,
    batch_size=args.train_batch_size * accelerator.num_processes * args.gradient_accumulation_steps,
    new_fingerprint=new_fingerprint_for_vae,
)

بعد حساب التضمينات، يتم حذف مُشفِّر النص وVAE ومُرمِّز الرموز لتحرير بعض الذاكرة:

del text_encoders, tokenizers, vae
gc.collect()
torch.cuda.empty_cache()

أخيرًا، يتولى حلقة التدريب باقي المهام. إذا اخترت تطبيق استراتيجية انحياز خطوة الزمن، فستلاحظ أن أوزان خطوة الزمن تُحسب وتُضاف كضوضاء:

weights = generate_timestep_weights(args, noise_scheduler.config.num_train_timesteps).to(
        model_input.device
    )
    timesteps = torch.multinomial(weights, bsz, replacement=True).long()

noisy_model_input = noise_scheduler.add_noise(model_input, noise, timesteps)

إذا كنت ترغب في معرفة المزيد حول كيفية عمل حلقة التدريب، فتوجه إلى شروحات فهم خطوط الأنابيب والنماذج والمجدولين التي تفصّل النمط الأساسي لعملية إزالة الضوضاء.

تشغيل السكربت

بمجرد أن تُجري جميع تعديلاتك أو تكون راضياً عن الإعداد الافتراضي، تكون مستعداً لإطلاق سكربت التدريب! 🚀

لنقم بالتدريب على مجموعة بيانات Naruto BLIP captions لتوليد شخصيات ناروتو الخاصة بك. اضبط متغيرات البيئة MODEL_NAME وDATASET_NAME على النموذج ومجموعة البيانات (سواءً من Hub أو مسار محلي). كما يجب عليك تحديد VAE غير VAE الخاص بـ SDXL (سواءً من Hub أو مسار محلي) باستخدام VAE_NAME لتجنب عدم الاستقرار العددي.

لمراقبة تقدم التدريب باستخدام Weights & Biases، أضف معامل --report_to=wandb إلى أمر التدريب. كما ستحتاج إلى إضافة --validation_prompt و--validation_epochs إلى أمر التدريب لتتبع النتائج. وقد يكون ذلك مفيدًا للغاية لتصحيح أخطاء النموذج وعرض النتائج الوسيطة.

export MODEL_NAME="stabilityai/stable-diffusion-xl-base-1.0"
export VAE_NAME="madebyollin/sdxl-vae-fp16-fix"
export DATASET_NAME="lambdalabs/naruto-blip-captions"

accelerate launch train_text_to_image_sdxl.py \
  --pretrained_model_name_or_path=$MODEL_NAME \
  --pretrained_vae_model_name_or_path=$VAE_NAME \
  --dataset_name=$DATASET_NAME \
  --enable_xformers_memory_efficient_attention \
  --resolution=512 \
  --center_crop \
  --random_flip \
  --proportion_empty_prompts=0.2 \
  --train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --gradient_checkpointing \
  --max_train_steps=10000 \
  --use_8bit_adam \
  --learning_rate=1e-06 \
  --lr_scheduler="constant" \
  --lr_warmup_steps=0 \
  --mixed_precision="fp16" \
  --report_to="wandb" \
  --validation_prompt="a cute Sundar Pichai creature" \
  --validation_epochs 5 \
  --checkpointing_steps=5000 \
  --output_dir="sdxl-naruto-model" \
  --push_to_hub

بعد الانتهاء من التدريب، يمكنك استخدام نموذج SDXL الذي درّبته للتو للاستدلال!

PyTorch
PyTorch XLA
from diffusers import DiffusionPipeline
import torch

pipeline = DiffusionPipeline.from_pretrained("path/to/your/model", dtype=torch.float16).to("cuda")  # or "mps", "xpu", "cpu"

prompt = "A naruto with green eyes and red legs."
image = pipeline(prompt, num_inference_steps=30, guidance_scale=7.5).images[0]
image.save("naruto.png")

الخطوات التالية

تهانينا على تدريب نموذج SDXL! لمعرفة المزيد حول كيفية استخدام نموذجك الجديد، قد تكون الأدلة التالية مفيدة:

  • اقرأ دليل Stable Diffusion XL لمعرفة كيفية استخدامه لمجموعة متنوعة من المهام المختلفة (النص إلى الصورة، الصورة إلى الصورة، إعادة الرسم)، وكيفية استخدام نموذج التصفية الخاص به، وأنواع التكييفات الدقيقة المختلفة.
  • اطّلع على أدلة تدريب DreamBooth وLoRA لمعرفة كيفية تدريب نموذج SDXL مخصص باستخدام عدد قليل من الصور الممثّلة. يمكن حتى دمج هاتين التقنيتين في التدريب!
Update on GitHub