# خطوط أنابيب ومكوّنات المجتمع

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

> [!TIP]
> اطّلع على خطوط الأنابيب المجتمعية في [diffusers/examples/community](https://github.com/huggingface/diffusers/tree/main/examples/community) مع أمثلة على الاستدلال والتدريب حول كيفية استخدامها.

تُخزَّن خطوط أنابيب المجتمع إما على Hub أو في مستودع GitHub الخاص بـ Diffusers. خطوط أنابيب Hub قابلة للتخصيص بالكامل (المجدول، النماذج، كود خط الأنابيب، إلخ) بينما خطوط أنابيب GitHub محدودة بكود خط الأنابيب المخصص فقط. قارن بين نوعي خطي الأنابيب في الجدول أدناه.

|  | GitHub | المركز |
|---|---|---|
| الاستخدام | `custom_pipeline="<filename_without_.py>"` | معرّف مستودع Hub أو `trust_remote_code=True` عندما يشير `_class_name` إلى مخصص |
| عملية المراجعة | افتح طلب سحب (Pull Request) على GitHub وخضع لعملية مراجعة من فريق Diffusers قبل الدمج. هذه الخيار أبطأ. | ارفع مباشرةً إلى مستودع في Hub دون مراجعة. هذه هي الخيار الأسرع. |
| الظهور | مشمولة في مستودع Diffusers الرسمي وتوثيقه. | مُدرج في ملفك الشخصي على Hub ويعتمد على استخدامك الخاص والترويج لكسب الظهور. |

## تحميل خط أنابيب مجتمعي

قم بتحميل أي نوع من خطوط أنابيب المجتمع عن طريق تمرير `custom_pipeline` إلى [from_pretrained()](/docs/diffusers/main/ar/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained).

```py
import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-3-medium-diffusers",
    custom_pipeline="pipeline_stable_diffusion_3_instruct_pix2pix",
    dtype=torch.float16,
    device_map="cuda"  # or "mps", "xpu", "cpu"
)
```

أضف الحجة `custom_revision` إلى [from_pretrained()](/docs/diffusers/main/ar/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained) لتحميل خط أنابيب المجتمع من إصدار محدد (على سبيل المثال، `v0.30.0` أو `main`). بشكل افتراضي، يتم تحميل خطوط أنابيب المجتمع من أحدث إصدار مستقر من Diffusers.

```py
import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-3-medium-diffusers",
    custom_pipeline="pipeline_stable_diffusion_3_instruct_pix2pix",
    custom_revision="main",
    dtype=torch.float16,
    device_map="cuda"  # or "mps", "xpu", "cpu"
)
```

> [!WARNING]
> في حين يقوم [مستودع Hugging Face](https://huggingface.co/docs/hub/security-malware) بمسح الملفات، يجب عليك أيضاً فحص كود خط أنابيب المستودع والتأكد من أنه آمن.

توجد عدة طرق لتحميل خط أنابيب المجتمع.

- مرّر مسارًا إلى `custom_pipeline` لتحميل خط أنابيب مجتمعي محلي. يجب أن يحتوي المجلد على ملف `pipeline.py` يحتوي على فئة خط الأنابيب.

  ```py
  import torch
  from diffusers import DiffusionPipeline

  pipeline = DiffusionPipeline.from_pretrained(
      "stabilityai/stable-diffusion-3-medium-diffusers",
      custom_pipeline="path/to/pipeline_directory",
      trust_remote_code=True,
      dtype=torch.float16,
      device_map="cuda"  # or "mps", "xpu", "cpu"
  )
  ```

- يُؤيَّد الحُجّة `custom_pipeline` أيضًا بواسطة [from_pipe()](/docs/diffusers/main/ar/api/pipelines/overview#diffusers.DiffusionPipeline.from_pipe)، وهو مفيد لـ [إعادة استخدام خطوط الأنابيب](./loading#reusing-models-in-multiple-pipelines) دون استخدام ذاكرة إضافية. فهو يحدّ من استخدام الذاكرة إلى أكبر خط أنابيب محمّل فقط.

  ```py
  import torch
  from diffusers import DiffusionPipeline

  pipeline_sd = DiffusionPipeline.from_pretrained(
      "emilianJR/CyberRealistic_V3", dtype=torch.float16, device_map="cuda"  # or "mps", "xpu", "cpu"
  )
  pipeline_lpw = DiffusionPipeline.from_pipe(
      pipeline_sd, custom_pipeline="lpw_stable_diffusion"
  )
  ```

  يُعدّ أسلوب [from_pipe()](/docs/diffusers/main/ar/api/pipelines/overview#diffusers.DiffusionPipeline.from_pipe) مفيداً بشكل خاص لتحميل خطوط أنابيب المجتمع، لأن العديد منها لا يحتوي على أوزان مُسبقة التدريب. تضيف خطوط أنابيب المجتمع عادةً ميزة فوق خط أنابيب قائم.

## مكوّنات المجتمع

تتيح لك مكوّنات المجتمع بناء خطوط أنابيب باستخدام محوّلات وUNets وVAEs ومجدولات مخصّصة لا تدعمها مكتبة Diffusers. وتحتاج هذه المكوّنات إلى وحدات Python خاصة بها.

تُظهر هذه القسم كيفية استخدام المستخدمين لمكونات المجتمع لبناء خط أنابيب مجتمع باستخدام [showlab/show-1-base](https://huggingface.co/showlab/show-1-base) كمثال.

1. حمّل المكونات المطلوبة، وهي المجدول ومعالج الصور. يتم استيراد مشفر النص بشكل عام من [Transformers](https://huggingface.co/docs/transformers/index).

```python
from transformers import T5Tokenizer, T5EncoderModel, CLIPImageProcessor
from diffusers import DPMSolverMultistepScheduler

pipeline_id = "showlab/show-1-base"
tokenizer = T5Tokenizer.from_pretrained(pipeline_id, subfolder="tokenizer")
text_encoder = T5EncoderModel.from_pretrained(pipeline_id, subfolder="text_encoder")
scheduler = DPMSolverMultistepScheduler.from_pretrained(pipeline_id, subfolder="scheduler")
feature_extractor = CLIPImageProcessor.from_pretrained(pipeline_id, subfolder="feature_extractor")
```

> [!WARNING]
> في الخطوتين 2 و3، يجب أن تتطابق تنسيقات التنفيذ المخصص لـ [UNet](https://github.com/showlab/Show-1/blob/main/showone/models/unet_3d_condition.py) و [pipeline](https://huggingface.co/sayakpaul/show-1-base-with-code/blob/main/unet/showone_unet_3d_condition.py) مع التنسيقات المعروضة في ملفاتهما حتى يعمل هذا المثال.

2. حمّل [UNet مخصصًا](https://github.com/showlab/Show-1/blob/main/showone/models/unet_3d_condition.py) مُنفَّذًا مسبقًا في [showone_unet_3d_condition.py](https://huggingface.co/sayakpaul/show-1-base-with-code/blob/main/unet/showone_unet_3d_condition.py). تم تغيير اسم فئة [UNet3DConditionModel](/docs/diffusers/main/ar/api/models/unet3d-cond#diffusers.UNet3DConditionModel) إلى التنفيذ المخصص `ShowOneUNet3DConditionModel`، لأن [UNet3DConditionModel](/docs/diffusers/main/ar/api/models/unet3d-cond#diffusers.UNet3DConditionModel) موجودة مسبقًا في Diffusers. يجب وضع جميع المكونات المطلوبة لفئة `ShowOneUNet3DConditionModel` في `showone_unet_3d_condition.py`.

```python
from showone_unet_3d_condition import ShowOneUNet3DConditionModel

unet = ShowOneUNet3DConditionModel.from_pretrained(pipeline_id, subfolder="unet")
```

3. حمّل كود خط الأنابيب المخصص (المنفَّذ مسبقًا في [pipeline_t2v_base_pixel.py](https://huggingface.co/sayakpaul/show-1-base-with-code/blob/main/pipeline_t2v_base_pixel.py)). يحتوي هذا النص البرمجي على فئة `TextToVideoIFPipeline` مخصصة لتوليد مقاطع الفيديو من النص. تمامًا كما هو الحال مع UNet المخصص، يجب وضع أي كود مطلوب لـ `TextToVideoIFPipeline` في `pipeline_t2v_base_pixel.py`.

قم بتهيئة `TextToVideoIFPipeline` باستخدام `ShowOneUNet3DConditionModel`.

```python
import torch
from pipeline_t2v_base_pixel import TextToVideoIFPipeline

pipeline = TextToVideoIFPipeline(
    unet=unet,
    text_encoder=text_encoder,
    tokenizer=tokenizer,
    scheduler=scheduler,
    feature_extractor=feature_extractor,
)
pipeline = pipeline.to("cuda")  # or "mps", "xpu", "cpu"
```

4. ادفع خط الأنابيب إلى Hub لمشاركته مع المجتمع.

```python
pipeline.push_to_hub("custom-t2v-pipeline")
```

بعد دفع خط الأنابيب بنجاح، أجرِ التغييرات التالية.

- غيّر خاصية `_class_name` في [model_index.json](https://huggingface.co/sayakpaul/show-1-base-with-code/blob/main/model_index.json#L2) إلى `["pipeline_t2v_base_pixel", "TextToVideoIFPipeline"]`.
- ارفع `showone_unet_3d_condition.py` إلى مجلد [unet](https://huggingface.co/sayakpaul/show-1-base-with-code/blob/main/unet/showone_unet_3d_condition.py) الفرعي.
- ارفع `pipeline_t2v_base_pixel.py` إلى مستودع خط الأنابيب [repository](https://huggingface.co/sayakpaul/show-1-base-with-code/tree/main).

لتشغيل الاستدلال، أضف الحجة `trust_remote_code` أثناء تهيئة خط الأنابيب للتعامل مع كل "السحر" خلف الكواليس.

```python
import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "<change-username>/<change-id>", trust_remote_code=True, dtype=torch.float16
)
```

> [!WARNING]
> كإجراء احترازي إضافي عند استخدام `trust_remote_code=True`، قم بتمرير تجزئة الالتزام (commit hash) إلى معامل `revision` في [from_pretrained()](/docs/diffusers/main/ar/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained) للتأكد من أن الكود لم يتم تحديثه بكود خبيث جديد (ما لم تكن تثق تماماً بأصحاب النموذج).

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

- اطّلع على المشكلة [#841](https://github.com/huggingface/diffusers/issues/841) لمزيد من السياق حول سبب إضافة خطوط أنابيب المجتمع لمساعدة الجميع على مشاركة أعمالهم بسهولة دون أن يتباطأوا.
- اطّلع على مستودع [stabilityai/japanese-stable-diffusion-xl](https://huggingface.co/stabilityai/japanese-stable-diffusion-xl/) كمثال إضافي على خط أنابيب مجتمعي يستخدم أيضًا ميزة `trust_remote_code`.

