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 минут над каждой картинкой — так это даже уютно, есть время сформулировать промпт поточнее.

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

Комментарии

  • Поставил твой плагин ai-image-generator на свой WP. Работает! Правда генерация долгая, но для меня 1 картинка в 2 минуты — норм.

  • Dreamshaper 8 — хорошая модель, но для реалистичных картинок я предпочитаю Realistic Vision. На CPU разница не такая большая, но качество заметно выше.

  • Подскажи, а пробовал ли ты запускать ComfyUI через Docker с пробросом RAM диска? Говорят, это ускоряет генерацию на CPU процентов на 15-20.

  • Советую попробовать LCM-LoRA модели — они на CPU генерируют за 4-5 шагов вместо 20. Разница в скорости раз в 5.

  • А сервер какой используешь? Выделенка или VPS? Ждём продолжение цикла!

  • Не думал что так просто. Оказывается я переусложнял. Может сделаешь скриншоты для наглядности?

  • У меня тоже RX 580 лежит без дела, хотел для Stable Diffusion приспособить. Но читая твой опыт про ROCm на Proxmox — пожалуй, не буду заморачиваться. Проще CPU оставить. Сколько времени одна картинка генерируется на твоём сервере?

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

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