Сегодня 22 декабря 2024
18+
MWC 2018 2018 Computex IFA 2018
реклама
Offсянка

Практикум по ИИ-рисованию, часть одиннадцатая: быстрое прототипирование с FLUX.1 [schnell]

⇣ Содержание

Доступные для локального запуска разновидности FLUX.1, [dev] и [schnell] (о которых мы начинали разговор в прошлом выпуске «Мастерской»), сами же разработчики называют «дистиллированными» (distilled) по сравнению с полноценной FLUX.1 [pro] — поскольку и количество рабочих параметров, и требования к аппаратной основе для них по сравнению с той значительно урезаны. При этом, как утверждается, модель первого порядка дистилляции — [dev] — специально натренировывали так, чтобы она как можно точнее воспроизводила результаты работы исходной, более сложной [pro] (доступной, напомним, пользователям только онлайн через API) по части как качества итоговых изображений, так и дотошности следования текстовым подсказкам.

In high spirits

За такое облегчение модели (эта процедура называется «дистилляцией указаний», guidance distillation) не в ущерб её функциональности пришлось заплатить, конечно же, определённую цену. В частности, параметр CFG, как мы уже обсуждали ранее, для FLUX.1 [dev] и [schnell] исходно рекомендовано оставлять равным строго единице — что вовсе лишает смысла использование негативных подсказок (которые сами по себе — инструмент не самый однозначный и в любом случае начинают применяться к формируемому в латентном пространстве изображению лишь при значениях бесклассификаторного указателя, classifier-free guidance, превосходящих 1). В определённой мере функции CFG по управлению генерацией принимает на себя для FLUX.1 новая величина, называемая просто «рекомендацией» (guidance) и по умолчанию выставляемая в значение 3,5. Чем ниже guidance, тем хуже изображение следует подсказке, зато отдельные детали — особенно человеческая кожа — удаются модели в целом реалистичнее, тогда как завышенные «рекомендации» приводят к чуть ли не буквалистскому исполнению подсказки (в пределах возможностей модели, конечно, — об этом чуть позже), но вот лица, скажем, выходят совсем уж пластиковыми и малоестественными.

 Простой пример того, насколько дистилляция сужает вариативность модели при сохранении качества (и адекватности подсказке) каждого изображения в отдельности. Все приведённые картинки сгенерированы по одной и той же фразе «warrior princess and her exotic battle pet, ruined castle as background» с разными случайными затравками: в верхнем ряду — с использованием усиленной несколькими (одними и теми же во всех случаях) LoRA модели SDXL 1.0; в среднем — FLUX.1 [dev], в нижнем — FLUX.1 [schnell]. Разница в уровне разнообразия налицо, как и зримое отличие [dev] от [schnell] в плане общей эстетики.

Простой пример того, насколько дистилляция сужает вариативность модели при сохранении качества (и адекватности подсказке) каждого изображения в отдельности. Все приведённые картинки сгенерированы по одной и той же фразе «warrior princess and her exotic battle pet, ruined castle as background» с разными случайными затравками: в верхнем ряду — с использованием усиленной несколькими (одними и теми же во всех случаях) LoRA модели SDXL 1.0; в среднем — FLUX.1 [dev], в нижнем — FLUX.1 [schnell]. Разница в уровне разнообразия налицо, как и зримое отличие [dev] от [schnell] в плане общей эстетики

Со всеми этими неприятностями можно бороться, и уже борются: за прошедшие с момента релиза FLUX.1 считаные месяцы энтузиасты успели и научиться запускать новинку с CFG > 1 (соответственно, добиваясь её реагирования и на негативную, а не только на позитивную подсказку), и в первом приближении «дедистиллировать» (dedistillate) версию [dev], используя в обратную сторону известный алгоритм дистилляции с опорой на довольно обширный (150 тыс.) массив тренировочных аннотированных изображений. Увы, решения эти трудно считать идеальными: без доступа к исходным весам [pro] это не более чем паллиативы, в разных сценариях использования не всегда демонстрирующие заведомо превосходные результаты — в сравнении даже с моделью [schnell], которая представляет собой вторую производную процесса оптимизации, ускоренную дистиллированную версию FLUX.1. Вдобавок возвращение к неединичному бесклассификаторному указателю разом вдвое увеличивает время исполнения таких моделей на локальном «железе» — что с точки зрения обладателей не самых мощных графических адаптеров никак не может считаться достоинством.

