- Added a new configuration option `UP_STOP_ON_FAIL` to control whether the GPU should be stopped automatically if the `up` command fails, enhancing user control over resource management. - Updated the CLI to include a `--keep-on-fail` flag, allowing users to prevent GPU shutdown during installation errors. - Enhanced the installation scripts and documentation to reflect these changes, providing clearer guidance on the new behavior and configuration options. - Improved error handling in the CLI to ensure proper cleanup of resources in case of failure, preventing unexpected billing for unused GPU resources.
261 lines
12 KiB
Markdown
261 lines
12 KiB
Markdown
# CLI и конфигурация
|
||
|
||
Имя команды: `gpu-rent`. Лаунчеры: `gpu-rent.bat` / `.\gpu-rent.ps1` / `./gpu-rent.sh` (создают `.venv` и вызывают `python -m gpu_rent`).
|
||
|
||
Без аргументов CLI показывает **help**. Поднять GPU с двойного клика: в `gpu-rent.vars` → `GPU_RENT_DEFAULT_ARGS=up --yes`.
|
||
|
||
---
|
||
|
||
## Типичные сценарии
|
||
|
||
### Первый раз
|
||
|
||
```text
|
||
gpu-rent doctor
|
||
gpu-rent up --yes
|
||
# … работа …
|
||
gpu-rent stop
|
||
```
|
||
|
||
Подготовка ключей: [setup.md](setup.md).
|
||
|
||
### Обычная сессия
|
||
|
||
```text
|
||
gpu-rent up --yes
|
||
# Ctrl+C → туннель off, GPU жив
|
||
gpu-rent tunnel --open
|
||
gpu-rent hold
|
||
gpu-rent stop
|
||
```
|
||
|
||
### Только облако (туннель позже)
|
||
|
||
```text
|
||
gpu-rent up --yes --no-tunnel
|
||
gpu-rent tunnel --open
|
||
```
|
||
|
||
### LLM рядом со SwarmUI
|
||
|
||
```text
|
||
gpu-rent setup # или
|
||
gpu-rent up --yes --ollama
|
||
```
|
||
|
||
Подробности: [llm.md](llm.md).
|
||
|
||
---
|
||
|
||
## Команды
|
||
|
||
| Команда | Поведение |
|
||
| --- | --- |
|
||
| `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` | Без `--yes`: меню LLM (если runtime none) → пресет → **Selectel**: flavor # / data GB / preemptible → confirm → create → туннель. Цветной лог (ошибки/warn/ok) |
|
||
| `gpu-rent up --yes` | Без вопросов; flavor из `FLAVOR_PREFERENCE` / `DEFAULT_FLAVOR_ID` |
|
||
| `up --keep-on-fail` | Не гасить GPU при ошибке install (по умолчанию `UP_STOP_ON_FAIL=true` → `stop`) |
|
||
| `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 |
|
||
| `gpu-rent up --flavor ID --yes` | Явный flavor; без `--flavor` + `--yes` — первый доступный из `FLAVOR_PREFERENCE` |
|
||
| `gpu-rent tunnel` / `tunnel --open` | Повторный проброс; `--open` сразу браузер. Ctrl+C GPU **не** гасит |
|
||
| `gpu-rent open` / `open --llm` | Браузер на SwarmUI / LLM-порт (туннель уже должен слушать) |
|
||
| `gpu-rent status` | State, Nova, диск, killer/hold, LLM, local-watchdog |
|
||
| `gpu-rent hold` / `--minutes N` / `--until ISO` / `--clear` | Пауза idle-killer (нужны живая VM + SSH) |
|
||
| `gpu-rent stop` / `stop --no-pull` | Удалить compute (+ FIP), диски оставить; optional pull Output |
|
||
| `gpu-rent destroy --i-understand-data-loss` | `stop` + диски |
|
||
| `gpu-rent logs` | journalctl swarmui / cloud-init |
|
||
| `gpu-rent ssh` | Оболочка на VM |
|
||
| `gpu-rent seed-models` | Докачать новые строки Civitai-манифеста на живой диск |
|
||
| `gpu-rent seed-extensions` | Доклонировать/обновить git-репы; restart swarmui |
|
||
| `gpu-rent push` / `push-models` | Локальные деревья → VM |
|
||
| `gpu-rent pull-output` | VM `Output/` → `./Output` |
|
||
| `gpu-rent capture` / `capture all` | Инвентарь VM → merge **ссылок** в `models.yaml` + `extensions.yaml` (веса не качать) |
|
||
| `gpu-rent capture models` / `--kind lora` | Только модели (фильтр по типу) |
|
||
| `gpu-rent capture extensions` | Только git Extensions / DLNodes |
|
||
| `gpu-rent capture --dry-run` | Отчёт без записи файлов |
|
||
| `gpu-rent resize-data --gb 400` | Data volume **только вверх** |
|
||
| `gpu-rent watchdog install` / `uninstall` / `status` / `tick` | Локальный safety-net (см. ниже) |
|
||
|
||
Второй `up` при живой VM: не создаёт второй GPU; autocomplete-check + push локальных папок; при `PULL_OUTPUT` — подтянуть Output. `--adopt` — подхватить тег без state.
|
||
|
||
Нет команды `generate`. Локальный SwarmUI целиком не зеркалируем — только папки приложения ([local-folders.md](local-folders.md)).
|
||
|
||
---
|
||
|
||
## `doctor`
|
||
|
||
Не создаёт сервер и не тратит GPU. Нужен до первого `up` и когда «вчера работало».
|
||
|
||
Проверки (все печатаются в отчёт):
|
||
|
||
1. Читается `.env`, обязательные `OS_*`
|
||
2. Keystone выдаёт токен
|
||
3. Квота GPU > 0 (иначе текст про поддержку Selectel)
|
||
4. В сегменте есть flavor из `FLAVOR_PREFERENCE`
|
||
5. Volume type / место под data ~100 GB
|
||
6. SSH-ключ есть или будет создан в `.gpu-rent/`
|
||
7. Если есть `CIVITAI_API_TOKEN` — доступ к API-хосту; манифест парсится
|
||
8. `extensions.yaml` парсится, если есть
|
||
9. Предупреждения по огромным локальным `Models/`
|
||
|
||
Exit 0 → можно `up`. Exit 1 → причина в таблице / кратком списке на `up`.
|
||
|
||
---
|
||
|
||
## `status` и `hold`
|
||
|
||
**status** — без туннеля. При SSH: ещё `df` диска и состояние killer; иначе только OpenStack + локальный state.
|
||
|
||
**hold** пишет на VM `/mnt/swarm_data/.gpu-rent-hold-until`. Killer не удаляет compute, пока `now < ts`. Без живой VM — ошибка (не «запомню на потом»). После unshelve hold на диске сохраняется.
|
||
|
||
---
|
||
|
||
## Local watchdog (опционально)
|
||
|
||
Основной авто-stop — **idle-killer на VM** (ноут можно закрыть). Local watchdog — если хочешь гасить GPU при «убили окно / ребут» без `stop`.
|
||
|
||
1. `gpu-rent watchdog install` (раз на машине, из корня репо)
|
||
2. Пока крутится `up`/`tunnel`, пишется heartbeat `.gpu-rent/local-lease.json`
|
||
3. **Ctrl+C** → detach, GPU **не** трогаем
|
||
4. Процесс умер / ребут → через `LOCAL_WATCHDOG_GRACE_MINUTES` (дефолт 10) → `stop`
|
||
5. `gpu-rent stop` чистит lease сам
|
||
|
||
Без `install` поведение прежнее. При `up --no-tunnel` lease не вооружается.
|
||
|
||
---
|
||
|
||
## Конфигурация
|
||
|
||
| Файл | Назначение |
|
||
| --- | --- |
|
||
| `.env` | Секреты и OpenStack (`OS_*`, токены). Не в git |
|
||
| `gpu-rent.vars` | Несекретные дефолты; читают лаунчеры и CLI. Пример: `gpu-rent.vars.example` |
|
||
| `models.yaml` / `extensions.yaml` / `ollama-models.yaml` / `llamacpp-models.yaml` | Манифесты (gitignore; из `*.example.yaml`) |
|
||
|
||
### Лаунчер (`gpu-rent.vars`)
|
||
|
||
```env
|
||
# Двойной клик / запуск без аргументов у .ps1/.bat/.sh:
|
||
GPU_RENT_DEFAULT_ARGS=up --yes
|
||
|
||
# Дописать ко всем вызовам:
|
||
# GPU_RENT_EXTRA_ARGS=--no-update
|
||
|
||
UPDATE_GIT=true
|
||
LLM_RUNTIME=none
|
||
# DATA_VOLUME_SIZE_GB=100
|
||
# DEFAULT_FLAVOR_ID=
|
||
# DEFAULT_SPOT=true
|
||
```
|
||
|
||
### Основные переменные (`.env` / vars)
|
||
|
||
```env
|
||
OS_AUTH_URL=https://cloud.api.selcloud.ru/identity/v3
|
||
OS_USER_DOMAIN_NAME=
|
||
OS_USERNAME=
|
||
OS_PASSWORD=
|
||
OS_PROJECT_ID=
|
||
OS_REGION_NAME=ru-7
|
||
GPU_RENT_AZ=ru-7a
|
||
|
||
SSH_PRIVATE_KEY_PATH=
|
||
SSH_USER=ubuntu
|
||
# Пусто = авто /32 твоего IP. Для spike/WARP иногда 0.0.0.0/0:
|
||
GPU_RENT_SSH_CIDR=
|
||
|
||
BOOT_VOLUME_ID=
|
||
DATA_VOLUME_ID=
|
||
DATA_VOLUME_SIZE_GB=100
|
||
BOOT_SNAPSHOT_NAME=gpu-rent-boot-ok
|
||
|
||
CIVITAI_API_TOKEN=
|
||
CIVITAI_API_HOST=civitai.red
|
||
MODELS_MANIFEST=
|
||
LOCAL_MODELS_DIR=
|
||
LOCAL_WILDCARDS_DIR=
|
||
LOCAL_WORKFLOWS_DIR=
|
||
LOCAL_OUTPUT_DIR=
|
||
EXTENSIONS_MANIFEST=
|
||
GIT_TOKEN=
|
||
|
||
AUTOCOMPLETE_ENABLED=true
|
||
|
||
SWARMUI_LOCAL_PORT=17801
|
||
LLM_RUNTIME=none
|
||
OLLAMA_LOCAL_PORT=17811
|
||
LLAMACPP_LOCAL_PORT=17812
|
||
UPDATE_GIT=true
|
||
|
||
DEFAULT_FLAVOR_ID=
|
||
FLAVOR_PREFERENCE=4090-24,4090-48,a5000,a100-40
|
||
FLAVOR_FALLBACK=true
|
||
SCAN_POOLS=ru-6,ru-7
|
||
DEFAULT_SPOT=true
|
||
KEEP_FLOATING_IP=false
|
||
IDLE_MINUTES=60
|
||
IDLE_GRACE_MINUTES=90
|
||
# LOCAL_WATCHDOG_GRACE_MINUTES=10
|
||
PULL_OUTPUT=false
|
||
NOTIFY_READY=true
|
||
```
|
||
|
||
Flavor uuid в git не хардкодить. `FLAVOR_FALLBACK=false` — только `DEFAULT_FLAVOR_ID` / `--flavor`.
|
||
|
||
Application credential для idle-killer CLI создаёт на `up` (узко: DELETE/GET **этого** server) и отзывает на `stop`. В `.env` ноутбука дублировать не нужно.
|
||
|
||
Пути локальных папок по умолчанию: `Models/`, `Wildcards/`, `CustomWorkflows/`, `Output/` в корне репо.
|
||
|
||
Полный шаблон: [`env.example`](../env.example).
|
||
|
||
---
|
||
|
||
## State
|
||
|
||
`<repo>/.gpu-rent/state.json` — ids, фаза, timestamps (окно preempt 24 ч). Без паролей. Lockfile рядом — два `up` не создадут два сервера.
|
||
|
||
---
|
||
|
||
## Ожидание готовности
|
||
|
||
Ориентир: **~20–40 мин** первый bootstrap, **~5–10 мин** unshelve.
|
||
|
||
Порядок готовности:
|
||
|
||
1. Nova `ACTIVE`
|
||
2. TCP 22 / SSH
|
||
3. Backend Idle (если SwarmUI) → toast (если `NOTIFY_READY`)
|
||
4. На VM: HTTP сервисов стека (SwarmUI `:7801` / Ollama `:11434` / llama.cpp `:8080`) — `verify_stack_on_vm`
|
||
5. На VM: **nvidia-smi / CUDA** (fail-fast) + **torch+cuda** в Comfy venv при SwarmUI (ждём) — `verify_gpu_env`
|
||
6. В логе: строка **`тайминг up:`** (SSH / bootstrap / Idle / verify / …)
|
||
7. Туннель + проверка **localhost** тех же сервисов → access-card (красная рамка, если killer failed)
|
||
|
||
`gpu-rent logs --unit swarm|ollama|llamacpp|killer` — фильтр journalctl.
|
||
`gpu-rent status` — killer/hold, последний стек/GPU-env, тайминг up.
|
||
|
||
Локальный порт UI: **17801** (на VM по-прежнему 7801 на loopback).
|
||
|
||
---
|
||
|
||
## Windows / notify
|
||
|
||
`NOTIFY_READY`: toast + системный звук, когда backend Idle. Если toast недоступен — только звук и лог, без падения CLI.
|
||
|
||
### Баланс Selectel (шаг 200 ₽)
|
||
|
||
Нужны:
|
||
|
||
1. `SELECTEL_API_TOKEN` в `.env` — **статический ключ панели** (`X-Token`), не OpenStack password ([баланс API](https://docs.selectel.ru/api/balance/)).
|
||
2. `gpu-rent watchdog install` — тот же локальный тикер, что и аварийный stop.
|
||
|
||
На `up` запоминается baseline баланса. Каждый tick watchdog: если с `up` ушло ещё ~200 ₽ (`BALANCE_NOTIFY_STEP_RUB`) — toast «Списано ~N ₽…». Пополнение сбрасывает baseline. Опционально `BALANCE_NOTIFY_LOW_RUB=300` — разовое «баланс низкий».
|
||
|