# LLM рядом со SwarmUI (opt-in) По умолчанию поднимается **только SwarmUI**. Ollama или llama.cpp — отдельно (помощь с промптами и т.п.). Интерактивные вопросы — **нумерованные меню** (Enter = вариант со ←). Ключ словом (`recommended`, `keep`) тоже принимается. Три стека на GPU: | # | стек | смысл | | --- | --- | --- | | 1 | SwarmUI | только генерация картинок | | 2 | SwarmUI + LLM | UI + Ollama/llama.cpp на той же карте | | 3 | только LLM | **без** SwarmUI — Ollama или llama.cpp | Флаги: `up --yes --llm-only --llamacpp` / `--no-swarm --ollama`. Vars: `ENABLE_SWARMUI=false` или `WORKLOAD=llm`. --- ## Быстрый путь ### A — wizard ```text gpu-rent setup ``` Меню: runtime → пресет моделей → опционально local-watchdog. Пишет `LLM_RUNTIME` в `gpu-rent.vars`. ### B — флаг на `up` ```text gpu-rent up --yes --ollama gpu-rent up --yes --llm llamacpp gpu-rent up --yes --llm-only --llamacpp # без SwarmUI ``` С `--yes` пресеты не спрашивает (берёт существующий yaml / example). ### C — vars вручную ```env LLM_RUNTIME=ollama ``` Потом `gpu-rent up --yes`. Выключить: `LLM_RUNTIME=none` (на `up` старые unit’ы `gpu-rent-ollama` / `gpu-rent-llamacpp` останавливаются). Голый `gpu-rent` без args — **help**. Двойной клик: `GPU_RENT_DEFAULT_ARGS=up --yes`. Полный doctor на up: `up -v`. --- ## Порты (loopback + туннель) | Сервис | На VM | На ноутбуке | | --- | --- | --- | | SwarmUI | 7801 | **17801** | | Ollama | 11434 | **17811** | | llama.cpp | 8080 | **17812** | ```text gpu-rent tunnel gpu-rent open --llm ``` ```powershell $env:OLLAMA_HOST = "http://127.0.0.1:17811" ``` После `up`/`tunnel` — access-card с URL и MCP-сниппетом. --- ## Ollama | Файл | Роль | | --- | --- | | `ollama-models.example.yaml` | шаблон в git | | `ollama-models.yaml` | список тегов (gitignore); лаунчер копирует example при отсутствии | На `up` — `ollama pull` по списку. Точные теги: уже есть `foo:7b` ≠ skip для `foo:3b`. Лишнее на диске не удаляет. ### Пресеты (меню) | # | ключ | tag / смысл | | --- | --- | --- | | 1 | **recommended** | `huihui_ai/qwen2.5-vl-abliterated:7b` — vision+RU, ~6 GB | | 2 | light | VL 3B abliterate (~3 GB) | | 3 | text | text-only `qwen2.5-abliterate:7b` | | 4 | stock | `qwen2.5:7b` | | 5 | alt | другой text abliterate 7B | | 6 | empty | только runtime | | — | keep | не трогать yaml (если уже спросили повторно) | `default: true` в yaml — preferred в логе; pull идёт по всему списку. --- ## Автотюнинг Ollama Unit `gpu-rent-ollama` читает `/mnt/swarm_data/.gpu-rent-gpu.json`: | Tier (VRAM) | Flash Attn | KEEP_ALIVE | KV cache | GPU_OVERHEAD | | --- | --- | --- | --- | --- | | low (<16 GiB) | off | 2m | q4_0 | 6 GiB | | mid (16–23) | on* | 5m | q8_0 | 10 GiB | | high (24–47) | on* | 15m | q8_0 | 14 GiB | | ultra (≥48) | on* | 30m | q8_0 | 20 GiB | \*Flash на Ampere+ (compute ≥ 8.0). `NUM_PARALLEL=1`, `MAX_LOADED_MODELS=1`. Env: `/mnt/swarm_data/.gpu-rent-ollama.env`. --- ## llama.cpp | Файл | Роль | | --- | --- | | `llamacpp-models.example.yaml` | шаблон | | `llamacpp-models.yaml` | HTTPS URL на `.gguf` (gitignore) | На `up`: скачать GGUF → `/mnt/swarm_data/llamacpp/models` → `llama-server` + systemd. Уже скачанные крупные файлы не трогает. **Бинарник:** в GitHub Releases **нет** Linux CUDA — только Windows CUDA + Ubuntu CPU/Vulkan. Драйвер/CUDA runtime на VM ≠ готовый `llama-server` с CUDA: его нужно **собрать** (`nvcc`) или взять Vulkan prebuilt. Порядок по умолчанию (`LLAMACPP_BACKEND=auto`): 1. Если на VM уже есть `nvcc` (часто после прошлого `up`) → **CUDA-сборка** (тихо + heartbeat 5–15 мин). 2. Иначе → Ubuntu **Vulkan** prebuilt (~30 MB). 3. Fallback на другой путь при ошибке. Был только Vulkan-stamp, а `nvcc` появился — следующий `up` сам пересоберёт CUDA. | Var | Зачем | | --- | --- | | `LLAMACPP_BACKEND=auto\|cuda\|vulkan` | выбор пути (default auto) | | `LLAMACPP_TAG` | pin release (`b10545`) | | `LLAMACPP_ASSET_URL` + `LLAMACPP_SHA256` | свой архив | | `LLAMACPP_BUILD_CUDA=1` | форс CUDA; `=0` — никогда не собирать | | `LLAMACPP_FORCE_REINSTALL=1` | снести бинарь и поставить заново | | `LLAMACPP_NGL` / `LLAMACPP_CTX` | override GPU layers / context | | `LLAMACPP_HOST` / `LLAMACPP_PORT` | bind (default `127.0.0.1:8080`) | | `LLAMACPP_EXTRA_ARGS` | доп. флаги `llama-server` | | `OLLAMA_VERSION` / `OLLAMA_SHA256` | pin Ollama | Готовые кейсы A–H — в `gpu-rent.vars.example`. ### Пресеты (меню) | # | ключ | что | | --- | --- | --- | | 1 | **recommended** | Qwen2.5-VL 7B abliterate + mmproj (~4.7+0.8 GB, картинки+RU) | | 2 | light | Qwen2.5 3B Instruct text Q4_K_M | | 3 | text | Qwen2.5 7B abliterate text-only | | 4 | stock | официальный 7B Instruct Q4_K_M | | 5 | empty | только runtime | | — | keep | не трогать yaml | `-ngl` / `-c` — по GPU probe. Для recommended abliterate GGUF нужен **`HF_TOKEN`** в `.env` (иначе 401). Вручную: положи GGUF в models и `systemctl restart gpu-rent-llamacpp`. --- ## Idle-killer и LLM Busy (не гасить GPU): - `ollama pull` (маркер младше ~45 мин; старше сбрасывается); - загруженная модель в Ollama; - llama.cpp: слоты заняты. Ошибка установки LLM на `up` — **fail** (не тихий лог). --- ## Supply-chain (опциональный pin) По умолчанию install тянет upstream без pin (`WARN` в логе). Жёстче: ```bash OLLAMA_VERSION=0.6.5 OLLAMA_SHA256= LLAMACPP_TAG=b10545 # или LLAMACPP_ASSET_URL=... + LLAMACPP_SHA256=... # CUDA из исходников (медленно): LLAMACPP_BUILD_CUDA=1 # Переустановка бинаря: LLAMACPP_FORCE_REINSTALL=1 # VRAM: LLAMACPP_NGL=40 LLAMACPP_CTX=4096 LLAMACPP_EXTRA_ARGS=--flash-attn on ```