И всё же преимущества FLUX.1 даже для этой, бюджетной, части аудитории энтузиастов ИИ-рисования слишком очевидны, чтобы продолжать игнорировать модную новинку, сохраняя приверженность куда более скоростным SDXL и SD 1.5. В части верности следования подсказкам FLUX.1 трудно найти равных среди прочих генеративных моделей text-to-image с открытыми весами, доступных для локального исполнения, — и потому очень хочется научиться пользоваться ею так, чтобы не было мучительно больно за долгие минуты (переходящие в часы), проведённые в ожидании завершения генерации очередной картинки. Пожалуй, в каком-то смысле дистилляцию [dev] и [schnell] можно даже считать достоинством: да, вариативность получаемых изображений вместе с богатым потенциалом негативной подсказки принесена этой самой дистилляции в жертву, — но зато есть шанс, подбирая нужные слова в оставшейся позитивной части, извлечь из латентного пространства максимально приближенный к задуманному образ. Причём заведомо очень достойного качества и с почти гарантированно верным числом пальцев на руках антропоморфных персонажей — что для далёких от настоящего художественного творчества энтузиастов ИИ-рисования, не слишком умелых по части ручной доводки полусырой картинки до кондиции в GIMP или ином редакторе, чрезвычайно значимое достоинство.

 Если предварительно натренированная модель T5 уже способна адекватно заполнять смысловые лакуны в предложениях на естественном языке, ориентируясь на выявленный общий смысл фразы, то после дообучения на расширенном наборе данных она справляется и с подразумевающими точный ответ вопросами (источник: Google Research)

Если предварительно натренированная модель T5 уже способна адекватно заполнять смысловые лакуны в предложениях на естественном языке, ориентируясь на выявленный общий смысл фразы, то после дообучения на расширенном наборе данных она справляется и с подразумевающими точный ответ вопросами (источник: Google Research)

С точки зрения корректности перевода слов в картинки едва ли не главное достоинство FLUX.1 в сравнении с другими изучавшимися нами прежде моделями — наличие комплексной системы для преобразования текста в токены (которые затем используются для извлечения образов из латентного пространства): связки CLIP и T5. Модель унифицированного преобразователя текста в текст (unified text-to-text transfer transformer; пять букв «t» подряд и дают акроним T5), предложенная исследователями из Google ещё в 2020 г., вовсе не дублирует стандартный для продуктов Stability AI, BFL и многих других разработчиков кодировщик CLIP (contrastive language-image pre-training; «сопоставление тексту образа на основе предварительного обучения»). Напротив: она именно что преобразует текст в текст, словно бы разжёвывая для модели CLIP — которая, судя по размеру файла с весами для неё (всего-то 246 Мбайт, как мы помним по проведённому в прошлый раз опыту установки FLUX.1 [dev]; файл же t5xxl в 16-разрядной кодировке, напомним для сравнения, занимает аж 9,79 Гбайт), невысокого полёта птица, — что и как именно требуется изобразить засевшему по другую сторону компьютерного монитора кожаному мешку.

Проделывает T5 это, конечно, несколько своеобычным, но вполне алгоритмизируемым образом, и если понять, как именно, то получать адекватные пользовательскому запросу по композиции картинки с применением новой модели окажется куда как проще, чем с SDXL или SD 1.5. SD3M, как мы в своё время обращали внимание, тоже полагается для интерпретации подсказок на T5 в сочетании с аж двумя версиями CLIP, — упомянем о том справедливости ради. Но это бесславное порождение Stability AI оказалось настолько безжалостно выхолощенным перед выпуском «в дикую природу», что сегодня редкий, даже самый искренний, энтузиаст ИИ-рисования вспоминает о нём хотя бы в страшных снах. Новоявленная Stable Diffusion 3.5 — дело, возможно, другое, но её возможности сообщество пока только начало изучать. Словом, возвращаясь к основной теме настоящей «Мастерской»: чтобы в полной мере раскрыть для себя потенциал FLUX.1, необходимо научиться корректно составлять для неё текстовые подсказки, — облегчая T5 задачу растолковывания их исполнительной, но недалёкой модели CLIP. А для этого очень здорово было бы научиться быстрому прототипированию text-to-image — с тем, чтобы можно было, оценив результат очередной итерации, скорректировать текст в поле ввода; после чего, вновь отправляя задачу на исполнение, ожидать появления новой картинки не часами и не десятками минут, а хотя бы в пределах первых сотен секунд. К счастью, инструментарий для такого рода деятельности энтузиастами уже развит, и мы приступаем к его изучению.

#Тонкости квантования

