# DPMSolverMultistepInverse

`DPMSolverMultistepInverse` adalah scheduler terbalik 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.

Implementasi ini sebagian besar didasarkan pada definisi inversi DDIM dari [Null-text Inversion for Editing Real Images using Guided Diffusion Models](https://huggingface.co/papers/2211.09794) dan implementasi notebook inversi laten `DiffEdit` dari [Xiang-cd/DiffEdit-stable-diffusion](https://github.com/Xiang-cd/DiffEdit-stable-diffusion/blob/main/diffedit.ipynb).

## Tips

Ambang batas dinamis dari [Imagen](https://huggingface.co/papers/2205.11487) didukung, dan untuk model difusi ruang piksel, Anda dapat mengatur `algorithm_type="dpmsolver++"` dan `thresholding=True` untuk menggunakan ambang batas dinamis. Metode ambang batas ini tidak cocok untuk model difusi ruang laten seperti Stable Diffusion.

## DPMSolverMultistepInverseScheduler[[diffusers.DPMSolverMultistepInverseScheduler]]

#### diffusers.DPMSolverMultistepInverseScheduler[[diffusers.DPMSolverMultistepInverseScheduler]]

```python
diffusers.DPMSolverMultistepInverseScheduler(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['dpmsolver', 'dpmsolver++', 'sde-dpmsolver', 'sde-dpmsolver++'] = 'dpmsolver++', solver_type: typing.Literal['midpoint', 'heun'] = 'midpoint', lower_order_final: bool = True, euler_at_final: bool = False, 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, lambda_min_clipped: float = -inf, variance_type: typing.Optional[typing.Literal['learned', 'learned_range']] = None, timestep_spacing: typing.Literal['linspace', 'leading', 'trailing'] = 'linspace', steps_offset: int = 0)
```

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

**Parameter:**

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

beta_start (`float`, defaultnya 0.0001) : Nilai awal `beta` untuk inferensi.

beta_end (`float`, defaultnya 0.02) : Nilai `beta` akhir.

beta_schedule (`str`, defaultnya `"linear"`) : Jadwal beta, pemetaan dari rentang beta ke urutan beta untuk melangkah model. Pilih dari `linear`, `scaled_linear`, atau `squaredcos_cap_v2`.

trained_betas (`np.ndarray`, *opsional*) : Lewatkan `beta_start` dan `beta_end` dengan meneruskan array betas secara langsung ke konstruktor.

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.

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).

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`, `dpmsolver++`, `sde-dpmsolver` atau `sde-dpmsolver++`. Jenis `dpmsolver` mengimplementasikan algoritma dalam paper [DPMSolver](https://huggingface.co/papers/2206.00927), dan 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.

use_karras_sigmas (`bool`, *opsional*, defaultnya `False`) : Apakah akan menggunakan Karras sigmas untuk ukuran langkah dalam jadwal noise selama proses sampling. Jika `True`, sigmas ditentukan berdasarkan urutan tingkat noise {σi}.

use_exponential_sigmas (`bool`, *opsional*, defaultnya `False`) : Apakah akan menggunakan sigma eksponensial untuk ukuran langkah dalam jadwal noise selama proses sampling.

use_beta_sigmas (`bool`, *opsional*, defaultnya `False`) : Apakah akan menggunakan beta sigmas untuk ukuran langkah dalam jadwal noise selama proses sampling. Lihat [Beta Sampling is All You Need](https://huggingface.co/papers/2407.12173) untuk informasi lebih lanjut.

use_flow_sigmas (`bool`, *opsional*, defaultnya `False`) : Apakah akan menggunakan flow sigmas untuk ukuran langkah dalam jadwal noise selama proses sampling.

flow_shift (`float`, *opsional*, default 1.0) : Faktor pergeseran aliran. Hanya valid ketika `use_flow_sigmas=True`.

lambda_min_clipped (`float`, defaultnya `-inf`) : Ambang pemotongan untuk nilai minimum dari `lambda(t)` demi stabilitas numerik. Hal ini sangat penting untuk jadwal noise kosinus (`squaredcos_cap_v2`).

variance_type (`str`, *opsional*) : Atur ke "learned" atau "learned_range" untuk model difusi yang memprediksi varians. Jika diatur, output model berisi varians Gaussian yang diprediksi.

timestep_spacing (`str`, defaultnya `"linspace"`) : Cara timestep harus diskalakan. Lihat Tabel 2 dari [Common Diffusion Noise Schedules and Sample Steps are Flawed](https://huggingface.co/papers/2305.08891) untuk informasi lebih lanjut.

steps_offset (`int`, default 0) : Offset yang ditambahkan ke langkah inferensi, sesuai kebutuhan beberapa keluarga model.

`DPMSolverMultistepInverseScheduler` adalah scheduler terbalik dari [DPMSolverMultistepScheduler](/docs/diffusers/main/id/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler).

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.DPMSolverMultistepInverseScheduler.add_noise]]

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

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

**Parameter:**

original_samples (`torch.Tensor`) : Sampel asli untuk ditambahkan noise.

noise (`torch.Tensor`) : Tensor noise.

timesteps (`torch.IntTensor`) : Langkah waktu di mana noise akan ditambahkan.

**Mengembalikan:** `torch.Tensor`

Sampel yang bising.

Tambahkan noise ke `original_samples` yang bersih menggunakan fungsi ekuivalen dari scheduler.

#### convert_model_output[[diffusers.DPMSolverMultistepInverseScheduler.convert_model_output]]

```python
convert_model_output(model_output: Tensor, *args, sample: typing.Optional[torch.Tensor] = None, **kwargs)
```

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

**Parameter:**

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

sample (`torch.Tensor`, *opsional*) : 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.DPMSolverMultistepInverseScheduler.dpm_solver_first_order_update]]

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

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

**Parameter:**

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

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

noise (`torch.Tensor`, *opsional*) : Tensor noise.

**Mengembalikan:** `torch.Tensor`

Tensor sampel pada langkah waktu sebelumnya.

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

#### multistep_dpm_solver_second_order_update[[diffusers.DPMSolverMultistepInverseScheduler.multistep_dpm_solver_second_order_update]]

```python
multistep_dpm_solver_second_order_update(model_output_list: list[torch.Tensor], *args, sample: typing.Optional[torch.Tensor] = None, noise: typing.Optional[torch.Tensor] = None, **kwargs)
```

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

**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`, *opsional*) : Instans saat ini dari sampel yang dibuat oleh proses difusi.

