Как блоки собираются вместе

Урок собирает три компонента в единый конвейер latent diffusion.

Latent diffusion — схема Stable Diffusion: текст кодируется CLIP, диффузия идёт в латенте под управлением U-Net, а VAE превращает финальный латент в картинку.

Полный маршрут

Соединим всё, что разобрали. Пользователь вводит промпт — дальше работает конвейер:

1. промпт ──CLIP──> эмбеддинги текста
2. случайный шум в латенте  (старт, задаётся seed)
3. повторять N шагов:
     U-Net(латент, шаг, эмбеддинги) -> оценка шума
     сэмплер: убрать часть шума из латента
4. финальный латент ──VAE-декодер──> картинка в пикселях

Кто за что отвечает

КомпонентРольКогда работает
CLIPпонять текстодин раз, в начале
U-Netпредсказать шумкаждый шаг (N раз)
сэмплеркак убирать шумкаждый шаг
VAE-декодерлатент → пикселиодин раз, в конце

Почему «latent»

Вся тяжёлая часть — N вызовов U-Net — происходит в маленьком латентном пространстве, а не в пикселях. Именно это сделало Stable Diffusion достаточно лёгким для домашних видеокарт и дало название всему подходу: latent diffusion. Если бы диффузия шла по пикселям, та же генерация была бы в разы дороже.

Как работает под капотом

Заметьте разделение труда: CLIP вызывается один раз (текст не меняется по ходу), VAE-декодер тоже один раз (в самом конце), а U-Net и сэмплер крутятся в цикле. Поэтому время генерации почти линейно зависит от числа шагов и размера картинки (он же — размер латента). Все три компонента обучались отдельно и затем были собраны вместе: это модульность, которая позволяет, например, заменить VAE-декодер или дообучить U-Net (LoRA), не трогая остальное.

Частые ошибки

  • Думать, что CLIP вызывается на каждом шаге. Текст кодируется один раз; в цикле работают U-Net и сэмплер.
  • Считать, что больше шагов меняет работу VAE. VAE-декодер всегда отрабатывает один раз в конце, независимо от числа шагов.
  • Забыть, что размер картинки = размер латента. Большая картинка — больший латент — дороже каждый из N шагов.

Модульность как суперсила

Главная архитектурная красота Stable Diffusion — что три его части обучались отдельно и стыкуются как кубики. Это открыло целую экосистему: можно дообучить только U-Net под новый стиль (LoRA), подменить только VAE-декодер ради чистых цветов или добавить управляющую ветку (ControlNet), не трогая остальное. Если бы модель была одним монолитом, ничего из этого не работало бы — пришлось бы переобучать всё целиком.

Эта же модульность объясняет, почему вокруг Stable Diffusion вырос огромный open-source-мир, а вокруг закрытых монолитных генераторов — нет. Когда блоки разделимы и понятны, сообщество может улучшать их по частям и обмениваться маленькими файлами надстроек. Понимание пайплайна, которое вы получили, — это буквально карта, по которой работают все эти расширения.

Итог

  • Пайплайн: CLIP кодирует текст → U-Net и сэмплер расшумляют латент N шагов → VAE-декодер выдаёт картинку.
  • CLIP и VAE-декодер работают по разу, U-Net — на каждом шаге, поэтому steps и размер сильнее всего влияют на время.
  • Модульность компонентов позволяет менять или дообучать их по отдельности.
Проверьте себя
1. Сколько раз за генерацию обычно вызывается текстовый энкодер CLIP?
AНа каждом шаге диффузии
BОдин раз, в начале
CДва раза за шаг
DНи разу
2. Почему подход называется latent diffusion?
AПотому что используется латиница
BПотому что диффузия идёт в компактном латентном пространстве, а не по пикселям
CПотому что картинки всегда тёмные
DПотому что не нужен VAE