# PixArt-α

![](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/pixart/header_collage.png)

[PixArt-α: Fast Training of Diffusion Transformer for Photorealistic Text-to-Image Synthesis](https://huggingface.co/papers/2310.00426) من تأليف Junsong Chen وJincheng Yu وChongjian Ge وLewei Yao وEnze Xie وYue Wu وZhongdao Wang وJames Kwok وPing Luo وHuchuan Lu وZhenguo Li.

ملخص الورقة البحثية هو:

*تتطلب أحدث نماذج تحويل النص إلى صورة (T2I) تكاليف تدريب كبيرة (مثل ملايين ساعات المعالجات الرسومية GPU)، مما يعيق بشكل جدي الابتكار الأساسي لمجتمع توليد المحتوى بالذكاء الاصطناعي (AIGC) مع زيادة انبعاثات ثاني أكسيد الكربون. يقدم هذا الورقة البحثية PIXART-α، وهو نموذج انتشار (diffusion) لتحويل النص إلى صورة يعتمد على Transformer، حيث تنافس جودة توليد الصور فيه أحدث مولدات الصور (مثل Imagen و SDXL وحتى Midjourney)، ليصل إلى معايير قريبة من التطبيقات التجارية. بالإضافة إلى ذلك، يدعم تركيب صور عالية الدقة تصل إلى دقة 1024 بكسل بتكلفة تدريب منخفضة، كما هو موضح في الشكلين 1 و 2. لتحقيق هذا الهدف، تم اقتراح ثلاثة تصاميم أساسية: (1) تفكيك استراتيجية التدريب: قمنا بتصميم ثلاث خطوات تدريبية متميزة تحسّن بشكل منفصل اعتماديات البكسل، ومواءمة النص مع الصورة، والجودة الجمالية للصورة؛ (2) Transformer فعال لتحويل النص إلى صورة: قمنا بدمج وحدات الانتباه المتقاطع (cross-attention) في Diffusion Transformer (DiT) لحقن شروط النص وتبسيط فرع شرط الفئة الذي يستهلك الكثير من الحسابات؛ (3) بيانات غنية بالمعلومات: نؤكد على أهمية كثافة المفاهيم في أزواج النص والصورة، ونستفيد من نموذج كبير للغة والرؤية (Vision-Language) لتوسيم تلقائي لوصوف زائفة كثيفة لمساعدة تعلم مواءمة النص مع الصورة. ونتيجة لذلك، تتفوق سرعة تدريب PIXART-α بشكل ملحوظ على نماذج T2I الكبيرة الحالية، فمثلاً يستغرق PIXART-α فقط 10.8% من وقت تدريب Stable Diffusion v1.5 (675 مقابل 6,250 يوم معالج رسومي A100)، مما يوفر ما يقرب من 300,000 دولار (26,000 مقابل 320,000 دولار) ويقلل انبعاثات ثاني أكسيد الكربون بنسبة 90%. علاوة على ذلك، مقارنةً بنموذج SOTA الأكبر، RAPHAEL، فإن تكلفة تدريبنا لا تتجاوز 1% فقط. تُظهر التجارب الواسعة أن PIXART-α يتفوق في جودة الصورة، والفن، والتحكم الدلالي. نأمل أن يوفر PIXART-α رؤى جديدة لمجتمع AIGC والشركات الناشئة لتسريع بناء نماذج توليدية عالية الجودة ومنخفضة التكلفة من الصفر.*

يمكنك العثور على قاعدة الأكواد الأصلية في [PixArt-alpha/PixArt-alpha](https://github.com/PixArt-alpha/PixArt-alpha) وجميع نقاط التفتيش المتاحة في [PixArt-alpha](https://huggingface.co/PixArt-alpha).

بعض الملاحظات حول هذا الخط:

* يستخدم عمودًا من نوع Transformer (بدلًا من UNet) لإزالة الضوضاء. وبذلك، فهو يملك بنية معمارية مشابهة لبنية [DiT](./dit).
* تم تدريبه باستخدام شروط نصية محسوبة من T5. يجعل هذا الجانب خط الأنابيب أفضل في اتباع الأوامر النصية المعقدة التي تتضمن تفاصيل دقيقة.
* يتميز بقدرته على إنتاج صور عالية الدقة بنسب أبعاد مختلفة. للحصول على أفضل النتائج، يوصي المؤلفون ببعض نطاقات الأحجام التي يمكن العثور عليها [هنا](https://github.com/PixArt-alpha/PixArt-alpha/blob/08fbbd281ec96866109bdd2cdb75f2f58fb17610/diffusion/data/datasets/utils.py).
* يتنافس مع جودة أنظمة توليد الصور من النص المتطورة (حتى تاريخ كتابة هذا النص) مثل Stable Diffusion XL وImagen وDALL-E 2، مع كونه أكثر كفاءة منها.

> [!TIP]
> تأكد من الاطلاع على [دليل المجدولين](../../using-diffusers/schedulers) لمعرفة كيفية استكشاف التوازن بين سرعة المجدول وجودة النتائج، واطّلع على قسم [إعادة استخدام المكونات عبر خطوط الأنابيب](../../using-diffusers/loading#reusing-models-in-multiple-pipelines) لمعرفة كيفية تحميل نفس المكونات بكفاءة في خطوط أنابيب متعددة.

## الاستدلال باستخدام ذاكرة GPU أقل من 8GB

شغّل [PixArtAlphaPipeline](/docs/diffusers/main/ar/api/pipelines/pixart#diffusers.PixArtAlphaPipeline) باستخدام أقل من 8 جيجابايت من ذاكرة GPU VRAM عن طريق تحميل مُشفّر النص بدقة 8 بت. دعونا نستعرض مثالًا كاملًا.

أولاً، ثبّت مكتبة [bitsandbytes](https://github.com/TimDettmers/bitsandbytes):

```bash
pip install -U bitsandbytes
```

ثم حمّل مُشفِّر النص بدقة 8 بت:

```python
from transformers import T5EncoderModel
from diffusers import PixArtAlphaPipeline
import torch

text_encoder = T5EncoderModel.from_pretrained(
    "PixArt-alpha/PixArt-XL-2-1024-MS",
    subfolder="text_encoder",
    load_in_8bit=True,
    device_map="auto",

)
pipe = PixArtAlphaPipeline.from_pretrained(
    "PixArt-alpha/PixArt-XL-2-1024-MS",
    text_encoder=text_encoder,
    transformer=None,
    device_map="auto"
)
```

الآن، استخدم `pipe` لتشفير موجه:

```python
with torch.no_grad():
    prompt = "cute cat"
    prompt_embeds, prompt_attention_mask, negative_embeds, negative_prompt_attention_mask = pipe.encode_prompt(prompt)
```

بما أن تمثيلات النص (Embeddings) قد تم حسابها، احذف `text_encoder` و`pipe` من الذاكرة، وأطلق بعض ذاكرة GPU:

```python
import gc

def flush():
    gc.collect()
    torch.cuda.empty_cache()

del text_encoder
del pipe
flush()
```

ثم احسب الكمونيات باستخدام تضمينات الموجه كمدخلات:

```python
pipe = PixArtAlphaPipeline.from_pretrained(
    "PixArt-alpha/PixArt-XL-2-1024-MS",
    text_encoder=None,
    dtype=torch.float16,
).to("cuda")  # or "mps", "xpu", "cpu"

latents = pipe(
    negative_prompt=None,
    prompt_embeds=prompt_embeds,
    negative_prompt_embeds=negative_embeds,
    prompt_attention_mask=prompt_attention_mask,
    negative_prompt_attention_mask=negative_prompt_attention_mask,
    num_images_per_prompt=1,
    output_type="latent",
).images

del pipe.transformer
flush()
```

> [!TIP]
> لاحظ أنه عند تهيئة `pipe`، تقوم بإعداد `text_encoder` ليكون `None` حتى لا يتم تحميله.

بمجرد حساب الكمونيات، مررها إلى VAE لتفكيكها إلى صورة حقيقية:

```python
with torch.no_grad():
    image = pipe.vae.decode(latents / pipe.vae.config.scaling_factor, return_dict=False)[0]
image = pipe.image_processor.postprocess(image, output_type="pil")[0]
image.save("cat.png")
```

من خلال حذف المكونات التي لا تستخدمها وإفراغ ذاكرة GPU VRAM، يجب أن تتمكن من تشغيل [PixArtAlphaPipeline](/docs/diffusers/main/ar/api/pipelines/pixart#diffusers.PixArtAlphaPipeline) باستخدام أقل من 8GB من ذاكرة GPU VRAM.

![](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/pixart/8bits_cat.png)

إذا كنت ترغب في الحصول على تقرير لاستهلاك الذاكرة، فقم بتشغيل هذا [السكربت](https://gist.github.com/sayakpaul/3ae0f847001d342af27018a96f467e4e).

> [!WARNING]
> يمكن أن تؤثر تضمينات النص المحسوبة بدقة 8 بت على جودة الصور المولّدة بسبب فقدان المعلومات في فضاء التمثيل الناتج عن تقليل الدقة. يُوصى بمقارنة المخرجات مع وبدون استخدام 8 بت.

عند تحميل `text_encoder`، قمت بتعيين `load_in_8bit` إلى `True`. يمكنك أيضاً تحديد `load_in_4bit` لتقليل متطلبات الذاكرة بشكل أكبر إلى أقل من 7 جيجابايت.

## PixArtAlphaPipeline[[diffusers.PixArtAlphaPipeline]]

#### diffusers.PixArtAlphaPipeline[[diffusers.PixArtAlphaPipeline]]

```python
diffusers.PixArtAlphaPipeline(tokenizer: T5Tokenizer, text_encoder: T5EncoderModel, vae: AutoencoderKL, transformer: PixArtTransformer2DModel, scheduler: DPMSolverMultistepScheduler)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/pixart_alpha/pipeline_pixart_alpha.py#L241)

**المعاملات:**

vae ([AutoencoderKL](/docs/diffusers/main/ar/api/models/autoencoderkl#diffusers.AutoencoderKL)) : نموذج الترميز التحويلي التبايني (VAE) لتشفير وفك تشفير الصور إلى تمثيلات كامنة ومنها.

text_encoder (`T5EncoderModel`) : مُشفِّر نص ثابت. يستخدم PixArt-Alpha [T5](https://huggingface.co/docs/transformers/model_doc/t5#transformers.T5EncoderModel)، وتحديداً النسخة [t5-v1_1-xxl](https://huggingface.co/PixArt-alpha/PixArt-alpha/tree/main/t5-v1_1-xxl).

tokenizer (`T5Tokenizer`) : مُجزِّئ من الفئة [T5Tokenizer](https://huggingface.co/docs/transformers/model_doc/t5#transformers.T5Tokenizer).

transformer ([PixArtTransformer2DModel](/docs/diffusers/main/ar/api/models/pixart_transformer2d#diffusers.PixArtTransformer2DModel)) : نموذج `PixArtTransformer2DModel` مشروط بالنص لإزالة الضوضاء من كامنات الصورة المُرمّزة. نُشر في الأصل باسم [`Transformer2DModel`](https://huggingface.co/PixArt-alpha/PixArt-XL-2-1024-MS/blob/main/transformer/config.json#L2) في الإعدادات، لكن يمكن تجاهل هذا الاختلاف.

scheduler ([SchedulerMixin](/docs/diffusers/main/ar/api/schedulers/overview#diffusers.SchedulerMixin)) : مُجدول يُستخدم بالاقتران مع `transformer` لإزالة الضوضاء من الكامنات المُرمّزة للصورة.

خط أنابيب لتوليد الصور من النص باستخدام PixArt-Alpha.

يرث هذا النموذج من [DiffusionPipeline](/docs/diffusers/main/ar/api/pipelines/overview#diffusers.DiffusionPipeline). راجع توثيق الفئة الأصلية لمعرفة الطرق العامة التي تنفذها المكتبة لجميع خطوط الأنابيب (مثل التنزيل أو الحفظ، أو التشغيل على جهاز معين، وما إلى ذلك).

#### __call__[[diffusers.PixArtAlphaPipeline.__call__]]

```python
__call__(prompt: str | list[str] = None, negative_prompt: str = '', num_inference_steps: int = 20, timesteps: list[int] = None, sigmas: list[float] = None, guidance_scale: float = 4.5, num_images_per_prompt: int | None = 1, height: int | None = None, width: int | None = None, eta: float = 0.0, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, prompt_attention_mask: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_attention_mask: typing.Optional[torch.Tensor] = None, output_type: str | None = 'pil', return_dict: bool = True, callback: typing.Optional[typing.Callable[[int, int, torch.Tensor], NoneType]] = None, callback_steps: int = 1, clean_caption: bool = True, use_resolution_binning: bool = True, max_sequence_length: int = 120, **kwargs)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/pixart_alpha/pipeline_pixart_alpha.py#L686)

**المعاملات:**

prompt (`str` أو `list[str]`، *اختياري*) : الأمر أو الأوامر التي تُوجّه توليد الصورة. إذا لم يُعرَّف، يجب تمرير `prompt_embeds` بدلاً من ذلك.

negative_prompt (`str` أو `list[str]`، *اختياري*) : الموجه أو الموجهات التي لا ينبغي توجيه توليد الصورة بها. إذا لم يُعرَّف، يجب تمرير `negative_prompt_embeds` بدلاً من ذلك. يتم تجاهله عند عدم استخدام التوجيه (أي يتم تجاهله إذا كان `guidance_scale` أقل من `1`).

num_inference_steps (`int`، *اختياري*، القيمة الافتراضية 100) : عدد خطوات إزالة الضوضاء. تؤدي زيادة عدد خطوات إزالة الضوضاء عادةً إلى صورة ذات جودة أعلى على حساب بطء الاستدلال.

timesteps (`list[int]`، *اختياري*) : خطوات زمنية مخصصة لاستخدامها في عملية إزالة الضوضاء مع المجدولين الذين يدعمون معامل `timesteps` في طريقة `set_timesteps` الخاصة بهم. إذا لم يُعرَّف، فسيتم استخدام السلوك الافتراضي عند تمرير `num_inference_steps`. يجب أن تكون بترتيب تنازلي.

sigmas (`list[float]`، *اختياري*) : قيم `sigmas` مخصصة لاستخدامها في عملية إزالة الضوضاء مع المجدولين الذين يدعمون معامل `sigmas` في طريقة `set_timesteps` الخاصة بهم. إذا لم تُعرَّف، فسيتم استخدام السلوك الافتراضي عند تمرير `num_inference_steps`.

guidance_scale (`float`، *اختياري*، القيمة الافتراضية 4.5) : مقياس التوجيه كما هو مُعرَّف في [Classifier-Free Diffusion Guidance](https://huggingface.co/papers/2207.12598). يُعرَّف `guidance_scale` على أنه `w` من المعادلة 2. في [Imagen Paper](https://huggingface.co/papers/2205.11487). يتم تفعيل مقياس التوجيه عن طريق تعيين `guidance_scale > 1`. يشجع مقياس التوجيه الأعلى على توليد صور مرتبطة ارتباطًا وثيقًا بنص `prompt`، وعادةً على حساب انخفاض جودة الصورة.

num_images_per_prompt (`int`، *اختياري*، القيمة الافتراضية 1) : عدد الصور التي سيتم توليدها لكل موجه.

height (`int`، *اختياري*، الافتراضي هو self.unet.config.sample_size) : ارتفاع الصورة المولّدة بالبكسل.

width (`int`، *اختياري*، الافتراضي هو self.unet.config.sample_size) : عرض الصورة المولدة بالبكسل.

eta (`float`، *اختياري*، القيمة الافتراضية 0.0) : يتوافق مع المعامل eta (η) في ورقة DDIM: https://huggingface.co/papers/2010.02502. ينطبق فقط على [schedulers.DDIMScheduler](/docs/diffusers/main/ar/api/schedulers/ddim#diffusers.DDIMScheduler)، وسيتم تجاهله في الحالات الأخرى.

generator (`torch.Generator` أو `list[torch.Generator]`، *اختياري*) : مولّد واحد أو قائمة من [مولّدات torch](https://pytorch.org/docs/stable/generated/torch.Generator.html) لجعل التوليد حتميًا.

latents (`torch.Tensor`، *اختياري*) : كامنات ضجيج مُولّدة مسبقًا، مُستخرجة من توزيع غاوسي، تُستخدم كمدخلات لتوليد الصور. يمكن استخدامها لتعديل نفس التوليد باستخدام أوامر مختلفة. إذا لم تُقدَّم، سيتم توليد كامنات من خلال الاستخراج باستخدام `generator` العشوائي المُقدَّم.

prompt_embeds (`torch.Tensor`، *اختياري*) : تمثيلات نصية مُولّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة، *مثلًا* وزن الأوامر. إذا لم تُقدَّم، فسيتم توليد تمثيلات النص من معامل الإدخال `prompt`.

prompt_attention_mask (`torch.Tensor`، *اختياري*) : قناع انتباه مُولّد مسبقًا لتضمينات النص.

negative_prompt_embeds (`torch.Tensor`، *اختياري*) : تمثيلات نصية سالبة مُولّدة مسبقًا. بالنسبة إلى PixArt-Alpha، يجب أن يكون هذا الموجه السلبي "". إذا لم يُقدَّم، فسيتم توليد negative_prompt_embeds من معامل الإدخال `negative_prompt`.

negative_prompt_attention_mask (`torch.Tensor`، *اختياري*) : قناع انتباه مُولّد مسبقًا لتضمينات النصوص السلبية.

output_type (`str`، *اختياري*، القيمة الافتراضية `"pil"`) : صيغة الصورة الناتجة عن عملية التوليد. اختر بين [PIL](https://pillow.readthedocs.io/en/stable/): `PIL.Image.Image` أو `np.array`.

return_dict (`bool`، *اختياري*، القيمة الافتراضية `True`) : ما إذا كان يجب إرجاع `~pipelines.stable_diffusion.IFPipelineOutput` بدلاً من tuple عادي.

callback (`Callable`، *اختياري*) : دالة ستُستدعى كل `callback_steps` خطوات أثناء الاستدلال. سيتم استدعاء الدالة مع الحُجج التالية: `callback(step: int, timestep: int, latents: torch.Tensor)`.

callback_steps (`int`، *اختياري*، القيمة الافتراضية 1) : التكرار الذي تُستدعى فيه دالة `callback`. إذا لم يتم تحديده، فستُستدعى الدالة في كل خطوة.

clean_caption (`bool`، *اختياري*، القيمة الافتراضية `True`) : ما إذا كان سيتم تنظيف الوصف قبل إنشاء التضمينات. يتطلب تثبيت `beautifulsoup4` و`ftfy`. إذا لم يتم تثبيت الاعتماديات، فسيتم إنشاء التضمينات من النص الخام.

use_resolution_binning (`bool` الافتراضي هو `True`) : إذا تم ضبطه على `True`، فإن الارتفاع والعرض المطلوبين يُخضعان أولاً للتحويل إلى أقرب دقة باستخدام `ASPECT_RATIO_1024_BIN`. بعد فك ترميز الكمّيات الناتجة إلى صور، يتم تغيير حجمها مرة أخرى إلى الدقة المطلوبة. مفيد لتوليد صور غير مربعة.

max_sequence_length (`int` الافتراضي 120) : أقصى طول تسلسل يُستخدم مع `prompt`.

**يعيد:** [ImagePipelineOutput](/docs/diffusers/main/ar/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) أو `tuple`

إذا كان `return_dict` هو `True`، يُعاد [ImagePipelineOutput](/docs/diffusers/main/ar/api/pipelines/consistency_models#diffusers.ImagePipelineOutput)، وإلا يُعاد `tuple` يكون عنصره الأول قائمة بالصور المولّدة

الدالة التي تُستدعى عند استدعاء خط الأنابيب للتوليد.

أمثلة:
```py
>>> import torch
>>> from diffusers import PixArtAlphaPipeline

>>> # You can replace the checkpoint id with "PixArt-alpha/PixArt-XL-2-512x512" too.
>>> pipe = PixArtAlphaPipeline.from_pretrained("PixArt-alpha/PixArt-XL-2-1024-MS", torch_dtype=torch.float16)
>>> # Enable memory optimizations.
>>> pipe.enable_model_cpu_offload()

>>> prompt = "A small cactus with a happy face in the Sahara desert."
>>> image = pipe(prompt).images[0]
```

#### encode_prompt[[diffusers.PixArtAlphaPipeline.encode_prompt]]

```python
encode_prompt(prompt: str | list[str], do_classifier_free_guidance: bool = True, negative_prompt: str = '', num_images_per_prompt: int = 1, device: typing.Optional[torch.device] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, prompt_attention_mask: typing.Optional[torch.Tensor] = None, negative_prompt_attention_mask: typing.Optional[torch.Tensor] = None, clean_caption: bool = False, max_sequence_length: int = 120, **kwargs)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/pixart_alpha/pipeline_pixart_alpha.py#L303)

**المعاملات:**

prompt (`str` أو `list[str]`، *اختياري*) : النص الذي سيتم ترميزه

negative_prompt (`str` أو `list[str]`، *اختياري*) : الأمر النصي الذي لا يوجّه توليد الصورة. إذا لم يُعرَّف، يجب تمرير `negative_prompt_embeds` بدلاً منه. يتم تجاهله عند عدم استخدام التوجيه (أي يتم تجاهله إذا كان `guidance_scale` أقل من `1`). بالنسبة إلى PixArt-Alpha، يجب أن يكون "".

do_classifier_free_guidance (`bool`، *اختياري*، القيمة الافتراضية `True`) : ما إذا كان سيتم استخدام classifier free guidance أم لا

num_images_per_prompt (`int`، *اختياري*، القيمة الافتراضية 1) : عدد الصور التي يجب توليدها لكل موجه

device : (`torch.device`, *اختياري*): جهاز torch لوضع التضمينات الناتجة عليه

prompt_embeds (`torch.Tensor`، *اختياري*) : تمثيلات نصية مُولّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة، *مثلًا* وزن الأوامر. إذا لم تُقدَّم، فسيتم توليد تمثيلات النص من معامل الإدخال `prompt`.

negative_prompt_embeds (`torch.Tensor`، *اختياري*) : تمثيلات نصية سالبة مُولّدة مسبقًا. بالنسبة إلى PixArt-Alpha، يجب أن تكون تمثيلات السلسلة "".

clean_caption (`bool`، القيمة الافتراضية `False`) : إذا كانت `True`، سيقوم الدالة بمعالجة الوصف المقدم وتنظيفه قبل الترميز.

max_sequence_length (`int`، القيمة الافتراضية 120) : الحد الأقصى لطول التسلسل المستخدم للموجّه.

يقوم بتشفير الموجه إلى حالات مخفية لمشفّر النص.

