# DEISMultistepScheduler

Diffusion Exponential Integrator Sampler (DEIS), Qinsheng Zhang ve Yongxin Chen tarafından [Fast Sampling of Diffusion Models with Exponential Integrator](https://huggingface.co/papers/2204.13902) makalesinde önerilmiştir. `DEISMultistepScheduler`, difüzyon sıradan diferansiyel denklemleri (ODE) için hızlı, yüksek mertebeden bir çözücüdür.

Bu uygulama, DEIS makalesindeki orijinal doğrusal `t` uzayı yerine log-rho uzayındaki polinom sığdırma formülünü değiştirir. Bu değişiklik, sayısal çözücüye başvurmak yerine üstel çok adımlı güncelleme için kapalı form katsayıları sağlar.

Makalenin özeti şudur:

*Son birkaç yıl, üretken modelleme görevlerinde yüksek sadakatli örnekler üretmede Difüzyon modellerinin~(DM) büyük başarısına tanık oldu. DM'nin önemli bir kısıtlaması, istenen doğruluğa ulaşmak için öğrenilen difüzyon sürecinin genellikle yüzlerce ile binlerce zaman ayrıklaştırma adımını gerektiren, meşhur yavaş örnek alma prosedürüdür. Amacımız, yüksek örnek kalitesini korurken çok daha az adımla DM'ler için hızlı bir örnek alma yöntemi geliştirmektir. Bu amaçla, DM'lerdeki örnek alma prosedürünü sistematik olarak analiz ediyoruz ve örnek kalitesini etkileyen ana faktörleri belirliyoruz; bunlar arasında ayrıklaştırma yöntemi en kritik olanıdır. Öğrenilen difüzyon sürecini dikkatlice inceleyerek Diffusion Exponential Integrator Sampler~(DEIS) öneriyoruz. Bu yöntem, sıradan diferansiyel denklemleri (ODE) ayrıklaştırmak için tasarlanan Exponential Integrator'a dayanır ve öğrenilen difüzyon sürecinin yarı doğrusal yapısından yararlanarak ayrıklaştırma hatasını azaltır. Önerilen yöntem herhangi bir DM'ye uygulanabilir ve en fazla 10 adımda yüksek sadakatli örnekler üretebilir. Deneylerimizde, tek bir A6000 GPU üzerinde CIFAR10'dan 50k görsel üretmek yaklaşık 3 dakika sürmektedir. Ayrıca, önceden eğitilmiş DM'leri doğrudan kullanarak, skor fonksiyonu değerlendirmesi~(NFE) sayısı kısıtlı olduğunda, örneğin CIFAR10'da 10 NFE ile 4.17 FID, 3.37 FID ve yalnızca 15 NFE ile 9.74 IS, en iyi örnek alma performansını elde ediyoruz. Kod [bu https URL](https://github.com/qsh-zh/deis) adresinde mevcuttur.*

## İpuçları

`solver_order`'un 2 veya 3 olarak ayarlanması önerilir; `solver_order=1` ise [DDIMScheduler](/docs/diffusers/main/tr/api/schedulers/ddim#diffusers.DDIMScheduler)'a eşdeğerdir.

[Imagen](https://huggingface.co/papers/2205.11487)'den dinik eşikleme desteklenmektedir ve piksel uzayında difüzyon modelleri için dinamik eşikleme kullanmak üzere `thresholding=True` ayarlayabilirsiniz.

## 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')
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L86)

**Parametreler:**

num_train_timesteps (`int`, varsayılan `1000`) : Modelin eğitileceği difüzyon adım sayısı.

beta_start (`float`, varsayılan `0.0001`) : Çıkarımın başlangıç `beta` değeri.

beta_end (`float`, varsayılan `0.02`) : Son `beta` değeri.

beta_schedule (`"linear"`, `"scaled_linear"` veya `"squaredcos_cap_v2"`, varsayılan olarak `"linear"`) : Beta zamanlaması, modelin adım atması için beta aralığından beta dizisine bir eşleme. `linear`, `scaled_linear` veya `squaredcos_cap_v2` seçeneklerinden birini seçin.

trained_betas (`np.ndarray` veya `list[float]`, *isteğe bağlı*) : `beta_start` ve `beta_end` değerlerini atlamak için beta dizisini doğrudan yapılandırıcıya iletin.

solver_order (`int`, varsayılan `2`) : `1` veya `2` veya `3` olabilecek DEIS derecesi. Rehberli örneklemeler için `solver_order=2`, koşulsuz örneklemeler için `solver_order=3` kullanılması önerilir.

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`, varsayılan `False`) : "Dinik eşikleme" yönteminin kullanılıp kullanılmayacağını belirtir. Bu, Stable Diffusion gibi gizli uzay difüzyon modelleri için uygun değildir.

dynamic_thresholding_ratio (`float`, varsayılan `0.995`) : Dinamik eşikleme yöntemi için oran. Yalnızca `thresholding=True` olduğunda geçerlidir.

sample_max_value (`float`, varsayılan `1.0`) : Dinamik eşikleme için eşik değeri. Yalnızca `thresholding=True` olduğunda geçerlidir.

algorithm_type (`"deis"`, varsayılan `"deis"`) : Çözücü için algoritma türü.

solver_type (`"logrho"`, varsayılan `"logrho"`) : DEIS için çözücü türü.

lower_order_final (`bool`, varsayılan `True`) : Son adımlarda düşük dereceli çözücülerin kullanılıp kullanılmayacağı. Yalnızca 15'ten az çıkarım adımı için geçerlidir.

use_karras_sigmas (`bool`, *isteğe bağlı*, varsayılan `False`) : Örnekleme sürecinde gürültü zamanlamasındaki adım boyutları için Karras sigmalarının kullanılıp kullanılmayacağını belirtir. `True` ise, sigmalar {σi} gürültü seviyeleri dizisine göre belirlenir.

use_exponential_sigmas (`bool`, *isteğe bağlı*, varsayılan `False`) : Örnekleme sürecinde gürültü zamanlamasındaki adım boyutları için üstel sigmaların kullanılıp kullanılmayacağını belirtir.

use_beta_sigmas (`bool`, *isteğe bağlı*, varsayılan `False`) : Örnekleme sürecinde gürültü zamanlamasında adım boyutları için beta sigmaların kullanılıp kullanılmayacağını belirtir. Daha fazla bilgi için [Beta Sampling is All You Need](https://huggingface.co/papers/2407.12173) makalesine bakın.

use_flow_sigmas (`bool`, *isteğe bağlı*, varsayılan `False`) : Örnekleme sürecinde gürültü zamanlamasında adım boyutları için akış sigmalarının kullanılıp kullanılmayacağı.

flow_shift (`float`, *isteğe bağlı*, varsayılan `1.0`) : Akış tabanlı modeller için akış kaydırma parametresi.

timestep_spacing (`"linspace"`, `"leading"` veya `"trailing"`, varsayılan olarak `"linspace"`) : Zaman adımlarının ölçeklendirilme yöntemi. Daha fazla bilgi için [Common Diffusion Noise Schedules and Sample Steps are Flawed](https://huggingface.co/papers/2305.08891) makalesindeki Tablo 2'ye bakın.

steps_offset (`int`, varsayılan `0`) : Bazı model ailelerinin gerektirdiği gibi, çıkarım adımlarına eklenen bir ofset.

use_dynamic_shifting (`bool`, varsayılan `False`) : Gürültü zamanlaması için dinamik kaydırma kullanılıp kullanılmayacağı.

time_shift_type (`"exponential"`, varsayılan olarak `"exponential"`) : Uygulanacak zaman kaydırma türü.

`DEISMultistepScheduler`, difüzyon sıradan diferansiyel denklemleri (ODE) için hızlı yüksek mertebeden bir çözücüdür.

Bu model [SchedulerMixin](/docs/diffusers/main/tr/api/schedulers/overview#diffusers.SchedulerMixin) ve [ConfigMixin](/docs/diffusers/main/tr/api/configuration#diffusers.ConfigMixin) sınıflarından devralır. Kütüphanenin tüm zamanlayıcılar için yükleme ve kaydetme gibi genel yöntemleri uyguladığı üst sınıf belgelendirmesini kontrol edin.

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

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

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L997)

**Parametreler:**

original_samples (`torch.Tensor`) : Gürültüsüz orijinal örnekler.

noise (`torch.Tensor`) : Örneklere eklenecek gürültü.

timesteps (`torch.IntTensor`) : Örneklerin gürültü eklenmesi için kullanılacak zaman adımları.

**Dönüş:** `torch.Tensor`

Gürültülü örnekler.

Belirtilen zaman adımlarındaki gürültü planına göre orijinal örneklerin gürültü ekleyin.

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

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

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L581)

**Parametreler:**

model_output (`torch.Tensor`) : Öğrenen difüzyon modelinden gelen doğrudan çıktı.

timestep (`int`) : Difüzyon zincirindeki mevcut ayrık zaman adımı.

sample (`torch.Tensor`) : Difüzyon süreci tarafından oluşturulan bir örneğin mevcut bir örneği.

**Dönüş:** `torch.Tensor`

Dönüştürülen model çıktısı.

Model çıktısını DEIS algoritmasının ihtiyaç duyduğu ilgili tipe dönüştürün.

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

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

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L641)

**Parametreler:**

model_output (`torch.Tensor`) : Öğrenen difüzyon modelinden gelen doğrudan çıktı.

timestep (`int`) : Difüzyon zincirindeki mevcut ayrık zaman adımı.

prev_timestep (`int`) : Difüzyon zincirindeki bir önceki ayrık zaman adımı.

sample (`torch.Tensor`) : Difüzyon süreci tarafından oluşturulan bir örneğin mevcut bir örneği.

**Dönüş:** `torch.Tensor`

Önceki zaman adımındaki örnek tensör.

Birinci dereceden DEIS için bir adım (DDIM ile eşdeğer).

#### 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)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L864)

**Parametreler:**

timestep (`int` veya `torch.Tensor`) : İndeksini bulmak istediğiniz zaman adımı.

schedule_timesteps (`torch.Tensor`, *isteğe bağlı*) : Aranacak zaman adımı zamanlaması. `None` ise `self.timesteps` kullanılır.

**Dönüş:** `int`

Zaman adımı planındaki zaman adımının indeksi.

Zamanlamadaki (schedule) belirli bir zaman adımının (timestep) indeksini bulun.

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

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

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L702)

**Parametreler:**

model_output_list (`list[torch.Tensor]`) : Öğrenen difüzyon modelinin mevcut ve sonraki zaman adımlarındaki doğrudan çıktıları.

sample (`torch.Tensor`) : Difüzyon süreci tarafından oluşturulan bir örneğin mevcut bir örneği.

**Dönüş:** `torch.Tensor`

Önceki zaman adımındaki örnek tensör.

İkinci mertebeden çok adımlı DEIS için bir adım.

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

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

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L775)

**Parametreler:**

model_output_list (`list[torch.Tensor]`) : Öğrenen difüzyon modelinin mevcut ve sonraki zaman adımlarındaki doğrudan çıktıları.

sample (`torch.Tensor`) : Difüzyon süreci tarafından oluşturulan bir örneğin mevcut bir örneği.

**Dönüş:** `torch.Tensor`

Önceki zaman adımındaki örnek tensör.

Üçüncü dereceden çok adımlı DEIS için bir adım.

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

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

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L981)

**Parametreler:**

sample (`torch.Tensor`) : Girdi örneği.

**Dönüş:** `torch.Tensor`

Ölçeklendirilmiş bir girdi örneği.

Gürültüden arındırma modelinin girdisinin mevcut zaman adımına bağlı olarak ölçeklenmesi gereken zamanlayıcılarla değiştirilebilirliği sağlar.

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

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

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L262)

**Parametreler:**

begin_index (`int`, varsayılan `0`) : Zamanlayıcının başlangıç indeksi.

Zamanlayıcının başlangıç indeksini ayarlar. Bu işlev, çıkarım (inference) öncesinde pipeline'dan çalıştırılmalıdır.

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

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

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L272)

**Parametreler:**

num_inference_steps (`int`) : Ön eğitilmiş bir modelle örnekler oluşturulurken kullanılan difüzyon adım sayısı.

device (`str` veya `torch.device`, *opsiyonel*) : Timestep'lerin taşınacağı cihaz. `None` ise timestep'ler taşınmaz.

mu (`float`, *isteğe bağlı*) : Dinamik kaydırma için mu parametresi. Yalnızca `use_dynamic_shifting=True` ve `time_shift_type="exponential"` olduğunda kullanılır.

Difüzyon zinciri için kullanılan ayrık zaman adımlarını ayarlar (çalıştırılmadan önce çıkarım yapılmalıdır).

#### adım[[diffusers.DEISMultistepScheduler.step]]

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

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_deis_multistep.py#L917)

**Parametreler:**

model_output (`torch.Tensor`) : Öğrenen difüzyon modelinden gelen doğrudan çıktı.

timestep (`int` veya `torch.Tensor`) : Difüzyon zincirindeki mevcut ayrık zaman adımı.

sample (`torch.Tensor`) : Difüzyon süreci tarafından oluşturulan bir örneğin mevcut bir örneği.

return_dict (`bool`, varsayılan `True`) : [SchedulerOutput](/docs/diffusers/main/tr/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) mu yoksa `tuple` mu döndürüleceğini belirtir.

**Dönüş:** [SchedulerOutput](/docs/diffusers/main/tr/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) veya `tuple`

return_dict `True` ise [SchedulerOutput](/docs/diffusers/main/tr/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) döndürülür, aksi halde bir tuple döndürülür ve bu tuple'ın ilk öğesi örnek tensörüdür.

Önceki zaman adımından örneklemeyi SDE'yi tersine çevirerek tahmin edin. Bu fonksiyon, örneklemeyi çok adımlı DEIS ile ilerletir.

## 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)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_utils.py#L66)

**Parametreler:**

prev_sample (`torch.Tensor`, görüntüler için `(batch_size, num_channels, height, width)` boyutunda) : Önceki zaman adımının hesaplanan `(x_{t-1})` örneği. `prev_sample`, gürültü azaltma döngüsünde bir sonraki model girdisi olarak kullanılmalıdır.

Bir zamanlayıcının `step` işlevinin çıktısı için temel sınıf.

