Diffusers documentation

Планировщики

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

Планировщики

Планировщик определяет, сколько шума следует удалить на каждом шаге цикла денойзинга. Различные планировщики предлагают разный баланс между скоростью и качеством.

В этом руководстве показано, как загрузить планировщик и настроить его расписание шагов по времени, интервалы и сигмы.

Выбор планировщика

Начните с контрольной точки по умолчанию. Заменяйте её только в том случае, если вам нужен иной баланс между скоростью и качеством.

  • 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]
AYS расписание шагов 10 шагов
Линейная шкала временных шагов, 10 шагов
Линейная шкала временных шагов, 25 шагов

Для 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
отступ в конце после 5 шагов
отступ перед текстом после 5 шагов

Сигмы

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.

Дальнейшие шаги

Update on GitHub