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 минут над каждой картинкой — так это даже уютно, есть время сформулировать промпт поточнее.
Если у вас есть вопросы или вы тоже через это проходили — пишите в комментариях, обсудим.
Не думал что так просто. Оказывается я переусложнял.
Давно искал подобный разбор. Всё чётко.
Согласен с автором. Подскажи плагин для такого же эффекта
Золотые слова. Сколько оперативки нужно?
Поставил твой плагин 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 оставить. Сколько времени одна картинка генерируется на твоём сервере?