# DEISMultistepScheduler

يُقترح مُدمج التكامل الأُسّي للتشتت (DEIS) في [Fast Sampling of Diffusion Models with Exponential Integrator](https://huggingface.co/papers/2204.13902) من قِبل Qinsheng Zhang وYongxin Chen. يُعدّ `DEISMultistepScheduler` حلاً سريعاً عالي الرتبة لمعادلات التفاضل العادية (ODEs) الخاصة بالتشتت.

تعديل هذه الصيغة الرياضية في فضاء log-rho بدلاً من فضاء `t` الخطي الأصلي في ورقة DEIS. ويتمتع هذا التعديل بمعاملات بصيغة مغلقة لتحديث متعدد الخطوات الأسي بدلاً من الاعتماد على الحل العددي.

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

*شهدت السنوات الأخيرة نجاحًا كبيرًا لنماذج الانتشار~(DMs) في توليد عينات عالية الدقة في مهام النمذجة التوليدية. يُعدّ أحد القيود الرئيسية لنماذج الانتشار بطء إجراء التوليد الشهير، والذي يتطلب عادةً مئات إلى آلاف خطوات التقطيع الزمني للعملية الانتشارية المتعلمة للوصول إلى الدقة المطلوبة. هدفنا هو تطوير طريقة توليد سريعة لنماذج الانتشار بعدد خطوات أقل بكثير مع الحفاظ على جودة عالية للعينات. لتحقيق ذلك، قمنا بتحليل منهجي لإجراء التوليد في نماذج الانتشار وتحديد العوامل الرئيسية التي تؤثر على جودة العينة، حيث تُعدّ طريقة التقطيع هي الأهم بينها. من خلال فحص دقيق للعملية الانتشارية المتعلمة، نقترح عيّّاد التكامل الأسي للانتشار~(DEIS). يعتمد هذا العيّّاد على مُكامل أسي مصمم لتقطيع المعادلات التفاضلية العادية (ODEs) ويستفيد من البنية شبه الخطية للعملية الانتشارية المتعلمة لتقليل خطأ التقطيع. يمكن تطبيق الطريقة المقترحة على أي نماذج انتشار وتوليد عينات عالية الدقة في ما لا يقل عن 10 خطوات. في تجاربنا، يستغرق الأمر حوالي 3 دقائق على وحدة معالجة رسومات واحدة من نوع A6000 لتوليد 50 ألف صورة من CIFAR10. علاوة على ذلك، من خلال استخدام نماذج انتشار مُدرَّبة مسبقًا مباشرةً، حققنا أداءً في التوليد يُعدّ من الأفضل في فئته عندما يكون عدد تقييمات دالة التدرج~(NFE) محدودًا، مثلًا، 4.17 FID مع 10 NFEs، و3.37 FID، و9.74 IS مع 15 NFEs فقط على CIFAR10. الكود متاح في [هذا الرابط](https://github.com/qsh-zh/deis).*

## نصائح

يُوصى بإعداد `solver_order` إلى 2 أو 3، بينما `solver_order=1` يعادل [DDIMScheduler](/docs/diffusers/main/ar/api/schedulers/ddim#diffusers.DDIMScheduler).

يُؤمَّن دعم العتبة الديناميكية من [Imagen](https://huggingface.co/papers/2205.11487)، ولنماذج الانتشار في فضاء البكسلات، يمكنك تعيين `thresholding=True` لاستخدام العتبة الديناميكية.

## DEISMultistepScheduler[[diffusers.DEISMultistepScheduler]]

#### diffusers.DEISMultistepScheduler[[diffusers.DEISMultistepScheduler]]

```python
diffusers.DEISMultistepScheduler(num_train_timesteps: int = 1000, beta_start: float = 0.0001, beta_end: float = 0.02, beta_schedule: typing.Literal['linear', 'scaled_linear', 'squaredcos_cap_v2'] = 'linear', trained_betas: numpy.ndarray | list[float] | None = None, solver_order: int = 2, prediction_type: typing.Literal['epsilon', 'sample', 'v_prediction', 'flow_prediction'] = 'epsilon', thresholding: bool = False, dynamic_thresholding_ratio: float = 0.995, sample_max_value: float = 1.0, algorithm_type: typing.Literal['deis'] = 'deis', solver_type: typing.Literal['logrho'] = 'logrho', lower_order_final: bool = True, use_karras_sigmas: bool = False, use_exponential_sigmas: bool = False, use_beta_sigmas: bool = False, use_flow_sigmas: bool = False, flow_shift: float = 1.0, timestep_spacing: typing.Literal['linspace', 'leading', 'trailing'] = 'linspace', steps_offset: int = 0, use_dynamic_shifting: bool = False, time_shift_type: typing.Literal['exponential'] = 'exponential')
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L86)

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

num_train_timesteps (`int`، القيمة الافتراضية `1000`) : عدد خطوات الانتشار لتدريب النموذج.

beta_start (`float`، القيمة الافتراضية `0.0001`) : القيمة الابتدائية لـ`beta` أثناء الاستدلال.

beta_end (`float`، القيمة الافتراضية `0.02`) : القيمة النهائية لـ`beta`.

beta_schedule (`"linear"` أو `"scaled_linear"` أو `"squaredcos_cap_v2"`، الافتراضي هو `"linear"`) : جدول بيتا، وهو إسقاط من نطاق بيتا إلى سلسلة من قيم بيتا لتقدم النموذج خطوة بخطوة. اختر من بين `linear` أو `scaled_linear` أو `squaredcos_cap_v2`.

trained_betas (`np.ndarray` أو `list[float]`، *اختياري*) : مرر مصفوفة من قيم بيتا مباشرةً إلى منشئ الكائن لتجاوز `beta_start` و`beta_end`.

solver_order (`int`، القيمة الافتراضية هي `2`) : ترتيب DEIS الذي يمكن أن يكون `1` أو `2` أو `3`. يُوصى باستخدام `solver_order=2` للعينة الموجَّهة، و`solver_order=3` للعينة غير المشروطة.

prediction_type (`"epsilon"`, `"sample"`, `"v_prediction"`, or `"flow_prediction"`, defaults to `"epsilon"`) : Prediction type of the scheduler function; can be `epsilon` (predicts the noise of the diffusion process), `sample` (directly predicts the noisy sample`), `v_prediction` (see section 2.4 of [Imagen Video](https://huggingface.co/papers/2210.02303) paper), or `flow_prediction`.

thresholding (`bool`، القيمة الافتراضية `False`) : ما إذا كان سيتم استخدام طريقة "العتبة الديناميكية". هذه الطريقة غير مناسبة لنماذج الانتشار في الفضاء الكامن مثل Stable Diffusion.

dynamic_thresholding_ratio (`float`، القيمة الافتراضية `0.995`) : نسبة طريقة العتبة الديناميكية. صالحة فقط عندما يكون `thresholding=True`.

sample_max_value (`float`، القيمة الافتراضية `1.0`) : قيمة العتبة الخاصة بالتعتيم الديناميكي. صالحة فقط عندما يكون `thresholding=True`.

algorithm_type (`"deis"`، الافتراضي هو `"deis"`) : نوع الخوارزمية لحلّ المسألة.

solver_type (`"logrho"`، القيمة الافتراضية هي `"logrho"`) : نوع المُحَلِّل الخاص بـ DEIS.

lower_order_final (`bool`، القيمة الافتراضية `True`) : ما إذا كان سيتم استخدام محللات من رتبة أدنى في الخطوات النهائية. صالح فقط لعدد خطوات الاستدلال < 15.

use_karras_sigmas (`bool`، *اختياري*، القيمة الافتراضية `False`) : ما إذا كان سيتم استخدام قيم Karras sigmas لحجم الخطوات في جدول الضوضاء أثناء عملية أخذ العينات. إذا كانت القيمة `True`، تُحدَّد قيم sigmas وفقاً لسلسلة من مستويات الضوضاء {σi}.

use_exponential_sigmas (`bool`، *اختياري*، القيمة الافتراضية `False`) : ما إذا كان سيتم استخدام قيم سيجما أسّية لحجم الخطوات في جدول الضوضاء أثناء عملية أخذ العينات.

use_beta_sigmas (`bool`, *optional*, defaults to `False`) : Whether to use beta sigmas for step sizes in the noise schedule during the sampling process. Refer to [Beta Sampling is All You Need](https://huggingface.co/papers/2407.12173) for more information.

use_flow_sigmas (`bool`، *اختياري*، القيمة الافتراضية `False`) : ما إذا كان سيتم استخدام قيم سيجما التدفق (flow sigmas) لحجم الخطوات في جدول الضوضاء أثناء عملية أخذ العينات.

flow_shift (`float`، *اختياري*، القيمة الافتراضية `1.0`) : معامل إزاحة التدفق (flow shift) للنماذج القائمة على التدفق.

timestep_spacing (`"linspace"`, `"leading"`, or `"trailing"`, defaults to `"linspace"`) : The way the timesteps should be scaled. Refer to Table 2 of the [Common Diffusion Noise Schedules and Sample Steps are Flawed](https://huggingface.co/papers/2305.08891) for more information.

steps_offset (`int`، القيمة الافتراضية `0`) : إزاحة تُضاف إلى خطوات الاستدلال، كما تتطلبها بعض عائلات النماذج.

use_dynamic_shifting (`bool`، القيمة الافتراضية `False`) : ما إذا كان سيتم استخدام الإزاحة الديناميكية لجدول الضوضاء.

time_shift_type (`"exponential"`، الافتراضي هو `"exponential"`) : نوع إزاحة الوقت الذي سيتم تطبيقه.

`DEISMultistepScheduler` هو محلل سريع من الرتبة العالية لمعادلات التفاضل العادية (ODEs) في عمليات الانتشار.

يرث هذا النموذج من [SchedulerMixin](/docs/diffusers/main/ar/api/schedulers/overview#diffusers.SchedulerMixin) و [ConfigMixin](/docs/diffusers/main/ar/api/configuration#diffusers.ConfigMixin). راجع توثيق الفئة الأصلية لمعرفة الطرق العامة التي تنفذها المكتبة لجميع مجدولات التعلم، مثل التحميل والحفظ.

#### add_noise[[diffusers.DEISMultistepScheduler.add_noise]]

```python
add_noise(original_samples: Tensor, noise: Tensor, timesteps: IntTensor)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L997)

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

original_samples (`torch.Tensor`) : العينات الأصلية دون ضوضاء.

noise (`torch.Tensor`) : الضوضاء التي يجب إضافتها إلى العينات.

timesteps (`torch.IntTensor`) : الخطوات الزمنية التي يُضاف فيها الضوضاء إلى العينات.

**يعيد:** `torch.Tensor`

العينات الضجيجية.

أضف الضوضاء إلى العينات الأصلية وفقًا لجدول الضوضاء عند خطوات الزمن المحددة.

#### convert_model_output[[diffusers.DEISMultistepScheduler.convert_model_output]]

```python
convert_model_output(model_output: Tensor, *args, sample: Tensor = None, **kwargs)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L581)

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

model_output (`torch.Tensor`) : المخرجات المباشرة من نموذج الانتشار المُتعلَّم.

timestep (`int`) : الخطوة الزمنية المنفصلة الحالية في سلسلة الانتشار.

sample (`torch.Tensor`) : نسخة حالية من عينة تم إنشاؤها بواسطة عملية الانتشار.

**يعيد:** `torch.Tensor`

مخرجات النموذج المحوّل.

حوّل مخرجات النموذج إلى النوع المقابل الذي يحتاجه خوارزمية DEIS.

#### deis_first_order_update[[diffusers.DEISMultistepScheduler.deis_first_order_update]]

```python
deis_first_order_update(model_output: Tensor, *args, sample: Tensor = None, **kwargs)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L641)

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

model_output (`torch.Tensor`) : المخرجات المباشرة من نموذج الانتشار المُتعلَّم.

timestep (`int`) : الخطوة الزمنية المنفصلة الحالية في سلسلة الانتشار.

prev_timestep (`int`) : الخطوة الزمنية المنفصلة السابقة في سلسلة الانتشار.

sample (`torch.Tensor`) : نسخة حالية من عينة تم إنشاؤها بواسطة عملية الانتشار.

**يعيد:** `torch.Tensor`

المصفوفة العينة عند خطوة الزمن السابقة.

خطوة واحدة لمعادلة تفاضلية من الرتبة الأولى (DEIS) (تعادل DDIM).

#### index_for_timestep[[diffusers.DEISMultistepScheduler.index_for_timestep]]

```python
index_for_timestep(timestep: typing.Union[int, torch.Tensor], schedule_timesteps: typing.Optional[torch.Tensor] = None)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L864)

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

timestep (`int` أو `torch.Tensor`) : خطوة الزمن التي سيتم إيجاد فهرسها.

schedule_timesteps (`torch.Tensor`، *اختياري*) : جدول خطوات الزمن للبحث فيه. إذا كان `None`، يتم استخدام `self.timesteps`.

**يعيد:** `int`

مؤشر خطوة الزمن في الجدول الزمني.

حدد فهرس خطوة زمنية معينة في الجدول الزمني.

#### multistep_deis_second_order_update[[diffusers.DEISMultistepScheduler.multistep_deis_second_order_update]]

```python
multistep_deis_second_order_update(model_output_list: list[torch.Tensor], *args, sample: Tensor = None, **kwargs)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L702)

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

model_output_list (`list[torch.Tensor]`) : المخرجات المباشرة من نموذج الانتشار المُتعلَّم عند خطوات الزمن الحالية واللاحقة.

sample (`torch.Tensor`) : نسخة حالية من عينة تم إنشاؤها بواسطة عملية الانتشار.

**يعيد:** `torch.Tensor`

المصفوفة العينة عند خطوة الزمن السابقة.

خطوة واحدة لخوارزمية DEIS متعددة الخطوات من الدرجة الثانية.

#### multistep_deis_third_order_update[[diffusers.DEISMultistepScheduler.multistep_deis_third_order_update]]

```python
multistep_deis_third_order_update(model_output_list: list[torch.Tensor], *args, sample: Tensor = None, **kwargs)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L775)

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

model_output_list (`list[torch.Tensor]`) : المخرجات المباشرة من نموذج الانتشار المُتعلَّم عند خطوات الزمن الحالية واللاحقة.

sample (`torch.Tensor`) : نسخة حالية من عينة تم إنشاؤها بواسطة عملية الانتشار.

**يعيد:** `torch.Tensor`

المصفوفة العينة عند خطوة الزمن السابقة.

خطوة واحدة لخوارزمية DEIS متعددة الخطوات من الرتبة الثالثة.

#### scale_model_input[[diffusers.DEISMultistepScheduler.scale_model_input]]

```python
scale_model_input(sample: Tensor, *args, **kwargs)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L981)

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

sample (`torch.Tensor`) : العينة المدخلة.

**يعيد:** `torch.Tensor`

عينة إدخال مُقيّمة.

يضمن قابلية الاستبدال مع المجدولات التي تحتاج إلى تحجيم مدخلات نموذج إزالة الضوضاء اعتمادًا على خطوة الزمن الحالية.

#### set_begin_index[[diffusers.DEISMultistepScheduler.set_begin_index]]

```python
set_begin_index(begin_index: int = 0)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L262)

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

begin_index (`int`، القيمة الافتراضية `0`) : فهرس البداية للمجدول.

يحدد الفهرس الابتدائي للمجدول. يجب تشغيل هذه الدالة من خط الأنابيب قبل الاستدلال.

#### set_timesteps[[diffusers.DEISMultistepScheduler.set_timesteps]]

```python
set_timesteps(num_inference_steps: int, device: typing.Union[str, torch.device] = None, mu: float | None = None)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L272)

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

num_inference_steps (`int`) : عدد خطوات الانتشار المستخدمة عند توليد العينات باستخدام نموذج مُدرَّب مسبقًا.

device (`str` أو `torch.device`، *اختياري*) : الجهاز الذي يجب نقل خطوات الزمن (timesteps) إليه. إذا كان `None`، فلن يتم نقل خطوات الزمن.

mu (`float`, *اختياري*) : معامل ميكا (mu) للإزاحة الديناميكية. يُستخدم فقط عندما يكون `use_dynamic_shifting=True` و`time_shift_type="exponential"`.

يحدد الخطوات الزمنية المنفصلة المستخدمة لسلسلة الانتشار (لتُنفَّذ قبل الاستدلال).

#### خطوة[[diffusers.DEISMultistepScheduler.step]]

```python
step(model_output: Tensor, timestep: typing.Union[int, torch.Tensor], sample: Tensor, return_dict: bool = True)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L917)

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

model_output (`torch.Tensor`) : المخرجات المباشرة من نموذج الانتشار المُتعلَّم.

timestep (`int` أو `torch.Tensor`) : الخطوة الزمنية المنفصلة الحالية في سلسلة الانتشار.

sample (`torch.Tensor`) : نسخة حالية من عينة تم إنشاؤها بواسطة عملية الانتشار.

return_dict (`bool`، القيمة الافتراضية `True`) : ما إذا كان يجب إرجاع [SchedulerOutput](/docs/diffusers/main/ar/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) أو `tuple` أم لا.

**يعيد:** [SchedulerOutput](/docs/diffusers/main/ar/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) أو `tuple`

إذا كانت قيمة `True`، يُعاد [SchedulerOutput](/docs/diffusers/main/ar/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput)، وإلا يُعاد tuple يكون العنصر الأول فيه tensor العينة.

تنبّأ بالعيّنة من خطوة الزمن السابقة عن طريق عكس معادلة ستوكس التفاضلية العشوائية (SDE). تنقل هذه الدالة العيّنة باستخدام DEIS متعدد الخطوات.

## SchedulerOutput[[diffusers.schedulers.scheduling_utils.SchedulerOutput]]

#### diffusers.schedulers.scheduling_utils.SchedulerOutput[[diffusers.schedulers.scheduling_utils.SchedulerOutput]]

```python
diffusers.schedulers.scheduling_utils.SchedulerOutput(prev_sample: Tensor)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_utils.py#L66)

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

prev_sample (`torch.Tensor` من الشكل `(batch_size, num_channels, height, width)` للصور) : العينة المحسوبة `(x_{t-1})` لخطوة الزمن السابقة. يجب استخدام `prev_sample` كمدخل للنموذج التالي في حلقة إزالة الضوضاء.

الفئة الأساسية لمخرجات دالة `step` في المجدول.

