# Trình lập lịch

Trình lập lịch (scheduler) chỉ cho vòng lặp khử nhiễu biết phải loại bỏ bao nhiêu nhiễu ở mỗi bước. Các trình lập lịch khác nhau đánh đổi tốc độ lấy chất lượng.

Hướng dẫn này cho thấy cách tải một scheduler và tùy chỉnh lịch trình bước thời gian (timestep), khoảng cách và sigmas của nó.

## Chọn trình lập lịch

Bắt đầu từ checkpoint mặc định. Chỉ thay thế nếu bạn cần một sự đánh đổi khác về tốc độ hoặc chất lượng.

- DPM++ 2M SDE Karras là một lựa chọn đa năng mạnh mẽ cho nhiều checkpoint của mô hình khuếch tán tiềm ẩn.
- [TCDScheduler](/docs/diffusers/main/vi/api/schedulers/tcd#diffusers.TCDScheduler) hoạt động tốt với các mô hình đã được chưng cất.
- Sử dụng [FlowMatchEulerDiscreteScheduler](/docs/diffusers/main/vi/api/schedulers/flow_match_euler_discrete#diffusers.FlowMatchEulerDiscreteScheduler) hoặc [FlowMatchHeunDiscreteScheduler](/docs/diffusers/main/vi/api/schedulers/flow_match_heun_discrete#diffusers.FlowMatchHeunDiscreteScheduler) cho các mô hình FlowMatch (Qwen-Image, Flux và các mô hình tương tự).
- [EulerDiscreteScheduler](/docs/diffusers/main/vi/api/schedulers/euler#diffusers.EulerDiscreteScheduler) hoặc [EulerAncestralDiscreteScheduler](/docs/diffusers/main/vi/api/schedulers/euler_ancestral#diffusers.EulerAncestralDiscreteScheduler) thường hoạt động tốt cho các hình ảnh theo phong cách anime.
- [LCMScheduler](/docs/diffusers/main/vi/api/schedulers/lcm#diffusers.LCMScheduler) với LCM UNet hoặc LoRA để tạo ảnh trong vài bước khi checkpoint hỗ trợ.

## Tải trình lập lịch

> [!TIP]
> Các mô hình flow-matching như Qwen-Image và Flux sử dụng [FlowMatchEulerDiscreteScheduler](/docs/diffusers/main/vi/api/schedulers/flow_match_euler_discrete#diffusers.FlowMatchEulerDiscreteScheduler) làm mặc định. Hãy giữ nguyên scheduler này trừ khi bạn chủ ý thử nghiệm. Chỉ thay thế bằng [from_config()](/docs/diffusers/main/vi/api/configuration#diffusers.ConfigMixin.from_config) khi phiên bản thay thế tương thích với checkpoint.

Schedulers chỉ bao gồm cấu hình và không đi kèm các tensor trọng số. Truy cập thuộc tính `.scheduler` trên một pipeline để kiểm tra cấu hình đã được nạp.

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

Để thay đổi scheduler trên một pipeline đã được nạp, hãy sử dụng [from_config()](/docs/diffusers/main/vi/api/configuration#diffusers.ConfigMixin.from_config) với cấu hình scheduler hiện có để `num_train_timesteps` và các trường liên quan vẫn được đồng bộ. Đối với các checkpoint FlowMatch (Qwen-Image, Flux và tương tự), hãy giữ nguyên [FlowMatchEulerDiscreteScheduler](/docs/diffusers/main/vi/api/schedulers/flow_match_euler_discrete#diffusers.FlowMatchEulerDiscreteScheduler) trừ khi bạn chủ ý thử nghiệm với một phương án thay thế tương thích.

```py
from diffusers import DPMSolverMultistepScheduler

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

Bạn cũng có thể tải cấu hình scheduler từ Hub bằng [from_pretrained()](/docs/diffusers/main/vi/api/schedulers/overview#diffusers.SchedulerMixin.from_pretrained) và truyền nó vào [from_pretrained()](/docs/diffusers/main/vi/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained) thông qua `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
```

## Lịch trình bước thời gian

Timestep hoặc lịch trình nhiễu quyết định cách nhiễu được phân bố trong quá trình khử nhiễu. Lịch trình có thể là tuyến tính hoặc tập trung nhiều hơn vào phần đầu hoặc phần cuối. Đây là một chuỗi các mức nhiễu được tính toán trước, sinh ra từ cấu hình mặc định của trình lập lịch, nhưng có thể được tùy chỉnh để sử dụng các lịch trình khác.

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

> [!TIP]
> `timesteps` tùy chỉnh chỉ hoạt động nếu `set_timesteps` của scheduler đó chấp nhận tham số này (các pipeline kiểm tra chữ ký thông qua `retrieve_timesteps` và sẽ ném `ValueError` nếu không). Hãy kiểm tra trang API của scheduler hoặc chữ ký của `set_timesteps` trước khi truyền chúng.

Ví dụ bên dưới sử dụng lịch trình [Align Your Steps (AYS)](https://research.nvidia.com/labs/toronto-ai/AlignYourSteps/), có thể tạo ra hình ảnh chất lượng cao chỉ trong 10 bước, giúp tăng tốc đáng kể quá trình tạo hình ảnh và giảm thời gian tính toán.

Nhập lịch trình và truyền nó vào tham số `timesteps` trong 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]
```

  
    
    Lịch trình bước thời gian AYS 10 bước
  
  
    
    Lịch trình bước thời gian phân bố tuyến tính 10 bước
  
  
    
    Lịch trình bước thời gian phân bố tuyến tính 25 bước
  

Đối với việc rescaling v-prediction/zero-SNR trên các checkpoint cũ hơn, xem [Legacy checkpoints](./legacy_checkpoints#rescaling-schedules).

## Khoảng cách bước thời gian

Khoảng cách bước thời gian (timestep) đề cập đến các bước cụ thể *t* để lấy mẫu từ lịch trình. Diffusers cung cấp ba loại khoảng cách như được hiển thị bên dưới.

| chiến lược khoảng cách | tính toán khoảng cách | các bước thời gian (timesteps) mẫu |
|---|---|---|
| `leading` | các bước cách đều | `[900, 800, 700, ..., 100, 0]` |
| `linspace` | bao gồm bước đầu tiên và bước cuối cùng, sau đó chia đều các bước trung gian còn lại | `[1000, 888.89, 777.78, ..., 111.11, 0]` |
| `trailing` | bao gồm bước cuối cùng và chia đều các bước trung gian còn lại bắt đầu từ cuối | `[999, 899, 799, 699, 599, 499, 399, 299, 199, 99]` |

Truyền chiến lược khoảng cách vào tham số `timestep_spacing` trong trình lập lịch.

> [!TIP]
> Chiến lược `trailing` thường tạo ra các hình ảnh có chất lượng cao hơn với nhiều chi tiết hơn trong số bước ít hơn, nhưng sự khác biệt về chất lượng không rõ ràng bằng đối với các giá trị bước tiêu chuẩn hơn.

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

  
    
    khoảng cách phía sau sau 5 bước
  
  
    
    khoảng cách phía trước sau 5 bước
  

## Sigmas

Sigmas là thước đo mức độ nhiễu của một mẫu tại một bước nhất định theo như lịch trình đã định. Khi sử dụng `sigmas` tùy chỉnh, các `timesteps` sẽ được tính từ các giá trị này thay vì cấu hình trình lập lịch mặc định.

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

> [!TIP]
> `sigmas` tùy chỉnh chỉ hoạt động nếu `set_timesteps` của trình lập lịch đó chấp nhận tham số này (các pipeline kiểm tra chữ ký thông qua `retrieve_timesteps` và sẽ ném `ValueError` nếu không). Hãy kiểm tra trang API của trình lập lịch hoặc chữ ký của `set_timesteps` trước khi truyền chúng.

Truyền các sigmas tùy chỉnh vào tham số `sigmas` trong pipeline. Ví dụ bên dưới sử dụng [sigmas](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_utils.py) từ lịch AYS 10 bước.

```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) lấy lại mẫu cho lịch trình nhiễu để lấy mẫu hiệu quả hơn bằng cách nhóm các sigma dày đặc hơn ở giữa chuỗi, nơi việc tái tạo cấu trúc là quan trọng, trong khi sử dụng ít sigma hơn ở đầu và cuối, nơi sự thay đổi của nhiễu có ít tác động hơn. Điều này có thể tăng mức độ chi tiết trong một hình ảnh được tạo ra.

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

Đặt `use_karras_sigmas=True` trong trình lập lịch để bật tính năng này.

```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]
```

  
    
    Bật sigmas Karras
  
  
    
    Karras sigmas đã bị vô hiệu hóa
  

Tham khảo [tổng quan](../api/schedulers/overview) API scheduler để xem danh sách các scheduler hỗ trợ Karras sigmas. Chỉ nên sử dụng cho các mô hình được huấn luyện với Karras sigmas.

## Các bước tiếp theo

- Đọc bài báo [Common Diffusion Noise Schedules and Sample Steps are Flawed](https://huggingface.co/papers/2305.08891) để biết thêm chi tiết về việc rescale noise schedule nhằm đảm bảo zero SNR.

