# DDIMScheduler

[نماذج الانتشار الضمنية غير الضجيج](https://huggingface.co/papers/2010.02502) (DDIM) من تأليف جيامينغ سونغ وتشينلين منغ وستيفانو إيرمون.

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

*حققت نماذج الانتشار الاحتمالية لإزالة الضوضاء (DDPMs) توليد صور عالية الجودة دون تدريب عدائي، لكنها تتطلب محاكاة سلسلة ماركوف لعدد كبير من الخطوات لإنتاج عينة. لتسريع عملية أخذ العينات، نقدم نماذج الانتشار الضمنية لإزالة الضوضاء (DDIMs)، وهي فئة أكثر كفاءة من النماذج الاحتمالية الضمنية التكرارية التي تتبع نفس إجراء التدريب المستخدم في DDPMs. في نماذج DDPMs، يُعرَّف العملية التوليدية على أنها عكس عملية انتشار ماركوفية. نبني فئة من عمليات الانتشار غير الماركوفية التي تؤدي إلى هدف تدريب متطابق، لكن عملية العكس فيها يمكن أن تكون أسرع بكثير في أخذ العينات. نُظهر تجريبيًا أن نماذج DDIMs يمكنها إنتاج عينات عالية الجودة أسرع بمقدار 10 إلى 50 مرة من حيث الوقت الفعلي مقارنةً بنماذج DDPMs، وتتيح لنا الموازنة بين الحساب وجودة العينة، كما يمكنها تنفيذ استيفاء دلالي ذي معنى للصور مباشرةً في الفضاء الكامن.*

يمكن العثور على قاعدة الكود الأصلية لهذا الورقة البحثية في [ermongroup/ddim](https://github.com/ermongroup/ddim)، ويمكنك التواصل مع المؤلف عبر [tsong.me](https://tsong.me/).

## نصائح

The paper [Common Diffusion Noise Schedules and Sample Steps are Flawed](https://huggingface.co/papers/2305.08891) claims that a mismatch between the training and inference settings leads to suboptimal inference generation results for Stable Diffusion. To fix this, the authors propose:

> [!WARNING]
> 🧪 هذه ميزة تجريبية!

1. إعادة مقياس جدول الضوضاء لفرض نسبة إشارة إلى ضوضاء نهائية صفرية (SNR)

```py
pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config, rescale_betas_zero_snr=True)
```

2. train a model with `v_prediction` (add the following argument to the [train_text_to_image.py](https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/train_text_to_image.py) or [train_text_to_image_lora.py](https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/train_text_to_image_lora.py) scripts)

```bash
--prediction_type="v_prediction"
```

3. غيّر المُعيّن (sampler) ليبدأ دائمًا من خطوة الزمن (timestep) الأخيرة

```py
pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config, timestep_spacing="trailing")
```

4. إعادة تحجيم التوجيه الحر من التصنيف لمنع الإفراط في التعرض

```py
image = pipe(prompt, guidance_rescale=0.7).images[0]
```

على سبيل المثال:

```py
from diffusers import DiffusionPipeline, DDIMScheduler
import torch

pipe = DiffusionPipeline.from_pretrained("ptx0/pseudo-journey-v2", dtype=torch.float16)
pipe.scheduler = DDIMScheduler.from_config(
    pipe.scheduler.config, rescale_betas_zero_snr=True, timestep_spacing="trailing"
)
pipe.to("cuda")  # or "mps", "xpu", "cpu"

prompt = "A lion in galaxies, spirals, nebulae, stars, smoke, iridescent, intricate detail, octane render, 8k"
image = pipe(prompt, guidance_rescale=0.7).images[0]
image
```

## DDIMScheduler[[diffusers.DDIMScheduler]]

#### diffusers.DDIMScheduler[[diffusers.DDIMScheduler]]

```python
diffusers.DDIMScheduler(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, clip_sample: bool = True, set_alpha_to_one: bool = True, steps_offset: int = 0, prediction_type: typing.Literal['epsilon', 'sample', 'v_prediction'] = 'epsilon', thresholding: bool = False, dynamic_thresholding_ratio: float = 0.995, clip_sample_range: float = 1.0, sample_max_value: float = 1.0, timestep_spacing: typing.Literal['leading', 'trailing', 'linspace'] = 'leading', rescale_betas_zero_snr: bool = False)
```

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

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

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

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

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

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

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

clip_sample (`bool`، القيمة الافتراضية `True`) : قصّ العينة المتنبأ بها من أجل الاستقرار العددي.

clip_sample_range (`float`، القيمة الافتراضية 1.0) : الحد الأقصى لحجم قصّ العينة. صالح فقط عندما يكون `clip_sample=True`.

set_alpha_to_one (`bool`، القيمة الافتراضية `True`) : يستخدم كل خطوة انتشار قيمة حاصل ضرب الألفا في تلك الخطوة وفي الخطوة السابقة. لا توجد ألفا سابقة للخطوة الأخيرة. عندما تكون هذه الخانة `True` يتم تثبيت حاصل ضرب ألفا السابقة عند `1`، وإلا فإنه يستخدم قيمة ألفا في الخطوة 0.

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

prediction_type (`Literal["epsilon", "sample", "v_prediction"]`، القيمة الافتراضية هي `"epsilon"`) : نوع التنبؤ لدالة المجدول. يجب أن يكون أحد `"epsilon"` (يتنبض بضوضاء عملية الانتشار)، أو `"sample"` (يتنبأ مباشرةً بالعينة الضوضائية)، أو `"v_prediction"` (انظر القسم 2.4 من ورقة [Imagen Video](https://huggingface.co/papers/2210.02303)).

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

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

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

timestep_spacing (`Literal["leading", "trailing", "linspace"]`، الافتراضي `"leading"`) : الطريقة التي يجب بها قياس خطوات الزمن. يجب أن تكون واحدة من `"leading"` أو `"trailing"` أو `"linspace"`. راجع الجدول 2 من [جداول ضوضاء الانتشار الشائعة وخطوات العينات معيبة](https://huggingface.co/papers/2305.08891) لمزيد من المعلومات.

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

يمتد `DDIMScheduler` على إجراء إزالة الضوضاء المُقدَّم في نماذج الانتشار الاحتمالية لإزالة الضوضاء (DDPMs) مع توجيه غير ماركوفي.

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

#### add_noise[[diffusers.DDIMScheduler.add_noise]]

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

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

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

original_samples (`torch.Tensor`) : العينات الأصلية التي سيتم إضافة الضوضاء إليها.

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

timesteps (`torch.IntTensor`) : خطوات الزمن التي تشير إلى مستوى الضوضاء لكل عينة.

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

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

أضف الضوضاء إلى العينات الأصلية وفقًا لحجم الضوضاء في كل خطوة زمنية (وهذا هو عملية الانتشار الأمامي).

#### get_velocity[[diffusers.DDIMScheduler.get_velocity]]

```python
get_velocity(sample: Tensor, noise: Tensor, timesteps: IntTensor)
```

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

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

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

noise (`torch.Tensor`) : متجه الضوضاء.

timesteps (`torch.IntTensor`) : خطوات الزمن لحساب السرعة.

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

السرعة المحسوبة.

احسب تنبؤ السرعة من العينة والضوضاء وفقًا لصيغة السرعة.

#### scale_model_input[[diffusers.DDIMScheduler.scale_model_input]]

```python
scale_model_input(sample: Tensor, timestep: int = None)
```

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

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

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

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

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

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

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

#### set_timesteps[[diffusers.DDIMScheduler.set_timesteps]]

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

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

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

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

device (`str | torch.device`، *اختياري*) : الجهاز المستخدم لخطوات الزمن.

**يرفع:** ``ValueError``

- ``ValueError`` -- إذا كان `num_inference_steps` أكبر من `self.config.num_train_timesteps`.

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

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

```python
step(model_output: Tensor, timestep: int, sample: Tensor, eta: float = 0.0, use_clipped_model_output: bool = False, generator: typing.Optional[torch.Generator] = None, variance_noise: typing.Optional[torch.Tensor] = None, return_dict: bool = True)
```

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

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

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

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

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

eta (`float`، *اختياري*، القيمة الافتراضية 0.0) : وزن الضوضاء المضافة في خطوة الانتشار. القيمة 0 تقابل DDIM (حتمي) والقيمة 1 تقابل DDPM (عشوائي بالكامل).

use_clipped_model_output (`bool`، *اختياري*، القيمة الافتراضية `False`) : إذا كانت `True`، تُحسب `model_output` "المُصحَّحة" من العينة الأصلية المتنبأ بها والمُقصَّاة. هذا ضروري لأن العينة الأصلية المتنبأ بها تُقصّ إلى [-1, 1] عندما تكون `self.config.clip_sample` هي `True`. إذا لم يحدث أي قصّ، فإن `model_output` "المُصحَّحة" ستطابق تلك المُقدَّمة كمدخل، ولن يكون لـ`use_clipped_model_output` أي تأثير.

generator (`torch.Generator`، *اختياري*) : مولّد أرقام عشوائية لعينات قابلة للتكرار.

variance_noise (`torch.Tensor`، *اختياري*) : بديل لتوليد الضوضاء باستخدام `generator` من خلال تقديم الضوضاء مباشرةً للتباين نفسه. مفيد لطرق مثل `CycleDiffusion`.

return_dict (`bool`، *اختياري*، الافتراضي `True`) : ما إذا كان يجب إرجاع [DDIMSchedulerOutput](/docs/diffusers/main/ar/api/schedulers/ddim#diffusers.schedulers.scheduling_ddim.DDIMSchedulerOutput) أو `tuple` أم لا.

**يعيد:** [DDIMSchedulerOutput](/docs/diffusers/main/ar/api/schedulers/ddim#diffusers.schedulers.scheduling_ddim.DDIMSchedulerOutput) أو `tuple`

If return_dict is `True`, [DDIMSchedulerOutput](/docs/diffusers/main/ar/api/schedulers/ddim#diffusers.schedulers.scheduling_ddim.DDIMSchedulerOutput) is returned, otherwise a tuple is returned where the first element is the sample tensor.

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

## DDIMSchedulerOutput[[diffusers.schedulers.scheduling_ddim.DDIMSchedulerOutput]]

#### diffusers.schedulers.scheduling_ddim.DDIMSchedulerOutput[[diffusers.schedulers.scheduling_ddim.DDIMSchedulerOutput]]

```python
diffusers.schedulers.scheduling_ddim.DDIMSchedulerOutput(prev_sample: Tensor, pred_original_sample: typing.Optional[torch.Tensor] = None)
```

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

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

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

pred_original_sample (`torch.Tensor` من الشكل `(batch_size, num_channels, height, width)` للصور) : العينة المُتوقَّع إزالة الضوضاء منها `(x_{0})` بناءً على مخرجات النموذج من خطوة الزمن الحالية. يمكن استخدام `pred_original_sample` لمعاينة التقدم أو للإرشاد.

فئة الإخراج لدالة `step` الخاصة بالجدول الزمني.

