Enhance LLM and SwarmUI integration with improved configuration options
- Updated `env.example` and `gpu-rent.vars.example` to include new variables for LLM runtime and SwarmUI options. - Refactored CLI commands to support interactive selection of LLM runtime and workload type (SwarmUI, LLM, or both). - Improved access link generation to handle cases where SwarmUI is disabled, providing clearer user feedback. - Enhanced provisioning logic to conditionally bootstrap SwarmUI based on user configuration, allowing for LLM-only setups. - Updated documentation across multiple files to reflect changes in LLM integration, CLI usage, and configuration management.
This commit is contained in:
@@ -21,6 +21,7 @@ CLI поднимает прерываемый GPU в Selectel, держит Swar
|
||||
| Word-list промптов | [autocomplete.md](autocomplete.md) |
|
||||
| Push/pull папок | [local-folders.md](local-folders.md) |
|
||||
| Ollama / llama.cpp | [llm.md](llm.md) |
|
||||
| Capture ссылок с VM | [cli.md](cli.md) (`capture`) + [models.md](models.md) |
|
||||
| Как устроены диски и killer | [architecture.md](architecture.md) |
|
||||
| Контракт Selectel | [selectel.md](selectel.md) |
|
||||
| Нативный SwarmUI на VM | [swarmui.md](swarmui.md) |
|
||||
|
||||
@@ -35,22 +35,24 @@
|
||||
|
||||
| Модуль | Ответственность |
|
||||
| --- | --- |
|
||||
| `cli` | Typer: `up`, `setup`, `tunnel`, `open`, `status`, `stop`, `destroy`, `logs`, `ssh`, `doctor`, `hold`, `seed-*`, `push` / `pull-output`, `resize-data`, `watchdog`, `dry-run` |
|
||||
| `cli` / `term` / `prompts` | Typer + цветной лог + нумерованные меню |
|
||||
| `config` / `varsfile` | `.env` + `gpu-rent.vars`, пути |
|
||||
| `state` | JSON сессии: ids, фаза, timestamps |
|
||||
| `os_client` / `cloud` / `pools` | openstacksdk, ресурсы, скан пулов |
|
||||
| `inventory` | Flavors/images, квоты, фоллбек flavor |
|
||||
| `inventory` / `ux` | Flavors, квоты; preview / ServerPlan (flavor/disk/spot) |
|
||||
| `session` | `cmd_up` / `cmd_stop` / adopt |
|
||||
| `bootstrap` + `remote/bootstrap.sh` | Идемпотентный first-boot; light без apt |
|
||||
| `provision` | extensions, autocomplete, civitai seed, push, idle-killer arm, start SwarmUI |
|
||||
| `provision` | extensions, autocomplete, civitai seed, LLM, push, idle-killer arm, start SwarmUI |
|
||||
| `capture` | Инвентарь VM → merge ссылок в локальные манифесты |
|
||||
| `doctor` | Preflight без mutating compute |
|
||||
| `sync_files` | SFTP `Models` / Wildcards / workflows / Output |
|
||||
| `notify` | Toast/звук при backend Idle |
|
||||
| `tunnel` | sshtunnel + Nova EXPIRED watchdog |
|
||||
| `local_watchdog` | Опциональный локальный тик → stop при unclean exit |
|
||||
| `llm_runtime` / `setup_wizard` | Opt-in Ollama/llama.cpp + `ollama-models.yaml` |
|
||||
| `llm_runtime` / `setup_wizard` | Opt-in Ollama/llama.cpp + `ollama-models.yaml` / `llamacpp-models.yaml` |
|
||||
| `idle_killer` / `hold` | systemd на VM + hold-файл |
|
||||
| `ready` / `snapshot` | Idle backend + boot snapshot |
|
||||
| `access_card` | URL / MCP panel после ready |
|
||||
|
||||
Каталог сервисов — из Keystone, не из выдуманного `api.selectel.ru/v3/`.
|
||||
|
||||
|
||||
+8
-3
@@ -51,13 +51,15 @@ gpu-rent up --yes --ollama
|
||||
|
||||
| Команда | Поведение |
|
||||
| --- | --- |
|
||||
| `gpu-rent setup` | Wizard: манифесты, `LLM_RUNTIME`, пресет ollama-models, опционально local-watchdog |
|
||||
| `gpu-rent setup` | Wizard: манифесты (в т.ч. ollama/llamacpp-models), `LLM_RUNTIME` (нумерованное меню), пресет, опционально local-watchdog |
|
||||
| `gpu-rent doctor` | Preflight **без** create. Exit ≠ 0 → сессию начинать нельзя |
|
||||
| `gpu-rent flavors` | Скан `SCAN_POOLS` × `FLAVOR_PREFERENCE`, список в текущем регионе |
|
||||
| `gpu-rent dry-run` | План без mutating-вызовов |
|
||||
| `gpu-rent up` / `up --yes` | Create/unshelve → bootstrap → optional LLM → **туннель** `:17801`. Без `--yes`: выбор flavor / data GB / preemptible, затем confirm. Ctrl+C = туннель off |
|
||||
| `gpu-rent up` | Без `--yes`: меню LLM (если runtime none) → пресет → **Selectel**: flavor # / data GB / preemptible → confirm → create → туннель. Цветной лог (ошибки/warn/ok) |
|
||||
| `gpu-rent up --yes` | Без вопросов; flavor из `FLAVOR_PREFERENCE` / `DEFAULT_FLAVOR_ID` |
|
||||
| `gpu-rent up -v` / `--verbose` | Полная таблица doctor на `up` (по умолчанию кратко) |
|
||||
| `gpu-rent up --ollama` / `--llamacpp` / `--llm …` | LLM рядом со SwarmUI |
|
||||
| `gpu-rent up --no-swarm` / `--llm-only` | Только LLM (нужен `--ollama`/`--llamacpp`); без clone SwarmUI |
|
||||
| `gpu-rent up --no-update` | Без `git pull` SwarmUI/extensions (только недостающие clone) |
|
||||
| `gpu-rent up --no-tunnel` | Только облако |
|
||||
| `gpu-rent up --no-spot` | Не preemptible |
|
||||
@@ -135,7 +137,7 @@ Exit 0 → можно `up`. Exit 1 → причина в таблице / кра
|
||||
| --- | --- |
|
||||
| `.env` | Секреты и OpenStack (`OS_*`, токены). Не в git |
|
||||
| `gpu-rent.vars` | Несекретные дефолты; читают лаунчеры и CLI. Пример: `gpu-rent.vars.example` |
|
||||
| `models.yaml` / `extensions.yaml` / `ollama-models.yaml` | Манифесты |
|
||||
| `models.yaml` / `extensions.yaml` / `ollama-models.yaml` / `llamacpp-models.yaml` | Манифесты (gitignore; из `*.example.yaml`) |
|
||||
|
||||
### Лаунчер (`gpu-rent.vars`)
|
||||
|
||||
@@ -148,6 +150,9 @@ GPU_RENT_DEFAULT_ARGS=up --yes
|
||||
|
||||
UPDATE_GIT=true
|
||||
LLM_RUNTIME=none
|
||||
# DATA_VOLUME_SIZE_GB=100
|
||||
# DEFAULT_FLAVOR_ID=
|
||||
# DEFAULT_SPOT=true
|
||||
```
|
||||
|
||||
### Основные переменные (`.env` / vars)
|
||||
|
||||
+4
-4
@@ -23,10 +23,10 @@ GPU в облаке дорогой. Веса для генерации карт
|
||||
- Push из `./Models`, `./Wildcards`, `./CustomWorkflows`, если папки не пустые; optional pull `./Output`.
|
||||
- Первый clone git-реп расширений SwarmUI и ComfyUI nodes из `extensions.yaml`.
|
||||
- Autocomplete: word-list в `Data/Autocompletions` до старта UI, на каждом `up` проверка новой версии.
|
||||
- `doctor` до create; фоллбек flavor; `hold` для idle-killer; toast когда backend Idle; `open` на 17801.
|
||||
- Opt-in LLM (Ollama / llama.cpp) через `setup` / `--ollama` / `LLM_RUNTIME`.
|
||||
- `status`: диск, ₽/час, окно preempt 24 ч, состояние killer.
|
||||
- Snapshot boot-диска после первого удачного bootstrap.
|
||||
- `doctor` до create; фоллбек flavor; интерактивный выбор flavor/диска; `hold`; toast Idle; `open` на 17801.
|
||||
- Opt-in LLM (Ollama / llama.cpp) через `setup` / флаги / `LLM_RUNTIME`; `capture` ссылок с VM.
|
||||
- `status`: диск, окно preempt 24 ч, killer / LLM.
|
||||
- Snapshot boot после первого удачного bootstrap.
|
||||
|
||||
## Что не входит (пока)
|
||||
|
||||
|
||||
+5
-2
@@ -14,14 +14,17 @@
|
||||
| Autocomplete | До первого старта: скачать word-list в `Data/Autocompletions`, прописать `DefaultUser.AutoComplete.Source`. На каждом `up` сверить GitHub blob sha и обновить файл, если изменился. Дефолт: `tags/danbooru.csv` из a1111-sd-webui-tagcomplete (как в доке SwarmUI) |
|
||||
| Доступ | Браузер на туннеле; MCP переключается на облако, пока оно живо; HTTP API SwarmUI через тот же туннель |
|
||||
| Preemptible | По умолчанию всегда. Обычный сервер — только `--no-spot` |
|
||||
| Selectel сейчас | Аккаунт есть, GPU-квоту не проверяли — скорее 0. Сначала тикет в поддержку |
|
||||
| Selectel сейчас | Квота GPU часто 0 на новом аккаунте — сначала тикет (setup §2.3), потом `doctor` |
|
||||
| Образ ОС | **Ubuntu 24.04 LTS GPU Driver 580** (Selectel, **без Docker**). SwarmUI нативно: `launch-linux.sh` + systemd. Нет образа 580 — фоллбек 24.04 Driver 535 без Docker |
|
||||
| Floating IP | `KEEP_FLOATING_IP=false`: выделить на `up`, удалить на `stop` |
|
||||
| Idle-killer | 30 минут пустой очереди генерации. Открытый браузер не продлевает жизнь |
|
||||
| Льгота после boot | Killer молчит во время clone/seed/push, hold, качалки в UI SwarmUI, пока backend не Idle, и 45 мин после ACTIVE/unshelve |
|
||||
| `up` / `tunnel` | `up` по умолчанию после ready открывает туннель `:17801`, печатает URL и ждёт. `--no-tunnel` — только облако. Ctrl+C на туннеле GPU не гасит (`stop` отдельно). Команда `tunnel` остаётся для повторного входа |
|
||||
| Interactive `up` | Без `--yes`: нумерованные меню (LLM, пресет, flavor #, data GB, preemptible) → confirm. Изменения можно сохранить в `gpu-rent.vars` |
|
||||
| Git update | На каждом `up` по умолчанию: `git pull` SwarmUI + репы из `extensions.yaml` + уже установленные на data (`Extensions`/`DLNodes`). `--no-update` или `UPDATE_GIT=false` — не тянуть |
|
||||
| LLM (opt-in) | `none` по умолчанию. `ollama` / `llamacpp` — флаг `--ollama`/`--llamacpp`/`--llm`, `LLM_RUNTIME` в vars, или вопрос в interactive `up`/`setup`. Ollama-модели из `ollama-models.yaml`. Порты: Ollama 17811, llama.cpp 17812. Назначение: помощь с промптами, не замена SwarmUI |
|
||||
| LLM (opt-in) | `none` по умолчанию. Флаги / `LLM_RUNTIME` / меню. Манифесты: `ollama-models.yaml`, `llamacpp-models.yaml`. Порты 17811 / 17812. Prompt-help, не замена SwarmUI |
|
||||
| llm-only | `ENABLE_SWARMUI=false` / `WORKLOAD=llm` / `--no-swarm`/`--llm-only`: GPU + LLM без SwarmUI (bootstrap только data disk) |
|
||||
| Capture | `gpu-rent capture` — инвентарь VM → merge **ссылок** в локальные yaml (веса не качать) |
|
||||
| Perf auto-tune | На `up`: probe GPU → tier. Swarm/Comfy: sageattention ExtraArgs на Ampere+ ≥16 GiB. Ollama: flash/KV/keep-alive + `GPU_OVERHEAD` чтобы оставить VRAM под Krea |
|
||||
| Data-диск | Старт **100 GB**, рост через resize вверх (вниз Selectel не умеет) |
|
||||
| SSH | CLI генерирует `<repo>/.gpu-rent/id_ed25519` без passphrase и сам регистрирует keypair |
|
||||
|
||||
+59
-54
@@ -1,37 +1,52 @@
|
||||
# LLM рядом со SwarmUI (opt-in)
|
||||
|
||||
По умолчанию поднимается **только SwarmUI**. Ollama или llama.cpp — отдельно, когда нужны (помощь с промптами и т.п.).
|
||||
По умолчанию поднимается **только 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
|
||||
### A — wizard
|
||||
|
||||
```text
|
||||
gpu-rent setup
|
||||
```
|
||||
|
||||
Выбери `ollama` или `llamacpp`. Для **обоих** спросит пресет моделей. Значение пишется в `gpu-rent.vars` (`LLM_RUNTIME=…`).
|
||||
Меню: runtime → пресет моделей → опционально local-watchdog. Пишет `LLM_RUNTIME` в `gpu-rent.vars`.
|
||||
|
||||
### Вариант B — флаг на `up`
|
||||
### B — флаг на `up`
|
||||
|
||||
```text
|
||||
gpu-rent up --yes --ollama
|
||||
gpu-rent up --yes --llm llamacpp
|
||||
gpu-rent up --yes --llm-only --llamacpp # без SwarmUI
|
||||
```
|
||||
|
||||
### Вариант C — вручную в vars
|
||||
С `--yes` пресеты не спрашивает (берёт существующий yaml / example).
|
||||
|
||||
### C — vars вручную
|
||||
|
||||
```env
|
||||
LLM_RUNTIME=ollama
|
||||
```
|
||||
|
||||
Потом обычный `gpu-rent up --yes`.
|
||||
Потом `gpu-rent up --yes`.
|
||||
|
||||
Чтобы **выключить** LLM на следующих сессиях: `LLM_RUNTIME=none` (на `up` старые unit’ы `gpu-rent-ollama` / `gpu-rent-llamacpp` останавливаются).
|
||||
Выключить: `LLM_RUNTIME=none` (на `up` старые unit’ы `gpu-rent-ollama` / `gpu-rent-llamacpp` останавливаются).
|
||||
|
||||
Голый `gpu-rent` без args — help, не `up`. Двойной клик: `GPU_RENT_DEFAULT_ARGS=up --yes` в `gpu-rent.vars`. Полный doctor на up: `up -v`.
|
||||
Голый `gpu-rent` без args — **help**. Двойной клик: `GPU_RENT_DEFAULT_ARGS=up --yes`. Полный doctor на up: `up -v`.
|
||||
|
||||
---
|
||||
|
||||
@@ -48,105 +63,95 @@ gpu-rent tunnel
|
||||
gpu-rent open --llm
|
||||
```
|
||||
|
||||
Клиент Ollama:
|
||||
|
||||
```text
|
||||
# Windows PowerShell
|
||||
```powershell
|
||||
$env:OLLAMA_HOST = "http://127.0.0.1:17811"
|
||||
```
|
||||
|
||||
После успешного `up`/`tunnel` CLI печатает access-card со всеми URL и MCP-сниппетом.
|
||||
После `up`/`tunnel` — access-card с URL и MCP-сниппетом.
|
||||
|
||||
---
|
||||
|
||||
## Ollama: модели
|
||||
## Ollama
|
||||
|
||||
| Файл | Роль |
|
||||
| --- | --- |
|
||||
| `ollama-models.example.yaml` | шаблон в git |
|
||||
| `ollama-models.yaml` | твой список (gitignore) |
|
||||
| `ollama-models.yaml` | список тегов (gitignore); лаунчер копирует example при отсутствии |
|
||||
|
||||
На `up` при `LLM_RUNTIME=ollama` CLI делает `ollama pull` по списку. Уже скачанные теги **точно** не трогает (`foo:3b` ≠ `foo:7b`). Лишние модели на диске не удаляет.
|
||||
На `up` — `ollama pull` по списку. Точные теги: уже есть `foo:7b` ≠ skip для `foo:3b`. Лишнее на диске не удаляет.
|
||||
|
||||
### Пресеты `setup`
|
||||
### Пресеты (меню)
|
||||
|
||||
| preset | tag | зачем |
|
||||
| # | ключ | tag / смысл |
|
||||
| --- | --- | --- |
|
||||
| **recommended** | `huihui_ai/qwen2.5-abliterate:7b` | RU/EN, ~5 GB, меньше отказов |
|
||||
| light | `qwen2.5:3b` | быстрее, слабее |
|
||||
| stock | `qwen2.5:7b` | официальный |
|
||||
| alt | `richardyoung/qwen2.5-7b-instruct-abliterated` | другой abliterate |
|
||||
| empty | `[]` | только runtime, pull руками |
|
||||
| 1 | **recommended** | `huihui_ai/qwen2.5-abliterate:7b` — RU/EN, ~5 GB |
|
||||
| 2 | light | `qwen2.5:3b` |
|
||||
| 3 | stock | `qwen2.5:7b` |
|
||||
| 4 | alt | другой abliterate 7B |
|
||||
| 5 | empty | только runtime |
|
||||
| — | keep | не трогать yaml (если уже спросили повторно) |
|
||||
|
||||
Community abliterate-модели без гарантий безопасности — для личного prompt-help рядом со SwarmUI.
|
||||
|
||||
Поле `default: true` в yaml — preferred модель (лог / подсказка); pull идёт по всему списку.
|
||||
`default: true` в yaml — preferred в логе; pull идёт по всему списку.
|
||||
|
||||
---
|
||||
|
||||
## Автотюнинг Ollama под GPU
|
||||
## Автотюнинг Ollama
|
||||
|
||||
На установке `gpu-rent-ollama` читает `/mnt/swarm_data/.gpu-rent-gpu.json` и пишет env в systemd unit (одна карта вместе со SwarmUI):
|
||||
Unit `gpu-rent-ollama` читает `/mnt/swarm_data/.gpu-rent-gpu.json`:
|
||||
|
||||
| Tier (VRAM) | Flash Attn | KEEP_ALIVE | KV cache | GPU_OVERHEAD (запас под Swarm/Krea) |
|
||||
| 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`.
|
||||
|
||||
Файл: `/mnt/swarm_data/.gpu-rent-ollama.env` (пересоздаётся на каждом install Ollama).
|
||||
\*Flash на Ampere+ (compute ≥ 8.0). `NUM_PARALLEL=1`, `MAX_LOADED_MODELS=1`. Env: `/mnt/swarm_data/.gpu-rent-ollama.env`.
|
||||
|
||||
---
|
||||
|
||||
## llama.cpp
|
||||
|
||||
Манифест GGUF:
|
||||
|
||||
| Файл | Роль |
|
||||
| --- | --- |
|
||||
| `llamacpp-models.example.yaml` | шаблон в git |
|
||||
| `llamacpp-models.yaml` | URL на `.gguf` (gitignore) |
|
||||
| `llamacpp-models.example.yaml` | шаблон |
|
||||
| `llamacpp-models.yaml` | HTTPS URL на `.gguf` (gitignore) |
|
||||
|
||||
На interactive `up` / `setup` после выбора `llamacpp` спрашивается пресет (как у Ollama). На `up` CLI скачивает GGUF в `/mnt/swarm_data/llamacpp/models`, затем ставит `llama-server` + systemd.
|
||||
На `up`: скачать GGUF → `/mnt/swarm_data/llamacpp/models` → `llama-server` + systemd. Уже скачанные крупные файлы не трогает.
|
||||
|
||||
### Пресеты
|
||||
### Пресеты (меню)
|
||||
|
||||
| preset | что |
|
||||
| --- | --- |
|
||||
| **recommended** | Qwen2.5 7B abliterate Q4_K_M (~4.7 GB) |
|
||||
| light | Qwen2.5 3B Instruct Q4_K_M |
|
||||
| stock | официальный Qwen2.5 7B Instruct Q4_K_M |
|
||||
| empty | только runtime |
|
||||
| # | ключ | что |
|
||||
| --- | --- | --- |
|
||||
| 1 | **recommended** | Qwen2.5 7B abliterate Q4_K_M (~4.7 GB) |
|
||||
| 2 | light | Qwen2.5 3B Instruct Q4_K_M |
|
||||
| 3 | stock | официальный 7B Instruct Q4_K_M |
|
||||
| 4 | empty | только runtime |
|
||||
| — | keep | не трогать yaml |
|
||||
|
||||
Параметры `-ngl` / `-c` — по GPU probe. Опционально `HF_TOKEN` для gated HF. Вручную: положи GGUF в каталог models и `systemctl restart gpu-rent-llamacpp`.
|
||||
`-ngl` / `-c` — по GPU probe. Опционально `HF_TOKEN` для gated HF. Вручную: положи GGUF в models и `systemctl restart gpu-rent-llamacpp`.
|
||||
|
||||
---
|
||||
|
||||
## Idle-killer и LLM
|
||||
|
||||
Busy (не гасить GPU), если:
|
||||
Busy (не гасить GPU):
|
||||
|
||||
- идёт `ollama pull` (маркер младше ~45 мин; старше — сбрасывается);
|
||||
- в Ollama есть загруженная модель;
|
||||
- llama.cpp занимает слоты.
|
||||
- `ollama pull` (маркер младше ~45 мин; старше сбрасывается);
|
||||
- загруженная модель в Ollama;
|
||||
- llama.cpp: слоты заняты.
|
||||
|
||||
Ошибка установки LLM на `up` — **fail** (не тихий лог): почини или поставь `LLM_RUNTIME=none`.
|
||||
Ошибка установки LLM на `up` — **fail** (не тихий лог).
|
||||
|
||||
---
|
||||
|
||||
## Supply-chain (опциональный pin)
|
||||
|
||||
По умолчанию install-скрипты тянут upstream **без pin** (Ollama: `curl|sh`; llama.cpp: GitHub `latest`) — риск подмены. В логе будет `WARN`.
|
||||
|
||||
Жёстче — задай env на VM / при bootstrap:
|
||||
По умолчанию install тянет upstream без pin (`WARN` в логе). Жёстче:
|
||||
|
||||
```bash
|
||||
OLLAMA_VERSION=0.6.5
|
||||
OLLAMA_SHA256=<sha256 of ollama-linux-amd64.tgz>
|
||||
|
||||
LLAMACPP_TAG=b4690
|
||||
# или LLAMACPP_ASSET_URL=... + LLAMACPP_SHA256=...
|
||||
```
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
|
||||
Продуктовые развилки закрыты — см. [decisions.md](decisions.md).
|
||||
|
||||
Ниже — что **подтвердить на spike** (живой GPU), не в споре:
|
||||
Подтвердить **на spike** (живой GPU), не в споре:
|
||||
|
||||
- Качалка модели в UI: отдельного poll-API нет → v1 считает busy через очередь / loading / backend≠idle; иначе пользователь жмёт `hold`.
|
||||
- Реальная цена 100 GB сетевого диска и 1×4090 preemptible ₽/час в твоём сегменте (в OpenStack API нет — только панель).
|
||||
- Имя GPU-образа (без Docker) и flavor id в твоём пуле (в git не класть); какие из `FLAVOR_PREFERENCE` реально есть.
|
||||
- Application credential с **узкими** access_rules (DELETE/GET только этого `server_id`) на Selectel: если Keystone отвергает rules — CLI **fail closed** (idle-killer не вооружается unrestricted). Нужно проверить на spike и при необходимости править права / путь.
|
||||
- Snapshot attached boot volume после Idle: время и можно ли сразу create from snapshot.
|
||||
- Качалка модели в UI: отдельного poll-API нет → busy через очередь / loading / backend≠idle; иначе `hold`.
|
||||
- Реальная цена data-диска и 1×4090 preemptible ₽/час в твоём сегменте (в API нет — панель).
|
||||
- Имя GPU-образа Driver 580 и живые flavor id в пуле (в git не класть).
|
||||
- App cred с узкими access_rules на Selectel: код fail closed; на spike убедиться, что Keystone принимает rules.
|
||||
- Snapshot attached boot после Idle: время; create from snapshot ок.
|
||||
|
||||
Если spike покажет, что 45 минут льготы мало на первую установку ComfyUI — подними `IDLE_GRACE_MINUTES`, не отключай killer.
|
||||
Если 45 мин льготы мало на первый Comfy — подними `IDLE_GRACE_MINUTES`, не отключай killer.
|
||||
|
||||
@@ -83,6 +83,9 @@
|
||||
- [x] Оценка ₽ честно («смотри панель»), предупреждение про диск 24/7 и idle-killer
|
||||
- [x] `NOTIFY_READY`: Windows toast + звук при backend Idle
|
||||
- [x] Пользовательский README поверх `docs/`
|
||||
- [x] Opt-in LLM + `setup`; нумерованные меню; interactive Selectel plan (flavor/disk/spot)
|
||||
- [x] Цветной CLI-лог; `capture` ссылок с VM
|
||||
- [x] Local-watchdog; access-card
|
||||
|
||||
## Вне скоупа v1
|
||||
|
||||
|
||||
+16
-6
@@ -49,6 +49,7 @@ chmod +x gpu-rent.sh
|
||||
- `env.example` → `.env`
|
||||
- `models.example.yaml` → `models.yaml`
|
||||
- `extensions.example.yaml` → `extensions.yaml`
|
||||
- `ollama-models.example.yaml` / `llamacpp-models.example.yaml` → соответствующие yaml (лаунчер / setup)
|
||||
- `gpu-rent.vars.example` → `gpu-rent.vars`
|
||||
|
||||
Секреты только в `<repo>/.env` и runtime в `<repo>/.gpu-rent/` (оба в `.gitignore`).
|
||||
@@ -59,7 +60,7 @@ chmod +x gpu-rent.sh
|
||||
.\gpu-rent.ps1 setup
|
||||
```
|
||||
|
||||
Спросит LLM (none/ollama/llamacpp) и local-watchdog. Можно пропустить и настроить позже.
|
||||
Спросит (нумерованные меню): LLM runtime → пресет моделей → local-watchdog. Можно пропустить и настроить позже (`LLM_RUNTIME` / `up`).
|
||||
|
||||
Для разработки / pytest:
|
||||
|
||||
@@ -215,15 +216,23 @@ copy models.example.yaml models.yaml
|
||||
|
||||
Первый прогон долгий (образ, SwarmUI, Comfy, seed): ориентир **20–40 минут**. Не закрывай терминал посередине bootstrap.
|
||||
|
||||
Без вопросов (CI / двойной клик):
|
||||
|
||||
```powershell
|
||||
.\gpu-rent.ps1 up --yes
|
||||
```
|
||||
|
||||
Интерактивно (меню LLM, пресет, **flavor / диск / preemptible**, confirm):
|
||||
|
||||
```powershell
|
||||
.\gpu-rent.ps1 up
|
||||
```
|
||||
|
||||
Что произойдёт:
|
||||
|
||||
1. Снова короткий doctor (кратко; полный — `up -v`).
|
||||
2. Create/unshelve preemptible GPU + диски.
|
||||
3. Bootstrap SwarmUI, extensions, autocomplete, Civitai-seed, push локальных папок.
|
||||
1. Короткий doctor (полный — `up -v`).
|
||||
2. Create/unshelve GPU + диски (после confirm).
|
||||
3. Bootstrap SwarmUI, extensions, autocomplete, Civitai-seed, push локальных папок; optional LLM.
|
||||
4. Туннель на `localhost:17801`, access-card с URL / MCP.
|
||||
5. Процесс ждёт: **Ctrl+C** закрывает только туннель, GPU остаётся.
|
||||
|
||||
@@ -233,9 +242,10 @@ copy models.example.yaml models.yaml
|
||||
| --- | --- |
|
||||
| `--no-tunnel` | только облако; UI потом: `tunnel --open` |
|
||||
| `--no-update` | не `git pull` SwarmUI/extensions |
|
||||
| `--ollama` | поднять Ollama рядом ([llm.md](llm.md)) |
|
||||
| `--ollama` / `--llamacpp` | LLM рядом ([llm.md](llm.md)) |
|
||||
| `--no-swarm` / `--llm-only` | только LLM, без SwarmUI (нужен runtime) |
|
||||
| `--no-spot` | обычный (не preemptible) тариф |
|
||||
| `--flavor ID` | явный flavor, без фоллбека |
|
||||
| `--flavor ID` | явный flavor (пропускает меню flavor) |
|
||||
|
||||
Двойной клик без аргументов: в `gpu-rent.vars` задай `GPU_RENT_DEFAULT_ARGS=up --yes`. Сам `gpu-rent` без args показывает **help**, не поднимает GPU.
|
||||
|
||||
|
||||
+3
-2
@@ -103,12 +103,13 @@
|
||||
|
||||
```powershell
|
||||
.\gpu-rent.ps1 up --yes --ollama
|
||||
# или интерактивно: up → меню runtime/пресет
|
||||
```
|
||||
|
||||
| Шаг | OK? |
|
||||
| --- | --- |
|
||||
| Ollama на :17811 через туннель | |
|
||||
| `ollama pull` из манифеста | |
|
||||
| Ollama :17811 или llama.cpp :17812 через туннель | |
|
||||
| pull / GGUF из манифеста | |
|
||||
| `LLM_RUNTIME=none` гасит unit на следующем up | |
|
||||
|
||||
См. [llm.md](llm.md).
|
||||
|
||||
Reference in New Issue
Block a user