И начнём с того, что отдадим должное модели FLUX.1 [schnell], исполнение которой подразумевает всего четыре шага итерации (steps) — в конце концов, это вполне официально предоставленная нам разработчиками из BFL ускоренная версия их творения. Да, в её адрес у энтузиастов ИИ-рисования имеется немало нареканий — включая претензии к качеству итоговой картинки, к гибкости (в части порой уж слишком буквалистского следования подсказке), к уровню проработанности мелких деталей и т. п. Хуже всего то, что, даже если наткнуться методом слепого свободного поиска на удачную затравку (seed) для данной конкретной подсказки с моделью [schnell], не выйдет переключиться на [dev] с той же самой затравкой и получить в целом ту же картинку, только лучше качеством, — она окажется даже по композиции во многом иной, поскольку дополнительное к дистилляции «ускорение» [schnell] ощутимо повлияло на применяемый здесь способ сопоставления с токенами извлекаемых из латентного пространства образов. И всё же у [schnell] имеется немалый потенциал: скажем, никто не мешает, создав удачное по композиции изображение с применением этой модели, увеличить его затем с повышением качества (процедура upscale) уже с использованием другой — той же FLUX.1 [dev] или SDXL/SD 1.5 с какими угодно расширениями LoRA, причём как в версии простого upscale с генеративной дорисовкой, так и с более подконтрольными оператору инструментами ControlNet/IP Adapter, inpainting/outpainting — и иными, наработанными сообществом за минувшие уже годы развития локального ИИ-рисования. В общем, нет смысла пренебрегать штатным средством быстрого прототипирования из арсенала BFL, — и мы им воспользуемся.

 Чтобы загружать UNet в формате GGUF, нужно использовать штатную для новых версий ComfyUI ноду «Unet Loader (GGUF)»: дважды щёлкнув мышью на пустом участке рабочего поля, в открывшемся окне поиска начнём вводить «gguf» — и почти сразу же её увидим.

Чтобы загружать UNet в формате GGUF, нужно использовать ноду «Unet Loader (GGUF)»: дважды щёлкнув мышью на пустом участке рабочего поля, в открывшемся окне поиска начнём вводить «gguf» — и почти сразу же её увидим

В прошлом выпуске «Мастерской» приведены все инструкции по установке рабочей среды ComfyUI в standalone-версии — не будем повторяться. Отметим только, что на момент написания настоящего материала актуальная версия этой среды — 0.2.4 и что ссылки на все необходимые для запуска [schnell] файлы, а именно на модели UNet, CLIP/T5 и VAE, вместе с опорными циклограммами присутствуют в соответствующем разделе странички с примерами, созданной лично ComfyAnonimous, автором этой рабочей среды.

