Большой разбор

ComfyUI с нуля: как читать workflow и собрать первый граф

ComfyUI показывает генерацию как граф: каждая нода выполняет одну операцию, а связь передаёт данные дальше. Если научиться читать этот маршрут от модели до сохранённого файла, даже большой workflow перестаёт быть клубком проводов. Соберём базовую схему и разберём, где искать причину, когда она не запускается.

Чтение
12 мин
Уровень
Начинающий
Обновлено
30.10.26

С чего начнём

В этом разборе

Можно читать по порядку или выбрать нужную тему в оглавлении.

  • Как устроен рабочий граф
  • Установка и первый запуск
  • Диагностика и расширение

Как устроен рабочий граф

От модели до файла — один видимый маршрут

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

В обычном интерфейсе эти операции скрыты за одной кнопкой. Здесь они разложены на столе. Сначала это выглядит сложнее, зато на любой стадии можно увидеть, какие данные пришли, куда они отправились и какой узел должен сработать дальше.

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

Модель, текстовые условия и латент сходятся в sampler, проходят через декодер и превращаются в готовое изображение.
Граф делает процесс видимым: модель, текстовые условия и латент сходятся в генерации, затем результат декодируется и сохраняется.

Из чего состоит граф

Нода выполняет операцию; у неё могут быть входные и выходные порты, а также настройки. У узла сохранения может не быть выхода, у источника данных — входа. Загрузчик модели, например, может вернуть несколько сущностей: саму модель для сэмплера, текстовый энкодер для промпта и декодер для перевода латента в пиксели. Это не три варианта одного файла, а три разных типа данных.

Связь между портами передаёт значение. Цвет порта помогает отличать типы, но полезнее читать подписи: MODEL, CONDITIONING, LATENT, VAE, IMAGE и другие. ComfyUI не соединяет несовместимые порты просто потому, что они находятся рядом.

Граф исполняется не слева направо по координатам. Система начинает с выходных узлов, нужных для текущего запуска, и вычисляет их зависимости. Поэтому нода может стоять визуально «не на своём месте» и всё равно работать. Положение отвечает за удобство чтения, связи — за логику.

Что происходит после запуска

Когда workflow отправлен в очередь, ComfyUI проверяет обязательные входы и строит план выполнения. Узлы, чей результат не изменился и может быть переиспользован, не обязательно вычисляются заново. Эта особенность делает граф удобным для экспериментов: изменение промпта само по себе не требует заново читать неизменившийся файл модели. Фактическое повторное использование зависит от настроек кеша и доступной памяти.

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

Минимальный text-to-image workflow

Названия и количество нод зависят от архитектуры модели. У одних checkpoint содержит почти всё необходимое, другим нужны отдельные загрузчики текстовых энкодеров, VAE или диффузионной модели. Поэтому универсальной схемы из строго семи блоков нет.

Зато общий маршрут стабилен:

  1. Загрузить компоненты модели. Загрузчик должен выдать данные тех типов, которые принимают следующие узлы.
  2. Подготовить текстовые условия. Prompt кодируется подходящим энкодером. Поддержка negative prompt зависит от модели и workflow.
  3. Создать или получить латент. Для text-to-image это обычно пустой латент нужной формы; шум создаётся отдельно или внутри сэмплера. Например, Empty Latent Image заполняет тензор нулями, а не случайным шумом. Для img2img латент получают из исходного изображения.
  4. Выполнить сэмплирование. Sampler получает модель, условия, латент и параметры процесса.
  5. Декодировать латент. Совместимый VAE или другой декодер переводит внутреннее представление в изображение.
  6. Показать или сохранить результат. Выход IMAGE приходит в preview, save или следующую ветку обработки.
Модульный маршрут ComfyUI проходит через загрузку, условия, латент, sampling, декодер и выход, хотя конкретные ноды могут меняться.
Минимальный граф — это не фиксированное число нод, а шесть ролей: загрузка, условия, латент, sampler, декодирование и выход.

Для первого запуска проще открыть официальный шаблон, который соответствует выбранной модели, и проследить маршрут от Save Image назад. Такой разбор сразу показывает, какие компоненты нужны именно этому семейству и почему случайная замена загрузчика часто ломает весь граф.

Пример связей для базового Stable Diffusion

Для совместимого checkpoint обычная схема состоит из семи нод: Load Checkpoint, двух CLIP Text Encode, Empty Latent Image, KSampler, VAE Decode и Save Image.

Load Checkpoint.MODEL → KSampler.model
Load Checkpoint.CLIP → оба CLIP Text Encode.clip
CLIP Text Encode (положительный) → KSampler.positive
CLIP Text Encode (отрицательный) → KSampler.negative
Empty Latent Image → KSampler.latent_image
KSampler → VAE Decode.samples
Load Checkpoint.VAE → VAE Decode.vae
VAE Decode → Save Image.images

В этой схеме загрузчик возвращает три разных компонента. Если забыть соединение VAE с декодером, одного результата KSampler недостаточно: латент ещё не стал изображением. Для первого запуска можно оставить размеры и параметры официального шаблона, а в положительном промпте описать простую сцену, например чашку на деревянном столе.

