# 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: манифесты, `LLM_RUNTIME`, пресет ollama-models, опционально 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`. Ctrl+C = туннель off | | `gpu-rent up -v` / `--verbose` | Полная таблица doctor на `up` (по умолчанию кратко) | | `gpu-rent up --ollama` / `--llamacpp` / `--llm …` | LLM рядом со 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` | Манифесты | ### Лаунчер (`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 ``` ### Основные переменные (`.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 `/.gpu-rent/state.json` — ids, фаза, timestamps (окно preempt 24 ч). Без паролей. Lockfile рядом — два `up` не создадут два сервера. --- ## Ожидание готовности Ориентир: **~20–40 мин** первый bootstrap, **~5–10 мин** unshelve. Порядок готовности: 1. Nova `ACTIVE` 2. TCP 22 / SSH 3. HTTP `http://127.0.0.1:7801` **на VM** (через SSH) 4. Backend Idle → toast (если `NOTIFY_READY`) + access-card Локальный порт UI: **17801** (на VM по-прежнему 7801 на loopback). --- ## Windows / notify `NOTIFY_READY`: toast + системный звук, когда backend Idle. Если toast недоступен — только звук и лог, без падения CLI.