# EDMDPMSolverMultistepScheduler

`EDMDPMSolverMultistepScheduler` adalah [formulasi Karras](https://huggingface.co/papers/2206.00364) dari `DPMSolverMultistepScheduler`, sebuah scheduler multistep dari [DPM-Solver: A Fast ODE Solver for Diffusion Probabilistic Model Sampling in Around 10 Steps](https://huggingface.co/papers/2206.00927) dan [DPM-Solver++: Fast Solver for Guided Sampling of Diffusion Probabilistic Models](https://huggingface.co/papers/2211.01095) oleh Cheng Lu, Yuhao Zhou, Fan Bao, Jianfei Chen, Chongxuan Li, dan Jun Zhu.

DPMSolver (dan versi yang ditingkatkan DPMSolver++) adalah solver ordo tinggi khusus yang cepat untuk ODE difusi dengan jaminan ordo konvergensi. Secara empiris, sampling DPMSolver dengan hanya 20 langkah dapat menghasilkan sampel berkualitas tinggi, dan dapat menghasilkan sampel yang cukup baik bahkan dalam 10 langkah.

## EDMDPMSolverMultistepScheduler[[diffusers.EDMDPMSolverMultistepScheduler]]

#### diffusers.EDMDPMSolverMultistepScheduler[[diffusers.EDMDPMSolverMultistepScheduler]]

```python
diffusers.EDMDPMSolverMultistepScheduler(sigma_min: float = 0.002, sigma_max: float = 80.0, sigma_data: float = 0.5, sigma_schedule: typing.Literal['karras', 'exponential'] = 'karras', num_train_timesteps: int = 1000, prediction_type: typing.Literal['epsilon', 'sample', 'v_prediction'] = 'epsilon', rho: float = 7.0, solver_order: int = 2, thresholding: bool = False, dynamic_thresholding_ratio: float = 0.995, sample_max_value: float = 1.0, algorithm_type: typing.Literal['dpmsolver++', 'sde-dpmsolver++'] = 'dpmsolver++', solver_type: typing.Literal['midpoint', 'heun'] = 'midpoint', lower_order_final: bool = True, euler_at_final: bool = False, final_sigmas_type: typing.Literal['zero', 'sigma_min'] = 'zero')
```

[Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L28)

**Parameter:**

sigma_min (`float`, *opsional*, default 0.002) : Magnitudo noise minimum dalam jadwal sigma. Nilai ini diatur ke 0.002 dalam paper EDM [1]; rentang yang wajar adalah [0, 10].

sigma_max (`float`, *opsional*, default 80.0) : Magnitudo maksimum noise dalam jadwal sigma. Nilai ini diatur ke 80.0 dalam paper EDM [1]; rentang yang wajar adalah [0.2, 80.0].

sigma_data (`float`, *opsional*, default 0.5) : Deviasi standar dari distribusi data. Nilai ini diatur ke 0,5 dalam paper EDM [1].

sigma_schedule (`str`, *opsional*, defaultnya `karras`) : Jadwal sigma untuk menghitung `sigmas`. Secara default, kami menggunakan jadwal yang diperkenalkan dalam paper EDM (https://huggingface.co/papers/2206.00364). Nilai lain yang dapat diterima adalah "exponential". Jadwal eksponensial ini diintegrasikan ke dalam model ini: https://huggingface.co/stabilityai/cosxl.

num_train_timesteps (`int`, defaultnya 1000) : Jumlah langkah difusi untuk melatih model.

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

rho (`float`, *opsional*, default 7.0) : Parameter rho dalam jadwal sigma Karras. Nilai ini diset ke 7.0 dalam paper EDM [1].

solver_order (`int`, defaultnya 2) : Urutan DPMSolver yang dapat berupa `1` atau `2` atau `3`. Disarankan untuk menggunakan `solver_order=2` untuk guided sampling, dan `solver_order=3` untuk unconditional sampling.

thresholding (`bool`, defaultnya `False`) : Apakah akan menggunakan metode "dynamic thresholding". Metode ini tidak cocok untuk model difusi ruang laten seperti Stable Diffusion.

dynamic_thresholding_ratio (`float`, defaultnya 0.995) : Rasio untuk metode ambang batas dinamis. Hanya valid ketika `thresholding=True`.

sample_max_value (`float`, defaultnya 1.0) : Nilai ambang untuk pengambangan dinamis. Hanya valid ketika `thresholding=True` dan `algorithm_type="dpmsolver++"`.

algorithm_type (`str`, defaultnya `dpmsolver++`) : Jenis algoritma untuk solver; bisa berupa `dpmsolver++` atau `sde-dpmsolver++`. Jenis `dpmsolver++` mengimplementasikan algoritma dalam paper [DPMSolver++](https://huggingface.co/papers/2211.01095). Disarankan untuk menggunakan `dpmsolver++` atau `sde-dpmsolver++` dengan `solver_order=2` untuk guided sampling seperti pada Stable Diffusion.

solver_type (`str`, defaultnya `midpoint`) : Jenis solver untuk solver orde kedua; bisa berupa `midpoint` atau `heun`. Jenis solver sedikit memengaruhi kualitas sampel, terutama untuk jumlah langkah yang kecil. Disarankan untuk menggunakan solver `midpoint`.

lower_order_final (`bool`, defaultnya `True`) : Apakah akan menggunakan solver orde lebih rendah pada langkah-langkah akhir. Hanya valid untuk < 15 langkah inferensi. Hal ini dapat menstabilkan sampling DPMSolver untuk langkah < 15, terutama untuk langkah <= 10.

euler_at_final (`bool`, defaultnya `False`) : Apakah akan menggunakan metode Euler pada langkah terakhir. Ini merupakan pertukaran antara stabilitas numerik dan kekayaan detail. Hal ini dapat menstabilkan sampling dari varian SDE dari DPMSolver untuk jumlah langkah inferensi yang kecil, tetapi terkadang dapat menyebabkan hasil yang buram.

final_sigmas_type (`str`, defaultnya `"zero"`) : Nilai `sigma` akhir untuk jadwal noise selama proses sampling. Jika `"sigma_min"`, sigma akhir sama dengan sigma terakhir dalam jadwal pelatihan. Jika `zero`, sigma akhir diatur ke 0.

Menerapkan DPMSolverMultistepScheduler dalam formulasi EDM seperti yang disajikan dalam Karras et al. 2022 [1]. `EDMDPMSolverMultistepScheduler` adalah solver ordo tinggi khusus yang cepat untuk ODE difusi.

[1] Karras, Tero, dkk. "Elucidating the Design Space of Diffusion-Based Generative Models." https://huggingface.co/papers/2206.00364

Model ini mewarisi dari [SchedulerMixin](/docs/diffusers/main/id/api/schedulers/overview#diffusers.SchedulerMixin) dan [ConfigMixin](/docs/diffusers/main/id/api/configuration#diffusers.ConfigMixin). Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan pustaka ini untuk semua scheduler, seperti pemuatan dan penyimpanan.

#### add_noise[[diffusers.EDMDPMSolverMultistepScheduler.add_noise]]

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

[Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L808)

**Parameter:**

original_samples (`torch.Tensor`) : Sampel asli yang akan ditambahkan dengan noise.

noise (`torch.Tensor`) : Tensor noise yang akan ditambahkan ke sampel asli.

timesteps (`torch.Tensor`) : Langkah waktu untuk menambahkan noise, yang menentukan tingkat noise dari jadwal.

**Mengembalikan:** `torch.Tensor`

Sampel berisik dengan tambahan noise yang diskalakan sesuai dengan jadwal timestep.

Tambahkan noise ke sampel asli sesuai dengan jadwal noise pada timestep yang ditentukan.

#### convert_model_output[[diffusers.EDMDPMSolverMultistepScheduler.convert_model_output]]

```python
convert_model_output(model_output: Tensor, sample: Tensor)
```

[Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L471)

**Parameter:**

model_output (`torch.Tensor`) : Output langsung dari model difusi yang dipelajari.

sample (`torch.Tensor`) : Instans saat ini dari sampel yang dibuat oleh proses difusi.

**Mengembalikan:** `torch.Tensor`

Output model yang telah dikonversi.

Konversi keluaran model ke tipe yang sesuai dengan kebutuhan algoritma DPMSolver/DPMSolver++. DPM-Solver dirancang untuk mendiskritisasi integral dari model prediksi noise, sedangkan DPM-Solver++ dirancang untuk mendiskritisasi integral dari model prediksi data.

> [!TIP] > Algoritma dan tipe model dipisahkan. Anda dapat menggunakan DPMSolver atau DPMSolver++ untuk keduanya
noise > prediksi dan model prediksi data.

#### dpm_solver_first_order_update[[diffusers.EDMDPMSolverMultistepScheduler.dpm_solver_first_order_update]]

```python
dpm_solver_first_order_update(model_output: Tensor, sample: Tensor, noise: typing.Optional[torch.Tensor] = None)
```

[Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L502)

**Parameter:**

model_output (`torch.Tensor`) : Output langsung dari model difusi yang dipelajari.

sample (`torch.Tensor`) : Instans saat ini dari sampel yang dibuat oleh proses difusi.

noise (`torch.Tensor`, *opsional*) : Tensor noise yang akan ditambahkan ke sampel asli.

**Mengembalikan:** `torch.Tensor`

Tensor sampel pada langkah waktu sebelumnya.

Satu langkah untuk DPMSolver orde pertama (setara dengan DDIM).

#### index_for_timestep[[diffusers.EDMDPMSolverMultistepScheduler.index_for_timestep]]

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

[Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L673)

**Parameter:**

timestep (`int` atau `torch.Tensor`) : timestep yang akan dicari indeksnya.

schedule_timesteps (`torch.Tensor`, *opsional*) : Jadwal timestep untuk dicari. Jika `None`, menggunakan `self.timesteps`.

**Mengembalikan:** `int`

Indeks timestep dalam jadwal.

Cari indeks untuk timestep tertentu dalam jadwal.

#### multistep_dpm_solver_second_order_update[[diffusers.EDMDPMSolverMultistepScheduler.multistep_dpm_solver_second_order_update]]

```python
multistep_dpm_solver_second_order_update(model_output_list: typing.List[torch.Tensor], sample: Tensor, noise: typing.Optional[torch.Tensor] = None)
```

[Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L545)

**Parameter:**

model_output_list (`list[torch.Tensor]`) : Output langsung dari model difusi yang telah dipelajari pada timestep saat ini dan timestep berikutnya.

sample (`torch.Tensor`) : Instans saat ini dari sampel yang dibuat oleh proses difusi.

noise (`torch.Tensor`, *opsional*) : Tensor noise yang akan ditambahkan ke sampel asli.

**Mengembalikan:** `torch.Tensor`

Tensor sampel pada langkah waktu sebelumnya.

Satu langkah untuk DPMSolver multistep orde kedua.

#### multistep_dpm_solver_third_order_update[[diffusers.EDMDPMSolverMultistepScheduler.multistep_dpm_solver_third_order_update]]

```python
multistep_dpm_solver_third_order_update(model_output_list: list[torch.Tensor], sample: Tensor)
```

[Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L618)

**Parameter:**

model_output_list (`list[torch.Tensor]`) : Output langsung dari model difusi yang telah dipelajari pada timestep saat ini dan timestep berikutnya.

sample (`torch.Tensor`) : Instans saat ini dari sampel yang dibuat oleh proses difusi.

**Mengembalikan:** `torch.Tensor`

Tensor sampel pada langkah waktu sebelumnya.

Satu langkah untuk DPMSolver multistep orde ketiga.

#### precondition_inputs[[diffusers.EDMDPMSolverMultistepScheduler.precondition_inputs]]

```python
precondition_inputs(sample: Tensor, sigma: typing.Union[float, torch.Tensor])
```

[Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L180)

**Parameter:**

sample (`torch.Tensor`) : Tensor sampel input untuk preconditioning.

sigma (`float` atau `torch.Tensor`) : Nilai sigma (tingkat noise) saat ini.

**Mengembalikan:** `torch.Tensor`

Contoh input yang diskalakan.

Lakukan pra-kondisi pada sampel input dengan menskalakannya sesuai dengan formulasi EDM.

#### precondition_noise[[diffusers.EDMDPMSolverMultistepScheduler.precondition_noise]]

```python
precondition_noise(sigma: typing.Union[float, torch.Tensor])
```

[Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L199)

**Parameter:**

sigma (`float` atau `torch.Tensor`) : Nilai sigma (level noise) untuk preconditioning.

**Mengembalikan:** `torch.Tensor`

Nilai noise preconditioned yang dihitung sebagai `0.25 * log(sigma)`.

Prakondisikan tingkat noise dengan menerapkan transformasi logaritmik.

#### precondition_outputs[[diffusers.EDMDPMSolverMultistepScheduler.precondition_outputs]]

```python
precondition_outputs(sample: Tensor, model_output: Tensor, sigma: typing.Union[float, torch.Tensor])
```

[Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L219)

**Parameter:**

sample (`torch.Tensor`) : Tensor sampel input.

model_output (`torch.Tensor`) : Output langsung dari model difusi yang dipelajari.

sigma (`float` atau `torch.Tensor`) : Nilai sigma (tingkat noise) saat ini.

**Mengembalikan:** `torch.Tensor`

Contoh yang telah dinoised yang dihitung dengan menggabungkan koneksi lompatan dan penskalaan output.

Prakondisikan keluaran model sesuai dengan formulasi EDM.

#### scale_model_input[[diffusers.EDMDPMSolverMultistepScheduler.scale_model_input]]

```python
scale_model_input(sample: Tensor, timestep: typing.Union[float, torch.Tensor])
```

[Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L255)

**Parameter:**

sample (`torch.Tensor`) : Tensor sampel input.

timestep (`float` atau `torch.Tensor`) : Langkah waktu (timestep) saat ini dalam rantai difusi.

**Mengembalikan:** `torch.Tensor`

Contoh input yang diskalakan.

Skalakan input model denoising agar sesuai dengan algoritma Euler. Menjamin interoperabilitas dengan scheduler yang perlu menskalakan input model denoising tergantung pada timestep saat ini.

#### set_begin_index[[diffusers.EDMDPMSolverMultistepScheduler.set_begin_index]]

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

[Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L169)

**Parameter:**

begin_index (`int`, defaultnya `0`) : Indeks awal untuk scheduler.

Menetapkan indeks awal untuk penjadwal. Fungsi ini harus dijalankan dari pipeline sebelum inferensi.

#### set_timesteps[[diffusers.EDMDPMSolverMultistepScheduler.set_timesteps]]

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

[Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L279)

**Parameter:**

num_inference_steps (`int`) : Jumlah langkah difusi yang digunakan saat menghasilkan sampel dengan model terlatih sebelumnya.

device (`str` atau `torch.device`, *opsional*) : Perangkat tempat timestep harus dipindahkan. Jika `None`, timestep tidak dipindahkan.

Menetapkan langkah waktu diskrit yang digunakan untuk rantai difusi (untuk dijalankan sebelum inferensi).

#### langkah[[diffusers.EDMDPMSolverMultistepScheduler.step]]

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

[Sumber](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L726)

**Parameter:**

model_output (`torch.Tensor`) : Output langsung dari model difusi yang telah dipelajari.

timestep (`int`) : Langkah waktu diskret saat ini dalam rantai difusi.

sample (`torch.Tensor`) : Instans saat ini dari sampel yang dibuat oleh proses difusi.

generator (`torch.Generator`, *opsional*) : Generator angka acak.

return_dict (`bool`) : Apakah akan mengembalikan [SchedulerOutput](/docs/diffusers/main/id/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) atau `tuple`.

**Mengembalikan:** [SchedulerOutput](/docs/diffusers/main/id/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) atau `tuple`

If return_dict is `True`, [SchedulerOutput](/docs/diffusers/main/id/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) dikembalikan, selain itu sebuah tuple dikembalikan di mana elemen pertama adalah tensor sampel.

Prediksi sampel dari langkah waktu sebelumnya dengan membalikkan SDE. Fungsi ini menyebarkan sampel dengan DPMSolver multistep.

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

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

**Parameter:**

prev_sample (`torch.Tensor` dengan bentuk `(batch_size, num_channels, height, width)` untuk gambar) : Sampel `(x_{t-1})` yang dihitung dari timestep sebelumnya. `prev_sample` harus digunakan sebagai input model berikutnya dalam loop denoising.

Kelas dasar untuk keluaran dari fungsi `step` sebuah scheduler.

