Скелет любого workflow: 6 нод
Это тот самый базовый граф «текст → картинка» (txt2img). Любой чужой монстр на 60 нод - это вот этот скелет плюс примочки вокруг. Запомни его - и перестанешь бояться больших графов.
Промпт на входе, картинка на выходе - где они?
Если ты пришёл из ChatGPT или Midjourney, в голове простая схема: пишешь промпт → получаешь картинку. В ComfyUI ровно то же самое - просто «коробку» вскрыли и показали начинку. Смотри, куда что заходит:
золотой час»
закодировать текст →
почистить шум →
разжать в пиксели
Внутри этой пунктирной «коробки» - те самые 6 нод, которые сейчас разберём. Две вещи сбивают новичка, и их важно проговорить:
- Промпт заходит не «в самое начало», а в конкретную станцию - ноду
CLIP Text Encode(в схеме ниже она подписана «сюда твой промпт»). Первые ноды (Load Checkpoint) промпт вообще не трогают - они просто достают ингредиенты: модель, переводчик и кодек. - Картинка выходит из последней ноды -
Save Image. Всё между входом и выходом - конвейер.
Это как decode / encode в коде. На границе входа текст декодируется во внутреннее представление (это делает CLIP: слова → числа). Внутри всё считается уже в этом внутреннем виде (latent). На границе выхода - обратное преобразование во внешний формат, пиксели (это делает VAE). «Промпт → картинка» - это границы конвейера, а ноды загрузки модели - как import библиотек: они не часть потока «текст→картинка», а просто дают инструменты. Поэтому граф и «стартует» не с промпта.
Если в чужом графе видишь картинку, воткнутую во вход, - это img2img (перекрасить готовую картинку), отдельный режим. Базовый скелет, который разбираем здесь, - чисто текст → картинка. Про «картинку на входе» - в главе про VAE.
Сначала - язык проводов
В ComfyUI провод нельзя воткнуть куда попало: у каждого выхода свой тип данных, и он подсвечен цветом. Вход примет только провод своего цвета. Базовых типов всего шесть - вот они:
| Цвет | Тип | Что «едет» по проводу | Откуда → куда (в скелете) |
|---|---|---|---|
| MODEL | сама диффузионная модель - «мозг», что чистит шум | Load Checkpoint → KSampler | |
| CLIP | text encoder - переводчик текста в числа | Load Checkpoint → CLIP Text Encode | |
| CONDITIONING | закодированный промпт (что рисуем / чего избегаем) | CLIP Text Encode → KSampler | |
| LATENT | картинка в сжатом виде, где идёт вся чистка шума | Empty Latent / KSampler → VAE Decode | |
| VAE | кодек: latent ⇄ пиксели | Load Checkpoint → VAE Decode | |
| IMAGE | готовые пиксели | VAE Decode → Save Image |
Это 6 базовых типов - их хватает почти для любого графа. Есть и более узкие (MASK для inpaint, CONTROL_NET, CLIP_VISION для IP-Adapter) - встретишь в главе 11. Смысл цветов простой: каждый тип покрашен по-своему, и вход примет только провод своего цвета - поэтому промахнуться почти нельзя, несовместимые разъёмы просто не соединятся.
Сам граф
А вот и весь скелет целиком. Теперь видно, почему на первый взгляд кажется вывернуто: граф начинается не с промпта, а с загрузки модели (Load Checkpoint). Но промпт всё равно заходит - он отдельным блоком слева, а жёлтая стрелка сверху ведёт его в CLIP Text Encode. Снизу в KSampler входит Empty Latent Image (размер холста), а готовая картинка выходит из Save Image справа.
«blurry, ugly» (-)
height 1024
batch 1
Про счёт нод: в рамке 6 коробок - но CLIP Text Encode нарисован одной, а это две ноды (positive и negative). Плюс Empty Latent Image (снизу, стрелкой в KSampler) задаёт размер холста (например 1024×1024). Итого на реальном холсте увидишь 7 прямоугольников, но по смыслу это те же 6 блоков. «Промпт» слева и «картинка» справа - не ноды, а твой ввод и результат.
Что во что втыкается (карта соединений)
| Откуда | Тип | Куда | Зачем |
|---|---|---|---|
| Load Checkpoint · MODEL | MODEL | KSampler · model | кто чистит шум |
| Load Checkpoint · CLIP | CLIP | оба CLIP Text Encode | чем кодировать текст |
| Load Checkpoint · VAE | VAE | VAE Decode · vae | чем разжать в пиксели |
| CLIP Text Encode (+) | COND | KSampler · positive | что нарисовать |
| CLIP Text Encode (-) | COND | KSampler · negative | чего избегать |
| Empty Latent Image | LATENT | KSampler · latent | пустой холст + размер |
| KSampler | LATENT | VAE Decode · latent | вычищенный результат |
| VAE Decode | IMAGE | Save Image | сохранить пиксели |
Что значат эти названия
На схеме сразу куча англицизмов - Checkpoint, CLIP, KSampler, VAE. Вот расшифровка, коротко, чтобы они не пугали. Подробно каждый кубик разбираем дальше по главам - здесь только «что за слово».
| Название | Откуда слово | Что это |
|---|---|---|
| Checkpoint | «контрольная точка» | Сохранённый снимок обученной модели (в ML модель по ходу тренировки сохраняют «чекпоинтами»). Внутри сразу MODEL + CLIP + VAE. → гл. 6 |
| CLIP | Contrastive Language-Image Pre-training | Модель OpenAI, которая научилась связывать текст и картинки. В ComfyUI так зовут text encoder - переводчик промпта в числа. → гл. 7 |
| VAE | Variational Autoencoder | Нейросеть-«архиватор»: жмёт пиксели в latent и разжимает обратно. → гл. 8 |
| KSampler | sampler + «K» | Sampler - алгоритм, который пошагово «сэмплит» (вычищает) шум. «K» - от библиотеки k-diffusion, на которой построены сэмплеры ComfyUI. Это сердце графа. → гл. 9 |
| Latent | «латентный» (скрытый) | Скрытое, сжатое представление картинки, в котором идёт вся чистка шума. → гл. 8 |
| Conditioning | «обуславливание» | Закодированный промпт - то, чем мы «обуславливаем» (направляем) чистку шума. → гл. 7 |
Слева направо: грузим модель (она отдаёт сразу три вещи - мозг, переводчик и кодек) → кодируем два текста (что хочу / чего не хочу) → KSampler чистит шум по этим текстам → VAE разжимает latent в картинку → сохраняем. Всё. Пять глаголов.
В Midjourney/DALL·E всё это спрятано в один запрос. ComfyUI намеренно раскрывает конвейер на отдельные станции. Минус - порог входа. Плюс - ты можешь врезаться в любую точку конвейера и подменить кубик: другой sampler, ещё одна LoRA, ControlNet перед KSampler, upscale после VAE Decode. Отсюда и монструозные графы - это тот же скелет с врезками. Дальше вся книга - про эти врезки.