Buckets:
| # Планировщики | |
| Планировщик определяет, сколько шума следует удалить на каждом шаге цикла денойзинга. Различные планировщики предлагают разный баланс между скоростью и качеством. | |
| В этом руководстве показано, как загрузить планировщик и настроить его расписание шагов по времени, интервалы и сигмы. | |
| ## Выбор планировщика | |
| Начните с контрольной точки по умолчанию. Заменяйте её только в том случае, если вам нужен иной баланс между скоростью и качеством. | |
| - DPM++ 2M SDE Karras — это универсальный вариант, хорошо подходящий для многих контрольных точек латентных диффузионных моделей. | |
| - [TCDScheduler](/docs/diffusers/v0.43.0/ru/api/schedulers/tcd#diffusers.TCDScheduler) хорошо работает для дистиллированных моделей. | |
| - Используйте [FlowMatchEulerDiscreteScheduler](/docs/diffusers/v0.43.0/ru/api/schedulers/flow_match_euler_discrete#diffusers.FlowMatchEulerDiscreteScheduler) или [FlowMatchHeunDiscreteScheduler](/docs/diffusers/v0.43.0/ru/api/schedulers/flow_match_heun_discrete#diffusers.FlowMatchHeunDiscreteScheduler) для моделей FlowMatch (Qwen-Image, Flux и аналогичные). | |
| - [EulerDiscreteScheduler](/docs/diffusers/v0.43.0/ru/api/schedulers/euler#diffusers.EulerDiscreteScheduler) или [EulerAncestralDiscreteScheduler](/docs/diffusers/v0.43.0/ru/api/schedulers/euler_ancestral#diffusers.EulerAncestralDiscreteScheduler) часто хорошо работают для изображений в аниме-стиле. | |
| - [LCMScheduler](/docs/diffusers/v0.43.0/ru/api/schedulers/lcm#diffusers.LCMScheduler) с LCM UNet или LoRA для генерации за несколько шагов, если чекпоинт это поддерживает. | |
| ## Загрузка планировщиков | |
| > [!TIP] | |
| > Модели flow-matching, такие как Qwen-Image и Flux, по умолчанию поставляются с [FlowMatchEulerDiscreteScheduler](/docs/diffusers/v0.43.0/ru/api/schedulers/flow_match_euler_discrete#diffusers.FlowMatchEulerDiscreteScheduler). Оставляйте этот планировщик, если вы не целенаправленно проводите эксперименты. Заменяйте его с помощью [from_config()](/docs/diffusers/v0.43.0/ru/api/configuration#diffusers.ConfigMixin.from_config) только в том случае, если замена совместима с контрольной точкой. | |
| Планировщики содержат только конфигурацию и не поставляются с тензорами весов. Чтобы просмотреть загруженную конфигурацию, обратитесь к атрибуту `.scheduler` конвейера. | |
| ```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 | |
| ``` | |
| Чтобы заменить планировщик в загруженном конвейере, используйте [from_config()](/docs/diffusers/v0.43.0/ru/api/configuration#diffusers.ConfigMixin.from_config) с существующей конфигурацией планировщика, чтобы `num_train_timesteps` и связанные поля оставались согласованными. Для контрольных точек FlowMatch (Qwen-Image, Flux и аналогичные) сохраняйте [FlowMatchEulerDiscreteScheduler](/docs/diffusers/v0.43.0/ru/api/schedulers/flow_match_euler_discrete#diffusers.FlowMatchEulerDiscreteScheduler), если вы не намеренно экспериментируете с совместимой заменой. | |
| ```py | |
| from diffusers import DPMSolverMultistepScheduler | |
| pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config) | |
| ``` | |
| Вы также можете загрузить конфигурацию планировщика из Hub с помощью [from_pretrained()](/docs/diffusers/v0.43.0/ru/api/schedulers/overview#diffusers.SchedulerMixin.from_pretrained) и передать её в [from_pretrained()](/docs/diffusers/v0.43.0/ru/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained) через `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 | |
| ``` | |
| ## Расписания шагов | |
| Параметр Timestep или расписание шума определяет, как шум распределяется в процессе устранения шума. Расписание может быть линейным или более сконцентрированным в начале или в конце. Это заранее вычисленная последовательность уровней шума, генерируемая из конфигурации по умолчанию планировщика, но её можно настроить для использования других расписаний. | |
| ```text | |
| linear (even steps) AYS (denser where it matters) | |
| noise noise | |
| ^ ^ | |
| | * | * | |
| | * | * | |
| | * | ** | |
| | * | *** | |
| | * | ** | |
| | * | * | |
| | * | * | |
| +-----------------> step +-----------------> step | |
| ``` | |
| > [!TIP] | |
| > Пользовательские `timesteps` работают только в том случае, если метод `set_timesteps` данного планировщика принимает этот аргумент (пайплайны проверяют сигнатуру через `retrieve_timesteps` и в противном случае выбрасывают `ValueError`). Перед передачей этих значений проверьте страницу API планировщика или сигнатуру `set_timesteps`. | |
| Приведённый ниже пример использует расписание [Align Your Steps (AYS)](https://research.nvidia.com/labs/toronto-ai/AlignYourSteps/), которое позволяет генерировать изображение высокого качества за 10 шагов, что значительно ускоряет процесс генерации и сокращает время вычислений. | |
| Импортируйте расписание и передайте его в аргумент `timesteps` в пайплайне. | |
| ```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] | |
| ``` | |
| AYS расписание шагов 10 шагов | |
| Линейная шкала временных шагов, 10 шагов | |
| Линейная шкала временных шагов, 25 шагов | |
| Для v-prediction/zero-SNR rescaling на старых чекпоинтах см. [Legacy checkpoints](./legacy_checkpoints#rescaling-schedules). | |
| ## Расстояние между шагами | |
| Расстояния между шагами (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` планировщика. | |
| > [!TIP] | |
| > Стратегия `trailing` обычно позволяет получать изображения более высокого качества с большим количеством деталей за меньшее число шагов, однако разница в качестве не так очевидна при более стандартных значениях числа шагов. | |
| ```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 | |
| ``` | |
| отступ в конце после 5 шагов | |
| отступ перед текстом после 5 шагов | |
| ## Сигмы | |
| Sigmas — это мера того, насколько шумным является образец на определённом шаге, как это определено расписанием. При использовании пользовательских `sigmas` значения `timesteps` вычисляются на основе этих величин, а не по конфигурации планировщика по умолчанию. | |
| ```text | |
| step: 0 1 2 3 4 | |
| sigma: σ0 > σ1 > σ2 > σ3 > σ4 ≈ 0 | |
| high noise ---> clean sample | |
| ``` | |
| > [!TIP] | |
| > Пользовательские `sigmas` работают только в том случае, если метод `set_timesteps` данного планировщика принимает этот аргумент (пайплайны проверяют сигнатуру через `retrieve_timesteps` и в противном случае выбрасывают `ValueError`). Перед передачей этих значений проверьте страницу API планировщика или сигнатуру `set_timesteps`. | |
| Передайте пользовательские сигмы в аргумент `sigmas` пайплайна. В примере ниже используются [sigmas](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_utils.py) из 10-шагового расписания AYS. | |
| ```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](https://huggingface.co/papers/2206.00364) пересчитывает расписание шума для более эффективного сэмплирования, сгущая сигмы в средней части последовательности, где критично восстановление структуры, и используя меньше сигм в начале и в конце, где изменения шума оказывают меньшее влияние. Это может повысить уровень детализации в сгенерированном изображении. | |
| ```text | |
| default σ: * * * * * * * * even-ish | |
| Karras σ: * * * * * * * denser mid, sparser ends | |
| |---structure---| | |
| ``` | |
| Установите `use_karras_sigmas=True` в планировщике, чтобы включить эту функцию. | |
| ```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] | |
| ``` | |
| Включены сигмы Карраса | |
| Сигмы Карраса отключены | |
| Список планировщиков, поддерживающих Karras sigmas, приведён в [обзоре](../api/schedulers/overview) API планировщиков. Использовать их следует только для моделей, обученных с Karras sigmas. | |
| ## Дальнейшие шаги | |
| - Подробнее о перемасштабировании расписания шума для обеспечения нулевого SNR читайте в статье [Общие расписания шума диффузии и шаги выборки имеют недостатки](https://huggingface.co/papers/2305.08891). | |
Xet Storage Details
- Size:
- 15.5 kB
- Xet hash:
- 58f847bdfff68ab3d7c913cd1856e1124bba5e62e2fa6aec5e0be73414cbb44f
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.