# التوازي

تساعد استراتيجيات التوازي في تسريع محولات الانتشار (diffusion transformers) من خلال توزيع العمليات الحسابية على عدة أجهزة، مما يتيح أوقات استدلال/تدريب أسرع. راجع دليل [الاستدلال الموزّع](../training/distributed_inference) لمعرفة المزيد.

## ParallelConfig[[diffusers.ParallelConfig]]

#### diffusers.ParallelConfig[[diffusers.ParallelConfig]]

```python
diffusers.ParallelConfig(context_parallel_config: diffusers.models._modeling_parallel.ContextParallelConfig | None = None, tensor_parallel_config: diffusers.models._modeling_parallel.TensorParallelConfig | None = None, _rank: int = None, _world_size: int = None, _device: device = None, _mesh: DeviceMesh = None)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/_modeling_parallel.py#L199)

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

context_parallel_config (`ContextParallelConfig`، *اختياري*) : إعدادات للتوازي السياقي.

tensor_parallel_config (`TensorParallelConfig`، *اختياري*) : إعدادات للتوازي على مستوى الموترات.

إعدادات لتطبيق أنواع مختلفة من التوازي.

## ContextParallelConfig[[diffusers.ContextParallelConfig]]

#### diffusers.ContextParallelConfig[[diffusers.ContextParallelConfig]]

```python
diffusers.ContextParallelConfig(ring_degree: int | None = None, ulysses_degree: int | None = None, convert_to_fp32: bool = True, rotate_method: typing.Literal['allgather', 'alltoall'] = 'allgather', mesh: typing.Optional[torch.distributed.device_mesh.DeviceMesh] = None, ulysses_anything: bool = False, ring_anything: bool = False, _rank: int = None, _world_size: int = None, _device: device = None, _mesh: DeviceMesh = None, _flattened_mesh: DeviceMesh = None, _ring_mesh: DeviceMesh = None, _ulysses_mesh: DeviceMesh = None, _ring_local_rank: int = None, _ulysses_local_rank: int = None)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/_modeling_parallel.py#L41)

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

ring_degree (`int`، *اختياري*، القيمة الافتراضية `1`) : عدد الأجهزة المستخدمة لـ Ring Attention. يتم تقسيم التسلسل عبر الأجهزة. تحسب كل جهاز الانتباه بين Q المحلي لديها وقطع KV التي تُمرَّر تسلسليًا حول الحلقة. ذاكرة أقل (تحتفظ فقط بـ 1/N من KV في كل مرة)، وتُدمج الحساب مع الاتصال، لكنها تتطلب N تكرارات لرؤية جميع الرموز. الأفضل للتسلسلات الطويلة مع ذاكرة/عرض نطاق محدود. عدد الأجهزة المستخدمة لـ ring attention داخل منطقة التوازي السياقي. يجب أن يكون قاسمًا لعدد الأجهزة الإجمالي في شبكة التوازي السياقي.

ulysses_degree (`int`, *optional*, defaults to `1`) : Number of devices to use for Ulysses Attention. Sequence split is across devices. Each device computes local QKV, then all-gathers all KV chunks to compute full attention in one pass. Higher memory (stores all KV), requires high-bandwidth all-to-all communication, but lower latency. Best for moderate sequences with good interconnect bandwidth.

convert_to_fp32 (`bool`، *اختياري*، الافتراضي `True`) : ما إذا كان سيتم تحويل المخرجات و LSE إلى float32 من أجل الاستقرار العددي لانتباه الحلقة (ring attention).

rotate_method (`str`، *اختياري*، القيمة الافتراضية `"allgather"`) : الطريقة المستخدمة لتدوير حالات المفاتيح/القيم عبر الأجهزة في انتباه الحلقة. حاليًا، يتم دعم `"allgather"` فقط.

ulysses_anything (`bool`، *اختياري*، القيمة الافتراضية `False`) : ما إذا كان سيتم تفعيل وضع "Ulysses Anything"، الذي يدعم أطوال تسلسلات وعدد رؤوس عشوائية لا تُقسَّم بالتساوي على `ulysses_degree`. عند التفعيل، يجب أن يكون `ulysses_degree` أكبر من 1 وأن يكون `ring_degree` مساوياً لـ 1.

ring_anything (`bool`، *اختياري*، القيمة الافتراضية `False`) : ما إذا كان سيتم تفعيل وضع "Ring Anything"، الذي يدعم أطوال تسلسلات غير محددة. عند التفعيل، يجب أن يكون `ring_degree` أكبر من 1 وأن يكون `ulysses_degree` مساوياً لـ 1.

