SD WebUI DML Neuro: Делаю универсальную сборку Stable Diffusion web UI для AMD/NVIDIA
Предисловие
Обычно нейронные сети ассоциируют с видеокартами NVIDIA, как минимум потому что люди больше предпочитают работать с CUDA, да и сама компания стремительно продвигает всякие интересные штуки, но AMD видеокарты тоже способны на работу с нейронными сетями, и даже есть DirectML версия Stable Diffusion web UI.
реклама
Но есть проблема, софт работающий с видеокартами AMD мягко говоря весьма скверный, и я уже имел неприятный опыт возни с таким софтом:
AMD и нейросети: Пробую использовать DirectML версию Stable Diffusion Web UI с видеокартой NVIDIA
Впрочем, видеокартой от AMD я так и не обзавёлся, но разве меня это остановит? Конечно же нет, я заметил что у одного человека есть видеокарта от AMD, и при этом у него уже была рабочая версия SD WebUI DML...
реклама
Таким образом я получил что мне нужно было, да, это архив приложения SD WebUI DML которое работало с видеокартой AMD Radeon RX 6600:
![]() |
![]() |
Файлы распакованы, и само собой они абсолютно бесполезны, ведь Stable Diffusion web UI по факту "линуксоидный" софт, а это значит что он не будет работать если просто так перенести приложение, болото зависимостей не позволит...
Я не могу просто взять и запустить это нагромождение файлов, даже если бы у меня была видеокарта от AMD. Но ничего страшного, я знаю что с этим хламом делать:
реклама
Почему я назвал это сборище файлов хламом? Всё просто, это и есть хлам тонущий в болоте зависимостей, а я как раз собираюсь из этого хлама сделать рабочее приложение:
Оно могло сколько угодно работать у другого человека, но у меня даже не запуститься, наверное у меня кривые руки? Нет, всё гораздо проще, кривые руки у разработчиков подобного софта.
Как зависимости уничтожают Linux экосистему и не только
реклама
Ну да ладно, пусть это будет на совести разработчиков (если у таких есть вообще совесть), которые выпускают непригодный для нормального запуска и использования софт.
Эта вся возня с командами, зависимостями и прочим мракобесием которое может произойти в процессе просто ужасна, особенно если учесть, что всё это зависимо от интернета и нужно делать заново на каждой операционной системе в отдельности, ибо оно не портативное:
-
--
---
Сборка
С чего же начать? Пожалуй с зависимостей, нужно оборвать все зависимости которые возможно, а чтобы облегчить работу я возьму наработки из предыдущей своей сборки и просто адаптирую под новую сборку:
Вот и одна из причин почему невозможно просто так перенести SD WebUI на другой ПК или в другую ОС, это файл "pyvenv.cfg", но ничего страшного, в моей сборке это недоразумение исправлено простым BAT файлом.
Кстати, у меня же сейчас загружена Windows 7, нужно бы загрузить Windows 10, ибо кривой DirectML не работает в якобы "устаревшей" операционной системе...
Запускаю, ах да, я же забыл подкинуть модель в папку с моделями.
К счастью дополнительных проблем не возникло, зависимости присосались нормально, разве что предупреждения идут по причине того, что у меня нет видеокарты от AMD:
Сгенерировать изображение не получилось, хотя сейчас ситуация явно интереснее, чем была при моём первом знакомстве с DirectML версий SD WebUI...
Немного колдовства с параметрами запуска и оно заработало даже с видеокартой от NVIDIA:
Вот оно, используя наработки от предыдущей сборки мне таки удалось запустить DirectML версию SD WebUI, хотя стоит заметить, на этот раз я взял файлы которые уже работали с видеокартами AMD, т.е. я не собирал приложение с нуля по инструкциям из репозиториев.
Хотя и без проблем не обошлось, оно говорит про нехватку памяти...
Пожалуй уберу аргумент "--no-half", он подразумевает работу с полной точностью FP32 вместо стандартной FP16, но это всё равно не помогло, при первой генерации вроде всё и получилось, но повторно сгенерировать уже не вышло, ругань на нехватку памяти.
![]() |
![]() |
В общем я начал ковырять настройки, оно по-прежнему заполняет память видеокарты, но теперь уже несколько картинок смог сгенерировать без особых проблем.
Хотя проблемы с выделением памяти всё равно преследуют меня. Что ещё я заметил, так это скорость генерации, CUDA сборка SD WebUI работает на скорости примерно ~1.6 итераций за секунду при аналогичных настройках, а вот DirectML версия тянет всего на ~1.1 итераций за секунду.
Впрочем, CUDA не работает с видеокартами AMD, так что это лучше, чем вообще ничего:
Даже параметр "--lowvram" не решает полностью проблему нехватки памяти, вот так генерировалось, и в самом конце работы оборвалось... Но стоит признать, без "--lowvram" при размере 1024x1024 обрывалось в самом начале генерации.
![]() |
![]() |
Я экспериментировал, пробовал всякое, но всё равно 1024x1024 у меня не получалось никак осилить, всё обязательно обрывалось если не в середине процесса, то в самом конце:
![]() |
![]() |
![]() |
А потом я понял, проблема не в том что у меня видеокарта от NVIDIA, а в самом DirectML кривом, ибо у человека с RX 6600 на 8 ГБ вообще генерирует адекватно только в размере 384x384, то что я добился относительно нормальной генерации 512x512 уже можно сказать прогресс, а ведь ещё на 1024x1024 замахиваюсь...
Причем важно заметить, даже у людей с Radeon 7900 XTX есть проблема нехватки памяти:
Не знаю даже что сказать, сейчас вот полтора десятка изображений сгенерировало без проблем, пожалуй текущие настройки оставлю как основные, ибо с ними я могу на своей 8 ГБ GTX 1070 без проблем генерировать изображения в размере 512x512:
![]() |
![]() |
![]() |
Ладно, займусь лучше оформлением BAT файлов, проблему памяти судя по всему не выйдет решить простыми методами.
В общем BAT файлы переделал, конечно же проверяю чтобы оно работало, процессором генерирую изображение, да, долго, 10 секунд на итерацию с R7 2700X, но зато работает всегда стабильно:
Далее добавляю несколько расширений, и у меня есть серьезные опасения по расширению "multidiffusion"...
Впрочем, сказать что всё ужасно я не могу, расширение Tiled Diffusion заработало и это принесло свои плоды, правда этим расширением нужно ещё уметь пользоваться, иначе результаты весьма странные выходят.
Может я и не умею работать с расширением Tiled Diffusion, но даже я смог сгенерировать картинку размером 1024x1024 имея всего 8 ГБ видеопамяти, впрочем, если бы я использовал CUDA вариант SD WebUI то и без "костылей" смог бы такой размер сгенерировать, но сейчас имеем дело с DirectML...
В любом случае расширение явно может быть полезным, так что однозначно оставляю в комплекте:
Что дальше? Конечно проверить возможности, моей GTX 1070 на 8 ГБ хватило для генерации изображения размером 768x512, но 1024x768 уже не потянуло, причем важно заметить, нехватка памяти происходит на этапе работы VAE, т.е. изображение сгенерировалось, но при работе VAE идёт нехватка памяти.
![]() |
![]() |
Чтобы наверняка подтвердить проблему при работе с VAE я отключил его совсем:
Но в итоге проблема не была решена... Максимальный размер изображения который мне удалось сгенерировать это 768x768, первое без VAE, второе с VAE:
![]() |
![]() |
А сейчас забавный факт, нехватка памяти происходит на самом последнем этапе когда изображение выводится в окно просмотра, и если принудительно установить размер предварительного просмотра на "full", то ошибка проявит себя с первой же итерации...
По сути я могу сгенерировать 1024x768 картинку, да, но когда она выводится в предварительный просмотр то происходит нехватка памяти и сброс результата, а когда размер предварительного просмотра установлен полный, то нехватка памяти происходит сразу же, причем полное отключение предварительного просмотра не решает проблему, ведь конечный результат в любом случае будет сформирован, а там и ошибка.
Впрочем, играясь с параметрами запуска мне удалось сгенерировать изображение размером 1024x768...
Иногда конечно может оборваться генерация с ошибкой нехватки памяти, но в целом изображения размером 1024x768 вполне возможно теперь генерировать, а ведь в самом начале было проблемой сгенерировать 512x512 картинку, так что не зря потратил время:
![]() |
![]() |
К сожалению про генерацию в размере 1024x1024 можно забыть, по крайней мере используя DirectML версию SD WebUI с видеокартой на 8 ГБ... Но в размере 1024x768 вполне возможно генерировать, правда иногда можно потерять результат из-за нехватки памяти:
![]() |
![]() |
![]() |
![]() |
В любом случае это уже приемлемый результат для сборки, при размере 768x512 сгенерировались без ошибок все 20 изображений из 20, и еще несколько десятков "за кадром":
Теперь можно приступать к настройке сборки SD WebUI DML Neuro, в общем дальше рутина следующего плана:
Далее нужно пройтись по функционалу приложения, я конечно уже скопировал все модели чтобы без зависимостей от интернета работало, но вдруг чего пропустил, так что да, всё перепроверяю, кроме LDSR конечно, ибо он доставляет проблемы ломая интерфейс:
Одна проблема конечно нашлась, SwinIR_4x пытался работать на процессоре вместо видеокарты, но не смог, ибо процессор не умеет работать с Float-Point 16 (FP16), это конечно можно решить переведя SD WebUI в режим Full-Precision (FP32), но это негативно повлияет на расход памяти, ради одного алгоритма вижу это нецелесообразным...
Иду дальше, функционал слияния моделей работает:
![]() |
![]() |
А вот с тренировкой Hypernetwork и Embedding всё не очень хорошо, впрочем, я уже где-то слышал что с этим есть проблемы у DirectML варианта Stable Diffusion web UI, даже запустив в режиме FP32 я не смог ничего сделать, ругань на несовпадающие типы данных пропала, но появилась ругань на нехватку памяти...
В общем тренировать сети в DirectML варианте SD WebUI не выйдет.
На этом проверки закончены, осталось поработать над ReadMe файлом, и отправить сборку человеку с AMD видеокартой на повторную проверку, после чего уже можно будет заканчивать как статью, так и сборку.
И ещё, поддержки Windows 7 на этот раз не будет, ибо кривая зависимость DirectML не работает в среде Windows 7, да, это вам не CUDA от "ужасной и плохой" NVIDIA... Если с CUDA все было просто, то с DirectML гораздо сложнее, я попросту не имею никакого желания пробовать дорабатывать этот велосипед с квадратными колёсами.
Пришло время архивировать сборку, и тут я подумал, ведь некоторым людям и не нужны модели в комплекте, так почему бы не сделать несколько вариантов на выбор? Первый вариант "All in One" (всё в одном), весит гигабайта 4 с лишним, но зато готов к работе сразу после распаковки, а второй вариант без моделей сделать, пользователю нужно будет самому скачивать модели.
Да, это выглядит отлично, для всех кому нужна автономная сборка есть "All in One" размером чуть больше ~4 гигабайт, скачал, распаковал и запустил. Но для тех, кому не важна полная автономность есть вариант "NO_MODELS", название говорит само за себя, я убрал модели из сборки, от чего архив со сборкой весит всего ~1 гигабайт:
В общем сборка без проблем заработала и с видеокартой AMD Radeon RX 6600, насколько хватило 8 ГБ памяти конечно, я говорил не ставить сразу 80 проходов на изображение при 1024x1024 ибо в конце упадёт, но человек не послушал и на утро словил ошибку нехватки памяти, и вариант lowvram не помог...
Впрочем, в режиме работы без видеокарты (Start WebUI CPU) можно генерировать картинки хоть размером 2048x2048.
![]() |
![]() |
А теперь пару слов про системные требования, почему 64 ГБ ОЗУ?
На самом деле оно сможет работать и при меньшем количестве системной памяти, только вот приложение занимает ~15 ГБ ОЗУ при первой же генерации в размере 512х512 со стандартными настройками...
А ведь кроме SD WebUI DML ещё нужно держать запущенным браузер, что тоже занимает оперативную память, да и операционная система не пушинка, так и выходят системные требования в 64 ГБ ОЗУ, можно было конечно указать 32 ГБ, но я не уверен хватит ли такого объема без костыля под названием "файл подкачки" если задействовать весь доступный функционал...
И ради небольших правок в ReadMe файле мне действительно пришлось перепаковать архивы, но так и работает действительно автономный софт, кому-то нужно всё собрать воедино, чтобы пользователю не приходилось танцевать над репозиториями собирая по кусочкам тоже самое.
В любом случае пора загружать сборку в GitHub, с мобильным интернетом это занятие конечно неприятное, но что поделать, у меня кроме мобильного интернета никаких других вариантов нет на данный момент, уже как 5 месяцев...
-
--
---
Заключение
Как можно заметить, сделать изначально "линуксоидное" приложение пригодным для нормального запуска и использования не такая уж и сложная задача...
Всего-то оборвать зависимости расположив их в одной папке с приложением, сделать костыль для venv, настроить всё, протестировать, оформить чтобы пользователям было понятно что к чему (правило наименьшего удивления), запаковать и загрузить в репозиторий, вот сборка и готова!
Точно, чуть не забыл, нужно ведь указать ссылку на репозиторий где можно взять сборку совершенно бесплатно, без СМС и регистраций:
Репозиторий сборки: ( https://github.com/Shedou/Neuro ).
Ну а для фанатиков Linux у которых факты поперёк горла застревают, всегда есть кнопка "черный список", пользуйтесь на здоровье и не благодарите за открытие:
Есть такой подход к разработке "чем хуже, тем лучше", но как показывает практика, в реальности обычно хуже, чем лучше, в то же время я вот взялся за доработку изначально кривого софта, а значит подход отчасти сработал...
Благодарю за внимание, больше интересных статей в блоге Hard-Workshop.
Лента материалов
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Комментарии Правила