# Latent Consistency Model Multistep Scheduler

## Ikhtisar

Scheduler multistep dan onestep (Algorithm 3) yang diperkenalkan bersama latent consistency models dalam paper [Latent Consistency Models: Synthesizing High-Resolution Images with Few-Step Inference](https://huggingface.co/papers/2310.04378) oleh Simian Luo, Yiqin Tan, Longbo Huang, Jian Li, dan Hang Zhao. Scheduler ini seharusnya mampu menghasilkan sampel yang baik dari [LatentConsistencyModelPipeline](/docs/diffusers/main/id/api/pipelines/latent_consistency_models#diffusers.LatentConsistencyModelPipeline) dalam 1-8 langkah.

## LCMScheduler[[diffusers.LCMScheduler]]

#### diffusers.LCMScheduler[[diffusers.LCMScheduler]]

```python
diffusers.LCMScheduler(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)
```

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

**Parameter:**

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

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

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

beta_schedule (`str`, defaultnya `"scaled_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` atau `list[float]`, *opsional*) : Teruskan array beta secara langsung ke konstruktor untuk melewati `beta_start` dan `beta_end`.

original_inference_steps (`int`, defaultnya `50`) : Jumlah langkah inferensi default yang digunakan untuk menghasilkan jadwal timestep yang tersebar secara linear, yang dari sana pada akhirnya akan diambil `num_inference_steps` timestep yang tersebar merata untuk membentuk jadwal timestep final.

clip_sample (`bool`, defaultnya `False`) : Memotong sampel prediksi untuk stabilitas numerik.

clip_sample_range (`float`, defaultnya `1.0`) : Magnitudo maksimum untuk pemotongan sampel. Hanya valid ketika `clip_sample=True`.

set_alpha_to_one (`bool`, defaultnya `True`) : Setiap langkah difusi menggunakan nilai produk alfa pada langkah tersebut dan pada langkah sebelumnya. Untuk langkah terakhir, tidak ada alfa sebelumnya. Ketika opsi ini `True`, produk alfa sebelumnya ditetapkan ke `1`, selain itu menggunakan nilai alfa pada langkah 0.

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

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`, 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 dinamis. Hanya valid ketika `thresholding=True`.

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

timestep_spacing (`str`, defaultnya `"leading"`) : 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.

timestep_scaling (`float`, defaultnya `10.0`) : Faktor yang akan dikalikan dengan timesteps saat menghitung kondisi batas model konsistensi `c_skip` dan `c_out`. Meningkatkan nilai ini akan mengurangi error aproksimasi (meskipun error aproksimasi pada nilai default `10.0` sudah cukup kecil).

rescale_betas_zero_snr (`bool`, defaultnya `False`) : Apakah akan melakukan penskalaan ulang betas agar memiliki SNR terminal nol. Hal ini memungkinkan model untuk menghasilkan sampel yang sangat terang dan gelap, alih-alih membatasi pada sampel dengan kecerahan sedang. Terkait secara longgar dengan [`--offset_noise`](https://github.com/huggingface/diffusers/blob/74fd735eb073eb1d774b1ab4154a0876eb82f055/examples/dreambooth/train_dreambooth.py#L506).

`LCMScheduler` memperluas prosedur denoising yang diperkenalkan dalam denoising diffusion probabilistic models (DDPM) dengan panduan non-Markovian.

Model ini mewarisi dari [SchedulerMixin](/docs/diffusers/main/id/api/schedulers/overview#diffusers.SchedulerMixin) dan [ConfigMixin](/docs/diffusers/main/id/api/configuration#diffusers.ConfigMixin). [~ConfigMixin](/docs/diffusers/main/id/api/configuration#diffusers.ConfigMixin) menangani penyimpanan semua atribut konfigurasi yang diteruskan dalam fungsi `__init__` scheduler, seperti `num_train_timesteps`. Atribut tersebut dapat diakses melalui `scheduler.config.num_train_timesteps`. [SchedulerMixin](/docs/diffusers/main/id/api/schedulers/overview#diffusers.SchedulerMixin) menyediakan fungsionalitas pemuatan dan penyimpanan umum melalui fungsi [SchedulerMixin.save_pretrained()](/docs/diffusers/main/id/api/schedulers/overview#diffusers.SchedulerMixin.save_pretrained) dan [from_pretrained()](/docs/diffusers/main/id/api/schedulers/overview#diffusers.SchedulerMixin.from_pretrained).

#### add_noise[[diffusers.LCMScheduler.add_noise]]

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

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

**Parameter:**

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

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

timesteps (`torch.IntTensor`) : Langkah waktu yang menunjukkan tingkat noise untuk setiap sampel.

**Mengembalikan:** `torch.Tensor`

Sampel yang bising.

Tambahkan noise ke sampel asli sesuai dengan magnitudo noise pada setiap timestep (ini adalah proses difusi maju).

#### get_scalings_for_boundary_condition_discrete[[diffusers.LCMScheduler.get_scalings_for_boundary_condition_discrete]]

```python
get_scalings_for_boundary_condition_discrete(timestep: int)
```

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

**Parameter:**

timestep (`int`) : Langkah waktu diskret untuk menghitung penskalaan.

**Mengembalikan:** `tuple[float, float]`

Tuple yang berisi `c_skip` (skala untuk sampel input) dan `c_out` (skala untuk sampel denoised yang diprediksi).

Menghitung penskalaan kondisi batas (`c_skip` dan `c_out`) untuk langkah waktu diskret yang diberikan, sebagaimana digunakan dalam Latent Consistency Model.

#### get_velocity[[diffusers.LCMScheduler.get_velocity]]

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

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

**Parameter:**

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

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

timesteps (`torch.IntTensor`) : Langkah waktu untuk komputasi kecepatan.

**Mengembalikan:** `torch.Tensor`

Kecepatan yang dihitung.

Hitung prediksi kecepatan dari sampel dan noise sesuai dengan rumus kecepatan.

#### index_for_timestep[[diffusers.LCMScheduler.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_lcm.py#L262)

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

#### previous_timestep[[diffusers.LCMScheduler.previous_timestep]]

```python
previous_timestep(timestep)
```

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

**Parameter:**

timestep (`int`) : Langkah waktu saat ini.

**Mengembalikan:** `int` atau `torch.Tensor`

Langkah waktu sebelumnya.

Hitung langkah waktu sebelumnya dalam rantai difusi.

#### scale_model_input[[diffusers.LCMScheduler.scale_model_input]]

```python
scale_model_input(sample: Tensor, timestep: int | None = None)
```

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

**Parameter:**

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

timestep (`int`, *opsional*) : Langkah waktu (timestep) saat ini dalam rantai difusi.

**Mengembalikan:** `torch.Tensor`

Contoh input yang diskalakan.

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

#### set_begin_index[[diffusers.LCMScheduler.set_begin_index]]

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

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

**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.LCMScheduler.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)
```

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

**Parameter:**

num_inference_steps (`int`, *opsional*) : Jumlah langkah difusi yang digunakan saat menghasilkan sampel dengan model terlatih. Jika digunakan, `timesteps` harus `None`.

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

original_inference_steps (`int`, *opsional*) : Jumlah langkah inferensi asli, yang akan digunakan untuk menghasilkan jadwal timestep yang tersebar secara linear (yang berbeda dari implementasi `diffusers` standar). Kami kemudian akan mengambil `num_inference_steps` timestep dari jadwal ini, yang tersebar merata dalam hal indeks, dan menggunakannya sebagai jadwal timestep akhir. Jika tidak diatur, ini akan secara default menggunakan atribut `original_inference_steps`.

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

strength (`float`, defaultnya `1.0`) : Faktor kekuatan yang digunakan untuk menghasilkan jadwal timestep parsial (misalnya untuk image-to-image). Nilai `1.0` menggunakan jadwal penuh.

**Mengembalikan:** `None`

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

#### langkah[[diffusers.LCMScheduler.step]]

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

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

**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 untuk pengambilan sampel yang dapat direproduksi.

return_dict (`bool`, defaultnya `True`) : Apakah akan mengembalikan `LCMSchedulerOutput` atau `tuple`.

**Mengembalikan:** `LCMSchedulerOutput` atau `tuple`

Jika `True`, `LCMSchedulerOutput` yang dikembalikan, selain itu sebuah tuple yang dikembalikan di mana elemen pertama adalah tensor sampel.

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

