SD WebUI DML Neuro: Тестирование Radeon RX 6600 и GeForce GTX 1070 в генерации изображений
Предисловие
Однажды я заинтересовался нейронными сетями, однако сначала попал на веб сервисы, например DALL-E 2 от OpenAI. Намучившись с сервисами быстро пришло понимание, что нужно иметь автономную нейросеть, которую можно в любой момент запустить и использовать не спрашивая разрешения у дядьки на другом конце земного шара, но в итоге я нашёл лишь кривой и зависимый софт.
реклама
Мои весёлые приключения с нейронными сетями (Dall-E, Stable Diffusion).
AMD и нейросети: Пробую использовать DirectML версию Stable Diffusion Web UI с видеокартой NVIDIA
Да, всякие Stable Diffusion GUI, web UI и т.п. оказались мягко говоря непригодными для нормального использования "из коробки", характерное для Linux болото зависимостей неистово бурлило, хотя я вроде как находился в среде Windows... В итоге мне пришлось поизвращаться чтобы существующий софт привести к адекватному состоянию пригодному для нормального использования "из коробки":
реклама
Сборка Stable Diffusion web UI Neuro: Доступная и простая в использовании нейросеть. Часть 1.
Сборка Stable Diffusion web UI Neuro: Доступная и простая в использовании нейросеть. Часть 2.
Ну да ладно, я поработал над изначально недоразвитым софтом и теперь есть сборка, правда только для видеокарт NVIDIA:
SD WebUI Neuro: Грибная фантазия нейронных сетей.
реклама
Но есть проблема, обладатели видеокарт AMD пролетают мимо ибо сборка работает с CUDA, оно и не удивительно учитывая отношение к пользователям со стороны разработчиков "свободного ПО", просто AMD и Open Source не дают адекватной базы для развития чего-либо.
Сегодня есть "функция один", да, кривая и сложная, но разработчики начинают её использовать, однако проходит небольшое время и эту функцию помечают как "Deprecated" выбрасывая на свалку истории, что делать разработчикам? Правильно, переписывать софт в который уже был вложен труд, вот она "философия Unix" во всей красе...
Как зависимости уничтожают Linux экосистему и не только.
Даже в старые времена NVIDIA заботилась об адекватной поддержке OpenCL, даже GTS 250 (9800GTX) способна на работу с нейронными сетями, когда ATI бросили серию видеокарт Radeon HD 4xxx так и не сделав адекватную поддержку OpenCL.
реклама
Да, всякие 8600GT, 9800GTX на текущий день имеют весьма скромную производительность, тем не менее они могут и работают с такими OpenCL приложениями как Waifu2X (Deadsix27), а вот Radeon HD 4xxx не способны даже запустить подобный софт, не то что работать и приносить хоть какую-то пользу.
Такая тенденция в принципе по сей день существует, NVIDIA играет со всякими интересными "технологиями" формируя отличную поддержку базовых API даже для старых видеокарт, тем временем у AMD происходит какая-то непонятная "Open Source" фигня...
То асинхронные вычисления заблокируют видеокартам на основе GCN 1.0 (HD 7750-7770, HD 7850-7870), как ощутить такое искусственное ограничение? Достаточно запустить AMD Radeon Pro Render на какой-нибудь HD 7850 (проверял в ~2019 году с HD 7870 Pitcairn), всё что нарисует видеокарта это чёрный экран так как асинхронные вычисления необходимые для работы просто заблокированы драйвером, игры на основе Vulkan API тоже спасибо не говорили за урезание асинхронных вычислений.
То бросят поддержку целой массы видеокарт внезапно прекратив выпускать драйверы, то инструменты для разработчиков бросят на произвол судьбы:
Конечно, технически видеокарты AMD очень хороши, но какой толк от "железа" если его невозможно нормально использовать? NVIDIA может сколько угодно клепать архитектурно ущербные видеокарты, но они работают, и компания трудиться над тем, чтобы их видеокарты можно было просто взять и использовать, тем временем AMD играет в "Open Source" выбрасывая не только свой, но и чужой труд на свалку истории своими выходками.
Взять тот же Stable Diffusion, его написали на языке Python используя CUDA, почему не выбрали OpenCL в качестве основы? Даже не знаю...
Тем не менее масса бурлит, и из этого бурления появился DirectML вариант Stable Diffusion работающий с AMD видеокартами, правда работает он почти что "никак" в своём изначальном виде:
SD WebUI DML Neuro: Делаю универсальную сборку Stable Diffusion web UI для AMD/NVIDIA.
Но ничего страшного, я наконец "осилил" сборку SD WebUI Neuro в варианте DirectML, теперь достаточно просто распаковать приложение из архива и запустить исполняемый BAT файл, можно даже на USB накопителе, никакого мракобесия со скачиванием и ручной установкой зависимостей, как и никакого прочего "веселья" с бубном вокруг всевозможных проблем, даже в браузер не нужно ничего вручную вписывать, сборка сама запустит всё необходимое:
Да, как можно заметить мои сборки предназначены для Windows, ибо над сборкой для Linux я даже боюсь начинать танцевать с бубном, особенно если учесть что DirectML это часть DirectX API, а оно недоступно в Linux, ну а CUDA доступна только с видеокартами NVIDIA, или через адские ROCm костыли, я уже молчу про видеокарты Intel.
Тем более в Linux дистрибутивах нет стабильной основы, просто бессмысленно вкладывать труд в это болото хлама постоянно ломающееся от любого чиха, так что у меня пока нет планов на создание сборки для дистрибутивов Linux...
Хм, фанатики Linux! Это ваш шанс сделать действительно адекватную и автономную сборку Stable Diffusion для своей любимицы, главное чтобы она работала в большинстве дистрибутивов и можно было легко скопировать обычной флешкой с одного ПК на другой, и так же легко запустить даже без доступа к интернету, при этом все файлы должны быть в одной папке. Ну или можете, как обычно, пойти в комментарии и написать гадости в мой адрес при этом искажая рейтинги накрутками, если это конечно всё на что хватает могущества святых дистрибутивов и вашего сверх мощного разума:
-
--
---
SD WebUI DML Neuro
Найти сборки можно в репозитории GitHub: ( https://github.com/Shedou/Neuro ).
Для тестирования и сравнения производительности видеокарт я буду использовать автономную сборку Stable Diffusion web UI DirectML Neuro (All in One).
Чтобы результаты моих тестов могли повторить все желающие было решено взять в качестве основы именно те версии сборок, что уже запакованы и загружены в GitHub:
Просто я продолжаю работать над сборками и экспериментирую, будет весьма неприятно если какая нибудь мелочь повлияет на результаты. А чтобы самому не перепутать ничего, я распакую сборку на обычную флешку объемом 64 ГБ, да, сборка будет работать с USB накопителя:
Точно, распакую ещё и обычную сборку SD WebUI Neuro, она конечно не будет работать с Radeon RX 6600, но мне это и не нужно, она нужна для полноты сравнительного тестирования, ибо GTX 1070 умеет с обеими сборками работать:
-
--
---
Условия тестирования
Теперь перейдём к условиям тестирования.
В тестировании будет использована сборка Stable Diffusion web UI DML Neuro, а так же сборка Stable Diffusion web UI Neuro, найти их можно в репозитории GitHub: ( https://github.com/Shedou/Neuro ).
Участвует в тестировании мой компактный ПК (CHIPC-01) в самодельном корпусе (~40x30x10 см.):
Фотографий другого ПК участвующего в сравнительном тестировании нет в наличии, его назовём "Rozpodrawa-PC", так предложил владелец ПК.
Тестовые системы | ||
Название системы | CHIPC-01 | Rozpodrawa-PC |
ЦП | AMD Ryzen 7 2700X | AMD Ryzen 7 3700X |
Видеокарта | MSI GeForce GTX 1070 AERO OC 8GB, stock, driver 527.56 DCH. |
Sapphire Radeon RX 6600 8GB, stock, driver 23.3.1. |
ОЗУ | 64GB 2x Kingston 9905734-101.A00G 3333 MHz - 16-20-20-40 |
64GB 4x Kingston HyperX 2866 MHz - CL16 |
Системная плата | Gigabyte B450M H | MSI X470 Gaming Plus |
Рабочий накопитель (Где SD WebUI DML Neuro) |
64GB Asolid USB Flash Wansenda WSD D200 |
4TB WD Purple 5600 RPM, 3.5" |
ОС | Windows 10 Pro x64 | Windows 10 Workstation x64 |
-
--
---
Тестирование
Начну со сборки Stable Diffusion web UI DirectML Neuro, первый запуск с флешки занял больше минуты, это так долго загружалась модель весом 2 ГБ, но второй запуск уже происходит за считанные секунды, все благодаря кэшу в оперативной памяти (standby list), впрочем, статья не про нюансы работы операционной системы, так что не будем заострять особое внимание на таких "мелочах".
Сейчас важно что всё запустилось и готово к работе, было бы удивительно если бы не запустилось... А чтобы тест можно было легко повторить и сравнить результат работы, я использую как параметры "по умолчанию", так и свой набор настроек.
1) Стандартные настройки.
При стандартных настройках сгенерированное изображение будет всегда разным, по умолчанию нет никакого текстового ввода и "зерно" установлено на значении "-1" (случайное значение).
2) Мои настройки.
Чтобы изображение было определенным я ввел в поле Promt слово "car", а в поле Negative promt ввёл "Low quality", сэмплер сменил на DPM2, а "зерно" установил на значении 1000, на этом всё.
Во всех случаях буду использовать встроенную в сборку модель "ChiMix_SF1-NED-AOM3_1.safetensors [08c8bbb6f1]", вообще эта модель была создана в ходе экспериментов с функционалом совмещения моделей, и так получилось что я не записывал точный "рецепт" этой модели, тем не менее она есть и работает. Хотя как показала практика модель может быть и другой, на скорость это не влияет, по крайней мере я не обнаружил влияния с моделями которые проверял.
Искать скорость генерации буду в консоли, справа написано сколько итераций в секунду (it/s), или секунд потрачено на итерацию (s/it), но это невероятно сложно для восприятия и сравнения когда величина измерения постоянно "плавает" из одной крайности в другую, разработчики, зачем вы такую дичь творите? Потому я буду смотреть время затраченное на генерацию, оно указано в последней строчке, всего 31 секунда, это примерно 1.55 секунд на итерацию, или 0.645 итераций в секунду:
И чтобы не перепутать ничего по вине изменчивой величины измерений it/s и s/it, я буду рассчитывать и указывать все значения в таблице результатов, а вот и первые результаты собраны:
Далее были собраны результаты с Radeon RX 6600 и Ryzen 7 3700X, и что важно заметить, у человека две видеокарты, RX 460 для рабочего стола и прочего софта, включая браузер, и RX 6600 для работы с нейронными сетями.
Ради интереса были ещё проведены тесты с R7 3700X при полной загрузке всех потоков, в Python файле devices.py (папка modules) можно задать количество используемых потоков для работы, и для R7 3700X было указано 16 потоков при проведении дополнительного теста.
torch.set_num_threads(16)
Скажу сразу, это не имеет особого смысла, нейросеть сильно зависит от скорости работы с памятью, в том числе от наличия быстрого x3d кэша у процессоров AMD Ryzen, потому использование всех потоков процессора с активной технологией SMT/HT не имеет особого смысла.
Но для людей которым интересно "поэкспериментировать" я предоставлю более интересный код, его можно вставить после секции с импортами (import), на свой страх и риск конечно же.
chi_threads = torch.get_num_threads()
chi_threads = chi_threads * 2
torch.set_num_threads(chi_threads)
Как можно было заметить, Radeon RX 460 тоже участвовала, правда она оказалась способной на работу в режиме Low VRAM (WebUI LowVRAM.bat), и то 2 ГБ видеопамяти хватило только на изображение в размере 256x256.
Дальше сбор результатов с CUDA версии Stable Diffusion, и вот здесь можно отметить некоторые интересные факты...
1) CUDA версия быстрее работает с видеокартой чем DirectML.
2) CUDA версия выдает "другой" результат.
Рассмотрим результаты DirectML версии Stable Diffusion, в целом всё нормально, результаты видеокарты в режиме FP16 и FP32 отличаются, хотя и едва заметно в текущем конкретном случае, при этом результаты сгенерированные в режиме полной точности не отличаются между собой независимо от того, процессором были сгенерированы или видеокартой.
1) Нормальный режим работы (FP16).
2) Режим полной точности (FP32).
3) Сгенерировано процессором (FP32).
А вот CUDA версия Stable Diffusion выдала совсем другое изображение, однажды я экспериментировал с приложением Easy Diffusion переключая работу между процессором и видеокартой, и заметил что видеокарта рисует совсем не то что было нарисовано процессором... Вот это явление проявилось и в Stable Diffusion web UI, CUDA версия рисует не то что должна была нарисовать.
Проще говоря результат CUDA версии Stable Diffusion не соответствует эталону, где же взять "эталон"? Банально сгенерировать при помощи процессора (третье изображение):
Вот цена скорости CUDA версии, самое время сказать что у NVIDIA цвета неправильные, и вообще про деревья и цвет ни слова не сказано, значит можно не рисовать их, да и зачем рисовать машину целиком когда можно оставить куски за кадром, главное непонятных отражений... Ой, "RTX лучей" набросать на окна чтобы блестело все что только можно... Вот так поворот...
-
--
---
Результаты
Пожалуй настало время обработать полученные результаты, для вас это просто таблица, а для меня это целая масса работы по составлению и оформлению:
Может быть не очень наглядно смотреть цифры в таблице, потому мне показалось хорошей идеей преобразовать полученные данные в диаграмму.
В общем при стандартных настройках (сэмплер Euler A) Radeon RX 6600 сильно уступает GeForce GTX 1070, но вот при сэмплере DPM2 видеокарты практически на равных встали, похоже мне следовало проверить производительность со всеми сэмплерами, но увы, как-нибудь в другой раз уже...
Процессоры конечно же не способны конкурировать в плане скорости с видеокартами, тем не менее у ЦП есть преимущество, у ЦП есть очень много памяти, и вполне спокойно может сгенерировать изображение в размере 2048x2048, очень медленно конечно, но может. Кстати, я уже говорил про зависимость от скорости работы с ОЗУ, так вот, я видел у Ryzen 7 5800X3D скорость генерации примерно ~8 секунд на итерацию при сэмплере "euler a", что выходит ~0.125 IT/s, а это уже всего в ~10 раз медленнее GTX 1070. Я не добавлял R7 5800X3D в сравнение ибо это было просто моё наблюдение без фиксации результатов.
-
--
---
Заключение
Вот так моя работа над сборками позволила легко провести сравнительное тестирование с двумя разными системами, а всё благодаря тому, что моя сборка портативная и независимая от доступа к интернету, её можно скопировать даже на флешку и прямо с неё запускать хоть на десятке разных ПК под управлением Microsoft Windows.
Ну а фанатики Linux так и будут свои любимые дистрибутивы топить в болоте зависимостей и орать что все вокруг глупые вендусятники ничего не понимают в линуксах...
Конечно, у моих сборок есть некоторые недостатки, например зависимость от браузера нужно ещё устранить, "линуксоидные" разработчики так сильно загадили всё зависимостями, что я уже больше месяца работаю чтобы всё привести в адекватное состояние, чтобы приложением можно было наконец нормально воспользоваться "из коробки" где угодно, это даже забавно.
Ну да ладно, пожалуй завершу текущую статью на этом, и можно будет приступать ко второй версии сборки где я уже устраняю одну противную зависимость, зависимость от браузера в системе пользователя и некоторые другие нюансы...
Благодарю за внимание, больше интересных статей в блоге Hard-Workshop.
А почему не Linux?
Лента материалов
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Комментарии Правила