- Reduced default values for IDLE_MINUTES from 60 to 30 and IDLE_GRACE_MINUTES from 90 to 45 across configuration files and documentation. - Updated related documentation to reflect the new default idle time settings, ensuring consistency in user guidance and system behavior.
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=30
|
||
IDLE_GRACE_MINUTES=45
|
||
# 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` — разовое «баланс низкий».
|
||
|