noise (`torch.Tensor`, *opsional*) : Kebisingan acak yang digunakan oleh varian solver stokastik (`sde-*`). Diperlukan ketika `algorithm_type` diatur ke salah satu dari varian tersebut, dan tidak digunakan dalam kasus lainnya.

**Mengembalikan:** `torch.Tensor`

Tensor sampel pada langkah waktu sebelumnya.

Satu langkah untuk DPMSolver multistep orde kedua.

#### multistep_dpm_solver_third_order_update[[diffusers.DPMSolverMultistepInverseScheduler.multistep_dpm_solver_third_order_update]]

```python
multistep_dpm_solver_third_order_update(model_output_list: list[torch.Tensor], *args, sample: typing.Optional[torch.Tensor] = None, noise: typing.Optional[torch.Tensor] = None, **kwargs)
```

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

**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`, *opsional*) : Instans saat ini dari sampel yang dibuat oleh proses difusi.

noise (`torch.Tensor`, *opsional*) : Tensor noise.

**Mengembalikan:** `torch.Tensor`

Tensor sampel pada langkah waktu sebelumnya.

Satu langkah untuk DPMSolver multistep orde ketiga.

#### scale_model_input[[diffusers.DPMSolverMultistepInverseScheduler.scale_model_input]]

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

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

**Parameter:**

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

**Mengembalikan:** `torch.Tensor`

Contoh input yang diskalakan.

Memastikan interoperabilitas dengan scheduler yang perlu menskalakan input model denoising berdasarkan timestep saat ini.

#### set_timesteps[[diffusers.DPMSolverMultistepInverseScheduler.set_timesteps]]

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

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

**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.DPMSolverMultistepInverseScheduler.step]]

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

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

**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.

variance_noise (`torch.Tensor`) : Alternatif untuk menghasilkan noise dengan `generator` dengan cara menyediakan noise untuk varians secara langsung. Berguna untuk metode seperti `CycleDiffusion`.

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.

