Почему платить за Midjourney, если можно собрать свою студию за вечер?
Признайся: тебе надоело каждый месяц платить $10-30 за подписку, получать цензуру промптов и ждать, пока нейросеть сгенерирует "не то"? Я тоже через это прошёл. Решение — собрать локальную SD Studio с LLM-помощником. И да, это реально даже на одной видеокарте, если не пытаться запустить всё сразу в максимальном разрешении.
Суть простая: LLM (например, Llama 4 или Qwen 2.5) берёт на себя мозги — переписывает твой корявый запрос в профессиональный промпт для Stable Diffusion, добавляет LoRA-триггеры, подбирает параметры. Ты только говоришь „нарисуй киберпанк-кота в стиле аниме“, а LLM уже разворачивает это в полноценный промпт с референсами на художников и техниками. Дальше — Automatic1111 или Forge, и готово. Без интернета, без цензуры, без доплат.
Важно: на 2026 год это не хак, а полноценный рабочий пайплайн. Модели SDXL и SD3 (через Stable Diffusion WebUI Forge) работают стабильно, LLM-квантизации помещаются в 6-12 ГБ VRAM, а инструменты интеграции уже не требуют танцев с бубном. Но если у тебя видеокарта с 4 ГБ — сначала прочти этот гайд.
Что будем собирать? (И почему это не pet-проект, а рабочий инструмент)
Представь студию, где есть два движка:
- Stable Diffusion — графический движок. Берёт промпт, рисует картинку. Мы используем Automatic1111 WebUI (или Forge), ControlNet, LoRA.
- LLM — текстовый движок. Превращает "кота" в "a cyberpunk cat with neon stripes, futuristic Tokyo street at night, detailed fur, volumetric lighting, style of Makoto Shinkai".
Связка простая: пользовательский запрос → LLM (локально через Ollama или llama.cpp) → улучшенный промпт → SD WebUI (через REST API) → готовое изображение. Всё на одной машине, на одной видеокарте, без облаков.
Такой пайплайн решает проблему дорогих сервисов: за стоимость месяца Midjourney ты получаешь бесконечные генерации, полный контроль над LoRA и возможность кастомизировать модели под свой стиль. А LLM-помощник ещё и учится на твоих промптах — со временем он будет выдавать то, что нужно, с первой попытки.
Железо: с чем можно жить, а с чем — не стоит
На 2026 год минимальный комфортный порог — видеокарта с 12 ГБ VRAM. Это позволяет одновременно держать в памяти SDXL-модель (6-7 ГБ) и LLM-квантизацию на 4-5 ГБ. Если у тебя 8 ГБ — придётся экономить: запускать последовательно, выгружать LLM из памяти перед генерацией, использовать лёгкие модели вроде SD 1.5 или TinySD. С 16 ГБ и больше живёшь припеваючи.
- RTX 5060 Ti 16GB — отличный бюджетный вариант, хватит и на SD, и на LLM 7B.
- RTX 3090 / 4090 — золотой стандарт: 24 ГБ позволяют держать обе модели постоянно в памяти.
- RTX 3060 12GB — тоже можно, но придётся заморачиваться с offloading. См. статью про 3×RTX 3090, если хочешь экстрима.
Общее правило: для LLM лучше брать квантизацию Q4_K_M — компромисс между качеством и размером. Для SD — модель SDXL (или SD3, если карта позволяет). LoRA весят по 50-100 МБ — их можно подгружать динамически.
Шаг 1: Установка Stable Diffusion WebUI
Не советую тратить время на кастомные сборки — бери Automatic1111 WebUI или Forge. На май 2026 Forge стабильнее поддерживает SD3 и ControlNet, но Automatic1111 всё ещё актуален. Установка в две команды:
# Установка Automatic1111 (Linux)
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
cd stable-diffusion-webui
./webui.sh --xformers --api
Флаг --api обязателен — через него мы будем слать промпты из LLM. На Windows запускай webui-user.bat, предварительно добавив --api в переменную COMMANDLINE_ARGS.
Ошибка новичка: забыть установить ControlNet. Поставь через Extensions → Available → поищи "sd-webui-controlnet". Он нужен, чтобы LLM могла задавать позы и композицию через OpenPose или Canny. Без него управлять генерацией сложнее.
Качаем модель: sd_xl_base_1.0.safetensors (или любую другую) и кладём в models/Stable-diffusion/. Для LoRA — в models/Lora/.
Шаг 2: Установка локального LLM (через Ollama)
Самый быстрый способ получить локальный текстовый движок — Ollama. Он под капотом использует llama.cpp, но даёт простой REST API. Установка:
# Linux/macOS
curl -fsSL https://ollama.com/install.sh | sh
# Windows — скачать exe с официального сайта
Качаем модель. Для видеокарты 12-16ГБ рекомендую Llama 4 7B Q4_K_M (около 4,5 ГБ) или Qwen 2.5 7B Q4_K_M. Они отлично справляются с написанием промптов. Если карта 24ГБ, можно взять Llama 4 70B Q3_K_M — качество выше, но и VRAM съест ~20 ГБ.
ollama pull llama4:7b-q4_K_M
# или qwen2.5:7b-q4_K_M
Проверяем, что работает: ollama serve (демон запущен по умолчанию). Теперь к нему можно обращаться через http://localhost:11434.
Сравнение Ollama vs llama.cpp — читай этот обзор. Для нашей задачи разницы почти нет, но Ollama удобнее для старта.
Шаг 3: Пишем скрипт-интегратор (Python)
Вот где начинается магия. Скрипт принимает текст от пользователя, отправляет его LLM, получает промпт и шлёт его в Automatic1111 на генерацию. Я написал минимальную версию — ты легко допилишь под себя.
import requests
import json
# Настройки
SD_URL = "http://127.0.0.1:7860/sdapi/v1/txt2img"
OLLAMA_URL = "http://localhost:11434/api/generate"
MODEL = "llama4:7b-q4_K_M"
def enhance_prompt(user_input: str) -> str:
prompt_template = f"""
Ты — эксперт по промптам для Stable Diffusion. Улучши запрос пользователя, добавь детали: освещение, стиль, цвета, технику. Используй английский язык. Ответь только готовым промптом, без пояснений.
Запрос: {user_input}
"""
payload = {
"model": MODEL,
"prompt": prompt_template,
"stream": False,
"options": {"num_predict": 256, "temperature": 0.7}
}
resp = requests.post(OLLAMA_URL, json=payload)
return resp.json()["response"].strip()
def generate_image(prompt: str, negative: str = "blurry, ugly, watermark") -> str:
payload = {
"prompt": prompt,
"negative_prompt": negative,
"steps": 25,
"width": 768,
"height": 768,
"sampler_name": "Euler a",
"cfg_scale": 7,
}
resp = requests.post(SD_URL, json=payload)
return resp.json()["images"][0] # base64
# Использование
if __name__ == "__main__":
user_text = input("Что нарисуем? ")
enhanced = enhance_prompt(user_text)
print(f"Сгенерированный промпт:\n{enhanced}")
img_b64 = generate_image(enhanced)
# Сохраняем как PNG
import base64
with open("output.png", "wb") as f:
f.write(base64.b64decode(img_b64))
print("Готово! output.png")
Запускаешь, вводишь "дракон на закате", получаешь километровый промпт и картинку. Можно добавить LoRA — для этого в payload SD допиши "alwayson_scripts": {"Lora": {"args": ["имя_лоры:1.0"]}}.
Типичная проблема: VRAM не хватает, и SD падает с OutOfMemory. Решение — выгружать LLM перед генерацией, если они запущены на одной карте. В скрипте можно добавить: requests.post("http://localhost:11434/api/generate", json={"model": MODEL, "keep_alive": 0}), чтобы освободить память.
Прокачка: ControlNet и мульти-LLM
Базовый пайплайн — это только начало. Попробуй:
- Использовать LLM для генерации негативного промпта — отдельным запросом. Я делаю два параллельных вызова: один для позитива, другой для "чего избегать".
- Добавить ControlNet через промпт: LLM описывает позу, а скрипт генерирует OpenPose-скелет через Python (библиотеки типа
controlnet_aux), и подкладывает его как вход ControlNet. - Подключать две модели LLM: маленькую (3B) для быстрых черновиков промпта, потом большую (70B) для рефайна. Это ускоряет работу — читай статью про две карты, если хочешь распределить нагрузку.
Автоматизация: когда лень вводить текст
Можно сделать веб-интерфейс на Flask или FastAPI, который будет принимать запросы из браузера. Или прикрутить Telegram-бота. LLM будет работать как ассистент: ты пишешь "киберпанк, дождь, неон", а бот возвращает картинку. Код — тот же, только заворачиваешь в loop с очередью.
Для полной автоматизации можно дать LLM доступ к списку твоих LoRA. Например, скормить ей YAML-файл с описаниями LoRA, и пусть сама решает, что применить. Я использую LLM Tool Calling (поддерживается в Ollama): LLM возвращает JSON с параметрами, а скрипт его парсит.
Типичные грабли и как их обойти (FAQ style)
| Проблема | Причина | Решение |
|---|---|---|
| LLM пишет промпт на русском | Модель не понимает инструкцию | Уточни в системном промпте: "Только английский" |
| SD падает при генерации | Не хватает VRAM | Добавь выгрузку LLM перед запросом к SD |
| Промпты получаются шаблонными | LLM не креативна, temperature низкая | Подними temperature до 0.9-1.2, добавь в промпт "be creative, use unexpected combinations" |
| Не работает ControlNet | Не установлены модели ControlNet или preprocessor | Скачай модели с Hugging Face (control_v11p_sd15_openpose), положи в models/ControlNet |
Бонус: как запустить всё на одной видеокарте, если она не монстр (6-8 ГБ)
Да, это возможно. Хотя лучше сначала прочитать гайд по минимальным требованиям VRAM, лайфхак такой: используй SD 1.5 (весит ~2 ГБ) и LLM модель 3B (квантизация Q4 ~2 ГБ). В сумме 4-5 ГБ, остаётся запас. Запускай SD WebUI с флагом --medvram или --lowvram. LLM запускай с num_gpu_layers не 100, а 20 — часть слоёв оставить на CPU. Скорость упадёт, но работать будет.
Альтернатива — не держать LLM постоянно в памяти. Поднимай её по запросу через Ollama (он сам грузит/выгружает). Но тогда каждый запрос будет долгим (первый запуск модели занимает несколько секунд).
Если хочешь собрать полноценную станцию с нуля — тебе сюда: гайд по мощной станции за $15k. Но для старта хватит RTX 5060 Ti и немного терпения.