mesh (`torch.distributed.device_mesh.DeviceMesh`، *اختياري*) : شبكة أجهزة مخصصة لاستخدامها في التوازي السياقي. إذا تم توفيرها، فسيتم استخدام هذه الشبكة بدلاً من إنشاء شبكة جديدة. يكون هذا مفيدًا عند دمج التوازي السياقي مع استراتيجيات توازي أخرى (مثل FSDP، والتوازي على مستوى الموترات) التي تتشارك نفس شبكة الأجهزة. يجب أن تحتوي الشبكة على أبعاد "ring" و"ulysses". استخدم الحجم 1 للأبعاد غير المستخدمة (مثل `mesh_shape=(2, 1, 4)` مع `mesh_dim_names=("ring", "ulysses", "fsdp")` لاستخدام انتباه الحلقة فقط مع FSDP).

إعدادات للتوازي السياقي.

#### diffusers.hooks.apply_context_parallel[[diffusers.hooks.apply_context_parallel]]

```python
diffusers.hooks.apply_context_parallel(module: Module, parallel_config: ContextParallelConfig, plan: dict)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/hooks/context_parallel.py#L80)

تطبيق توازٍ سياقي على نموذج.

## TensorParallelConfig[[diffusers.TensorParallelConfig]]

#### diffusers.TensorParallelConfig[[diffusers.TensorParallelConfig]]

```python
diffusers.TensorParallelConfig(tp_degree: int = 1, mesh: typing.Optional[torch.distributed.device_mesh.DeviceMesh] = None, _rank: int = None, _world_size: int = None, _device: device = None, _mesh: DeviceMesh = None, _tp_degree: int = None)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/_modeling_parallel.py#L157)

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

tp_degree (`int`، القيمة الافتراضية `1`) : عدد الأجهزة التي سيتم تقسيم النموذج عليها. يجب أن يكون قاسماً لعدد رؤوس الانتباه (والأبعاد المخفية لشبكة التغذية العكسية) في النموذج المُوازى.

mesh (`torch.distributed.device_mesh.DeviceMesh`، *اختياري*) : شبكة أجهزة مخصصة للاستخدام. إذا تم تقديمها، يُستنتج `tp_degree` من `mesh.size()` ويُتجاهل الحُجج. مفيد عند دمج TP مع استراتيجيات توازٍ أخرى (مثل CP) التي تتشارك نفس الشبكة.

إعدادات للتوازي على مستوى الموترات.

يقوم توازي الموترات بتقسيم مصفوفات الأوزان (عمودياً وصفوفياً) عبر الأجهزة. يحسب كل جهاز نتيجة جزئية؛ ثم يعيد AllReduce/AllGather عند حدود الطبقات بناء المخرجات الكاملة. يستخدم `torch.distributed.tensor.parallelize_module` مع أنماط التقسيم `ColwiseParallel` / `RowwiseParallel`. أنواع الأجهزة المدعومة هي `"cuda"` و`"neuron"` و`"tpu"`.

#### diffusers.hooks.apply_tensor_parallel[[diffusers.hooks.apply_tensor_parallel]]

```python
diffusers.hooks.apply_tensor_parallel(model: Module, config: TensorParallelConfig, tp_plan: dict, weights_already_sharded: bool = False)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/hooks/tensor_parallel.py#L481)

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

model (`torch.nn.Module`) : النموذج الذي سيتم تقسيمه في مكانه.

config (`TensorParallelConfig`) : إعدادات التوازي على مستوى الموتر. يجب أن يكون شبكة الأجهزة (device mesh) مضبوطة مسبقًا باستخدام `config.setup(...)`.

tp_plan (`dict`) : تعيين مسطّح من أنماط أسماء الوحدات إلى نمط `"colwise"`/`"rowwise"` (أو متغير مضغوط)، وهو عادةً `_tp_plan` الخاص بالنموذج.

weights_already_sharded (`bool`، القيمة الافتراضية `False`) : ما إذا كانت المعاملات المخططة هي بالفعل شتات `DTensor`، كما هي بعد تحميل `from_pretrained` بالتدفق. إذا كانت `True`، يتم تسجيل خطافات الأمامية فقط. يتم تمرير هذا القيمة صراحةً بدلاً من اكتشافها، لأن المعامل المخطط له المفقود من نقطة الحفظ سيظل متغيرًا افتراضيًا (meta tensor) وسيجعل عملية الاكتشاف تقول "غير مجزأ" لنموذج هو في الواقع مجزأ جزئيًا.

تطبيق توازي الموترات على نموذج من `_tp_plan` المسطّح الخاص به.

