# Penjadwal

Penjadwal memberi tahu loop denoising berapa banyak noise yang harus dihapus pada setiap langkah. Penjadwal yang berbeda menukar kecepatan dengan kualitas.

Panduan ini menunjukkan cara memuat scheduler dan menyesuaikan jadwal timestep, jarak, dan sigmanya.

## Memilih scheduler

Mulai dari checkpoint default. Ganti hanya jika Anda memerlukan tradeoff kecepatan atau kualitas yang berbeda.

- DPM++ 2M SDE Karras adalah pilihan serbaguna yang kuat untuk banyak checkpoint difusi laten.
- [TCDScheduler](/docs/diffusers/main/id/api/schedulers/tcd#diffusers.TCDScheduler) bekerja dengan baik untuk model yang telah didistilasi.
- Gunakan [FlowMatchEulerDiscreteScheduler](/docs/diffusers/main/id/api/schedulers/flow_match_euler_discrete#diffusers.FlowMatchEulerDiscreteScheduler) atau [FlowMatchHeunDiscreteScheduler](/docs/diffusers/main/id/api/schedulers/flow_match_heun_discrete#diffusers.FlowMatchHeunDiscreteScheduler) untuk model FlowMatch (Qwen-Image, Flux, dan sejenisnya).
- [EulerDiscreteScheduler](/docs/diffusers/main/id/api/schedulers/euler#diffusers.EulerDiscreteScheduler) atau [EulerAncestralDiscreteScheduler](/docs/diffusers/main/id/api/schedulers/euler_ancestral#diffusers.EulerAncestralDiscreteScheduler) sering kali bekerja dengan baik untuk gambar bergaya anime.
- [LCMScheduler](/docs/diffusers/main/id/api/schedulers/lcm#diffusers.LCMScheduler) dengan LCM UNet atau LoRA untuk generasi beberapa langkah saat checkpoint mendukungnya.

## Memuat penjadwal

> [!TIP]
> Model flow-matching seperti Qwen-Image dan Flux menyertakan [FlowMatchEulerDiscreteScheduler](/docs/diffusers/main/id/api/schedulers/flow_match_euler_discrete#diffusers.FlowMatchEulerDiscreteScheduler) sebagai default. Pertahankan scheduler tersebut kecuali Anda sengaja melakukan eksperimen. Ganti dengan [from_config()](/docs/diffusers/main/id/api/configuration#diffusers.ConfigMixin.from_config) hanya jika penggantian tersebut kompatibel dengan checkpoint.

Schedulers hanya berupa konfigurasi dan tidak menyertakan tensor bobot. Akses atribut `.scheduler` pada pipeline untuk memeriksa konfigurasi yang dimuat.

```py
import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.float16, device_map="cuda"  # or "mps", "xpu", "cpu"
)
pipeline.scheduler
```

Untuk mengganti scheduler pada pipeline yang sudah dimuat, gunakan [from_config()](/docs/diffusers/main/id/api/configuration#diffusers.ConfigMixin.from_config) dengan konfigurasi scheduler yang ada agar `num_train_timesteps` dan field terkait tetap selaras. Untuk checkpoint FlowMatch (Qwen-Image, Flux, dan sejenisnya), pertahankan [FlowMatchEulerDiscreteScheduler](/docs/diffusers/main/id/api/schedulers/flow_match_euler_discrete#diffusers.FlowMatchEulerDiscreteScheduler) kecuali Anda sengaja bereksperimen dengan pengganti yang kompatibel.

```py
from diffusers import DPMSolverMultistepScheduler

pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config)
```

Anda juga dapat memuat konfigurasi scheduler dari Hub dengan [from_pretrained()](/docs/diffusers/main/id/api/schedulers/overview#diffusers.SchedulerMixin.from_pretrained) dan meneruskannya ke [from_pretrained()](/docs/diffusers/main/id/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained) melalui `scheduler`.

```py
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler

dpm = DPMSolverMultistepScheduler.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", subfolder="scheduler"
)
pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    scheduler=dpm,
    dtype=torch.float16,
    device_map="cuda",  # or "mps", "xpu", "cpu"
)
pipeline.scheduler
```

## Jadwal timestep

Timestep atau jadwal noise menentukan bagaimana noise didistribusikan selama proses denoising. Jadwal ini dapat berupa linear atau lebih terkonsentrasi di bagian awal atau akhir. Ini adalah urutan tingkat noise yang dihitung sebelumnya, dihasilkan dari konfigurasi default scheduler, tetapi dapat dikustomisasi untuk menggunakan jadwal lain.

```text
linear (even steps)                 AYS (denser where it matters)
noise                               noise
  ^                                   ^
  | *                                 | *
  |  *                                |   *
  |   *                               |    **
  |    *                              |     ***
  |     *                             |      **
  |      *                            |        *
  |       *                           |          *
  +-----------------> step            +-----------------> step
```

> [!TIP]
> `timesteps` kustom hanya berfungsi jika `set_timesteps` dari scheduler tersebut menerima argumen tersebut (pipeline memeriksa signature melalui `retrieve_timesteps` dan akan melempar `ValueError` jika tidak). Periksa halaman API scheduler atau signature `set_timesteps` sebelum meneruskannya.

Contoh di bawah ini menggunakan jadwal [Align Your Steps (AYS)](https://research.nvidia.com/labs/toronto-ai/AlignYourSteps/) yang dapat menghasilkan gambar berkualitas tinggi dalam 10 langkah, sehingga secara signifikan mempercepat proses generasi dan mengurangi waktu komputasi.

Impor jadwal dan teruskan ke argumen `timesteps` di pipeline.

```py
import torch
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler
from diffusers.schedulers import AysSchedules

sampling_schedule = AysSchedules["StableDiffusionXLTimesteps"]
print(sampling_schedule)
# [999, 845, 730, 587, 443, 310, 193, 116, 53, 13]

pipeline = DiffusionPipeline.from_pretrained(
    "SG161222/RealVisXL_V4.0",
    dtype=torch.float16,
    device_map="cuda"  # or "mps", "xpu", "cpu"
)
pipeline.scheduler = DPMSolverMultistepScheduler.from_config(
  pipeline.scheduler.config, algorithm_type="sde-dpmsolver++"
)

prompt = "A cinematic shot of a cute little rabbit wearing a jacket and doing a thumbs up"
image = pipeline(
    prompt=prompt,
    negative_prompt="",
    timesteps=sampling_schedule,
).images[0]
```

  
    
    Jadwal timestep AYS 10 langkah
  
  
    
    Jadwal timestep yang berjarak linear 10 langkah
  
  
    
    Jadwal timestep yang berjarak linear 25 langkah
  

Untuk v-prediction/zero-SNR rescaling pada checkpoint lama, lihat [Legacy checkpoints](./legacy_checkpoints#rescaling-schedules).

## Jarak antar-timestep

Jarak timestep merujuk pada langkah-langkah spesifik *t* untuk diambil dari jadwal. Diffusers menyediakan tiga jenis jarak seperti yang ditunjukkan di bawah ini.

| strategi spasi | perhitungan spasi | langkah waktu contoh |
|---|---|---|
| `leading` | langkah-langkah yang berjarak sama | `[900, 800, 700, ..., 100, 0]` |
| `linspace` | termasuk langkah pertama dan terakhir serta membagi rata langkah-langkah perantara yang tersisa | `[1000, 888.89, 777.78, ..., 111.11, 0]` |
| `trailing` | termasuk langkah terakhir dan membagi rata langkah-langkah perantara yang tersisa mulai dari akhir | `[999, 899, 799, 699, 599, 499, 399, 299, 199, 99]` |

Lewatkan strategi spasi ke argumen `timestep_spacing` di scheduler.

> [!TIP]
> Strategi `trailing` umumnya menghasilkan gambar dengan kualitas lebih tinggi dan detail lebih banyak dalam jumlah langkah yang lebih sedikit, namun perbedaan kualitasnya tidak terlalu jelas untuk nilai langkah yang lebih standar.

```py
import torch
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler

pipeline = DiffusionPipeline.from_pretrained(
    "SG161222/RealVisXL_V4.0",
    dtype=torch.float16,
    device_map="cuda"  # or "mps", "xpu", "cpu"
)
pipeline.scheduler = DPMSolverMultistepScheduler.from_config(
  pipeline.scheduler.config, timestep_spacing="trailing"
)

prompt = "A cinematic shot of a cute little black cat sitting on a pumpkin at night"
image = pipeline(
    prompt=prompt,
    negative_prompt="",
    num_inference_steps=5,
).images[0]
image
```

  
    
    spasi di belakang setelah 5 langkah
  
  
    
    jarak antar baris setelah 5 langkah
  

## Sigmas

Sigmas adalah ukuran seberapa bising suatu sampel pada langkah tertentu sebagaimana didefinisikan oleh jadwal. Saat menggunakan `sigmas` kustom, `timesteps` dihitung dari nilai-nilai ini alih-alih dari konfigurasi scheduler default.

```text
step:   0    1    2    3    4
sigma:  σ0 > σ1 > σ2 > σ3 > σ4 ≈ 0
        high noise  --->  clean sample
```

> [!TIP]
> `sigmas` kustom hanya berfungsi jika `set_timesteps` dari scheduler tersebut menerima argumen tersebut (pipeline memeriksa signature melalui `retrieve_timesteps` dan akan melempar `ValueError` jika tidak). Periksa halaman API scheduler atau signature `set_timesteps` sebelum meneruskannya.

Lewatkan sigmas kustom ke argumen `sigmas` di pipeline. Contoh di bawah menggunakan [sigmas](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_utils.py) dari jadwal AYS 10-langkah.

```py
import torch
from diffusers import DiffusionPipeline, EulerDiscreteScheduler
from diffusers.schedulers import AysSchedules

pipeline = DiffusionPipeline.from_pretrained(
    "SG161222/RealVisXL_V4.0",
    dtype=torch.float16,
    device_map="cuda",  # or "mps", "xpu", "cpu"
)
pipeline.scheduler = EulerDiscreteScheduler.from_config(pipeline.scheduler.config)

sigmas = AysSchedules["StableDiffusionXLSigmas"]
prompt = "A cinematic shot of a cute little rabbit wearing a jacket and doing a thumbs up"
image = pipeline(
    prompt=prompt,
    negative_prompt="",
    sigmas=sigmas,
).images[0]
```

### Karras sigmas

[Karras sigmas](https://huggingface.co/papers/2206.00364) melakukan resampling jadwal noise untuk sampling yang lebih efisien dengan mengelompokkan sigma lebih rapat di tengah urutan tempat rekonstruksi struktur sangat krusial, sementara menggunakan lebih sedikit sigma di awal dan akhir tempat perubahan noise memiliki dampak yang lebih kecil. Hal ini dapat meningkatkan tingkat detail pada gambar yang dihasilkan.

```text
default σ:  *  *  *  *  *  *  *  *     even-ish
Karras σ:   *   * * * * *   *          denser mid, sparser ends
            |---structure---|
```

Setel `use_karras_sigmas=True` pada scheduler untuk mengaktifkannya.

```py
import torch
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler

pipeline = DiffusionPipeline.from_pretrained(
    "SG161222/RealVisXL_V4.0",
    dtype=torch.float16,
    device_map="cuda"  # or "mps", "xpu", "cpu"
)
pipeline.scheduler = DPMSolverMultistepScheduler.from_config(
  pipeline.scheduler.config,
  algorithm_type="sde-dpmsolver++",
  use_karras_sigmas=True,
)

prompt = "A cinematic shot of a cute little rabbit wearing a jacket and doing a thumbs up"
image = pipeline(
    prompt=prompt,
    negative_prompt="",
    num_inference_steps=20,
).images[0]
```

  
    
    Karras sigmas diaktifkan
  
  
    
    Karras sigmas dinonaktifkan
  

Lihat [ringkasan](../api/schedulers/overview) API scheduler untuk daftar scheduler yang mendukung Karras sigmas. Ini hanya harus digunakan untuk model yang dilatih dengan Karras sigmas.

## Langkah selanjutnya

- Baca paper [Common Diffusion Noise Schedules and Sample Steps are Flawed](https://huggingface.co/papers/2305.08891) untuk detail lebih lanjut tentang rescaling noise schedule untuk menegakkan zero SNR.