Это пример для конкретного устройства модели, а не шаблон для любого файла: FLUX, видеомодели и другие архитектуры могут требовать иной набор компонентов.

Установка и первый запуск

Установка без привязки к одной сборке

У ComfyUI есть официальный Desktop‑вариант и другие способы запуска. Desktop подготавливает рабочую среду, портативная сборка поставляется со своим Python, а ручной запуск позволяет собрать окружение самостоятельно. Поддерживаемые системы и оборудование описаны в официальном репозитории ComfyUI.

Для первого знакомства удобна изолированная установка: её зависимости и Python не смешиваются с другими проектами. Если позже понадобится стабильная рабочая сборка и отдельная экспериментальная, их проще держать независимо и обновлять в разное время.

В официальном Desktop‑варианте Manager уже входит в комплект. Его не нужно устанавливать как отдельную ноду по старым инструкциям. В портативной и ручной установке встроенному Manager могут понадобиться зависимости из manager_requirements.txt и запуск с --enable-manager. Это отдельный пакет управления, а не нода генеративного графа. Порядок для своей установки можно сверить в документации Manager.

Где ComfyUI ищет модели

Модели лежат в каталогах по назначению, а дополнительные хранилища можно подключить через конфигурацию путей. Точные папки зависят от типа компонента: checkpoint, VAE, LoRA, ControlNet, текстовый энкодер и upscale-модель не взаимозаменяемы.

Если файл не появился в загрузчике, полезно проверить три вещи:

  • загрузчик поддерживает формат и семейство модели;
  • файл лежит в каталоге, который входит в пути поиска;
  • после изменения файлов список моделей обновился или приложение было перезапущено, если это требуется сборке.

Официальная библиотека шаблонов помогает связать модель с подходящим workflow. Это надёжнее, чем брать сложный JSON, менять в нём один checkpoint и надеяться, что остальные компоненты совместимы.

Как читать sampler

Сэмплирование — участок, где латент постепенно меняется под влиянием модели и условий. В разных workflow он может быть собран одной нодой или разложен на несколько операций, но вопросы остаются похожими.

  • Seed или noise seed задаёт исходную случайность. Зафиксированный seed удобен для сравнения изменений, но не обещает одинаковую картинку при другой модели, версии нод или вычислительной среде.
  • Steps задаёт число шагов выбранного процесса. Больше шагов не означает автоматически больше деталей: после полезного диапазона время растёт, а изображение может почти не меняться.
  • CFG или guidance управляет влиянием текстового условия там, где выбранная модель использует такой механизм. Шкалы разных архитектур нельзя переносить напрямую.
  • Sampler и scheduler описывают способ пройти по уровням шума. Их сочетание оценивают вместе с конкретной моделью и задачей.
  • Denoise влияет на начальный уровень шума и участок расписания, который проходит латент. В img2img это связано с силой переработки исходника. В генерации из пустого латента исходное изображение сохранять нечему.

Одни и те же числа могут быть удачными для одной модели и неподходящими для другой. Для сравнения сохраняют одну схему и seed, меняют один параметр и смотрят, что именно изменилось в кадре. Такой эксперимент подробно показан в разборе настроек KSampler.

Denoise и исходное изображение

В text-to-image процесс обычно начинается с полного шума. В img2img или inpainting исходная картинка сначала кодируется в латент, после чего часть её структуры может сохраниться.

Чем меньше пройденная часть процесса, тем сильнее результат обычно держится за вход. Чем она больше, тем свободнее модель перестраивает форму и детали. Это не линейная шкала «процентов сходства»: поведение зависит от модели, sampler, prompt и самого изображения.

Зачем нужен VAE

Латент нельзя показать как обычную картинку без декодирования. VAE или другой подходящий декодер выполняет этот перевод. Он должен соответствовать модели и способу, которым был создан латент.

Странные цвета, пустое превью или ошибка формы иногда действительно связаны с VAE, но не только с ним. Сначала стоит проверить типы входов и совместимость компонентов, затем — декодер, указанный для этой модели. Симптомы и порядок проверки разобраны в статье о VAE и серой картинке.

Первый практический маршрут

Первую рабочую схему можно проверить без большого набора расширений.

  1. Установить ComfyUI по официальной инструкции и открыть один официальный шаблон.
  2. Добавить только те компоненты модели, которые указаны для этого шаблона.
  3. Найти выходную ноду и пройти по связям назад до загрузчика.
  4. Запустить пример без структурных изменений и убедиться, что изображение сохраняется.
  5. Зафиксировать seed, изменить только промпт и сравнить результат.
  6. Вернуть промпт, изменить один параметр сэмплера и снова сравнить.
  7. Сохранить чистый рабочий workflow как точку возврата.

После такого круга граф уже читается как процесс, а не как чужая картинка. Следующую возможность — LoRA, ControlNet, референс или второй проход — можно добавить отдельной веткой и сразу увидеть, куда она входит.

Диагностика и расширение

Как искать поломку

Диагностика начинается не с полной перестройки, а с короткого прохода по маршруту.

