Stable Diffusion на VPS с GPU
Stable Diffusion — open-source модель генерации изображений. Для комфортной работы нужна GPU-нода с NVIDIA VRAM от 6 ГБ. CPU-генерация работает, но занимает 5-15 минут на изображение.
Требования к серверу
- GPU VPS: NVIDIA RTX 3060/3080 (8+ ГБ VRAM) или RunPod/Vast.ai
- RAM: 16 ГБ минимум, Диск: 50+ ГБ
- ОС: Ubuntu 22.04
Установка AUTOMATIC1111
apt update && apt install -y wget git python3 python3-pip python3-venv libgl1 libglib2.0-0
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
cd stable-diffusion-webui
# Скачать модель SDXL
cd models/Stable-diffusion
wget https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors
cd ../..
./webui.sh --api --listen --port 7860 Systemd сервис
[Unit]
Description=Stable Diffusion WebUI
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/stable-diffusion-webui
ExecStart=/opt/stable-diffusion-webui/webui.sh --api --listen --port 7860
Restart=on-failure
[Install]
WantedBy=multi-user.target API: генерация через Python
import requests, base64
def generate_image(prompt: str, steps: int = 20) -> bytes:
payload = {
"prompt": prompt,
"negative_prompt": "blurry, low quality",
"steps": steps,
"width": 512,
"height": 512,
"cfg_scale": 7,
"sampler_name": "DPM++ 2M Karras"
}
r = requests.post("http://localhost:7860/sdapi/v1/txt2img", json=payload)
return base64.b64decode(r.json()["images"][0])
img = generate_image("professional server photo, dark background, 4k")
with open("output.png", "wb") as f:
f.write(img) Частые ошибки при запуске
Почти все проблемы с локальным Stable Diffusion сводятся к нехватке VRAM или неверно установленным драйверам CUDA — сама модель редко бывает источником сбоя.
CUDA out of memory. Tried to allocate ... GiB
Ошибка означает, что видеопамяти не хватило на выбранное разрешение, размер батча или конкретную модель. Уменьшите width/height, добавьте флаг --medvram или --lowvram при запуске webui.sh, либо закройте другие процессы, занимающие GPU (проверьте через nvidia-smi).
RuntimeError: Torch is not able to use GPU
Веб-интерфейс запустился, но не видит видеокарту. Обычно причина — несовпадение версии CUDA, под которую собран PyTorch, и версии драйвера NVIDIA на сервере. Проверьте вывод nvidia-smi и убедитесь, что версия драйвера поддерживает версию CUDA toolkit, указанную в requirements проекта.
AUTOMATIC1111, ComfyUI и InvokeAI: что выбрать
| Критерий | AUTOMATIC1111 | ComfyUI | InvokeAI |
|---|---|---|---|
| Интерфейс | Формы и вкладки | Визуальный граф нод | Формы, ближе к продукту |
| Гибкость пайплайна | Средняя, через расширения | Максимальная, каждый узел настраивается | Средняя, фокус на удобстве |
| Порог входа | Низкий | Выше, нужно понимать граф | Низкий |
| REST API "из коробки" | Есть, через --api | Есть, но формат сложнее | Есть |
Когда Stable Diffusion на VPS не подходит
- Нужны единичные генерации от случая к случаю — аренда почасового GPU у облачных провайдеров обойдётся дешевле постоянно арендованного сервера.
- Требуется гарантированная задержка в единицы секунд при высокой нагрузке — под пиковые нагрузки нужен пул GPU, а не одна карта.
- Команда не готова обслуживать драйверы CUDA и следить за совместимостью версий PyTorch — managed-сервисы снимают эту нагрузку.
- Бюджет не покрывает GPU-сервер даже с почасовой арендой — на CPU генерация одного изображения занимает минуты, что не подходит для интерактивных сценариев.
Проверка, что генерация работает
curl http://localhost:7860/sdapi/v1/options
nvidia-smi --query-gpu=memory.used,memory.total --format=csv Первая команда должна вернуть JSON с текущими настройками WebUI — если приходит ошибка соединения, сервис не запущен или порт закрыт. Вторая показывает, сколько видеопамяти реально занято: значение, близкое к общему объёму сразу после старта без единого запроса, обычно означает, что модель загрузилась некорректно или зависла на предыдущей генерации.
Отдельно стоит заложить время на первый прогон: при первом запросе после старта WebUI модель загружается в память с диска, и это может занять заметно больше времени, чем сама генерация изображения. Если сервис перезапускается по расписанию или после сбоя, первый пользовательский запрос после рестарта будет медленным — это нормально и не означает поломку, но стоит предупредить пользователей интерфейса или сделать прогрев модели отдельным запросом сразу после старта сервиса.