# UniPCMultistepScheduler

`UniPCMultistepScheduler` هو إطار عمل لا يتطلب تدريبًا، مصمم لأخذ عينات سريعة من نماذج الانتشار. تم تقديمه في [UniPC: A Unified Predictor-Corrector Framework for Fast Sampling of Diffusion Models](https://huggingface.co/papers/2302.04867) بواسطة Wenliang Zhao وLujia Bai وYongming Rao وJie Zhou وJiwen Lu.

يتألف من مُصحِّح (UniC) ومُتنبِّئ (UniP) يتشاركان في شكل تحليلي موحّد ويدعمان رتبًا عشوائية. صُمِّم UniPC ليكون مستقلًا عن النموذج، ويدعم نماذج DPM في فضاء البكسلات/فضاء الكمون على العينة غير الشرطية/الشرطية. كما يمكن تطبيقه على كلا نموذجي التنبؤ بالضوضاء والتنبؤ بالبيانات. ويمكن أيضًا تطبيق المُصحِّح UniC بعد أي محلِّلات جاهزة الاستخدام لزيادة رتبة الدقة.

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

*أثبتت النماذج الاحتمالية الانتشارية (DPMs) قدرة واعدة للغاية في تركيب الصور عالية الدقة. ومع ذلك، فإن العينة من DPM مُدرَّب مسبقًا تستغرق وقتًا طويلاً بسبب التقييمات المتعددة لشبكة إزالة الضوضاء، مما يجعل تسريع أخذ العينات من DPMs أمرًا مهمًا بشكل متزايد. على الرغم من التقدم الأخير في تصميم عيّنات سريعة، لا تزال الطرق الحالية غير قادرة على توليد صور مرضية في العديد من التطبيقات التي يُفضَّل فيها عدد أقل من الخطوات (مثل <10). في هذه الورقة، نطوّر مُصحِّحًا موحَّدًا (UniC) يمكن تطبيقه بعد أي عيّنة DPM موجودة لزيادة رتبة الدقة دون تقييمات نموذج إضافية، ونشتق مُتنبئًا موحَّدًا (UniP) يدعم أي رتبة كمنتج ثانوي. وبدمج UniP وUniC، نقترح إطارًا موحَّدًا للتنبؤ والتصحيح يُسمى UniPC لأخذ عينات سريعة من DPMs، والذي يمتلك شكلًا تحليليًا موحَّدًا لأي رتبة ويمكنه تحسين جودة أخذ العينات بشكل كبير مقارنة بالطرق السابقة، خاصةً في عدد خطوات قليل للغاية. نقيّم طرقنا من خلال تجارب شاملة تشمل أخذ عينات غير مشروطة ومشروطة باستخدام DPMs في فضاء البكسل وفضاء الكمون. يمكن لـUniPC الخاص بنا تحقيق 3.87 FID على CIFAR10 (غير مشروط) و7.51 FID على ImageNet 256×256 (مشروط) باستخدام 10 تقييمات دالة فقط. الكود متاح في [هذا الرابط](https://github.com/wl-zhao/UniPC).*

## نصائح

يُوصى بإعداد `solver_order` إلى 2 لعينة الدليل، و`solver_order=3` للعينة غير الشرطية.

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

## UniPCMultistepScheduler[[diffusers.UniPCMultistepScheduler]]

#### diffusers.UniPCMultistepScheduler[[diffusers.UniPCMultistepScheduler]]

```python
diffusers.UniPCMultistepScheduler(num_train_timesteps: int = 1000, beta_start: float = 0.0001, beta_end: float = 0.02, beta_schedule: str = '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, predict_x0: bool = True, solver_type: typing.Literal['bh1', 'bh2'] = 'bh2', lower_order_final: bool = True, disable_corrector: list[int] = [], solver_p: SchedulerMixin = None, 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, final_sigmas_type: typing.Literal['zero', 'sigma_min'] = 'zero', rescale_betas_zero_snr: bool = False, use_dynamic_shifting: bool = False, time_shift_type: typing.Literal['exponential'] = 'exponential', sigma_min: float | None = None, sigma_max: bool | None = None, shift_terminal: bool | None = None)
```

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

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

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`، *اختياري*) : مرر مصفوفة من قيم بيتا مباشرةً إلى منشئ الكائن لتجاوز `beta_start` و`beta_end`.

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

prediction_type (`"epsilon"`, `"sample"`, `"v_prediction"`, or `"flow_prediction"`, defaults to `"epsilon"`, *optional*) : 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` و `predict_x0=True`.

predict_x0 (`bool`، القيمة الافتراضية `True`) : ما إذا كان سيتم استخدام خوارزمية التحديث على x0 المتوقعة.

solver_type (`"bh1"` أو `"bh2"`، الافتراضي هو `"bh2"`) : نوع المُحلِّل لـ UniPC. يُوصى باستخدام `bh1` للعينة غير الشرطية عندما يكون عدد الخطوات < 10، و`bh2` في الحالات الأخرى.

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

disable_corrector (`list`، الافتراضي `[]`) : يحدد الخطوة التي يجب تعطيل المُصحِّح فيها للتخفيف من عدم المحاذاة بين `epsilon_theta(x_t, c)` و`epsilon_theta(x_t^c, c)`، وهو ما قد يؤثر على التقارب عند استخدام مقياس توجيه كبير. عادةً ما يُعطَّل المُصحِّح خلال الخطوات الأولى.

solver_p (`SchedulerMixin`، الافتراضي `None`) : أي جدولة أخرى، فإذا تم تحديدها، يصبح الخوارزمية `solver_p + UniC`.

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) لحجم الخطوات في جدول الضوضاء أثناء عملية أخذ العينات.

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) : إزاحة تُضاف إلى خطوات الاستدلال، كما تتطلبها بعض عائلات النماذج.

