# Stable Diffusion XL

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

[Stable Diffusion XL (SDXL)](https://hf.co/papers/2307.01952) هو إصدار أكبر وأكثر قوة من نموذج Stable Diffusion، قادر على إنتاج صور بدقة أعلى.

UNet في SDXL أكبر بثلاث مرات، ويضيف النموذج مشفّر نصي ثانٍ إلى البنية. اعتمادًا على العتاد المتاح لك، قد يكون هذا مكلفًا حسابيًا للغاية وقد لا يعمل على وحدة معالجة رسومية استهلاكية مثل Tesla T4. لمساعدة هذا النموذج الأكبر على الاستيعاب في الذاكرة وتسريع التدريب، جرّب تفعيل `gradient_checkpointing` و`mixed_precision` و`gradient_accumulation_steps`. يمكنك تقليل استهلاك الذاكرة بشكل أكبر عن طريق تفعيل الانتباه الموفّر للذاكرة باستخدام [xFormers](../optimization/attention_backends) واستخدام مُحسّن [bitsandbytes'](https://github.com/TimDettmers/bitsandbytes) ذي 8 بت.

This guide will explore the [train_text_to_image_sdxl.py](https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/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.

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

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

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

```bash
cd examples/text_to_image
pip install -r requirements_sdxl.txt
```

> [!TIP]
> 🤗 Accelerate هي مكتبة تساعدك على التدريب على عدة وحدات معالجة رسومية (GPU) أو وحدات معالجة مخصصة (TPU) أو باستخدام دقة مختلطة. ستقوم تلقائيًا بإعداد بيئة التدريب الخاصة بك بناءً على عتادك وبيئتك. اطّلع على [الجولة السريعة](https://huggingface.co/docs/accelerate/quicktour) في 🤗 Accelerate لمعرفة المزيد.

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

```bash
accelerate config
```

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

```bash
accelerate config default
```

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

```py
from accelerate.utils import write_basic_config

write_basic_config()
```

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

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

> [!TIP]
> تسلّط الأقسام التالية الضوء على أجزاء من سكربت التدريب التي تُعدّ مهمة لفهم كيفية تعديله، لكنها لا تغطي كل جانب من جوانب السكربت بالتفصيل. إذا كنت مهتمًا بالتعلّم أكثر، فلا تتردد في قراءة [السكربت](https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/train_text_to_image_sdxl.py) وإعلامنا بأي أسئلة أو مخاوف لديك.

يوفر سكربت التدريب العديد من المعلمات لمساعدتك على تخصيص عملية التدريب. يمكنك العثور على جميع المعلمات ووصفاتها في الدالة [`parse_args()`](https://github.com/huggingface/diffusers/blob/aab6de22c33cc01fb7bc81c0807d6109e2c998c9/examples/text_to_image/train_text_to_image_sdxl.py#L129). توفر هذه الدالة قيمًا افتراضية لكل معلمة، مثل حجم الدفعة التدريبية ومعدل التعلم، لكن يمكنك أيضًا تعيين قيمك الخاصة في أمر التدريب إذا رغبت في ذلك.

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

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

معظم المعلمات متطابقة مع المعلمات في دليل تدريب [النص إلى صورة](text2image#script-parameters)، لذا ستركّز على المعلمات ذات الصلة بتدريب SDXL في هذا الدليل.

- `--pretrained_vae_model_name_or_path`: المسار إلى نموذج VAE مُدرَّب مسبقًا؛ يُعرف أن VAE الخاص بـ SDXL يعاني من عدم استقرار عددي، لذا يتيح لك هذا المعامل تحديد [VAE](https://huggingface.co/madebyollin/sdxl-vae-fp16-fix) أفضل
- `--proportion_empty_prompts`: نسبة أوامر الصور التي سيتم استبدالها بنصوص فارغة
- `--timestep_bias_strategy`: تحديد موضع (في وقت مبكر أو متأخر) تطبيق انحياز ضمن خطوة الزمن، مما قد يشجع النموذج على تعلم تفاصيل ذات تردد منخفض أو مرتفع
- `--timestep_bias_multiplier`: وزن التحيز المطبَّق على خطوة الزمن
- `--timestep_bias_begin`: خطوة الزمن التي يبدأ عندها تطبيق الانحياز
- `--timestep_bias_end`: خطوة الزمن التي ينتهي عندها تطبيق التحيز
- `--timestep_bias_portion`: نسبة الخطوات الزمنية التي يُطبَّق عليها التحيز

### وزن Min-SNR

يمكن لاستراتيجية وزن [Min-SNR](https://huggingface.co/papers/2303.09556) أن تساعد في التدريب من خلال إعادة موازنة الخسارة لتحقيق تقارب أسرع. يدعم سكربت التدريب التنبؤ إما بـ `epsilon` (الضوضاء) أو `v_prediction`، لكن Min-SNR متوافق مع كلا نوعي التنبؤ. لا تدعم هذه الاستراتيجية وزن إلا بواسطة PyTorch.

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

```bash
accelerate launch train_text_to_image_sdxl.py \
  --snr_gamma=5.0
```

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

يُشبه سكربت التدريب أيضًا دليل تدريب [النص إلى صورة](text2image#training-script)، لكنه تم تعديله لدعم تدريب SDXL. سيركز هذا الدليل على الكود الفريد الخاص بسكربت تدريب SDXL.

يبدأ الأمر بإنشاء دوال لـ [تجزئة الأوامر](https://github.com/huggingface/diffusers/blob/aab6de22c33cc01fb7bc81c0807d6109e2c998c9/examples/text_to_image/train_text_to_image_sdxl.py#L478) لحساب تضمينات الأوامر، ولحساب تضمينات الصور باستخدام [VAE](https://github.com/huggingface/diffusers/blob/aab6de22c33cc01fb7bc81c0807d6109e2c998c9/examples/text_to_image/train_text_to_image_sdxl.py#L519). ثم ستقوم بإنشاء دالة لـ [توليد أوزان الخطوات الزمنية](https://github.com/huggingface/diffusers/blob/aab6de22c33cc01fb7bc81c0807d6109e2c998c9/examples/text_to_image/train_text_to_image_sdxl.py#L531) اعتماداً على عدد الخطوات الزمنية واستراتيجية انحياز الخطوة الزمنية المراد تطبيقها.

داخل الدالة [`main()`](https://github.com/huggingface/diffusers/blob/aab6de22c33cc01fb7bc81c0807d6109e2c998c9/examples/text_to_image/train_text_to_image_sdxl.py#L572)، بالإضافة إلى تحميل مُرمِّز (tokenizer)، يقوم السكربت بتحميل مُرمِّز ثانٍ ومُشفِّر نصوص (text encoder) لأن بنية SDXL تستخدم اثنين من كل منهما:

```py
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"
)
```

تُحسب [تضمينات النص الموجه والصورة](https://github.com/huggingface/diffusers/blob/aab6de22c33cc01fb7bc81c0807d6109e2c998c9/examples/text_to_image/train_text_to_image_sdxl.py#L857) أولاً وتُحفظ في الذاكرة، وهو ما لا يُشكّل عادةً مشكلةً في حالة مجموعات البيانات الأصغر، لكنّه قد يؤدي إلى مشاكل في الذاكرة عند التعامل مع مجموعات بيانات أكبر. وإذا كان هذا هو الحال، فيجب عليك حفظ التضمينات المحسوبة مسبقًا على القرص بشكل منفصل، ثم تحميلها إلى الذاكرة أثناء عملية التدريب (راجع هذا [طلب الدمج](https://github.com/huggingface/diffusers/pull/4505) لمزيد من النقاش حول هذا الموضوع).

```py
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 ومُرمِّز الرموز لتحرير بعض الذاكرة:

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

أخيرًا، يتولى [حلقة التدريب](https://github.com/huggingface/diffusers/blob/aab6de22c33cc01fb7bc81c0807d6109e2c998c9/examples/text_to_image/train_text_to_image_sdxl.py#L943) باقي المهام. إذا اخترت تطبيق استراتيجية انحياز خطوة الزمن، فستلاحظ أن أوزان خطوة الزمن تُحسب وتُضاف كضوضاء:

```py
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)
```

إذا كنت ترغب في معرفة المزيد حول كيفية عمل حلقة التدريب، فتوجه إلى شروحات [فهم خطوط الأنابيب والنماذج والمجدولين](../using-diffusers/write_own_pipeline) التي تفصّل النمط الأساسي لعملية إزالة الضوضاء.

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

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

لنقم بالتدريب على مجموعة بيانات [Naruto BLIP captions](https://huggingface.co/datasets/lambdalabs/naruto-blip-captions) لتوليد شخصيات ناروتو الخاصة بك. اضبط متغيرات البيئة `MODEL_NAME` و`DATASET_NAME` على النموذج ومجموعة البيانات (سواءً من Hub أو مسار محلي). كما يجب عليك تحديد VAE غير VAE الخاص بـ SDXL (سواءً من Hub أو مسار محلي) باستخدام `VAE_NAME` لتجنب عدم الاستقرار العددي.

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

```bash
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 الذي درّبته للتو للاستدلال!

```py
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")
```

يتيح لك [PyTorch XLA](https://pytorch.org/xla) تشغيل PyTorch على أجهزة XLA مثل TPUs، والتي قد تكون أسرع. تستغرق خطوة الإحماء الأولية وقتًا أطول لأن النموذج يحتاج إلى التجميع والتحسين. ومع ذلك، تكون الاستدعاءات اللاحقة للخطوة على مدخل **بنفس الطول** كموجّه الأصلية أسرع بكثير لأنه يمكن إعادة استخدام الرسم البياني المحسّن.

```py
from diffusers import DiffusionPipeline
import torch
import torch_xla.core.xla_model as xm

device = xm.xla_device()
pipeline = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0").to(device)

prompt = "A naruto with green eyes and red legs."
start = time()
image = pipeline(prompt, num_inference_steps=inference_steps).images[0]
print(f'Compilation time is {time()-start} sec')
image.save("naruto.png")

start = time()
image = pipeline(prompt, num_inference_steps=inference_steps).images[0]
print(f'Inference time is {time()-start} sec after compilation')
```

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

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

- اقرأ دليل [Stable Diffusion XL](../api/pipelines/stable_diffusion/stable_diffusion_xl) لمعرفة كيفية استخدامه لمجموعة متنوعة من المهام المختلفة (النص إلى الصورة، الصورة إلى الصورة، إعادة الرسم)، وكيفية استخدام نموذج التصفية الخاص به، وأنواع التكييفات الدقيقة المختلفة.
- اطّلع على أدلة تدريب [DreamBooth](dreambooth) و[LoRA](lora) لمعرفة كيفية تدريب نموذج SDXL مخصص باستخدام عدد قليل من الصور الممثّلة. يمكن حتى دمج هاتين التقنيتين في التدريب!

