# TCDScheduler

قدّم [Trajectory Consistency Distillation](https://huggingface.co/papers/2402.19159) الذي نشره Jianbin Zheng وMinghui Hu وZhongyi Fan وChaoyue Wang وChangxing Ding وDacheng Tao وTat-Jen Cham، طريقة Strategic Stochastic Sampling (الخوارزمية 4) قادرة على توليد عينات جيدة بعدد صغير من الخطوات. وتتميز هذه الطريقة بأنها تكرار متقدم لمجدول الخطوات المتعددة (الخوارزمية 1) في [Consistency Models](https://huggingface.co/papers/2303.01469)، حيث صُممت Strategic Stochastic Sampling خصيصًا لوظيفة اتساق المسار.

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

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

يمكن العثور على قاعدة الكود الأصلية في [jabir-zheng/TCD](https://github.com/jabir-zheng/TCD).

## TCDScheduler[[diffusers.TCDScheduler]]

#### diffusers.TCDScheduler[[diffusers.TCDScheduler]]

```python
diffusers.TCDScheduler(num_train_timesteps: int = 1000, beta_start: float = 0.00085, beta_end: float = 0.012, beta_schedule: str = 'scaled_linear', trained_betas: numpy.ndarray | list[float] | None = None, original_inference_steps: int = 50, clip_sample: bool = False, clip_sample_range: float = 1.0, set_alpha_to_one: bool = True, steps_offset: int = 0, prediction_type: str = 'epsilon', thresholding: bool = False, dynamic_thresholding_ratio: float = 0.995, sample_max_value: float = 1.0, timestep_spacing: str = 'leading', timestep_scaling: float = 10.0, rescale_betas_zero_snr: bool = False)
```

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

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

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

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

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

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

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

original_inference_steps (`int`، القيمة الافتراضية هي `50`) : العدد الافتراضي لخطوات الاستدلال المستخدمة لتوليد جدول أزمنة متباعد خطياً، حيث سنأخذ في النهاية `num_inference_steps` من أزمنة متباعدة بالتساوي لتشكيل جدول الأزمنة النهائي.

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

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

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

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

prediction_type (`str`, 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`) or `v_prediction` (see section 2.4 of [Imagen Video](https://huggingface.co/papers/2210.02303) paper).

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

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

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

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

timestep_scaling (`float`، القيمة الافتراضية `10.0`) : العامل الذي تُضرب به خطوات الزمن عند حساب شروط الحدود لنموذج الاتساق `c_skip` و`c_out`. زيادة هذا العامل تقلل من خطأ التقريب (على الرغم من أن خطأ التقريب عند القيمة الافتراضية `10.0` صغير بالفعل).

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

`TCDScheduler` يدمج `Strategic Stochastic Sampling` الذي قدمته ورقة `Trajectory Consistency Distillation`، ممتدًا من العينة الأصلية متعددة الخطوات Multistep Consistency Sampling لتمكين اجتياز المسار دون قيود.

يستند هذا الكود إلى المستودع الرسمي لـ TCD (https://github.com/jabir-zheng/TCD).

يرث هذا النموذج من [SchedulerMixin](/docs/diffusers/main/ar/api/schedulers/overview#diffusers.SchedulerMixin) و [ConfigMixin](/docs/diffusers/main/ar/api/configuration#diffusers.ConfigMixin). يتولى [~ConfigMixin](/docs/diffusers/main/ar/api/configuration#diffusers.ConfigMixin) تخزين جميع سمات الإعدادات التي تُمرَّر في دالة `__init__` الخاصة بالجدول الزمني، مثل `num_train_timesteps`. يمكن الوصول إليها عبر `scheduler.config.num_train_timesteps`. يوفر [SchedulerMixin](/docs/diffusers/main/ar/api/schedulers/overview#diffusers.SchedulerMixin) وظائف عامة للتحميل والحفظ عبر الدالتين [SchedulerMixin.save_pretrained()](/docs/diffusers/main/ar/api/schedulers/overview#diffusers.SchedulerMixin.save_pretrained) و [from_pretrained()](/docs/diffusers/main/ar/api/schedulers/overview#diffusers.SchedulerMixin.from_pretrained).

#### add_noise[[diffusers.TCDScheduler.add_noise]]

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

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

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

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

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

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

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

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

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

#### get_velocity[[diffusers.TCDScheduler.get_velocity]]

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

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

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

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

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

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

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

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

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

#### index_for_timestep[[diffusers.TCDScheduler.index_for_timestep]]

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

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

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

timestep (`float` أو `torch.Tensor`) : قيمة خطوة الزمن التي يجب البحث عنها في الجدول الزمني.

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

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

مؤشر خطوة الزمن في الجدول. بالنسبة للخطوة الأولى تمامًا، يُرجع المؤشر الثاني إذا كانت هناك تطابقات متعددة، لتجنب تجاوز قيمة سيجما عند البدء من منتصف الجدول (مثلًا، في تحويل الصورة إلى صورة).

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

#### previous_timestep[[diffusers.TCDScheduler.previous_timestep]]

```python
previous_timestep(timestep: int)
```

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

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

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

**يعيد:** `int` أو `torch.Tensor`

خطوة الزمن السابقة.

احسب خطوة الزمن السابقة في سلسلة الانتشار.

#### scale_model_input[[diffusers.TCDScheduler.scale_model_input]]

```python
scale_model_input(sample: Tensor, timestep: typing.Union[int, torch.Tensor, NoneType] = None)
```

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

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

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

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

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

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

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

#### set_begin_index[[diffusers.TCDScheduler.set_begin_index]]

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

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

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

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

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

#### set_timesteps[[diffusers.TCDScheduler.set_timesteps]]

```python
set_timesteps(num_inference_steps: int | None = None, device: typing.Union[str, torch.device, NoneType] = None, original_inference_steps: int | None = None, timesteps: list[int] | None = None, strength: float = 1.0)
```

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

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

num_inference_steps (`int`, *اختياري*) : عدد خطوات الانتشار المستخدمة عند توليد العينات بنموذج مُدرَّب مسبقًا. إذا تم استخدامه، يجب أن يكون `timesteps` هو `None`.

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

original_inference_steps (`int`, *اختياري*) : العدد الأصلي لخطوات الاستدلال، والذي سيُستخدم لتوليد جدول أزمنة متباعد خطياً (وهو يختلف عن التنفيذ القياسي في `diffusers`). ثم سنأخذ `num_inference_steps` من أزمنة هذا الجدول، متباعدة بالتساوي من حيث الفهارس، ونستخدمها كجدول أزمنة نهائي. إذا لم يُضبط، فسيكون الافتراضي هو الخاصية `original_inference_steps`.

timesteps (`list[int]`، *اختياري*) : خطوات زمنية مخصصة تُستخدم لدعم تباعد تعسفي بين الخطوات الزمنية. إذا كانت `None`، فسيتم استخدام استراتيجية التباعد الافتراضية للخطوات الزمنية، وهي التباعد المتساوي بين الخطوات الزمنية على جدول الخطوات الزمنية للتدريب/التقطير. إذا تم تمرير `timesteps`، فيجب أن تكون `num_inference_steps` هي `None`.

strength (`float`، القيمة الافتراضية `1.0`) : يُستخدم لتحديد عدد خطوات الزمن المستخدمة أثناء الاستدلال عند استخدام img2img وinpaint وما إلى ذلك.

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

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

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

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

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

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

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

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

eta (`float`، القيمة الافتراضية `0.3`) : معامل عشوائي (يُشار إليه باسم `gamma` في الورقة البحثية) يُستخدم للتحكم في درجة العشوائية في كل خطوة. عندما يكون eta = 0، فإنه يمثل أخذ عينات حتمي، بينما يشير eta = 1 إلى أخذ عينات عشوائي كامل.

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

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

**يعيد:** [TCDSchedulerOutput](/docs/diffusers/main/ar/api/schedulers/tcd#diffusers.schedulers.scheduling_tcd.TCDSchedulerOutput) أو `tuple[torch.Tensor, torch.Tensor]`

If return_dict is `True`, [TCDSchedulerOutput](/docs/diffusers/main/ar/api/schedulers/tcd#diffusers.schedulers.scheduling_tcd.TCDSchedulerOutput) is returned, otherwise a tuple is returned containing the previous sample and the predicted noised sample.

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

## TCDSchedulerOutput[[diffusers.schedulers.scheduling_tcd.TCDSchedulerOutput]]

#### diffusers.schedulers.scheduling_tcd.TCDSchedulerOutput[[diffusers.schedulers.scheduling_tcd.TCDSchedulerOutput]]

```python
diffusers.schedulers.scheduling_tcd.TCDSchedulerOutput(prev_sample: Tensor, pred_noised_sample: typing.Optional[torch.Tensor] = None)
```

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

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

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

pred_noised_sample (`torch.Tensor` من الشكل `(batch_size, num_channels, height, width)` للصور، *اختياري*) : العينة الضجيجية المتوقعة `(x_{s})` بناءً على مخرجات النموذج من خطوة الزمن الحالية.

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

