AI-генерация картинок на CPU: мой опыт настройки ComfyUI без видеокарты
Когда я затевал эту авантюру, я наивно полагал, что достаточно воткнуть видеокарту в сервер, установить драйверы — и понеслась. 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.
Как это работает:
- На странице есть форма с шорткодом
[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 недельных копии. Мало ли я что-то сломаю очередным экспериментом — всегда можно откатиться.
Что в итоге?
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 минут над каждой картинкой — так это даже уютно, есть время сформулировать промпт поточнее. Автоматическая генерация иллюстраций — это не только удобство, но и уникальность контента: каждая картинка создаётся специально под статью. Если у вас есть вопросы или вы тоже через это проходили — пишите в комментариях, обсудим.