mysurik.ru

AI-генерация картинок на CPU: мой опыт настройки ComfyUI без видеокарты

Theme CSS Fix

Когда я затевал эту авантюру, я наивно полагал, что достаточно воткнуть видеокарту в сервер, установить драйверы — и понеслась. Spoiler: понеслась, но совсем не туда.

Как всё начиналось

В моём распоряжении был Proxmox-сервер и старенькая AMD RX 580, которая пылилась в шкафу. Я рассудил: «Ну, RX 580 — это же вполне себе карта, ROCm должен работать, тем более есть кастомные сборки для gfx803».

Спойлер: нет, не должен.

Неделя ада с ROCm

Началось всё с того, что официальный ROCm от AMD просто отказался видеть мою карту — gfx803 (она же Polaris) давно в legacy. Ладно, думаю, есть же энтузиасты, которые собирают образы для старых карт.

Я перепробовал всё:

  • Официальный ROCm — карта не детектится, обидно
  • Кастомные образы с rocm612-torch24 — GPU виден, но генерация виснет намертво без внятной ошибки
  • woodrex/rocm612-torch24-gfx803 с нативным gfx803 — вот это был мой главный лучик надежды. Образ нашёл карту, torch говорил «CUDA available: False, ROCm available: True», я уже потирал руки… и генерация снова висла на KSampler
  • Ещё штук 5 разных образов — результат тот же: GPU виден, картинки нет

Каждый раз — missing HIP/rocBLAS kernels. Я гуглил, лез в исходники, пробовал собирать из сорцов. В какой-то момент поймал себя на мысли, что провожу вечера не за генерацией картинок, а за отладкой ROCm. Это было не то, ради чего я затевал всю эту историю.

Решение, которое лежало на поверхности

После недели танцев с бубном я решил попробовать CPU-режим. Просто чтобы убедиться, что с ComfyUI всё в порядке, а проблема именно в сROCm.

И — о чудо! — ComfyUI запустился, промпт обработался, и через пару минут я увидел первую сгенерированную картинку. Да, ждать пришлось долго. Да, качество на 10 шагах было так себе. НО ЭТО РАБОТАЛО.

И тут я понял: а может, мне и не нужна видеокарта? Для моих задач — генерация иллюстраций к статьям в блоге — скорость не критична. Я могу запустить генерацию, пойти пить кофе, а через 5-10 минут получить результат.

Собираем Docker-образ для CPU

Я собрал образ на минималистичном python:3.10-slim. Почему slim, а не alpine? С alpine вечно проблемы с wheel-пакетами для PyTorch, не хотелось изобретать велосипед.

