VAE & Latent Space¶
VAE (Variational AutoEncoder) — архитектура нейросетей для эффективного сжатия и распаковки данных.
Латентное пространство (latent space) - запакованные посредством VAE данные.
Как работает VAE в Stable Diffusion¶
В случае Stable Diffusion, VAE — это нейронная сеть, хранящаяся в формате pt, ckpt или safetensors, которая преобразует RGB-изображение в латентное пространство и обратно.
Латентное пространство — это то, с чем работает Stable Diffusion во время процесса семплинга (sampling), т. е. когда индикатор процесса генерации находится между пустым и полным.
Для режима txt2img VAE используется для создания результирующего изображения после завершения операций семплинга. В режиме img2img VAE используется для конвертации входного изображения в латентное пространство перед этапом семплинга и для создания изображения после завершения этапа семплинга.
При кодировании изображения размером 1280x1280 пикселей, в латентном пространстве оно будет представлено в виде массива размером 160x160x4 параметров — по каждой из сторон происходит сжатие в 8 раз.
Подобное является возможным по той причине, что, входные данные, как правило, не являются случайными, что позволяет их эффективно сжимать с минимальными потерями.
При приближении можно заметить, что, на разных "каналах" в латентном пространстве, персонаж находится в немного отличающихся позах, а так же обилие "белого шума". Способ представления изображения в латентном пространстве не является интерпретируемым.
Как выбрать и где взять VAE?¶
Несовместимость VAE от разных базовых моделей
VAE от разных базовых моделей (таких как SD 1.X и SDXL) несовместимы между собой без использования дополнительных костылей. Если вашу картинку жёстко размазало, то, скорее всего, вы использовали VAE от SDXL для SD 1.X, либо наоборот.
Не используйте стандартный VAE от первого SD
При использовании моделей основанных на SD 1.X крайне желательно использовать любой VAE, отличный от стандартного. Причина этого в том, что стандартный VAE имеет тенденцию плодить артефакты в виде фиолетовых пятен.
Технически, Stable Diffusion не может работать без наличия VAE. Если вы выбираете опцию None
в качестве VAE, то будет использован VAE, зашитый в текущий SD-чекпоинт. Если в SD-чекпоинт вшит VAE, отличный от стандартного, то это называют термином baked VAE.
Стоит отметить, что любые алгоритмы дообучения SD (Dreambooth, LoRA, LyCORIS) так же осуществляют работу в латентном пространстве. Причиной, почему все процессы связанные с SD работают в латентном пространстве является то, что данный подход позволяет более чем на порядок сократить объём данных во время работы UNet, что сильно снижает требования к обучению и запуску SD-чекпоинтов.
SD 1.X¶
Совместимые с SD 1.X VAE вместе со ссылками на загрузку вы можете увидеть ниже. Наиболее заметным эффектом при смене VAE является яркость изображения. Стандартный NovelAI VAE выдаёт блеклые цвета, поэтому имеет смысл использовать его в том случае, если вы хотите сделать изображения менее яркими.
Загруженные файлы с VAE необходимо поместить в директорию %автоматик%\models\VAE
.
NovelAI VAE [Orig] [fp16] [fp32] [bf16] |
kl-f8-anime2 VAE | EMA 560k VAE | MSE 840k VAE |
---|---|---|---|
SDXL¶
Индусы из Stability AI жёстко облажались с VAE при релизе SD XL 1.0 - оригинальное VAE корректно работает только в режиме fp32, при попытке использования режима fp16 оно без вариантов будет выдавать NaN'ы на этапе декодинга изображения. Рекомендуется скачать версию VAE с исправлением для режима fp16, либо использовать TAESD.
Дополнительная информация о VAE-моделях¶
Прочие VAE
Существует большое количество файнтьюнов VAE, которые можно найти на civitai.
В отдельных случаях, авторы SD-чекпоинтов помещают информацию о рекомендуемом VAE на странице своей модели в civitai. В этом случае, ссылка на загрузку рекомендуемого VAE будет распологаться под кнопкой загрузки модели.
Настройки и оптимизации¶
Вынос настройки VAE на верхнюю панель¶
Через меню Settings -> Quicksettings list
возможно вынести настройку VAE на верхнюю панель. Для этого добавьте опцию sd_vae
в список быстрых настроек. После сохранения и перезагрузки интерфейса, вы увидите настройку SD VAE в верхней части интерфейса, рядом с выпадающим списком SD-чекпоинтов.
Перестаём генерировать чёрные квадраты¶
По умолчанию, VAE выполняется с точностью fp16, что, при определённых обстоятельствах, может приводить к генерации NaN-тензоров, что внешне будет проявляться в виде генерации чёртных квадратов.
Кроме того, NovelAI VAE и не работает в режиме fp16 на видеокартах 16xx поколения.
Для решения данной проблемы необходимо сменить точность операций VAE на fp32. Это можно осуществить одним из двух способов.
Увеличение потребления VRAM
Смена режима точности с fp16 на fp32 неминуемо ведёт к увеличению потребления VRAM в процессе энкодинга/декодинга изображения. Если вы столкнулись с нехватной VRAM после увеличения точности для VAE, попробуйте запустить webui с аргументом --medvram
, либо же испольуйте Tiled VAE или TAESD (описано ниже).
Аргумент запуска --no-half-vae¶
Добавление аргумента --no-half-vae
к параметрам запуска в файле webui-user.bat включит режим точности fp32 для VAE.
В случае использования 16xx линейки видеокарт так же является необходимым добавить дополнительные аргументы:
--precision full --no-half
Дополнительная информация о флагах для исправления проблемы может быть найдена в репе автоматика.
Опция Automatically revert VAE to 32-bit floats¶
Активация опции Automatically revert VAE to 32-bit floats
в настройках автоматика приведёт к запуску VAE в режиме точности fp32 в том случае, если в режиме fp16 VAE начинает возвращать NaN
вместо корректных значений.
Tiled VAE¶
Расширение multidiffusion-upscaler-for-automatic1111 предоставляет возможность проводить процесс энкодинга/декодинга изображения по частям, что позволяет значительно сократить объём потребляемой VRAM в момент работы VAE.
- Сокращает потребление VRAM практически без побочных эффектов
- Во многих случаях делает ненужным использование опций
--lowvram
и--medvram
- При использовании highres.fix вы сможете использовать более высокий коэффициент апскейла без вылетов из-за нехватки VRAM
- В большинстве случаев, вы можете использовать стандартные настройки Tiled VAE без каких либо модификаций
- Плагин автоматически проставит рекомендуемые настройки размера тайла при первом запуске
Не забудьте включить плагин
По умолчанию плагин будет выключен на вкладках txt2img/img2img. Не забудьте включить его, раскрыв панель настроек в секции Tiled VAE и прожав опцию Enable.
Исправление цветов
Если вы используете маленький размер тайла и картинка становится серой и нечёткой, включите опцию Encoder Color Fix.
CUDA error: out of memory
Если вы увидите ошибки о недостатке памяти для CUDA, то просто уменьшите размер одного тайла.
Tiny AutoEncoder for Stable Diffusion (TAESD)¶
TAESD представляет собой легковестную реализацию VAE, использующую API обычного VAE от Stable Diffusion. TAESD менее точен, но работает на пару порядков быстрее и требует гораздо меньшее количество VRAM. TAESD предоставляет свои собственные VAE-энкодеры/декодеры, совместимые с SD 1.X и SDXL. Не требует дополнительных настроек.
Приоритет выбора обычного VAE и TAESD
При использовании TAESD выбор любого VAE из Quicksettings list будет игнорироваться.
Обычный VAE (SD VAE) | TAESD | |
---|---|---|
Параметров в энкодере | 34,163,592 | 1,222,532 |
Параметров в декодере | 49,490,179 | 1,222,531 |
Хорош для мелких деталей | ✅ | ❌ |
Работает моментально | ❌ | ✅ |
TAESD интегрирован в webui и может быть включён в настройках за пару кликов.
Автор TAESD не рекомендует использовать данное решение в том случае, если вам необходимо точное воспроизведение мелких деталей, поскольку TAESD может их искажать.
Пример от автора TAESD:
Пример для аниме:
SD VAE | TAESD |
---|---|