# Kandinsky 2.2

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

Kandinsky 2.2 هو نموذج نص إلى صورة متعدد اللغات قادر على إنتاج صور أكثر واقعية. يتضمن النموذج نموذجًا مسبقًا للصور لإنشاء تمثيلات (embeddings) للصور من أوامر نصية، ونموذج فك ترميز يولّد الصور بناءً على تمثيلات النموذج المسبق. ولهذا السبب ستجد سكريبتين منفصلين في Diffusers خاصين بـ Kandinsky 2.2، أحدهما لتدريب النموذج المسبق والآخر لتدريب نموذج فك الترميز. يمكنك تدريب كلا النموذجين بشكل منفصل، لكن للحصول على أفضل النتائج، يجب عليك تدريب كل من النموذج المسبق ونموذج فك الترميز.

اعتمادًا على بطاقة الرسوميات لديك، قد تحتاج إلى تفعيل `gradient_checkpointing` (⚠️ غير مدعوم للنموذج السابق!)، و`mixed_precision`، و`gradient_accumulation_steps` للمساعدة في ملاءمة النموذج في الذاكرة وتسريع التدريب. يمكنك تقليل استهلاك الذاكرة بشكل أكبر عن طريق تفعيل الانتباه الموفر للذاكرة باستخدام [xFormers](../optimization/attention_backends) (فشل الإصدار [v0.0.16](https://github.com/huggingface/diffusers/issues/2234#issuecomment-1416931212) في التدريب على بعض بطاقات الرسوميات، لذا قد تحتاج إلى تثبيت إصدار تطويري بدلاً من ذلك).

This guide explores the [train_text_to_image_prior.py](https://github.com/huggingface/diffusers/blob/main/examples/kandinsky2_2/text_to_image/train_text_to_image_prior.py) and the [train_text_to_image_decoder.py](https://github.com/huggingface/diffusers/blob/main/examples/kandinsky2_2/text_to_image/train_text_to_image_decoder.py) scripts 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/kandinsky2_2/text_to_image
pip install -r requirements.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]
> تسلّط الأقسام التالية الضوء على أجزاء من سكربتات التدريب التي تُعدّ مهمة لفهم كيفية تعديلها، لكنها لا تغطي كل جانب من جوانب السكربتات بالتفصيل. إذا كنت مهتمًا بالتعلّم أكثر، فلا تتردد في الاطلاع على السكربتات وإعلامنا بأي أسئلة أو مخاوف لديك.

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

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

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

```bash
accelerate launch train_text_to_image_prior.py \
  --mixed_precision="fp16"
```

معظم المعلمات متطابقة مع المعلمات في دليل تدريب [النص إلى صورة](text2image#script-parameters)، لذا دعونا نتوجه مباشرة إلى شرح سكربتات تدريب Kandinsky!

### وزن 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_prior.py \
  --snr_gamma=5.0
```

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

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

تحتوي الدالة [`main()`](https://github.com/huggingface/diffusers/blob/6e68c71503682c8693cb5b06a4da4911dfd655ee/examples/kandinsky2_2/text_to_image/train_text_to_image_prior.py#L441) على الكود الخاص بإعداد مجموعة البيانات وتدريب النموذج.

من أبرز الفروقات التي ستلاحظها فوراً هو أن سكربت التدريب يُحمّل أيضاً [CLIPImageProcessor](https://huggingface.co/docs/transformers/v5.22.2/en/model_doc/clip#transformers.CLIPImageProcessor) - إلى جانب مُجدول ومُرمّز - لمعالجة الصور مسبقاً، ونموذج [CLIPVisionModelWithProjection](https://huggingface.co/docs/transformers/v5.22.2/en/model_doc/clip#transformers.CLIPVisionModelWithProjection) لتشفير الصور:

```py
noise_scheduler = DDPMScheduler(beta_schedule="squaredcos_cap_v2", prediction_type="sample")
image_processor = CLIPImageProcessor.from_pretrained(
    args.pretrained_prior_model_name_or_path, subfolder="image_processor"
)
tokenizer = CLIPTokenizer.from_pretrained(args.pretrained_prior_model_name_or_path, subfolder="tokenizer")

with ContextManagers(deepspeed_zero_init_disabled_context_manager()):
    image_encoder = CLIPVisionModelWithProjection.from_pretrained(
        args.pretrained_prior_model_name_or_path, subfolder="image_encoder", dtype=weight_dtype
    ).eval()
    text_encoder = CLIPTextModelWithProjection.from_pretrained(
        args.pretrained_prior_model_name_or_path, subfolder="text_encoder", dtype=weight_dtype
    ).eval()
```

يستخدم Kandinsky نموذج [PriorTransformer](/docs/diffusers/v0.43.0/ar/api/models/prior_transformer#diffusers.PriorTransformer) لتوليد تمثيلات الصور، لذا ستحتاج إلى إعداد المُحسِّن (optimizer) ليتعلم معاملات وضع المسبق (prior mode).

```py
prior = PriorTransformer.from_pretrained(args.pretrained_prior_model_name_or_path, subfolder="prior")
prior.train()
optimizer = optimizer_cls(
    prior.parameters(),
    lr=args.learning_rate,
    betas=(args.adam_beta1, args.adam_beta2),
    weight_decay=args.adam_weight_decay,
    eps=args.adam_epsilon,
)
```

بعد ذلك، يتم تحويل عناوين الإدخال إلى رموز، وتتم [معالجة الصور مسبقاً](https://github.com/huggingface/diffusers/blob/6e68c71503682c8693cb5b06a4da4911dfd655ee/examples/kandinsky2_2/text_to_image/train_text_to_image_prior.py#L632) بواسطة [CLIPImageProcessor](https://huggingface.co/docs/transformers/v5.22.2/en/model_doc/clip#transformers.CLIPImageProcessor):

```py
def preprocess_train(examples):
    images = [image.convert("RGB") for image in examples[image_column]]
    examples["clip_pixel_values"] = image_processor(images, return_tensors="pt").pixel_values
    examples["text_input_ids"], examples["text_mask"] = tokenize_captions(examples)
    return examples
```

أخيرًا، يقوم [حلقة التدريب](https://github.com/huggingface/diffusers/blob/6e68c71503682c8693cb5b06a4da4911dfd655ee/examples/kandinsky2_2/text_to_image/train_text_to_image_prior.py#L718) بتحويل الصور المدخلة إلى كامنات، وإضافة ضوضاء إلى تضمينات الصور، وإجراء تنبؤ:

```py
model_pred = prior(
    noisy_latents,
    timestep=timesteps,
    proj_embedding=prompt_embeds,
    encoder_hidden_states=text_encoder_hidden_states,
    attention_mask=text_mask,
).predicted_image_embedding
```

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

تحتوي الدالة [`main()`](https://github.com/huggingface/diffusers/blob/6e68c71503682c8693cb5b06a4da4911dfd655ee/examples/kandinsky2_2/text_to_image/train_text_to_image_decoder.py#L440) على الكود الخاص بإعداد مجموعة البيانات وتدريب النموذج.

على عكس النموذج السابق، يقوم المُفكِّك بتهيئة [VQModel](/docs/diffusers/v0.43.0/ar/api/models/vq#diffusers.VQModel) لفك ترميز الكمونيات إلى صور، كما يستخدم [UNet2DConditionModel](/docs/diffusers/v0.43.0/ar/api/models/unet2d-cond#diffusers.UNet2DConditionModel):

```py
with ContextManagers(deepspeed_zero_init_disabled_context_manager()):
    vae = VQModel.from_pretrained(
        args.pretrained_decoder_model_name_or_path, subfolder="movq", dtype=weight_dtype
    ).eval()
    image_encoder = CLIPVisionModelWithProjection.from_pretrained(
        args.pretrained_prior_model_name_or_path, subfolder="image_encoder", dtype=weight_dtype
    ).eval()
unet = UNet2DConditionModel.from_pretrained(args.pretrained_decoder_model_name_or_path, subfolder="unet")
```

بعد ذلك، يتضمن السكربت عدة تحويلات للصور ودالة [معالجة مسبقة](https://github.com/huggingface/diffusers/blob/6e68c71503682c8693cb5b06a4da4911dfd655ee/examples/kandinsky2_2/text_to_image/train_text_to_image_decoder.py#L622) لتطبيق هذه التحويلات على الصور وإرجاع قيم البكسل:

```py
def preprocess_train(examples):
    images = [image.convert("RGB") for image in examples[image_column]]
    examples["pixel_values"] = [train_transforms(image) for image in images]
    examples["clip_pixel_values"] = image_processor(images, return_tensors="pt").pixel_values
    return examples
```

أخيرًا، يتولى [حلقة التدريب](https://github.com/huggingface/diffusers/blob/6e68c71503682c8693cb5b06a4da4911dfd655ee/examples/kandinsky2_2/text_to_image/train_text_to_image_decoder.py#L706) تحويل الصور إلى كامنات، وإضافة الضوضاء، والتنبؤ بباقي الضوضاء.

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

```py
model_pred = unet(noisy_latents, timesteps, None, added_cond_kwargs=added_cond_kwargs).sample[:, :4]
```

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

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

ستقوم بالتدريب على مجموعة بيانات [Naruto BLIP captions](https://huggingface.co/datasets/lambdalabs/naruto-blip-captions) لتوليد شخصيات ناروتو الخاصة بك، لكن يمكنك أيضاً إنشاء مجموعة بياناتك الخاصة والتدريب عليها باتباع دليل [Create a dataset for training](create_dataset). اضبط متغير البيئة `DATASET_NAME` على اسم مجموعة البيانات على Hub، أو إذا كنت تتدرب على ملفاتك الخاصة، اضبط متغير البيئة `TRAIN_DIR` على مسار مجموعة بياناتك.

إذا كنت تدرب على أكثر من وحدة معالجة رسومية واحدة، أضف معامل `--multi_gpu` إلى أمر `accelerate launch`.

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

```bash
export DATASET_NAME="lambdalabs/naruto-blip-captions"

accelerate launch --mixed_precision="fp16"  train_text_to_image_prior.py \
  --dataset_name=$DATASET_NAME \
  --resolution=768 \
  --train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --max_train_steps=15000 \
  --learning_rate=1e-05 \
  --max_grad_norm=1 \
  --checkpoints_total_limit=3 \
  --lr_scheduler="constant" \
  --lr_warmup_steps=0 \
  --validation_prompts="A robot naruto, 4k photo" \
  --report_to="wandb" \
  --push_to_hub \
  --output_dir="kandi2-prior-naruto-model"
```

```bash
export DATASET_NAME="lambdalabs/naruto-blip-captions"

accelerate launch --mixed_precision="fp16"  train_text_to_image_decoder.py \
  --dataset_name=$DATASET_NAME \
  --resolution=768 \
  --train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --gradient_checkpointing \
  --max_train_steps=15000 \
  --learning_rate=1e-05 \
  --max_grad_norm=1 \
  --checkpoints_total_limit=3 \
  --lr_scheduler="constant" \
  --lr_warmup_steps=0 \
  --validation_prompts="A robot naruto, 4k photo" \
  --report_to="wandb" \
  --push_to_hub \
  --output_dir="kandi2-decoder-naruto-model"
```

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

```py
from diffusers import AutoPipelineForText2Image, DiffusionPipeline
import torch

prior_pipeline = DiffusionPipeline.from_pretrained(output_dir, dtype=torch.float16)
prior_components = {"prior_" + k: v for k,v in prior_pipeline.components.items()}
pipeline = AutoPipelineForText2Image.from_pretrained("kandinsky-community/kandinsky-2-2-decoder", **prior_components, dtype=torch.float16)

pipe.enable_model_cpu_offload()
prompt="A robot naruto, 4k photo"
image = pipeline(prompt=prompt, negative_prompt=negative_prompt).images[0]
```

> [!TIP]
> لا تتردد في استبدال `kandinsky-community/kandinsky-2-2-decoder` بنقطة فحص decoder التي دربتها بنفسك!

```py
from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained("path/to/saved/model", dtype=torch.float16)
pipeline.enable_model_cpu_offload()

prompt="A robot naruto, 4k photo"
image = pipeline(prompt=prompt).images[0]
```

لنموذج المُفكِّك، يمكنك أيضًا تنفيذ الاستدلال من نقطة حفظ محفوظة، وهو ما قد يكون مفيدًا لعرض النتائج الوسيطة. في هذه الحالة، حمّل نقطة الحفظ إلى UNet:

```py
from diffusers import AutoPipelineForText2Image, UNet2DConditionModel

unet = UNet2DConditionModel.from_pretrained("path/to/saved/model" + "/checkpoint-<N>/unet")

pipeline = AutoPipelineForText2Image.from_pretrained("kandinsky-community/kandinsky-2-2-decoder", unet=unet, dtype=torch.float16)
pipeline.enable_model_cpu_offload()

image = pipeline(prompt="A robot naruto, 4k photo").images[0]
```

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

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

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