FROM python:3.10-slim
RUN apt update && apt install -y git && rm -rf /var/lib/apt/lists/*
RUN git clone https://github.com/comfyanonymous/ComfyUI.git /app/comfyui
WORKDIR /app/comfyui
RUN pip install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
RUN pip install --no-cache-dir -r requirements.txt
CMD ["python", "main.py", "--listen", "0.0.0.0", "--port", "8188"]

Кстати, важный момент: ComfyUI из коробки пытается найти CUDA или ROCm и падает, если не находит. Пришлось пропатчить model_management.py — буквально 5 строк кода в начале файла, которые форсят CPU-режим, если нет доступного GPU. Если кому нужно — пишите в комментариях, выложу патч.

Модель я выбрал Dreamshaper 8 (SD 1.5, ~2.1 ГБ). Она хорошо держит промпты и даёт приятный результат даже на небольших разрешениях.

А как быстро оно хотя бы?

Давайте честно: быстро — это не про CPU. Мои замеры:

Разрешение Скорость 10 шагов
320×320 ~6 сек/шаг ~1 минута
512×512 ~15 сек/шаг ~2.5 минуты
768×768 ~35 сек/шаг ~6 минут
1024×1024 ~60 сек/шаг ~10 минут

Но! Для блога иллюстрации 512×512 в 10 шагов — самое то. Финальная картинка выходит нормального качества, а ждать 2.5 минуты вполне реально. Я запускаю генерацию, проверяю почту — и готово.

Кстати, вот пример того, что получается (эту картинку сгенерировал как раз на CPU):

Интегрируем с WordPress

Дальше нужно было как-то подружить ComfyUI с моим блогом на WordPress. Я написал небольшой плагин — ai-image-generator.

Как это работает:

  1. На странице есть форма с шорткодом [ai_image_generator]
  2. Вы вводите промпт, выбираете размер и количество шагов
  3. Запрос улетает на POST /prompt моего ComfyUI (кстати, в v0.25.0 эндпоинт изменился, старый /queue больше не работает — я на этом потерял полдня)
  4. Фронтенд каждую секунду проверяет статус через /history/{prompt_id}
  5. Как только картинка готова — она автоматом загружается в медиатеку WordPress

Таймаут я выставил 10 минут — чтобы даже самые тяжелые генерации успевали. Обычно хватает с запасом.

Технические детали для тех, кому интересно

Пару слов об инфраструктуре. Всё это хозяйство крутится на Proxmox:

  • Веб-сервер (Ubuntu 24.04, 8 ГБ ОЗУ, nginx/FastPanel)
  • Там же крутится WordPress с плагином
  • ComfyUI — в Docker на том же сервере в Docker, порт 8188
  • Плагин шлёт запросы на localhost:8188

И да, я настроил бекапы. Мало ли что. Ежедневно в 2 часа ночи, snapshot-режим (без остановки VM), сжатие zstd. Хранятся 7 ежедневных + 4 недельных копии. Мало ли я что-то сломаю очередным экспериментом — всегда можно откатиться.

Что в итоге?

CPU-генерация — это не серебряная пуля. Но если у вас завалялся сервер с процессором и нет видеокарты — не отчаивайтесь. Рабочее решение есть, оно просто требует терпения.

Плюсы, которые я для себя отметил:

  • Не нужно покупать GPU (они сейчас дорогие)
  • Меньше энергопотребления
  • Проще в настройке (когда прошёл через ROCm-ад)
  • Можно запускать на старых серверах

Минусы:

  • Медленно (но если не на скорость — норм)
  • Высокая загрузка CPU на время генерации
  • Не подойдёт, если нужно генерировать пачками

Лично я результатом доволен. Теперь у моего блога есть свой AI-генератор картинок, который работает 24/7 и не просит новую видеокарту. А то, что он думает 5 минут над каждой картинкой — так это даже уютно, есть время сформулировать промпт поточнее.

Если у вас есть вопросы или вы тоже через это проходили — пишите в комментариях, обсудим.

Расширю рассказ о настройке ComfyUI на сервере без видеокарты дополнительными деталями. Когда я затевал эту авантюру, я наивно полагал, что достаточно воткнуть видеокарту в сервер, установить драйверы — и понеслась. Spoiler: понеслась, но совсем не туда. Как всё начиналось. В моём распоряжении был Proxmox-сервер и старенькая AMD RX 580, которая пылилась в шкафу. Я рассудил: «Ну, RX 580 — это же вполне себе карта, ROCm должен работать, тем более есть кастомные сборки для gfx803». Спойлер: нет, не должен. Идея была простая: где-то расположить сервер генерации изображений, чтобы иллюстрации для статей блога создавались автоматически. Поиск в интернете сразу указал на ComfyUI — мощный нодовый интерфейс для нейросетей, работающий поверх PyTorch. RX 580 казалась подходящей кандидатурой: поддержка AMD, приличная память, огромное сообщество. Оставалась одна проблема — заставить это работать под Linux.

Неделя ада с ROCm. Началось всё с того, что официальный ROCm от AMD просто отказался видеть мою карту — gfx803 (она же Polaris) давно в legacy. Ладно, думаю, есть же энтузиасты, которые собирают образы для старых карт. Я перепробовал всё: Официальный ROCm — карта не детектится, обидно. Кастомные образы с rocm612-torch24 — GPU виден, но генерация виснет намертво без внятной ошибки. woodrex/rocm612-torch24-gfx803 с нативным gfx803 — вот это был мой главный лучик надежды. Образ нашёл карту, torch говорил «CUDA available: False, ROCm available: True», я уже потирал руки… и генерация снова висла на KSampler. Ещё штук 5 разных образов — результат тот же: GPU виден, картинки нет. Каждый раз — missing HIP/rocBLAS kernels. Я гуглил, лез в исходники, пробовал собирать из сорцов. ROCm для старых карт — это минное поле: поддержка gfx803 убита ещё в пятой версии, а старые сборки конфликтуют с современными библиотеками. В какой-то момент поймал себя на мысли, что провожу вечера не за генерацией картинок, а за отладкой ROCm. Это было не то, ради чего я затевал всю эту историю. Неделя отладки показала главное: если карта ушла в legacy, бороться с драйверами — это тупик. Потраченные вечера, бесконечные логи, пересборки. Выход должен был быть проще.

Решение, которое лежало на поверхности. После недели танцев с бубном я решил попробовать CPU-режим. Просто чтобы убедиться, что с ComfyUI всё в порядке, а проблема именно в сROCm. И — о чудо! — ComfyUI запустился, промпт обработался, и через пару минут я увидел первую сгенерированную картинку. Да, ждать пришлось долго. Да, качество на 10 шагах было так себе. НО ЭТО РАБОТАЛО. И тут я понял: а может, мне и не нужна видеокарта? Для моих задач — генерация иллюстраций к статьям в блоге — скорость не критична. Я могу запустить генерацию, пойти пить кофе, а через 5-10 минут получить результат. Ключевой инсайт был в том, что задачи у меня не требующие скорости. Иллюстрации к статьям — это не хайповая генерация на потоке. Несколько картинок в день — и CPU-режим справляется на ура. Если бы я генерировал потоковое видео или сотни промптов в час — тогда macOS с GPU обязательна. Но для блога — идеальный баланс. Первый успех на CPU вернул веру в затею. Всё, что нужно было — это правильный подход.

Собираем Docker-образ для CPU. Я собрал образ на минималистичном python:3.10-slim. Почему slim, а не alpine? С alpine вечно проблемы с wheel-пакетами для PyTorch, не хотелось изобретать велосипед. Выбор базы образа — это первый шаг. python:3.10-slim — компактный, но с полноценной системой. Alpine экономит место, но PyTorch не всегда имеет готовые пакеты для неё. Для стабильности выбрал slim. FROM python:3.10-slim, RUN apt update && apt install -y git && rm -rf /var/lib/apt/lists/*, RUN git clone https://github.com/comfyanonymous/ComfyUI.git /app/comfyui, WORKDIR /app/comfyui, RUN pip install —no-cache-dir torch torchvision torchaudio —index-url https://download.pytorch.org/whl/cpu, RUN pip install —no-cache-dir -r requirements.txt, CMD [«python», «main.py», «—listen», «0.0.0.0», «—port», «8188»]. Ключевой момент — установка torch из CPU-репозитория: —index-url https://download.pytorch.org/whl/cpu. Это даёт сборку PyTorch, которая полностью работает на процессоре без видеокарты. Кстати, важный момент: ComfyUI из коробки пытается найти CUDA или ROCm и падает, если не находит. Пришлось пропатчить model_management.py — буквально 5 строк кода в начале файла, которые форсят CPU-режим, если нет доступного GPU. Если кому нужно — пишите в комментариях, выложу патч. Патч — это маленькая правка, которая экономит часы поиска. Модель я выбрал Dreamshaper 8 (SD 1.5, ~2.1 ГБ). Она хорошо держит промпты и даёт приятный результат даже на небольших разрешениях. Выбор модели — это половина успеха. Dreamshaper 8 — проверенная модель на базе SD 1.5: стабильная, хорошо держит промпт, качественно рисует иллюстрации. Модель небольшая — её можно использовать на сервере без проблем. А как быстро оно хотя бы? Давайте честно: быстро — это не про CPU.

Мои замеры: 320×320 — ~6 сек/шаг, 10 шагов ~1 минута; 512×512 — ~15 сек/шаг, 10 шагов ~2.5 минуты; 768×768 — ~35 сек/шаг, 10 шагов ~6 минут; 1024×1024 — ~60 сек/шаг, 10 шагов ~10 минут. Но! Для блога иллюстрации 512×512 в 10 шагов — самое то. Финальная картинка выходит нормального качества, а ждать 2.5 минуты вполне реально. Я запускаю генерацию, проверяю почту — и готово. Скорость CPU-генерации — это вопрос терпения. Важно подобрать оптимальное разрешение и число шагов. Для блога 512×512 на 10 шагах — золотая середина: приемлемое качество и разумное время ожидания. Процесс стал для меня даже релаксацией: отправил промпт, налил кофе, вернулся к готовому результату.

Интегрируем с WordPress. Дальше нужно было как-то подружить ComfyUI с моим блогом на WordPress. Я написал небольшой плагин — ai-image-generator. Как это работает: На странице есть форма с шорткодом [ai_image_generator]. Вы вводите промпт, выбираете размер и количество шагов. Запрос улетает на POST /prompt моего ComfyUI (кстати, в v0.25.0 эндпоинт изменился, старый /queue больше не работает — я на этом потерял полдня). Фронтенд каждую секунду проверяет статус через /history/{prompt_id}. Как только картинка готова — она автоматом загружается в медиатеку WordPress. Таймаут я выставил 10 минут — чтобы даже самые тяжелые генерации успевали. Обычно хватает с запасом. Плагин превращает генерацию в одну кнопку: вводите промпт, ждёте, картинка сама появляется в медиатеке. Весь процесс автоматизирован. Технические детали для тех, кому интересно.

Пару слов об инфраструктуре. Всё это хозяйство крутится на Proxmox: Веб-сервер (Ubuntu 24.04, 8 ГБ ОЗУ, nginx/FastPanel). Там же крутится WordPress с плагином. ComfyUI — в Docker на том же сервере в Docker, порт 8188. Плагин шлёт запросы на localhost:8188. И да, я настроил бекапы. Мало ли что. Ежедневно в 2 часа ночи, snapshot-режим (без остановки VM), сжатие zstd. Хранятся 7 ежедневных + 4 недельных копии. Мало ли я что-то сломаю очередным экспериментом — всегда можно откатиться. Инфраструктура — это Proxmox, где всё изолировано: веб-сервер, ComfyUI в Docker, бекапы снапшотов. Снапшоты VM без остановки — это идеальная страховка от экспериментов. Что в итоге?

CPU-генерация — это не серебряная пуля. Но если у вас завалялся сервер с процессором и нет видеокарты — не отчаивайтесь. Рабочее решение есть, оно просто требует терпения. Плюсы, которые я для себя отметил: Не нужно покупать GPU (они сейчас дорогие). Меньше энергопотребления. Проще в настройке (когда прошёл через ROCm-ад). Можно запускать на старых серверах. Минусы: Медленно (но если не на скорость — норм). Высокая загрузка CPU на время генерации. Не подойдёт, если нужно генерировать пачками. Лично я результатом доволен. Теперь у моего блога есть свой AI-генератор картинок, который работает 24/7 и не просит новую видеокарту. А то, что он думает 5 минут над каждой картинкой — так это даже уютно, есть время сформулировать промпт поточнее. Автоматическая генерация иллюстраций — это не только удобство, но и уникальность контента: каждая картинка создаётся специально под статью. Если у вас есть вопросы или вы тоже через это проходили — пишите в комментариях, обсудим.

Ваш комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *