Diffusers documentation
Trình lập lịch
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 hoạt động tốt với các mô hình đã được chưng cất.
- Sử dụng FlowMatchEulerDiscreteScheduler hoặc FlowMatchHeunDiscreteScheduler cho các mô hình FlowMatch (Qwen-Image, Flux và các mô hình tương tự).
- EulerDiscreteScheduler hoặc EulerAncestralDiscreteScheduler thường hoạt động tốt cho các hình ảnh theo phong cách anime.
- 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
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.schedulerLị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
timestepstùy chỉnh chỉ hoạt động nếuset_timestepscủa scheduler đó chấp nhận tham số này (các pipeline kiểm tra chữ ký thông quaretrieve_timestepsvà sẽ némValueErrornếu không). Hãy kiểm tra trang API của scheduler hoặc chữ ký củaset_timestepstrướ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]
Đố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á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.
Chiến lược
trailingthườ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
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
sigmastùy chỉnh chỉ hoạt động nếuset_timestepscủ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 quaretrieve_timestepsvà sẽ némValueErrornếu không). Hãy kiểm tra trang API của trình lập lịch hoặc chữ ký củaset_timestepstrướ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]
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
- Đọc bài báo Common Diffusion Noise Schedules and Sample Steps are Flawed để biết thêm chi tiết về việc rescale noise schedule nhằm đảm bảo zero SNR.