Впрочем, если файл flux1-schnell.safetensor с весами основной UNet-модели на 23,8 Гбайт пока не выкачан, торопиться не стоит: ускорение работы с FLUX.1 есть смысл начать прямо отсюда. Стандартное представление весов генеративных моделей массивом 16-разрядных вещественных чисел (формат FP16) слишком уж ресурсоёмко; не случайно всё большую популярность приобретают сжатые варианты таких файлов — с понижением разрядности до 8 (FP8) и даже до 4 (NF4). Вполне объяснимое снижение качества по сравнению с исходной 16-разрядной моделью при использовании таких UNet далеко не всегда выходит катастрофическим, а размеры их значительно уменьшаются — что позволяет им целиком умещаться даже в не самой обширной видеопамяти. Так, для 16 Гбайт видеоОЗУ, оптимальными сегодня, а для установленной на нашей тестовой системе GeForce GTX 1070 с 8 Гбайт памяти формально сгодится версия flux1-schnell-Q4_K_S.gguf, что занимает менее 7 Гбайт. Обратим внимание на расширение: оно указывает, что используется специально разработанная для убористого хранения матрицы весов генеративных моделей кодировка GGUF (не просто сжатие, но квантование, quantization, этих специфических данных) — и для этого потребуется инсталлировать в рабочую среду специально разработанное дополнение, ComfyUI-GGUF, из его репозитория на Git Hub (https://github.com/city96/ComfyUI-GGUF).

 Опорная циклограмма с «галактикой в бутылке» вместе с результатом её исполнения в рабочей среде ComfyUI: здесь уже использована нода «Unet Loader (GGUF)» для загрузки модели flux1-schnell-Q4_K_S.gguf, а все прочие параметры генерации оставлены прежними, — только вот ноды для наглядности расположены не скученно.

Опорная циклограмма с «галактикой в бутылке» вместе с результатом её исполнения в рабочей среде ComfyUI: здесь уже использована нода «Unet Loader (GGUF)» для загрузки модели flux1-schnell-Q4_K_S.gguf, а все прочие параметры генерации оставлены прежними — только вот ноды для наглядности расположены не скученно

На упомянутой чуть выше страничке с примерами генераций с FLUX.1 в среде ComfyUI приведены картинки в формате PNG, которые содержат соответствующие циклограммы, — чтобы те увидеть, достаточно перетащить после загрузки картинку мышкой из «Проводника» на рабочее поле среды. После смены исходной ноды для загрузки UNet-модели в стандартной кодировке FP на «Unet Loader (GGUF)» и оставления всех прочих параметров без изменения, с подсказкой «a bottle with a rainbow galaxy inside it on top of a wooden table in the middle of a modern kitchen» получаем примерно то же самое, что и для FP16 и для Q8-вариантов.

 езультаты исполнения одной и той же циклограммы (разве что использованы разные ноды для загрузки UNet в форматах FP и GGUF) с одними и теми же параметрами генерации, включая подсказку и затравку, но для модели FLUX.1 [schnell] в разных представлениях: слева — FP16, в центре — Q8_0, справа — Q4_K_S

Результаты исполнения одной и той же циклограммы (разве что использованы разные ноды для загрузки UNet в форматах FP и GGUF) с одними и теми же параметрами генерации, включая подсказку и затравку, но для модели FLUX.1 [schnell] в разных представлениях: слева — FP16, в центре — Q8_0, справа — Q4_K_S

Разница в размерах и длительностях исполнения при этом более чем впечатляет. Исходная FP-16-модель [schnell] занимает почти 24 Гбайт и генерирует изображение со скоростью примерно 69 секунд на одну итерацию (всего тех, напомним, для этой дистиллированной и ускоренной версии FLUX.1 рекомендовано производить четыре), GGUF Q8_0 — 12 Гбайт и 31 с/ит., Q4_K_S — 7 Гбайт и 29 с/ит. Надо понимать, что во всех трёх примерах замерялась скорость выдачи лишь первой картинки: поскольку предварительная загрузка в память и исполнение моделей CLIP и T5 тоже занимают определённое время, в режиме свободного поиска — когда текстовая подсказка низменна и лишь случайным образом меняется затравка — второе и последующие изображения в серии будут извлекаться из латентного пространства ещё быстрее.

Занятный вывод напрашивается после сопоставления трёх полученных нами с тестовой циклограммой изображений: визуальная разница между FP16 и Q8_0 минимальна, тогда как исполняется первый вариант кодировки [schnell] в два с лишним раза дольше; картинки же, полученные при помощи Q8_0 и Q4_K_S, различаются куда разительнее — зато продолжительность генерации для них примерно одна и та же. И это не случайная флуктуация: довольно скоро после появления на Hugging Face GGUF-моделей в сообществе энтузиастов практически сложился консенсус по части предпочтения Q8_0 всем прочим вариантам, включая FP- и NF-кодировки, — проигрыш по длительности исполнения у таких моделей по сравнению с более сжатыми минимальный (тем более для [schnell] с его четырьмя итерациями), равно как и визуальное отличие от исходной версии FP16. По этой причине в дальнейшем будем пользоваться в рамках настоящей «Мастерской» именно моделью flux1-schnell-Q8_0.gguf из репозитория FLUX.1-schnell-gguf. Пара минут на одну картинку — вполне приемлемо с учётом того, насколько верна модель FLUX.1 корректно составленной подсказке. Другой вопрос — а как, собственно, этой корректности добиться?

#Вот ваш меч

Вернёмся к двум разновидностям кодировщиков текста, о которых упоминали уже вскользь ранее, — CLIP и T5. С первым всё более или менее понятно: это нейросетевая модель, натренированная сопоставлять с определённым текстом (точнее, условными числовыми токенами, в которые тот превращается ради удобства обработки цифровой вычислительной системой) определённые же изображения. Опять-таки, корректнее будет говорить не об изображениях в доступном восприятию человеком виде, а о векторах в некотором существенно многомерном пространстве — том самом латентном, — которые можно воспринимать как абстрагированные от реальных сущностей, представленные в виде числовых последовательностей едва ли не платоновские идеи эмпирических объектов, их характеристик (величина, цвет, фактура поверхности…), поз, художественных стилей и проч. Уже на следующем этапе эти векторы трансформирует в изображения (в данном случае изображения, поскольку мы говорим об ИИ-моделях для рисования, — но можно и в текст, и в программный код, и в видеоролики, и в музыку, в зависимости от поставленной задачи) генеративная же субмодель VAE, вариационный автокодировщик.

 Поскольку официальная документация FLUX.1 довольно скудна, энтузиасты сами стали разбираться в открытом коде новой модели — и составили в итоге такую вот примерную блок-схему её функционирования: текстовая подсказка поступает снизу, её совместно обрабатывают CLIP и T5 (источник: Reddit)

Поскольку официальная документация FLUX.1 довольно скудна, энтузиасты сами стали разбираться в открытом коде новой модели — и составили в итоге такую вот примерную блок-схему её функционирования: текстовая подсказка поступает снизу, её совместно обрабатывают CLIP и T5 (источник: Reddit)

CLIP при всех его достоинствах не идеален: его «внимание» довольно быстро рассеивается по мере удлинения заданной текстовой подсказки (чем ближе к её финалу некое слово, тем меньше вероятность увидеть связанный с ним объект или характеристику на картинке); он плохо воспринимает фразы на естественном языке (перечень разделённых запятыми существительных для него «понятнее» связного предложения). Один из вариантов помочь генеративной модели глубже вникнуть в запрос оператора — это привлечь дополнительный перекодировщик, ещё одну генеративную модель, специально натренированную на преобразование сформулированных человеком фраз в заведомо лучше воспринимаемый моделью CLIP набор ключевых слов. Этот перекодировщик и есть уже упомянутая нами не раз модель T5, которая в тесном взаимодействии с CLIP выстраивает в латентном пространстве (в соответствии с опытом, полученным в ходе предварительного обучения) наиболее точно соответствующий пользовательскому запросу вектор. Грубо говоря, CLIP — неплохой, хотя и не блестящий художник, способный в ответ на услышанное знакомое слово изобразить соответствующую ему сущность, тогда как T5 — ничего не смыслящий в рисовании менеджер, в определённой степени владеющий человеческой речью и хорошо осведомлённый о словарном запасе коллеги; добросовестно переводящий на доступный CLIP язык те задания, что поступают от живого оператора.

Результат их совместной работы в случае FLUX.1 часто (гораздо чаще, чем для SD1.5 и SDXL) выходит отменно удовлетворительным — об этом мы в прошлом выпуске «Мастерской» уже говорили. Да, есть и трудности, связанные как с особенностями тренировки всех вовлечённых в процесс рисования субмоделей, так и с дистилляцией доступных для локального исполнения [dev]- и [schnell]-версий. К примеру, упоминание в подсказке меча (sword) буквально заставляет модель генерировать сценки из средневековой/фэнтезийной жизни. И поскольку в исторические Средние века мужчины практически поголовно разгуливали с бородами, и изображения их как раз в таком виде и попадают в обучающие базы генеративных моделей, банальная подсказка «a man with a sword» с вероятностью под 100% (мы проверили этот тезис на выборке из 350 генераций со случайными затравками — на большее усидчивости не хватило) будет порождать изображения вооружённых разнообразными клинками бородачей. Причём связка «меч — борода» на уровне модели оказалась настолько сильной — напомним, в том числе вследствие дистилляции доступных для локального исполнения версий FLUX.1, — что даже прямое указание на безбородость (в различных вариантах — «no beard», «beardless», «shaved», «clean chin» и т. д.) если и срабатывает, то в минимальной степени: место бороды у сгенерированного персонажа порой занимает трёхдневная щетина, но и только. Вот где пригодилась бы негативная подсказка, но её поневоле искусственное, стараниями энтузиастов, добавление к штатному циклу работы FLUX.1 порождает, увы, дополнительные артефакты и удлиняет время исполнения.

 Мечи на месте — но и бóроды, увы, тоже, хотя подсказка в данном случае сформулирована как «a beardless man with a sword»; более того, попытка одновременно выловить из латентного пространства меч и безбородость порождает явные артефакты, — обратите внимание и на само оружие, и на кисти держащих его рук (источник: ИИ-генерация на основе модели FLUX.1 [schnell])

Мечи на месте — но и бóроды, увы, тоже, хотя подсказка в данном случае сформулирована как «a beardless man with a sword»; более того, попытка одновременно выловить из латентного пространства меч и безбородость порождает явные артефакты — обратите внимание и на само оружие, и на кисти держащих его рук (источник: ИИ-генерация на основе модели FLUX.1 [schnell])

Важный момент: хотя в опорной циклограмме, которой мы до сих пор пользовались, предусмотрено одно окошко текстового ввода, для позитивной подсказки, модель готова принимать текстовые указания для моделей CLIP и T5 по отдельности, — и уже одно это даёт возможность существенно улучшать качество картинки (особенно со сложной композицией) в отсутствие дополнительных внешних инструментов вроде ControlNet, региональных подсказок и прочего. SD3M такую опцию тоже предоставляла — там, напомним, аж целых три преобразователя текста: две разновидности CLIP и одна T5, — но та модель на данный момент бесславно канула в небытие, а на SD 3.5 энтузиасты пока только-только принялись накладывать свои опытные руки. FLUX.1 же, даже в версии [schnell], — дело другое, и в этом мы сейчас удостоверимся предметно.

 На место исходной ноды «CLIP Text Encode (Prompt)» — по центру сверху, уже с отсоединёнными входом и выходом — для ввода текстовой подсказки внедрим в опорную циклограмму «CLIPTextEncodeFlux». Чуть правее последней — упомянутая ниже нода «BasicScheduler» с числом шагов «4», уже переключённая на использование планировщика «beta».

На место исходной ноды «CLIP Text Encode (Prompt)» — по центру сверху, уже с отсоединёнными входом и выходом, — для ввода текстовой подсказки внедрим в опорную циклограмму «CLIPTextEncodeFlux». Чуть правее последней — упомянутая ниже нода «BasicScheduler» с числом шагов «4», уже переключённая на использование планировщика «beta»

Для начала поменяем в ноде «BasicScheduler» значение «simple» на «beta»: сочетание алгоритма выборки (sampler) «euler» и планировщика (scheduler) «beta» признано сообществом оптимальным для семейства моделей FLUX.1 по соотношению скорости исполнения и общего качества получаемых изображений. Далее где-нибудь на пустом месте рабочего поля кликнем левой кнопкой мыши дважды и в открывшейся строке поиска начнём набирать «cliptext…». По мере набора в выпадающем меню под этой строкой появится среди прочих вариант «CLIPTextEncodeFlux»; нажмём на него — теперь на рабочем поле возникла невиданная прежде нода с двумя текстовыми полями (верхнее — для модели CLIP, нижнее — для T5) и строкой, в которой задаётся параметр руководства, guidance, со значением по умолчанию «3,5». Обратим внимание, кстати, что в исходной опорной циклограмме для [schnell] этот параметр вообще нигде не устанавливается, а если впоследствии попробовать его менять в только что внедрённой в циклограмму ноде, никакого воздействия на итоговую картинку он оказывать не будет — это ещё одно следствие двойного выхолащивания (дистилляция + ускорение) используемой версии FLUX.1. Для [dev]-варианта, напротив, величина руководства имеет значение, но о быстром прототипировании с [dev] мы поговорим в другой раз.

#Колба с секретом

Итак, поставив «CLIPTextEncodeFlux» на место «CLIP Text Encode (Prompt)» и подключив куда следует входную и выходную связи — «clip» и «CONDITIONING» соответственно, — для начала удостоверимся, что всё работает корректно. Разместим в оба доступных теперь поля текстового ввода прежнюю подсказку, «a bottle with a rainbow galaxy inside it on top of a wooden table in the middle of a modern kitchen», и, задействовав всё ту же затравку, исполним циклограмму — что должно засвидетельствовать полную идентичность полученного изображения прежнему. На всякий случай — напоминание: здесь и далее мы по-прежнему используем основную модель с квантованием GGUF Q8_0.

 Слева и в центре — результат генерации с алгоритмом выборки euler и планировщиком simple, но в первом случае с применением штатной ноды «CLIP Text Encode (Prompt)» с единственным полем для ввода общей подсказки, а во втором та же самая подсказка вводится через «CLIPTextEncodeFlux» с идентичными строками текста в обоих полях: картинки полностью идентичны. Справа — тот же способ ввода текста, но с парой euler + beta: эстетика в целом улучшилась (более реалистичные ручки на мебели, чайник на плите, корректнее показано выгнутое донышко бутылки и т. п.)

Слева и в центре — результат генерации с алгоритмом выборки euler и планировщиком simple, но в первом случае с применением штатной ноды «CLIP Text Encode (Prompt)» с единственным полем для ввода общей подсказки, а во втором та же самая подсказка вводится через «CLIPTextEncodeFlux» с идентичными строками текста в обоих полях: картинки полностью идентичны. Справа — тот же способ ввода текста, но с парой euler + beta: эстетика в целом улучшилась (более реалистичные ручки на мебели, чайник на плите, корректнее показано выгнутое донышко бутылки и т. п.)

И вот теперь возьмёмся за самое интересное: лексически обогатим подсказку для модели T5, превратив её в пространное описание желаемой сцены. Смысл этого действа следующий: поскольку доступные для локального исполнения версии FLUX.1 дистиллированы, один и тот же текст на входе, но с разными значениями затравок (seed) будет порождать примерно одни и те же композиции, причём довольно-таки скудные по изобразительным средствам. Иными словами, вариативность этой модели хуже, чем у SDXL и даже SD 1.5, — там можно было ожидать в ответ на самые простые подсказки просто-таки буйства интерпретаций, хотя в плане эстетики эти интерпретации далеко не всегда устраивали оператора. Для FLUX.1 ситуация обратная: эстетика картинки, что порождается лаконичной подсказкой, чаще всего вполне приемлема (если не пытаться совмещать нечто с точки зрения модели несовместимое, вроде мечей и безбородости), — зато вариативность чрезвычайно скудна.

Тут-то и приходит на помощь способность T5 перетолковывать пространные детализированные описания человеческим языком на доступный восприятию CLIP лапидарный лад. Оставив в верхнем окошке текстового ввода ноды «CLIPTextEncodeFlux» короткую строку, в нижнее, предназначенное как раз для T5, следует поместить расширенное, насыщенное деталями и обогащённое мелкими подробностями. Если уровень владения английским у оператора не на высоте, можно набросать такое описание на русском, а затем воспользоваться любым онлайн-переводчиком. Или же обратиться к специально созданным для того сервисам обогащения подсказок (prompt enhancement), которых в Сети уже имеется изрядно, в том числе и совершенно бесплатных — правда, часто с ограничениями на число запросов в определённый интервал времени, поскольку обычно они задействуют GPT или иные генеративные облачные модели для преобразования текста в текст. В принципе, запускать подобные текстовые обогатители можно и на локальном же ПК (более того, интегрировав соответствующую ноду прямо в циклограмму ComfyUI), но и вычислительных ресурсов, и времени — особенно на машине с GTX 1070 — подобная эскапада потребует изрядно; потому — не в этот раз.

В результате из нашей исходной подсказки получается такое вот, к примеру, словесное полотно:

In the center of a sleek, modern kitchen, a rustic wooden table serves as a striking contrast to the surrounding contemporary design. The table's grains are rich and varied, showcasing deep browns intertwined with lighter hues, evoking a sense of warmth. Perched atop this inviting surface is a glass bottle, elegantly shaped with a tapered neck and a wide base. Inside the bottle swirls a mesmerizing galaxy of vibrant colors, blending blues, purples, and pinks seamlessly, like the cosmos captured in miniature form. Tiny sparkles glisten within, reminiscent of distant stars, creating an enchanting spectacle.

The kitchen itself is alive with the fresh, crisp scent of a morning breeze filtering through large, sunlit windows, illuminating the metallic appliances that gleam like silver jewels. Sunlight refracts through the glass, casting a kaleidoscope of colors onto the table, as the bottle's swirling universe seems to dance and shift with each fleeting ray. This harmonious scene evokes feelings of wonder and curiosity, inviting anyone who enters to reflect on the beauty of the universe contained within a simple bottle.

 Слева — по-прежнему та картинка (крайняя справа на предыдущей иллюстрации), что получена путём подачи на входы CLIP и T5 одной и той же краткой подсказки; справа — то, что выходит, если T5 предложить существенно обогащённый деталями текст.

Слева — по-прежнему та картинка (крайняя справа на предыдущей иллюстрации), что получена путём подачи на входы CLIP и T5 одной и той же краткой подсказки; справа — то, что выходит, если T5 предложить существенно обогащённый деталями текст

Модели с одними лишь CLIP-кодировщиками попросту не в состоянии будут извлечь из этого текста всю содержащуюся в нём информацию, а вот T5 в случае FLUX.1 с готовностью придёт на помощь. Поместив полученные два абзаца во второе окошко текстового ввода ноды «CLIPTextEncodeFlux», запустим циклограмму на исполнение — и увидим разительно иной в сравнении с прежним результат. Отличия буквально бросаются в глаза: тут и бесспорно спиральная галактика (а не невнятно-бесформенная туманность) внутри бутылки, и обогащённый деталями задний план, и ставшая крайне живописной текстура дерева, — словом, овчинка явно стоит выделки. Причём, что важно с точки зрения быстрого прототипирования, скорость исполнения модели с разными вариантами подсказок для CLIP и T5 остаётся практически прежней.

Выходит, корректируя текстовый ввод для преобразователя T5, оператор получает возможность существенным образом воздействовать на итоговую картинку — в части как композиции в целом, так и деталей и художественного стиля. Общая идея понятна: подсказка для CLIP должна быть простой, лаконичной, опирающейся на заведомо хорошо представленные в обучающем массиве понятия, тогда как всю поэтику создаваемого системой визуального образа следует концентрировать в описании для Т5.

 Слева — пробки нет; справа — она уже на месте, а композиция практически неизменна.

Слева — пробки нет; справа — она уже на месте, а композиция практически неизменна

В какой мере эта поэтика будет влиять на итоговое изображение, поможет оценить следующий пример. После подачи на вход преобразователя T5 обогащённой подсказки куда-то подевалась пробка, затыкавшая прежде горлышко нашей бутылки. Вернём её на место — но не дорисовыванием, а всего лишь добавлением упоминания о ней в предназначенный именно для Т5 пространный текст. Для этого попросту поменяем первое включение «glass bottle» на «corked glass bottle», т. е. добавим в эти два абзаца одно-единственное слово. И результат — будьте-нате!

 Слева — первый вариант картинки с ретортой; справа — второй, более приемлемый, и всё это с прежней затравкой.

Слева — первый вариант картинки с ретортой; справа — второй, более приемлемый, и всё это с прежней затравкой

Заменить бутылку химической ретортой? Тоже никаких проблем: вместо

glass bottle, elegantly shaped with a tapered neck and a wide base

внедрим в текст второй подсказки следующий фрагмент:

glass retort with smooth, curvaceous neck leading to a delicate spout, intricately designed for precise pouring

чуть ниже — ещё одна замена: «Inside the bottle» — на «Inside the retort»,

далее, «the bottle's swirling universe» → «the retort's swirling universe»,

и, наконец, «within a simple bottle» → «within a simple retort»

Здесь результат не такой впечатляющий — вытяжка над плитой слева приняла какую-то неестественную форму, да и стол как-то неприлично вытянулся вплоть до самого окна. Попробуем обратиться за помощью к одной из онлайновых генеративных моделей для обогащения подсказок — посмотрим, во что она превратит банальную фразу «glass retort on a table». А вот во что:

In a dimly lit laboratory filled with the faint scent of chemicals and the sharp tang of glass, a meticulously crafted glass retort stands on a sturdy wooden table, its surface gleaming under the flickering light of an oil lamp. The retort features a smooth, curvaceous neck leading to a delicate spout, intricately designed for precise pouring. A mix of vibrant blue and deep green liquids bubble gently inside, creating small, rhythmic ripples that reflect the light like tiny jewels. Around the retort, scattered notes with hurried scribbles hint at recent experiments, while dusty shelves overflow with colorful glassware, each piece unique in shape and size. The atmosphere is thick with anticipation, as if the retort holds secrets waiting to be revealed, and a faint whisper of the past lingers in the air.

Отталкиваясь от этого детального описания (кстати, по нему самому можно сгенерировать довольно занятную картинку), добавим к первому упоминанию реторты в нашем прежнем блоке текста для T5 — «glass retort with smooth, curvaceous neck leading to a delicate spout» — всего два слова в самое начало: «meticulously crafted». И снова запустим циклограмму на исполнение: результат — на предыдущей иллюстрации справа.

И вот это уже совсем другое дело. Пусть реторта тут больше похожа на вазу, но в целом поставленная изначально цель достигнута: при сохранении фона практически неизменным мы довольно ощутимо скорректировали центральный элемент композиции. Такая манипуляция подсказками на уровне отдельных слов — причём манипуляция тонкая, поскольку производится она на уровне более деликатной по сравнению с CLIP модели T5, — открывает массу возможностей для доработки удачных генераций, в которых кое-что частично пошло не так. Стабильность CLIP практически гарантирует общую стабильность картинки при зафиксированном значении затравки, а меняющийся Т5 постепенно приведёт оператора к желаемому результату — и, поскольку [schnelle] просто-таки создана для быстрого прототипирования, путь этот займёт не слишком много времени.

 Теперь сгенерированная моделью [schnelle] реторта слева, а справа — результат работы FLUX.1 [dev] в квантованной версии Q8_0 с числом шагов 20 и всеми прочими неизменными параметрами, включая алгоритм выборки, планировщик, затравку и обе подсказки. Вот это уже определённо — галактика в реторте!

Теперь сгенерированная моделью [schnelle] реторта слева, а справа — результат работы FLUX.1 [dev] в квантованной версии Q8_0 с числом шагов 20 и всеми прочими неизменными параметрами, включая алгоритм выборки, планировщик, затравку и обе подсказки. Вот это уже определённо галактика в реторте!

Хорошо; но выдаваемые [dev]-версией FLUX.1 картинки, как мы уже имели возможность убедиться, в плане общей эстетичности всё-таки на голову превосходят порождения скоростной [schnelle]. Неужели нет возможности освоить быстрое прототипирование для модели, исходно рассчитанной на 20 шагов итерации вместо 4 — и потому менее дистиллированной, а значит, с эстетической точки зрения способной выдавать ещё более привлекательный результат? Возможности такие, по счастью, есть, и в следующий раз мы с ними познакомимся. А пока интересующиеся могут загрузить PNG-картинки со встроенными циклограммами для генерации рассмотренных нами бутылок и реторт по этой вот ссылке.

Материалы по теме

 
 
⇣ Содержание
Если Вы заметили ошибку — выделите ее мышью и нажмите CTRL+ENTER.
Вечерний 3DNews
Каждый будний вечер мы рассылаем сводку новостей без белиберды и рекламы. Две минуты на чтение — и вы в курсе главных событий.

window-new
Soft
Hard
Тренды 🔥
Министр торговли США признала, что санкции против Китая неэффективны 3 ч.
Apple запустила разработку умного дверного звонка с Face ID 3 ч.
AirPods научатся измерять пульс, температуру и «множество физиологических показателей» 4 ч.
Саудовская Аравия привлечёт роботов для строительства футуристического мегаполиса в пустыне 5 ч.
Облако Vultr привлекло на развитие $333 млн при оценке $3,5 млрд 9 ч.
Разработчик керамических накопителей Cerabyte получил поддержку от Европейского совета по инновациям 9 ч.
Вышел первый настольный компьютер Copilot+PC — Asus NUC 14 Pro AI на чипе Intel Core Ultra 9 11 ч.
Foxconn немного охладела к покупке Nissan, но вернётся к этой теме, если слияние с Honda не состоится 16 ч.
В следующем году выйдет умная колонка Apple HomePod с 7-дюймовым дисплеем и поддержкой ИИ 16 ч.
Продажи AirPods превысили выручку Nintendo, они могут стать третьим по прибыльности продуктом Apple 17 ч.