Diffusers documentation

Trình lập lịch

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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.

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

Các mô hình flow-matching như Qwen-Image và Flux sử dụng 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() 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.

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() 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 trừ khi bạn chủ ý thử nghiệm với một phương án thay thế tương thích.

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() và truyền nó vào from_pretrained() thông qua scheduler.

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.

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

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

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.

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áchtính toán khoảng cáchcác bước thời gian (timesteps) mẫu
leadingcác bước cách đều[900, 800, 700, ..., 100, 0]
linspacebao 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]
trailingbao 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.

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.

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.

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

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 từ lịch AYS 10 bước.

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

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.

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

Update on GitHub