final_sigmas_type (`"zero"` أو `"sigma_min"`، الافتراضي هو `"zero"`) : القيمة النهائية لـ`sigma` في جدول الضوضاء أثناء عملية أخذ العينات. إذا كانت `"sigma_min"`، فإن قيمة sigma النهائية هي نفسها آخر قيمة sigma في جدول التدريب. إذا كانت `zero`، يتم تعيين قيمة sigma النهائية إلى 0.

rescale_betas_zero_snr (`bool`، القيمة الافتراضية `False`) : ما إذا كان يجب إعادة مقياس معاملات بيتا (betas) بحيث يكون SNR النهائي صفراً. يتيح هذا النموذج توليد عينات ساطعة جداً ومظلمة جداً بدلاً من تقييده بتوليد عينات بإضاءة متوسطة. له علاقة غير مباشرة بـ [`--offset_noise`](https://github.com/huggingface/diffusers/blob/74fd735eb073eb1d774b1ab4154a0876eb82f055/examples/dreambooth/train_dreambooth.py#L506).

`UniPCMultistepScheduler` هو إطار عمل لا يتطلب تدريبًا، مصمم لأخذ عينات سريعة من نماذج الانتشار.

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

#### add_noise[[diffusers.UniPCMultistepScheduler.add_noise]]

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

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

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

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

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

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

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

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

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

#### convert_model_output[[diffusers.UniPCMultistepScheduler.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_unipc_multistep.py#L760)

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

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

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

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

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

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

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

#### index_for_timestep[[diffusers.UniPCMultistepScheduler.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_unipc_multistep.py#L1100)

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

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

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

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

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

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

#### multistep_uni_c_bh_update[[diffusers.UniPCMultistepScheduler.multistep_uni_c_bh_update]]

```python
multistep_uni_c_bh_update(this_model_output: Tensor, *args, last_sample: Tensor = None, this_sample: Tensor = None, order: int = None, **kwargs)
```

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

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

this_model_output (`torch.Tensor`) : مخرجات النموذج عند `x_t`.

this_timestep (`int`) : خطوة الزمن الحالية `t`.

last_sample (`torch.Tensor`) : العينة المولّدة قبل المتنبئ الأخير `x_{t-1}`.

this_sample (`torch.Tensor`) : العينة المولّدة بعد آخر متنبئ `x_{t}`.

order (`int`) : قيمة `p` الخاصة بـ UniC-p في هذه الخطوة. يجب أن يكون ترتيب الدقة الفعّال `order + 1`.

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

المصفوفة العينة المُصحَّحة عند خطوة الزمن الحالية.

خطوة واحدة لنموذج UniC (نسخة B(h)).

#### multistep_uni_p_bh_update[[diffusers.UniPCMultistepScheduler.multistep_uni_p_bh_update]]

```python
multistep_uni_p_bh_update(model_output: Tensor, *args, sample: Tensor = None, order: int = None, **kwargs)
```

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

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

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

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

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

order (`int`) : ترتيب UniP في خطوة الزمن هذه (يتوافق مع *p* في UniPC-p).

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

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

خطوة واحدة لنموذج UniP (نسخة B(h)). أو يُستخدم `self.solver_p` إذا تم تحديد ذلك.

#### scale_model_input[[diffusers.UniPCMultistepScheduler.scale_model_input]]

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

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

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

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

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

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

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

#### set_begin_index[[diffusers.UniPCMultistepScheduler.set_begin_index]]

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

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

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

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

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

#### set_timesteps[[diffusers.UniPCMultistepScheduler.set_timesteps]]

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

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

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

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

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

sigmas (`List[float]`، *اختياري*) : قيم مخصصة لـ sigmas تُستخدم لكل خطوة من خطوات الانتشار. إذا كانت `None`، تُحسب قيم sigmas تلقائيًا.

mu (`float`، *اختياري*) : معامل mu الاختياري للإزاحة الديناميكية عند استخدام نوع الإزاحة الزمنية الأُسّي.

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

#### خطوة[[diffusers.UniPCMultistepScheduler.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_unipc_multistep.py#L1153)

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

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). تنقل هذه الدالة العيّنة باستخدام UniPC متعدد الخطوات.

#### stretch_shift_to_terminal[[diffusers.UniPCMultistepScheduler.stretch_shift_to_terminal]]

```python
stretch_shift_to_terminal(t: Tensor)
```

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

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

t (`torch.Tensor`) : متجه (Tensor) لخطوات الزمن (timesteps) التي سيتم تمديدها وإزاحتها.

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

مصفوفة (Tensor) من خطوات الزمن المُعدَّلة بحيث تكون القيمة النهائية مساوية لـ `self.config.shift_terminal`.

يمدّ جدول خطوات الزمن ويحرّكه لضمان أنه ينتهي عند قيمة الإعداد `shift_terminal` المُحدَّدة.

مرجع: https://github.com/Lightricks/LTX-Video/blob/a01a171f8fe3d99dce2728d60a73fecf4d4238ae/ltx_video/schedulers/rf.py#L51

#### time_shift[[diffusers.UniPCMultistepScheduler.time_shift]]

```python
time_shift(mu: float, sigma: float, t: Tensor)
```

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

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

mu (`float`) : معامل mu الخاص بإزاحة الوقت.

sigma (`float`) : معامل سيجما الخاص بإزاحة الوقت.

t (`torch.Tensor`) : خطوات الزمن المدخلة.

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

خطوات الزمن المُزاحة.

طبّق إزاحةً زمنية على قيم sigmas.

## 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` في المجدول.

