KSampler

ksampler — узел ComfyUI для прохождения latent по шкале шума

Раздел
Сэмплеры
Обновлено
11.08.26

KSampler объединяет модель, conditioning, исходный latent и настройки sampling в один узел ComfyUI. Scheduler строит последовательность уровней шума, sampler задаёт правило перехода между ними, а результатом остаётся latent — декодирование в изображение происходит отдельно.

Коротко

KSampler проводит latent через последовательность уровней шума. Он получает модель, два набора conditioning и исходный latent, создаёт шум по seed, строит шаги по scheduler и применяет выбранный sampler.

Название узла часто создаёт впечатление, что внутри находится один «сэмплер». На деле KSampler собирает несколько независимых решений: откуда начать, в каких точках запросить модель, как перейти к следующей точке и как смешать условное и безусловное предсказания.

На выходе остаётся LATENT. Готовые пиксели появляются только после VAE decode или другого подходящего декодера.

Место KSampler в графе

Базовый путь выглядит так:

MODEL + CONDITIONING + LATENT
              ↓
          KSampler
              ↓
            LATENT

Официальная документация KSampler перечисляет четыре обязательных входа:

  • model — объект модели, которая предсказывает очищенное состояние или связанную с ним величину;
  • positive — положительное CONDITIONING;
  • negative — отрицательное CONDITIONING;
  • latent_image — структура LATENT с исходными samples и, возможно, дополнительными полями.

Positive и negative — не обязательно две текстовые строки. До KSampler они уже превратились в структуры conditioning и могут содержать embeddings, области, маски, временные диапазоны и другие данные, которые поддерживает конкретный граф.

Модель тоже не стоит автоматически называть U-Net. В современных workflow за типом MODEL может скрываться U-Net, diffusion transformer или другой denoiser, обёрнутый в интерфейс ComfyUI.

Что происходит внутри

Упрощённо работа проходит в пять этапов.

  1. По форме входного latent готовится шум. Seed определяет его псевдослучайную последовательность.
  2. Модельная конфигурация и scheduler задают последовательность значений sigma — уровней шума.
  3. На каждой выбранной точке denoiser получает текущее состояние и conditioning.
  4. Guidance смешивает условное и безусловное предсказания с учётом CFG или другого правила модели.
  5. Sampler вычисляет переход к следующему sigma и возвращает итоговые latent samples.

Исходный код common_ksampler показывает эту развязку: узел готовит noise и mask, а затем передаёт steps, cfg, sampler_name, scheduler, conditioning и latent в общий sampling-слой.

Scheduler и sampler — разные части маршрута

Это главное различие для понимания узла.

Scheduler выбирает точки на шкале шума. Он отвечает на вопрос: при каких значениях sigma модель будет вызвана и насколько плотно расположены ранние и поздние шаги.

Sampler задаёт численное правило движения между соседними точками. Euler использует один тип приближения, Heun — другой, DPM-Solver++ — собственное семейство решателей.

Работа Elucidating the Design Space of Diffusion-Based Generative Models специально разделяет noise schedule и solver. ComfyUI отражает ту же идею двумя полями.

Комбинация не сводится к правилу «один лучший sampler плюс один лучший scheduler». Модель обучалась с определённой параметризацией шума, а решатели по-разному ведут себя на короткой и длинной сетке. Имена доступных вариантов меняются быстрее, чем сам принцип.

Steps — число точек, но не всегда число вызовов модели

steps задаёт желаемую дискретизацию пути. Однако вычислительная цена одного шага зависит от sampler. Метод более высокого порядка может делать дополнительный запрос denoiser или использовать историю прошлых предсказаний.

Поэтому два sampler с одинаковым steps не обязаны иметь одинаковое время и число model evaluations. И больше шагов не означает линейное улучшение: после определённого момента ошибка solver уже не является главным ограничением результата.

У DPM-Solver++, например, есть многошаговые варианты для быстрого guided sampling. Это объясняет семейство названий, но не даёт универсального числа steps для любой модели.

Seed создаёт шум, а не «хранит картинку»

В KSampler seed передаётся генератору стартового шума. При одинаковом seed и форме latent получается та же псевдослучайная основа — если совпадают алгоритм генерации, batch layout и окружение.

Композиция меняется вместе с seed, потому что denoising начинается с другого состояния. Но seed не кодирует готовый кадр. Изменение размера, модели, conditioning, scheduler или sampler меняет траекторию даже при том же числе.

Опция вроде fixed, increment или randomize относится к поведению интерфейса после запуска: оставить значение, изменить его или выбрать новое. Это не отдельный sampling-алгоритм внутри denoiser.

CFG и два conditioning

Классический classifier-free guidance объединяет условное и безусловное предсказания. Исходная работа CFG описывает компромисс между соответствием условию и разнообразием.

Упрощённая запись выглядит так:

guided = uncond + cfg × (cond − uncond)

Высокое значение увеличивает разницу, но не гарантирует более точный результат. Оно способно усиливать контраст, насыщенность и ошибки. Значение зависит от обучения модели и способа guidance.

В актуальном коде ComfyUI при cfg = 1 безусловная ветвь может не вычисляться, если модель не запрещает эту оптимизацию. Некоторые архитектуры используют дополнительный guidance-вход или модифицированное правило. Поэтому таблица «правильных CFG для всех моделей» быстро устаревает.

