Diffusers documentation
Планировщики
Планировщики
Планировщик определяет, сколько шума следует удалить на каждом шаге цикла денойзинга. Различные планировщики предлагают разный баланс между скоростью и качеством.
В этом руководстве показано, как загрузить планировщик и настроить его расписание шагов по времени, интервалы и сигмы.
Выбор планировщика
Начните с контрольной точки по умолчанию. Заменяйте её только в том случае, если вам нужен иной баланс между скоростью и качеством.
- DPM++ 2M SDE Karras — это универсальный вариант, хорошо подходящий для многих контрольных точек латентных диффузионных моделей.
- TCDScheduler хорошо работает для дистиллированных моделей.
- Используйте FlowMatchEulerDiscreteScheduler или FlowMatchHeunDiscreteScheduler для моделей FlowMatch (Qwen-Image, Flux и аналогичные).
- EulerDiscreteScheduler или EulerAncestralDiscreteScheduler часто хорошо работают для изображений в аниме-стиле.
- LCMScheduler с LCM UNet или LoRA для генерации за несколько шагов, если чекпоинт это поддерживает.
Загрузка планировщиков
Модели flow-matching, такие как Qwen-Image и Flux, по умолчанию поставляются с FlowMatchEulerDiscreteScheduler. Оставляйте этот планировщик, если вы не целенаправленно проводите эксперименты. Заменяйте его с помощью from_config() только в том случае, если замена совместима с контрольной точкой.
Планировщики содержат только конфигурацию и не поставляются с тензорами весов. Чтобы просмотреть загруженную конфигурацию, обратитесь к атрибуту .scheduler конвейера.
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Чтобы заменить планировщик в загруженном конвейере, используйте from_config() с существующей конфигурацией планировщика, чтобы num_train_timesteps и связанные поля оставались согласованными. Для контрольных точек FlowMatch (Qwen-Image, Flux и аналогичные) сохраняйте FlowMatchEulerDiscreteScheduler, если вы не намеренно экспериментируете с совместимой заменой.
from diffusers import DPMSolverMultistepScheduler
pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config)Вы также можете загрузить конфигурацию планировщика из Hub с помощью from_pretrained() и передать её в from_pretrained() через 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Расписания шагов
Параметр Timestep или расписание шума определяет, как шум распределяется в процессе устранения шума. Расписание может быть линейным или более сконцентрированным в начале или в конце. Это заранее вычисленная последовательность уровней шума, генерируемая из конфигурации по умолчанию планировщика, но её можно настроить для использования других расписаний.
linear (even steps) AYS (denser where it matters) noise noise ^ ^ | * | * | * | * | * | ** | * | *** | * | ** | * | * | * | * +-----------------> step +-----------------> step
Пользовательские
timestepsработают только в том случае, если методset_timestepsданного планировщика принимает этот аргумент (пайплайны проверяют сигнатуру черезretrieve_timestepsи в противном случае выбрасываютValueError). Перед передачей этих значений проверьте страницу API планировщика или сигнатуруset_timesteps.
Приведённый ниже пример использует расписание Align Your Steps (AYS), которое позволяет генерировать изображение высокого качества за 10 шагов, что значительно ускоряет процесс генерации и сокращает время вычислений.
Импортируйте расписание и передайте его в аргумент timesteps в пайплайне.
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]
Для v-prediction/zero-SNR rescaling на старых чекпоинтах см. Legacy checkpoints.
Расстояние между шагами
Расстояния между шагами (timestep spacing) указывают на конкретные шаги t, из которых выполняется выборка по расписанию. Diffusers предоставляет три типа расстояний, показанные ниже.
| стратегия интервалов | расчёт интервала | примеры шагов |
|---|---|---|
leading | шаги с равным интервалом | [900, 800, 700, ..., 100, 0] |
linspace | включите первый и последний шаги и равномерно распределите оставшиеся промежуточные шаги | [1000, 888.89, 777.78, ..., 111.11, 0] |
trailing | включите последний шаг и равномерно распределите оставшиеся промежуточные шаги, начиная с конца | [999, 899, 799, 699, 599, 499, 399, 299, 199, 99] |
Передайте стратегию интервала в аргумент timestep_spacing планировщика.
Стратегия
trailingобычно позволяет получать изображения более высокого качества с большим количеством деталей за меньшее число шагов, однако разница в качестве не так очевидна при более стандартных значениях числа шагов.
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 значения timesteps вычисляются на основе этих величин, а не по конфигурации планировщика по умолчанию.
step: 0 1 2 3 4
sigma: σ0 > σ1 > σ2 > σ3 > σ4 ≈ 0
high noise ---> clean sampleПользовательские
sigmasработают только в том случае, если методset_timestepsданного планировщика принимает этот аргумент (пайплайны проверяют сигнатуру черезretrieve_timestepsи в противном случае выбрасываютValueError). Перед передачей этих значений проверьте страницу API планировщика или сигнатуруset_timesteps.
Передайте пользовательские сигмы в аргумент sigmas пайплайна. В примере ниже используются sigmas из 10-шагового расписания AYS.
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 пересчитывает расписание шума для более эффективного сэмплирования, сгущая сигмы в средней части последовательности, где критично восстановление структуры, и используя меньше сигм в начале и в конце, где изменения шума оказывают меньшее влияние. Это может повысить уровень детализации в сгенерированном изображении.
default σ: * * * * * * * * even-ish
Karras σ: * * * * * * * denser mid, sparser ends
|---structure---|Установите use_karras_sigmas=True в планировщике, чтобы включить эту функцию.
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, приведён в обзоре API планировщиков. Использовать их следует только для моделей, обученных с Karras sigmas.
Дальнейшие шаги
- Подробнее о перемасштабировании расписания шума для обеспечения нулевого SNR читайте в статье Общие расписания шума диффузии и шаги выборки имеют недостатки.