Stable Diffusion – sprawdzam wydajność kart graficznych, w generowaniu obrazów

Typowo wydajność sprawdzałbym w jakiejś nowej grze, jednak tak ostatnio wciągnąłem się w generowanie obrazów przez sieci neuronowe, że postanowiłem przeprowadzić benchmarki i na tym polu. Zatem która karta graficzna jest najwydajniejsza do Stable Diffusion?

O zaletach wykorzystania sieci neuronowej od Stability.Ai. pisałem w osobnym artykule, do którego przeczytania zachęcam. Dziś skupimy się wyłącznie na wydajności kilku kart graficznych. Sprawdzimy, czy Stable Diffusion ma naprawdę tak niskie wymagania jak chwalą się tym twórcy oprogramowania.

Wymagania sprzętowe – program tylko dla kart Nvidii?

Przeglądając wymagania sprzętowe, zwrócimy uwagę, że developrzery podają tylko niektóre parametry, które powinien mieć nasz PC. Kwestia procesora jest całkowicie pomijana, do stabilnej pracy wystarczy 8 GB RAM, choć zalecane jest 16 GB pamięci podręcznej. Największą uwagę zwraca się na kartę graficzną. Tutaj pierwsza niemiła niespodzianka. Stability.Ai zaleca układy Nvidia GeForce z przynajmniej 10 GB pamięci VRAM. Czyżby zapomniano o Radeonach i układach ARC Intela?

Cóż, Stable Diffusion w swojej oryginalnej formie korzysta do obliczeń bazujących na API Cuda. To dzięki temu właśnie w procesie generowania obrazu bierze udział karta graficzna, a nie procesor. 

Zatem posiadacze innych kart graficznych nie mogą korzystać ze Stable Diffusion? Mogą, ale muszą skorzystać z przygotowanej przez społeczność wersji bazującej na API DirectML. Cały proces instalacji został opisany w osobnym artykule.

Nie obyło się bez problemów

Pierwsze próby “zabawy” ze Stable Diffusion, rozpocząłem na prywatnym komputerze. Na moje nieszczęście jak się zaraz okaże, posiadam w nim zainstalowanego Radeona RX 7900 XTX.  O ile na co dzień karta sprawdza się znakomicie, to w przypadku generowania obrazów przez AI, nie raz powodowała moją frustrację. Wydajność nie zachwycała od początku, gdzie mogłem liczyć na jedną interakcję co 10 sekund. Tak, generowanie jednego obrazka 512 x 512 pixeli (30 kroków) trwało prawie 6 min! Okazało się jednak, że problem leżał po stronie systemu operacyjnego, a dokładniej kilku wpisów w rejestrze, które pozostały po starej karcie graficznej Nvidii. Na szczęście program Display Driver Uninstaller (DDU), był w stanie poradzić sobie z pozostałościami po driverach i “wyczyścić” Windowsa.

Ponowna instalacja oprogramowania Stable Diffusion w wersji DirectML, przyniosła znaczący wzrost wydajności. Teraz zamiast 6 min jeden obraz generuje się ok. 10-12 sekund. Niestety wersja WebUi od lshqqytiger, z której korzystam, cierpi na problem z “zapychającą” się pamięcią VRAM. Oznacza to konieczność resetowania programu po każdym wygenerowanym zestawie obrazów.

Nie udało mi się również uruchomić backendu Olive DirectML, który to bazuje na rozwiązaniu ONYX. Dzięki niemu, teoretycznie posiadany przeze mnie  RX 7900 XTX, powinien osiągnąć wydajność nawet 20 interakcji na sekundę. Niestety, nigdy nie byłem programistą i wyświetlane kody błędów Python, niewiele mi mówią. Jednak nie mam zamiaru się poddawać w tej kwestii. W przypadku sukcesu na pewno Was poinformuje w osobnym artykule.

Wydajność

Wszystkie testy zostały przeprowadzone na redakcyjnej platformie testowej:

  • PROCESOR: INTEL CORE i9-12900K
  • PŁYTA GŁÓWNA: Gigabyte Z690 Aorus Pro 
  • RAM: G.Skill Trident Z5 DDR5 6800 Mhz CL34
  • DYSK: WD Black SN850X, Kingston Fury Renegade 2 TB   
  • ZASILACZ: be quiet! Dark Power PRO 12 1500W 80+ Titatnium
  • CHŁODZENIE: Custom LC 360 mm RAD

Po raz kolejny sięgnąłem po redakcyjny zestaw kart graficznych, w których skład wchodziły dwa leciwe już GTX – 1660 Super oraz 1080 Ti, trzy RTX – 4070, 4070 Ti i 4080. Na wykresach znajdzie również wynik osiągnięty przez RX 7900 XTX.

Procedura testowa wyglądała następująco. Na każdej karcie graficznej ustawiłem do wygenerowania obraz według tego samego opisu, korzystając z tego samego modelu (checkpoint). Na potrzeby testu postanowiłem podnieść rozdzielczość do 768 x 512, dzięki temu uzyskujemy typowe fotograficzne proporcje 3:2. Jednorazowo program generował 4 różne grafiki w 30 krokach.

Cóż jak widać po powyższym wykresie karta od AMD, na domyślnych ustawieniach w Stable Diffusion nie szans na dogonienie RTX serii 4000. Nawet GTX 1080 Ti radzi sobie całkiem nieźle. Co prawda jest dwukrotnie wolniejszy od RX 7900 XTX, jednak pamiętajmy, że mówimy tutaj o konstrukcji, która ma już ponad 6 lat. Przykład ten dobitnie pokazuje jak dobrze Stable Diffusion jest zoptymalizowany pod kątem kart Nvidii. 

Poniżej kilka wygenerowanych obrazów przez AI:

8k, RAW photo, best quality, masterpiece:1.2), (realistic, photo-realistic:1.37), octane render, ultra high res, ultra-detailed , professional lighting, photon mapping, radiosity, physically-based rendering, ue5, ((island sanctuary)), ((ancient fallen kingdom)), ((reflections in water)), ((raytracing)), ((drowned city))

Jedyną kartą, która nie poradziła sobie z Stable Diffusion był GTX 1660 Super. Niestety 6 GB pamięci VRAM to za mało, nawet gdy włączyłem optymalizację XFORMERS. Na chwilę obecną wydaje się, że karty od “zielonych” lepiej radzą sobie z generowaniem obrazów na naszych PC. To w ich przypadków napotkamy znacznie mniej problemów czy błędów. Dodatkowo w przypadku konstrukcji RTX możemy wykorzystać do generowania rdzenie Tensor, co również powinno znacząco przyspieszyć cały proces. Na pewno przetestuje i ten wariant w wolnej chwili i opiszę całość w osobnym artykule.