VAE
variational autoencoder — мост между пикселями и латентом
VAE переводит картинку в компактное числовое представление — латент — и восстанавливает из него пиксели. При этом часть деталей теряется. Разберём, как подобрать VAE к модели, подключить его в ComfyUI и найти причину странных цветов или размытия.
Коротко
VAE связывает пиксели с латентным представлением — внутренним форматом изображения, с которым работает модель. Энкодер (encoder) сжимает картинку в латент, декодер (decoder) восстанавливает из него изображение. В моделях латентной диффузии основная генерация идёт в этом компактном пространстве: так нужно обрабатывать гораздо меньше чисел.
Это сжатие с потерями. Декодер не достаёт спрятанный оригинал, а восстанавливает изображение по сохранённой информации. Поэтому два совместимых декодера могут по-разному передать оттенки, мелкую фактуру и черты лица из одного и того же латента.
Зачем нужен отдельный автоэнкодер
При диффузионной генерации модель выполняет много последовательных вычислений. Если на каждом шаге обрабатывать полное RGB-изображение, требуется много памяти и вычислительных ресурсов, особенно при большом разрешении. Авторы Latent Diffusion Models поручили сжатие изображения заранее обученному автоэнкодеру, а удаление шума перенесли в более компактное пространство.
У этого разделения две задачи:
- VAE учится сохранять визуально важную информацию и восстанавливать пиксели;
- denoising-модель учится превращать шумный латент в латент нужного изображения.
Текстовый энкодер стоит в другой ветке: он превращает промпт в числовые условия генерации. VAE не читает промпт и не решает, какой объект рисовать. Его работа начинается с пикселей или заканчивается ими.
Что означает «вариационный»
Обычный автоэнкодер может выдавать для изображения одну фиксированную точку. Вариационный автоэнкодер описывает распределение возможных латентов — например, через среднее и разброс — и позволяет брать из него образцы. При обучении репараметризация отделяет случайный шум от обучаемых среднего и разброса, чтобы через вычисления проходил градиент.
Регуляризация помогает сделать латентное пространство более гладким и пригодным для генеративной модели. Одновременно VAE учится реконструкции: декодированное изображение должно быть похоже на вход. При генерации изображений к пиксельной ошибке часто добавляют оценку визуального сходства, потому что математически близкая картинка не всегда выглядит близкой человеку.
Название VAE в интерфейсах стало удобным общим ярлыком для кодировщика и декодировщика изображения. Но семейства моделей могут использовать разные классы автоэнкодеров, число каналов и способы регуляризации. Совместимость определяет конфигурация, а не одна надпись на файле.
Где VAE участвует в генерации
В txt2img, то есть генерации по тексту, исходной картинки нет. Программа создаёт шум нужного размера в латентном пространстве, генеративная модель постепенно преобразует его, а VAE Decoder переводит результат в пиксели. Энкодер здесь обычно не нужен.
В img2img путь длиннее:
- VAE Encoder переводит исходное изображение в латент.
- Программа добавляет к нему шум в соответствии с настройкой strength или denoise.
- Генеративная модель меняет латент с учётом промпта и других условий.
- VAE Decoder возвращает результат в пространство пикселей.
В inpainting encoder тоже нужен: он кодирует исходное изображение и область, с которой работает конкретный pipeline. Точная схема маски зависит от модели и реализации.
Размер латента: пример, а не закон
Для классических Stable Diffusion 1.x и SDXL характерно восьмикратное уменьшение ширины и высоты и четыре latent-канала. Отсюда знакомые формы:
| Пример | Пиксельный тензор | Латент VAE | Элементов меньше |
|---|---|---|---|
| SD 1.x, 512×512 | 512×512×3 | 64×64×4 | в 48 раз |
| SDXL, 1024×1024 | 1024×1024×3 | 128×128×4 | в 48 раз |
| FLUX.1, 1024×1024 | 1024×1024×3 | 128×128×16 | в 12 раз |
Последний столбец сравнивает только число элементов. Он не обещает такое же уменьшение файла, VRAM или времени: пиксельный и латентный тензоры могут храниться в разных типах данных, а pipeline держит промежуточные результаты вычислений и временные буферы.
У FLUX.1 официальный VAE использует 16 latent-каналов. У других архитектур их может быть 4, 16, 32 или гораздо больше; видеоавтоэнкодеры дополнительно сжимают время. Некоторые pipelines ещё и упаковывают латент перед transformer. Поэтому форму лучше брать из конфигурации модели, а не из универсальной памятки.
Латентные каналы не имеют простых подписей «цвет», «форма» и «текстура». Информация распределена между ними. Показывать первые три канала как RGB можно для отладки, но такая картинка не раскрывает буквальный смысл каждого канала.
Почему VAE должен подходить модели
Совпадения числа каналов недостаточно. Важны:
- класс и архитектура автоэнкодера;
- пространственный коэффициент сжатия;
- число и порядок latent-каналов;
- коэффициент масштабирования, а в некоторых системах ещё сдвиг и нормализация;
- распределение латентов, на котором обучалась denoising-модель;
- правила подготовки изображения и диапазон пикселей.
Грубое несовпадение обычно заканчивается ошибкой формы или шумом. Более тихое несовпадение может декодироваться, но давать сдвиг цвета, грубые границы, странный контраст или слабую фактуру.
VAE бывает упакован в единый checkpoint либо хранится отдельным компонентом. Это свойство формата поставки, а не жёсткое правило семейства. Надёжнее читать model card и использовать комплект, с которым публиковалась модель или workflow.
VAE в ComfyUI
Стандартный CheckpointLoaderSimple возвращает три выхода: основную модель, текстовый энкодер и VAE. Для обычного txt2img его выход VAE подключается к VAEDecode, а latent после sampling — ко входу samples этой ноды.
Для img2img одно и то же совместимое значение VAE идёт в VAEEncode и VAEDecode. Первая нода принимает IMAGE и выдаёт LATENT, вторая делает обратный переход.
Отдельный загрузчик VAE нужен не по умолчанию, а когда:
- модель распространяется раздельными компонентами;
- автор workflow явно указал внешний VAE;
- вы сравниваете два совместимых декодера;
- checkpoint не содержит нужного компонента.
Подменять VAE наугад из-за одного неудачного кадра не стоит. Сначала полезно проверить, какой компонент выходит из загрузчика и для какого семейства собран latent workflow. Соединения и порядок проверки показаны в разборе серой картинки и VAE; общие основы чтения графа — в разделе ComfyUI на TimeSaver VFX.
Быстрая диагностика
| Симптом | Возможная причина | Что проверить |
|---|---|---|
| Ошибка формы тензора | другое число каналов или коэффициент сжатия | карточку модели, VAE и форму латента |
| Цветной шум вместо изображения | несовместимый декодер или неподходящий латент | семейство модели и соединения |
| Сдвинутые цвета, грубые края | совпали размеры, но не способ кодирования | результат со штатным VAE |
| Чёрный кадр или NaN | численная ошибка, неподходящая точность или сбой декодера | журнал ошибок и поддерживаемую точность вычислений |
| Швы на больших изображениях | обработка по плиткам | размер плиток, их перекрытие и смешивание краёв |
| Out of memory при декодировании | VAE обрабатывает большой массив целиком | обработку по плиткам, размер пачки и разрешение |
| img2img слишком сильно изменил исходник | высокий denoise, неподходящий энкодер или подготовка входа | denoise, размер исходника и штатный VAE |
Серая или блеклая картинка сама по себе не доказывает VAE mismatch. Причина может находиться в цветовой обработке, preview, checkpoint, prompt, precision или postprocessing.
Проверка без догадок
Самый наглядный тест — round trip:
- Взять обычную фотографию с кожей, небом, градиентами и мелкой фактурой.
- Пропустить её через
VAEEncodeи сразу черезVAEDecode, без sampler. - Сравнить геометрию, цвет, текстуры и тонкие линии.
- Повторить с кандидатом на замену при тех же настройках.
Так видна именно реконструкция автоэнкодера, без влияния промпта и удаления шума. При случайном кодировании важны одинаковые условия выборки. Небольшая потеря микродеталей ожидаема: VAE сжимает с потерями. Если меняется общая палитра, рушатся лица или появляются блоки, стоит проверить настройки, подготовку входа и сам компонент. Удачная реконструкция ещё не доказывает совместимость с основной моделью: каждый автоэнкодер может хорошо работать в собственном пространстве.
Для txt2img можно декодировать один сохранённый латент двумя совместимыми декодерами. Тогда разница будет связана именно с декодированием. Если же запустить две полные генерации с разными seed, на сравнение повлияет ещё и разный исходный шум.
Что VAE меняет, а что нет
VAE влияет на то, как latent превращается в пиксели: цветовые переходы, локальный контраст, края, мелкую текстуру, лица и тонкие линии. Официальный ft-MSE для раннего Stable Diffusion, например, дообучал decoder с большим акцентом на reconstruction MSE и описывался как дающий более гладкие результаты — не просто «больше насыщенности».
Замена совместимого декодера обычно сохраняет общую композицию, заключённую в латенте. Но из-за потерь реконструкции мелкий объект может выглядеть иначе или исчезнуть. В img2img влияние шире, потому что участвует encoder.
VAE не заменяет модель увеличения изображений. Если архитектура позволяет, он может декодировать латент большего размера. Но это другая операция, чем обработка уже готовой картинки апскейлером, который восстанавливает или дорисовывает детали.
Память и tiled decode
Фраза «VAE почти не занимает VRAM» обманчива. Веса автоэнкодера могут быть меньше основной модели, но высокое разрешение создаёт большие промежуточные результаты вычислений. Именно на decode или encode иногда возникает пик памяти.
Tiling делит изображение на перекрывающиеся участки и снижает пиковое потребление памяти. Но операций становится больше, а на границах участков возможны различия тона или швы. Slicing обрабатывает по частям пакет из нескольких изображений. Оба приёма помогают выполнить кодирование или декодирование при меньшем пике памяти; они не создают отдельный «улучшенный VAE». Другие значения слова tile и способы проверить границы собраны в статье о тайлинге.
С чем часто путают
- VAE и denoising-модель. Denoiser формирует latent; VAE переводит между latent и пикселями.
- VAE и text encoder. Первый кодирует изображение, второй — текст.
- VAE и latent upscaler. Upscaler меняет пространственную сетку или добавляет детали, decoder только реконструирует пиксели из полученного latent.
- VAE и формат checkpoint. Один файл может содержать несколько компонентов, но упаковка не делает их одной нейросетью.
- VAE и preview latent. Быстрый preview может использовать приближённое преобразование, а не полноценный decoder, поэтому его цвет не всегда совпадает с финалом.
Частые ошибки и заблуждения
«Любой VAE с четырьмя каналами подойдёт»
Нет. Должны совпасть масштабирование, распределение латентов, архитектура и другие соглашения pipeline.
«Лучший VAE делает цвета насыщеннее»
Универсально лучшего декодера нет. Более насыщенная картинка может быть менее точной реконструкцией и хуже подходить конкретной модели.
«VAE хранит картинку в 48 раз меньше»
Для некоторых конфигураций это отношение числа элементов двух тензоров. Размер памяти и степень сохранённой информации так не измеряются.
«Если кадр чёрный, сломан VAE»
VAE — одна из возможных причин. Чёрный результат также появляется из-за недопустимых чисел (NaN), неподходящей точности вычислений, ошибок нормализации и несовместимых компонентов среды запуска.
«Encoder нужен в каждом txt2img workflow»
Нет. Когда исходных пикселей нет, pipeline начинает с latent noise и использует decoder в конце.
Связанные термины
- Latent Space — пространство, в которое VAE переводит изображение.
- Stable Diffusion и SDXL — семейства latent diffusion с собственными соглашениями VAE.
- FLUX — семейство с другим числом latent-каналов и масштабированием.
- img2img — маршрут, где работают encoder и decoder.
- Denoising Strength — определяет, насколько меняется закодированный вход.
- KSampler — обрабатывает latent, который затем декодирует VAE.
- CLIP — модель с текстовым и визуальным энкодерами. В текстовой ветке генерации используется её текстовая часть; визуальные векторы CLIP не заменяют латент VAE.
Частые вопросы
Нужно ли скачивать VAE отдельно?
Только если так устроена поставка модели или это прямо указано в workflow и model card. Checkpoint может уже содержать совместимый VAE.
Можно ли заменить VAE и сохранить тот же seed?
Да, но сравнивать лучше один и тот же сохранённый latent. Так decoder остаётся единственной изменяемой частью.
Почему внешний VAE меняет лицо?
Лицо содержит много высокочастотных деталей. Сжатие с потерями и другая настройка реконструкции декодера могут изменить глаза, кожу и тонкие границы.
Почему VAE разных семейств несовместимы?
Они могут различаться каналами, пространственным сжатием, масштабированием, сдвигом и распределением латентов. Denoiser обучался на конкретном представлении.
Поможет ли VAE от нехватки VRAM?
Замена модели — не первый инструмент. Для больших изображений обычно используют tiled encode/decode, уменьшают batch или переносят компонент между CPU и GPU, если pipeline это поддерживает.
Можно ли использовать разные VAE для encode и decode?
Технически некоторые совместимые по форме компоненты соединятся, но round trip окажется несогласованным. Для обычного workflow безопаснее одна согласованная пара, если автор метода не описал другое.
Главное
VAE — не фильтр насыщенности, а обученный мост между пикселями и латентом. Он сжимает изображение с потерями, поэтому отвечает за качество реконструкции и должен совпадать с соглашениями denoising-модели.
В txt2img обычно нужен decoder, в img2img и inpainting — encoder и decoder. При проблемах полезнее проверить форму latent, scaling, штатный компонент и чистый round trip, чем перебирать случайные VAE по названию.
Источники
- Auto-Encoding Variational Bayes
- High-Resolution Image Synthesis with Latent Diffusion Models
- CompVis Latent Diffusion: pretrained autoencoders
- Hugging Face Diffusers: AutoencoderKL
- Hugging Face Diffusers: memory, VAE slicing and tiling
- ComfyUI: CheckpointLoaderSimple
- ComfyUI: VAEEncode
- ComfyUI: VAEDecode
- Stability AI: improved autoencoders
- SDXL VAE configuration
- FLUX.1: реализация автоэнкодера