Предисловие
Однажды мною были замечены нейронные сети для генерации изображений, однако облачные сервисы оказались слишком ограниченными, а существующие сборки Stable Diffusion были вообще не портативными, от слова совсем, из-за множества отвратительных зависимостей их практически невозможно развернуть без доступа к интернету, и даже просто перенести в другую папку, что меня очень раздражало.
Потому я создал свои сборки Stable Diffusion на основе AUTOMATIC1111/stable-diffusion-webui, но они доступны только для Windows, ведь до сих пор я не знаю ни одного действительно адекватного и пригодного для нормального использования дистрибутива Linux, а потому нет смысла создавать софт для мёртвой экосистемы, хотя казалось бы, 2024 год, пора бы уже догнать хотя бы древнюю Windows XP/7, но увы, "линуксоиды" продолжают постоянно всё ломать и топить в болоте зависимостей, причём некоторые в последнее время агрессивно принуждают к обновлениям...
Разработчиков софта это тоже касается, так что не одни только разработчики дистрибутивов Linux творят мракобесие:
Но сейчас у меня есть свой дистрибутив Linux на основе MX Linux под названием Chimbalix, и это моя основная операционная система на данный момент, не то чтобы Windows 7 умерла, нет, она до сих пор отлично работает, просто над чем ещё можно бесконечно танцевать с бубном, как не над вечно кривыми и убогими линуксами?
В конце концов я попытался сделать пригодный для использования линукс, и у меня получается, как бы забавно это не звучало. Только проблема в том, что я один всё делаю, следовательно, процесс затягивается, особенно когда начинаю работу над чем-то вроде сборок SD WebUI Neuro...
Теперь я всё делаю исключительно для своего дистрибутива, а остальной недоразвитый зоопарк уже по остаточному принципу, ведь в моём дистрибутиве есть специальный каталог "portsoft", который позволяет содержать такие приложения как SD WebUI Neuro, без него не было бы даже смысла создавать сборку Stable Diffusion под Linux:
Ну а сборки Neuro можно найти в репозитории GitHub, правда софт для Linux не пользуется популярностью, в отличие от софта для Windows, что ожидаемо...
https://github.com/Shedou/Neuro
На этом закончим предисловие, и начнём эксперименты!
-
Проверка работоспособности
Начнём с элементарного, проверим сборку на работоспособность.
Из дистрибутивов будут использованы "Chimbalix 23.1 Alphachi" и находящийся в разработке "Chimbalix 24.1 Alphachi-pre5", оба установлены в виртуальной машине VirtualBox, мне просто накладно будет постоянно перезагружать ПК для проверок, тем более в виртуальной машине дистрибутивы сразу после установки можно сказать, системы ещё не обросли дополнительным болотом зависимостей из линуксоидных репозиториев:
https://github.com/Shedou/Chimbalix
Ну а переносить сборку буду обычной флешкой, причём далеко не самой быстрой, как можно заметить:
Начнём с дистрибутива Chimbalix 23.1 Alphachi, распаковываем сборку:
И запускаем "start-cpu.sh" через терминал, ведь в дистрибутиве версии 23.1 нет специального пункта меню для быстрого запуска скриптов, как в версии 24.1, потому приходится по-линуксоидски это делать, тем не менее оно работает сразу после распаковки:
Кстати, выделенных виртуальной машине 8 ГБ ОЗУ едва хватило для работы сборки, но ведь хватило же! И даже без подкачки:
Далее проверяю установочный скрипт, и тут случилось неприятное, мерзкие линуксоидные зависимости поругались между собой во время установки Service Pack 1 для Chimbalix 23.1 Alphachi, ну да ладно, фиг с ними, остальное то установилось без проблем:
И вообще, это же Open-Source, наверняка ведь кто-нибудь возьмёт и доработает скрипты, а исправленную версию предложит разработчику, то есть мне! Хотя учитывая что Chi-Calculator так никто за год и не взялся доработать, чтобы слишком большие результаты не ограничивались размером типа данных, да и прочие недостатки исправить, не похоже чтобы "попен-сорсные" философии работали в реальности, а ведь репозиторий до сих пор открыт:
Ну да ладно, вернёмся к сборке SD WebUI, запускаем ярлыком из меню "Пуск", и оно работает:
Осталось проверить "удалятор", он прекрасно работает, как и задумывалось:
Теперь нужно проверить в дистрибутиве Chimbalix 24.1 Alphachi-pre5, снова этап распаковки:
Проверяю распакованную сборку, работает как надо:
А вот с установкой у меня не заладилось, оказывается этой виртуальной машине я выделил слишком мало места на диске, пришлось удалить весь софт из portsoft каталога, и не только, правда под удаление случайно попал и веб-браузер, но его я восстановил, всё же без него никак...
Ну что, запускаем сборку из меню "Пуск", и радуемся ~70 МиБ свободного места на системном разделе:
В общем опять всё работает, ничего нового:
Ну и процесс удаления, тоже без проблем:
К слову о производительности, если в виртуальной машине мой R7 2700X с отключенным XFR вытягивал одну итерацию за 18-19 секунд с автоматически выбранными оптимизациями InvokeAI, то на реальном ПК уже выходит около 9 секунд на итерацию с оптимизациями Doggettx, что в 2 раза быстрее выходит:
Так что даже без видеокарты вполне возможно побаловаться с генерацией картинок процессором, если конечно в качестве ЦП выступает R7 2700X или что-то более производительное...
Генерируем с помощью GeForce GTX 1070
Пожалуй пора полноценно запустить сборку, использовать буду оптимизации Xformers, просто так лучше с моей видеокартой, и да, сборка уже установлена в системе, в том числе модели:
Правда забыл про SDXL модель... Но это дело поправимое, жаль только маленькие скорости у 2.5" HDD подключенного через USB 3.0, но на SSD хранить такие объёмы не очень приятно конечно:
Пожалуй сразу переключим модель на SDXL и именно с неё начнём:
А теперь посмотрим на пределы, которые доступны моей GTX 1070 с 8 ГБ памяти!
Разрешение 512x512, SDXL для такого явно не предназначен, потому нарисовало мусор со скоростью 1.14 итерации в секунду, памяти на видеокарте занято ~6500 МиБ... Дальше размер 1024x1024, именно на такое разрешение рассчитана модель SDXL, и тут уже настолько внятный результат, насколько внятный запрос, а запрос у меня состоит из одного слова "test", памяти на видеокарте занято ~6770 МиБ, скорость примерно 3.5 секунды на итерацию.
Третий результат при разрешении 2048x2048, модель на такое разрешение не рассчитана, а потому выдает мусор, даже если сделать более конкретный запрос, скорость 22 секунды на итерацию, памяти занято ~7740 МиБ:
Пожалуй пора делать апгрейд видеокарты... Хотя ладно, я не так уж и много генерирую, чтобы ради повышения скорости менять свою GTX 1070 на что-то более новое.
Пожалуй будет неплохой идеей использовать Hires для генерации большого изображения, правда что-то пошло не так при использовании SDXL модели, и вместо промежуточного результата сохранился чёрный квадрат, но генерация идёт:
Получилось, мягко говоря, не очень качественно, но гораздо лучше, чем без Hires:
Думаю есть смысл сгенерировать несколько изображений в "правильном" разрешении добавив "negative promt", и посмотреть что из этого выйдет:
Что тут сказать...
Хм, а как с этой задачей справится модель ChiMix_SF1-NED-AOM3_1 предназначенная для генерации 512x512 изображений...
Поучаствует в этом сравнении даже SD 1.5 модель, просто потому что...
Вот и результаты с моделью "ChiMix_SF1-NED-AOM3_1", получились очень даже неплохо, учитывая конечно что модель рассчитана на разрешение 512x512, а сгенерировала 1024x1024, SDXL предназначенная для 1024x1024 явно хуже себя чувствовала когда генерировал в x2 размере:
Ну и результаты с моделью "v1-5-pruned-emaonly" (SD 1.5), вот и получили то, что получали с SDXL моделью при 2048x2048... Получилось месиво:
Можно конечно использовать Hires, но так не интересно, потому сгенерировал три изображения в "правильном" разрешении:
А самое удачное отправил в контрольную сеть, используя SoftEdge получилось не очень качественно, наверное нужно убрать "грибы" из запроса, однако уже нет месива из тысячи головешек:
Впрочем, никто не мешает использовать другие препроцессоры ControlNet, Lineart, Depth и Canny справились гораздо интереснее, причём эти изображения генерировались всего в 35 шагов вместо 50, так что при должном подходе и SD 1.5 модель способна выдавать "результат":
Ладно, пожалуй хватит генерировать, пора тренировать!
-
Тренируем с помощью GeForce GTX 1070
Этим делом займусь уже завтра, но не волнуйтесь, здесь это время пройдёт как одна строчка текста!
Вот и настал новый день, пришло время тренировки небольшой вспомогательной сети (hypernetwork), первым делом создаю "сеть" с названием n68c-gs4-fx, можно конечно перейти в раздел "тренировка" (train), но сейчас там делать особо нечего:
Ведь сначала нужно подготовить исходные изображения:
Само собой большие фотографии сначала уменьшу для упрощения дальнейшей обработки:
Немного "волшебства" в графическом редакторе Krita:
Готово! Конечно, в идеале нужно было убрать фон, оставив лишь объект тренировки, но и так думаю сойдёт для начала:
Обрабатываем изображения в разделе "Extras", нужно создать описания содержимого, и использовать буду Deepbooru:
Правда справился он плохо со своей задачей, как и линуксоидный thumbnailer, отвечающий за миниатюры изображений... Видимо следовало использовать BLIP, но это особо и не важно, всё равно вручную придётся написать описания:
Осталось настроить и начать тренировку, но у моей GTX 1070 оказалось недостаточно памяти для разрешения 1024x1024...
На 768x768 моих 8 ГБ тоже оказалось недостаточно, так что придется вернуться к 512x512, увы, тренировать это не генерировать:
Осталось только ждать и посматривать за прогрессом, прошло всего 200 итераций, а результат меня уже радует, наверное дело в удачной подготовке исходного материала:
Ещё следует заметить один нюанс, "гиперсеть" создается в совокупности с текущей выбранной моделью, в моём случае SD 1.5, с другими моделями сеть будет работать иначе, но этот нюанс я не проверял досконально, чтобы сказать к каким именно результатам может привести использование неподходящих сетей.
Прошло некоторое время, указанные 10000 итераций завершились, и в промежуточных результатах видно несколько самолётов, что довольно забавно:
Осталось сгенерировать изображение с новой гиперсетью:
При запросе " , n64c, n68c-gs4, motherboard" оно нарисовало системную плату, однако получилась какая-то смесь... При ослаблении гиперсетки (hypernet:n68c-gs4-fx:0.5) системная плата уже совсем не похожа на то, что я запрашивал, а без использования гиперсетки вообще нарисовало плату с зелёным текстолитом.
И только если убрать слово "motherboard" из запроса (последний результат), нейронная сеть выдает именно то, что я тренировал, насколько смогла конечно:
Из этого следует, что правильные описания к каждому изображению довольно важная часть подготовки к тренировке.
Но что произойдёт, если сменить модель на другую? SD 1.5 и без "дополнений" вроде как умеет рисовать системные платы, а вот у "ChiMix_SF1-NED-AOM3_1" есть некоторые проблемы с такими запросами...
Первые 4 изображения с запросом "n64c, n68c-gs4, motherboard", вторая пачка уже с использованием гиперсети "n64c, n68c-gs4, motherboard, ", модель определенно плохо справляется с компьютерным железом, но благодаря дополнительной "сетке" (не секте), эта проблема частично решается, и сразу видно, что гиперсеть не может даже слоты памяти нарисовать будучи оторванная от SD 1.5 модели:
Так что натренированная гиперсеть на одной модели, с другой работать конечно будет, но как попало, это наверное можно сравнить с ситуацией, когда водителя экскаватора садят в спортивную машину отправляя на соревнования, или наоборот, вроде и получится что-то из этого, но не очень хорошо.
Почему с техникой у нейронных сетей всё настолько плохо? Вообще ответ лежит на поверхности, достаточно заглянуть на "civitai.com" и всё встаёт на свои места, абсолютное большинство моделей рассчитаны на генерацию людей и персонажей из аниме/игр:
Есть ли модели рассчитанные на генерацию компьютерной техники и других подобных вещей? Вероятно есть, но я пока не знаю таких, увы.
А еще не стоит забывать про ОЗУ, некоторые наверняка до сих пор верят, что 8-16 ГБ это нормальный объём памяти для ПК, хватит даже на игры... Увы, 16 ГБ мне уже в 2017 году было недостаточно чтобы просто нормально поиграть в игры без помощи костыля под названием "файл подкачки", ну а сейчас Stable Diffusion у меня скушал 41 ГиБ ОЗУ, выводы делайте сами, так сказать предостережение для тех, кто во время сборки ПК захочет сэкономить на объёме ОЗУ по глупости:
Так что будем уже завершать статью...
Напоследок сгенерирую несколько изображений с помощью моделей SD 1.5, ChiMix_SF1-NED-AOM3_1, RaemuMix v8.1 (на основе SD 1.5), Raemu XL (на основе SDXL 1.0) и SDXL base 1.0, а чтобы результаты можно было сравнить между собой, будем использовать одинаковые параметры для всех моделей.
Начнём с размера 512x512, запрос "landscape, day, sun, lake, road, forest, grassland", зерно "2394593424", сэмплер "DPM++ 2M Karras", а для упрощения задачи использоваться будет скрипт "X/Y/Z plot":
В итоге при разрешении 512x512 откровенно не справилась только модель SDXL Base v1.0, модель SD 1.5 не смогла нарисовать озеро, а RaemuMix v8.1 не нарисовала дорогу, а RaemuXL не нарисовала солнце, только ChiMix_SF1-NED-AOM3_1 нарисовала практически всё запрошенное, хотя дорога получилась не очень:
Пожалуй усложним задачу, сэмплер сменим на "DPM++ 3M SDE Karras", и будем использовать два зерна "894319" и "10435734":
Опять модель SDXL Base не справилась, SD 1.5 снова показала посредственный результат, тем временем оставшиеся модели хоть и теряют временами солнце, однако стараются нарисовать всё:
В разрешении 1280x720 результаты получились интереснее, модель SD 1.5 показала себя как всегда, посредственно, ChiMix и RaemuMix выдали неплохо, но лучшие результаты пожалуй за SDXL моделями:
Безусловно SDXL модели справились лучше всех при размере 1280x720, однако стоит заметить, что даже с моделями на основе SD 1.5 возможно сгенерировать довольно качественные изображения, например стандартный фон дистрибутива Chimbalix 23.1 Alphachi сгенерирован как раз с помощью модели ChiMix, причём в разрешении 1920x1080, а после небольшой обработки получилось вот это:
Так что даже используя неподходящие модели можно добиться нужного результата, особенно если использовать контрольные сети, что ранее уже демонстрировалось, разумеется всему есть цена, в данном случае усложнение процесса генерации...
Ну что, осталось проверить как разные модели справляются с генерацией человека! Ну а чтобы нейронная сеть случайно не нарисовала ничего "неприемлемого", я буду использовать слово "nsfw" (not safe/suitable for work - небезопасно/неподходяще для работы) в Negative Promt, да и сам запрос упростил:
Разрешение 512x512, SDXL Base v1.0, как обычно, не справилась, хотя пыталась, SD 1.5 нарисовала реалистично, ChiMix выдала что-то среднее, а вот RaemuMix/RaemuXL однозначно аниме стиль:
Интересно, как обстоят дела при разрешении 1280x720?
Модель SD 1.5 почему-то постоянно пытается рисовать клонированных детей при столь простом запросе, остальные модели явно не "поняли" что от них хотели:
Думаю есть смысл повторить с более сложным запросом, потому что базовая SD 1.5 модель постоянно рисует детей даже с другими сидами, и это меня уже начинает напрягать:
Теперь SDXL Base начала рисовать детей... Да что ж такое:
Похоже у базовых моделей Stable Diffusion было тяжёлое детство... Дорабатываем запрос:
И наконец получаем результат!
Модель SD 1.5 старалась, очень старалась... Но увы, она единственная нарисовала "объект" трижды!
ChiMix тоже старалась, и даже руки местами получились весьма неплохо, но стиль явно веет неопределённостью, видимо нужно более конкретные запросы расписывать для получения более качественных результатов.
RaemuMix нарисовала в аниме стиле, как и всегда.
А вот RaemuXL уже попыталась в реалистичность, причём получилось это даже лучше, чем у SDXL Base модели, и в целом она выдала результаты наиболее соответствующие запросу, такое ощущение, что первые три модели вообще проигнорировали слово "portrait":
Оперативной памяти конечно заняло чуть больше 18 ГиБ, и это я только генерировал изображения, даже не открывал разделы обработки и тренировки...
На этом пожалуй завершу статью, ведь основной используемый функционал проверил, а на остальные мелочи в подробностях не хватит и двух статей.
Ранее я уже оставлял ссылки на GitHub репозитории, но оставлю и здесь, чтобы не потерялись:
Сборки Neuro: ( https://github.com/Shedou/Neuro ).
Дистрибутив Chimbalix: ( https://github.com/Shedou/Chimbalix ).
Ну и закончим традиционно грибами:
Благодарю за внимание, больше интересных статей в блоге Hard-Workshop.