# CMStochasticIterativeScheduler

[Consistency Models](https://huggingface.co/papers/2303.01469) oleh Yang Song, Prafulla Dhariwal, Mark Chen, dan Ilya Sutskever memperkenalkan penjadwal multistep dan onestep (Algorithm 1) yang mampu menghasilkan sampel yang baik dalam satu langkah atau sejumlah kecil langkah.

Abstrak dari makalah tersebut adalah:

*Model difusi telah mendorong kemajuan signifikan di bidang generasi gambar, audio, dan video, tetapi mereka bergantung pada proses sampling iteratif yang menyebabkan generasi lambat. Untuk mengatasi keterbatasan ini, kami mengusulkan model konsistensi, sebuah keluarga model baru yang menghasilkan sampel berkualitas tinggi dengan memetakan noise langsung ke data. Mereka mendukung generasi satu langkah yang cepat secara desain, sambil tetap memungkinkan sampling multi-langkah untuk menukar komputasi dengan kualitas sampel. Mereka juga mendukung pengeditan data zero-shot, seperti inpainting gambar, pewarnaan, dan super-resolusi, tanpa memerlukan pelatihan eksplisit pada tugas-tugas tersebut. Model konsistensi dapat dilatih baik dengan mendistilasi model difusi yang sudah terlatih, maupun sebagai model generatif mandiri sepenuhnya. Melalui eksperimen yang luas, kami menunjukkan bahwa mereka melampaui teknik distilasi yang ada untuk model difusi dalam sampling satu langkah dan beberapa langkah, mencapai FID state-of-the-art baru sebesar 3,55 pada CIFAR-10 dan 6,20 pada ImageNet 64x64 untuk generasi satu langkah. Ketika dilatih secara terpisah, model konsistensi menjadi keluarga model generatif baru yang dapat melampaui model generatif satu langkah, non-adversarial yang ada pada benchmark standar seperti CIFAR-10, ImageNet 64x64, dan LSUN 256x256.*

Kodebase asli dapat ditemukan di [openai/consistency_models](https://github.com/openai/consistency_models).

## CMStochasticIterativeScheduler[[diffusers.CMStochasticIterativeScheduler]]

#### diffusers.CMStochasticIterativeScheduler[[diffusers.CMStochasticIterativeScheduler]]

```python
diffusers.CMStochasticIterativeScheduler(num_train_timesteps: int = 40, sigma_min: float = 0.002, sigma_max: float = 80.0, sigma_data: float = 0.5, s_noise: float = 1.0, rho: float = 7.0, clip_denoised: bool = True)
```

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

**Parameter:**

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

sigma_min (`float`, defaultnya 0.002) : Magnitudo noise minimum dalam jadwal sigma. Defaultnya 0.002 dari implementasi asli.

sigma_max (`float`, defaultnya 80.0) : Magnitudo maksimum noise dalam jadwal sigma. Defaultnya 80.0 dari implementasi asli.

sigma_data (`float`, defaultnya 0.5) : Standar deviasi dari distribusi data pada [paper](https://huggingface.co/papers/2206.00364) EDM. Defaultnya 0.5 dari implementasi asli.

s_noise (`float`, defaultnya 1.0) : Jumlah noise tambahan untuk mengompensasi hilangnya detail selama sampling. Rentang yang wajar adalah [1.000, 1.011]. Defaultnya 1.0 dari implementasi asli.

rho (`float`, defaultnya 7.0) : Parameter untuk menghitung jadwal sigma Karras dari [makalah](https://huggingface.co/papers/2206.00364) EDM. Defaultnya 7.0 dari implementasi asli.

clip_denoised (`bool`, defaultnya `True`) : Apakah akan memotong (clip) output yang telah didenois ke `(-1, 1)`.

timesteps (`list` atau `np.ndarray` atau `torch.Tensor`, *opsional*) : Jadwal timestep eksplisit yang dapat ditentukan secara opsional. Timestep diharapkan berada dalam urutan menaik.

Sampling multistep dan onestep untuk model konsistensi.

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

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

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

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

#### get_scalings[[diffusers.CMStochasticIterativeScheduler.get_scalings]]

```python
get_scalings(sigma: Tensor)
```

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

**Parameter:**

sigma (`torch.Tensor`) : Nilai sigma saat ini dalam jadwal noise.

**Mengembalikan:** `tuple[torch.Tensor, torch.Tensor]`

Tuple yang berisi `c_skip` (skala untuk sampel input) dan `c_out` (skala untuk output model).

Menghitung faktor penskalaan untuk output model konsistensi.

#### get_scalings_for_boundary_condition[[diffusers.CMStochasticIterativeScheduler.get_scalings_for_boundary_condition]]

```python
get_scalings_for_boundary_condition(sigma: Tensor)
```

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

**Parameter:**

sigma (`torch.Tensor`) : sigma saat ini dalam jadwal sigma Karras.

**Mengembalikan:** `tuple[torch.Tensor, torch.Tensor]`

Tuple dua elemen di mana `c_skip` (yang menimbang sampel saat ini) adalah elemen pertama dan `c_out` (yang menimbang output model konsistensi) adalah elemen kedua.

Mendapatkan penskalaan yang digunakan dalam parameterisasi model konsistensi (dari Lampiran C [makalah](https://huggingface.co/papers/2303.01469)) untuk menegakkan kondisi batas.

> [!TIP] > `epsilon` dalam persamaan untuk `c_skip` dan `c_out` diatur ke `sigma_min`.

#### index_for_timestep[[diffusers.CMStochasticIterativeScheduler.index_for_timestep]]

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

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

**Parameter:**

timestep (`float` atau `torch.Tensor`) : Nilai timestep yang akan dicari dalam jadwal.

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

**Mengembalikan:** `int`

Indeks timestep dalam jadwal. Untuk langkah pertama, mengembalikan indeks kedua jika ada beberapa kecocokan untuk menghindari pengabaian sigma saat memulai di tengah jadwal (misalnya, untuk image-to-image).

Cari indeks dari timestep tertentu dalam jadwal timestep.

#### scale_model_input[[diffusers.CMStochasticIterativeScheduler.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_consistency_models.py#L136)

**Parameter:**

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

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

**Mengembalikan:** `torch.Tensor`

Contoh input yang diskalakan.

Menskala input model konsistensi dengan `(sigma**2 + sigma_data**2) ** 0.5`.

#### set_begin_index[[diffusers.CMStochasticIterativeScheduler.set_begin_index]]

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

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

**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.CMStochasticIterativeScheduler.set_timesteps]]

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

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

**Parameter:**

num_inference_steps (`int`, *opsional*) : 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.

timesteps (`list[int]`, *opsional*) : Timesteps kustom yang digunakan untuk mendukung spasi arbitrer antar timesteps. Jika `None`, maka strategi spasi timestep default dengan spasi yang sama antar timesteps digunakan. Jika `timesteps` diteruskan, `num_inference_steps` harus `None`.

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

#### sigma_to_t[[diffusers.CMStochasticIterativeScheduler.sigma_to_t]]

```python
sigma_to_t(sigmas: float | numpy.ndarray)
```

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

**Parameter:**

sigmas (`float` atau `np.ndarray`) : Karras sigma tunggal atau array dari Karras sigmas.

**Mengembalikan:** `np.ndarray`

Array timestep input yang diskalakan.

Mendapatkan langkah waktu yang diskalakan dari sigma Karras untuk input ke model konsistensi.

#### langkah[[diffusers.CMStochasticIterativeScheduler.step]]

```python
step(model_output: Tensor, timestep: typing.Union[float, 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_consistency_models.py#L364)

**Parameter:**

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

timestep (`float` atau `torch.Tensor`) : Langkah waktu (timestep) 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`, defaultnya `True`) : Apakah akan mengembalikan [CMStochasticIterativeSchedulerOutput](/docs/diffusers/main/id/api/schedulers/cm_stochastic_iterative#diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput) atau `tuple`.

**Mengembalikan:** [CMStochasticIterativeSchedulerOutput](/docs/diffusers/main/id/api/schedulers/cm_stochastic_iterative#diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput) atau `tuple`

If return_dict is `True`, [CMStochasticIterativeSchedulerOutput](/docs/diffusers/main/id/api/schedulers/cm_stochastic_iterative#diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput) is returned, otherwise a tuple is returned where the first element is the sample tensor.

Prediksi sampel dari langkah waktu sebelumnya dengan membalik SDE. Fungsi ini menyebarkan proses difusi dari keluaran model yang dipelajari (paling sering berupa noise yang diprediksi).

## CMStochasticIterativeSchedulerOutput[[diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput]]

#### diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput[[diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput]]

```python
diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput(prev_sample: Tensor)
```

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

**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 output untuk fungsi `step` scheduler.