Denoise — выбранный участок шкалы

Поле denoise удобно воспринимать не как процент перерисованных пикселей, а как выбор участка noise schedule.

При значении 1 KSampler проходит полный предусмотренный маршрут. При меньшем значении sampling начинается позже, с более низкого уровня шума, поэтому encoded latent сохраняет больше структуры.

denoise = 0.5 не означает «половина изображения останется прежней» и не гарантирует ровно половину визуальных изменений. Итог зависит от модели, VAE, sampler, sigma schedule и содержания исходного latent.

Для text-to-image вход может быть пустым latent-холстом, к которому добавляется полный шум. Для image-to-image исходное изображение сначала кодируется в latent, а сокращённый участок пути позволяет его переосмыслить без обязательной полной перестройки.

Noise mask и inpainting

Структура LATENT может содержать noise_mask. common_ksampler извлекает её и передаёт в sampling-слой. Так область, где разрешено добавление шума и обновление samples, может отличаться от остального кадра.

Это ещё одна причина не считать latent_image просто тензором картинки. В нём могут жить batch indices, маска и служебные данные, которые узел сохраняет при формировании выхода.

Почему на выходе не изображение

KSampler возвращает denoised latent. В исходном коде узла копируется входная структура и заменяется поле samples.

Дальше latent можно:

  • передать следующей sampling-стадии;
  • декодировать VAE;
  • увеличить в latent space;
  • смешать с другим latent;
  • сохранить специальным узлом;
  • использовать как вход для редактирования.

Поэтому VAE Decode — частый следующий шаг, но не часть KSampler.

KSampler Advanced

KSamplerAdvanced раскрывает управление, которое базовый узел прячет за denoise и полным проходом:

  • add_noise — добавлять ли стартовый шум;
  • noise_seed — seed этого шума;
  • start_at_step и end_at_step — какой диапазон schedule пройти;
  • return_with_leftover_noise — завершать ли путь до чистого состояния.

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

Стыковка требует одинакового понимания schedule, steps и границы. Два случайных диапазона с одинаковыми процентами не обязательно образуют непрерывный путь, особенно если между узлами меняются scheduler или модельная параметризация.

KSampler не единственный способ sampling

В ComfyUI есть более модульные графы, где noise, guider, sampler и sigmas создаются отдельными нодами. Они дают точнее контролировать каждую часть и не обязаны включать KSampler.

Поэтому фраза «любой workflow крутится вокруг KSampler» слишком сильная. Он остаётся удобным встроенным узлом для распространённых схем, но sampling можно собрать иначе или полностью заменить специализированным backend.

Как читать неудачный результат

Разные симптомы указывают на разные части маршрута.

Композиция меняется при ожидаемо фиксированном запуске. Проверяются seed, batch indices, случайные узлы, версии sampler и окружение.

Img2img слишком далеко уходит от исходника. Важны denoise, VAE encode, sigma schedule и реальный входной latent.

Изображение выглядит пережатым или перенасыщенным. Причиной может быть CFG, но также модель, prompt weighting или декодирование.

Детали не успевают сложиться. Steps могли быть малы для этой пары sampler/scheduler, но проблема бывает и в несовместимой модели или слишком сложном conditioning.

На стыке двух KSampler виден скачок. Проверяются add noise, start/end, leftover noise и совпадение шкалы sigma.

Изменение одного параметра при фиксированном seed делает сравнение понятнее. Одновременная замена sampler, scheduler, CFG и steps не показывает, что именно повлияло на кадр.

Частые вопросы

Что означает буква K в названии?

Название связано с k-diffusion-линейкой sampler, которая сильно повлияла на ранний sampling-стек. В актуальном ComfyUI лежит собственная ветка comfy/k_diffusion, но список узла включает и другие реализации. KSampler лучше понимать как историческое имя обёртки, а не обещание одного внешнего пакета.

Какой sampler лучший?

Универсального нет. Результат зависит от модели, числа шагов, scheduler, guidance и сюжета. Содержательное сравнение фиксирует всё, кроме sampler, и использует несколько seed.

Чем scheduler отличается от noise schedule модели?

Модель имеет собственную параметризацию допустимых уровней шума. Scheduler выбирает конечную последовательность sigmas для конкретного запуска с заданным числом шагов.

Denoise добавляет указанную долю шума?

Это удобное бытовое описание, но математически неточное. В KSampler параметр определяет, какую часть рассчитанного schedule использовать. Визуальная сила изменения не обязана быть линейной.

Можно ли соединить два KSampler?

Да. Второй получает latent первого. Но повторное добавление полного шума запускает новый проход, а согласованное продолжение требует корректной границы и обычно более явного контроля Advanced или модульных sampler-нод.

Почему одинаковый seed не повторяет изображение?

Seed воспроизводит только случайный шум при совпадающих условиях. Размер, batch, модель, sampler, scheduler, conditioning, версии кода и вычислительный backend тоже должны совпасть.

Главное

KSampler — удобная сборка sampling-процесса в одном узле. Seed задаёт шум, steps и scheduler — точки sigma, sampler — переходы, CFG — правило guidance, denoise — используемый участок пути.

Узел принимает и возвращает latent. Он не содержит VAE decode и не является единственным способом запустить diffusion. Надёжнее всего понимать его не как «магический генератор», а как координатора нескольких отдельных механизмов.

Источники