Инженерка идёт назад от первой красной ноды и последовательно проверяет входы, совместимость компонентов и журнал запуска.
Искать причину проще по порядку: первая красная нода, обязательные входы, совместимость компонентов, журнал запуска и только затем настройки качества.

Нода отсутствует

Если импортированный workflow содержит незнакомый тип, ComfyUI не может исполнить этот участок. Встроенный Manager умеет находить зарегистрированные пакеты для missing nodes, устанавливать, обновлять, отключать и удалять их. Перед установкой полезно посмотреть, какой пакет добавляет нужную ноду и зачем она участвует в графе.

Custom node — исполняемый код со своими зависимостями. Несколько пакетов могут требовать разные версии одной библиотеки, поэтому небольшой набор расширений проще поддерживать. Снимок состояния помогает восстановить сведения о пакетах, но не заменяет резервную копию весов, исходников и Python-окружения. Возможности восстановления зависят от способа установки пакетов. Для экспериментов подойдёт отдельная установка со своими зависимостями; сама по себе она не ограничивает доступ расширений к вашим файлам.

Нода есть, но вход красный

Чаще всего это несовместимый тип, отсутствующая модель или неверная форма данных. Названия нод могут быть похожи, но данные одного загрузчика не обязательно подходят узлу другого семейства.

Здесь помогает проверка цепочки перед ошибкой: какой вход обязателен, откуда он приходит, что выдаёт предыдущая нода. В журнале запуска можно найти техническую причину — отсутствующий файл, зависимость, нехватку памяти или ошибку внутри custom node. Отдельный порядок работы с расширениями есть в руководстве по Custom Nodes.

Граф работает, но результат странный

Технически успешная генерация ещё не означает, что параметры подходят задаче. Удобнее вернуться к чистой версии и по очереди проверить модель, промпт, исходный латент, guidance, denoise, декодер и каждую дополнительную ветку.

Как расширять workflow

Дополнительные ветки проще воспринимать по их роли:

  • LoRA меняет поведение модели через дополнительные веса.
  • ControlNet и родственные способы управления добавляют условие по позе, глубине, линиям или другой структуре.
  • Референс изображения передаёт визуальные признаки через подходящий энкодер или адаптер.
  • Второй проход получает уже созданный латент или изображение и дорабатывает его.
  • Batch и очередь помогают обрабатывать серии. Batch объединяет несколько элементов в одну группу, а очередь содержит отдельные задания; эти способы по-разному расходуют память.
Вокруг рабочего базового графа расположены ветки стиля, структуры, референса и второго прохода, а инженер подключает их по одной.
Расширение графа остаётся понятным, когда каждая новая ветка отвечает на один вопрос: что она добавляет, куда входит и какой результат меняет.

Сложный workflow необязательно держать одним полотном. Группы, понятные названия и подграфы помогают свернуть проверенный участок в повторно используемый блок. Это меняет оформление, но не скрывает типы входов и выходов.

С чем часто путают

  • Workflow и изображение. Граф описывает процесс, но не включает автоматически все внешние модели и custom nodes. Для переноса нужны совместимые компоненты.
  • Seed и воспроизводимость. Seed фиксирует исходную случайность, а не всю среду. Другая модель, sampler или версия узла может изменить результат.
  • Manager и сама генерация. Встроенный Manager управляет пакетами и моделями; он не заменяет ноды, из которых собран workflow.
  • Связь и порядок на экране. Исполнение определяют зависимости, а не положение прямоугольников слева или справа.

Вопросы и полезные материалы

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

Нужно ли собирать первый workflow вручную?

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

Почему некоторые workflow не используют negative prompt?

Способ подготовки текстовых условий зависит от архитектуры модели. Если официальный шаблон не передаёт отрицательное условие, добавление знакомой ноды из другого семейства не обязательно даст ожидаемый эффект.

Где теперь устанавливать custom nodes?

В официальном Desktop используется встроенный Manager. Он ищет зарегистрированные пакеты, показывает missing nodes и управляет обновлениями. Отдельная установка Manager как custom node относится к другим или старым вариантам сборки и не нужна для этого маршрута.

Почему после смены checkpoint граф сломался?

Файл мог принадлежать другому семейству и требовать иной загрузчик, текстовый энкодер, формат латента или декодер. Безопаснее открыть подходящий шаблон и сравнить компоненты, а не менять только имя модели.

Как сохранить рабочий вариант?

Workflow можно сохранить отдельно, а изображения часто содержат метаданные графа, если этот механизм не был отключён или удалён при обработке. Для проекта надёжнее хранить JSON, список моделей и заметку о важных версиях рядом.

Источники и связанные материалы

Если хочется разобрать такой граф вместе с примерами, на Timesaver есть раздел ComfyUI. Его удобно открыть рядом со своим workflow и сравнивать не расположение блоков, а их входы и выходы.

Главное

ComfyUI становится понятнее, когда граф читается от результата к зависимостям. Загрузчик даёт компоненты модели, текстовый энкодер создаёт условия, сэмплер меняет латент, декодер превращает его в изображение, а выходной узел сохраняет результат. После первого успешного запуска можно менять по одной части схемы: так проще увидеть эффект и вернуться к рабочему варианту.