Files
gpu-rent/docs/roadmap.md
T
Leonid PershinandCursor 6dfbf4e702 Add Civitai Krea2 metadata scrape for train JSONL and Assistent FTS search.
Local civitai-dataset launchers collect ~2000 prompt/params rows without images; search.jsonl is pushed on up for cheap example lookup.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-23 08:13:53 +03:00

105 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Roadmap
**Код v1 (§1–6) готов** (включая opt-in LLM, local-watchdog, access-card). Дальше — твой облачный прогон.
Пользовательский путь: [setup.md](setup.md) → `doctor``up`. Чеклист живого GPU: [spike-notes.md](spike-notes.md).
## 0.0 Квота GPU
- [ ] Квота GPU в панели ≥ 1 (иначе тикет — текст в setup §2.3)
- [ ] Тикет закрыт / не нужен
- [ ] Сервисный пользователь `member` + `.env` заполнен
- [ ] `gpu-rent doctor` exit 0
`flavors` / `dry-run` — по желанию перед первым `up`.
## 0. Ручной spike в панели
Заполняй [spike-notes.md](spike-notes.md). В коде уже есть idle-killer, hold, snapshot, tunnel-watchdog — spike **проверяет** на живом GPU, не пишет заново.
- [ ] RC-файл, `doctor` зелёный, квота > 0
- [ ] `flavors` / образ Driver **580** без Docker в пуле
- [ ] `up --yes` → Idle backend + seed; время ACTIVE/SSH/Idle
- [ ] `tunnel` → UI :17801 + API; `nvidia-smi`
- [ ] idle-killer timer + `hold`; качалка UI → только hold
- [ ] EXPIRED → tunnel unshelve или `up`
- [ ] `stop` → диски живы → второй `up`
- [ ] Boot snapshot `gpu-rent-boot-ok` → следующий boot из него
- [ ] ₽/час и ₽/мес диска из панели (в API нет)
Заметки — только в spike-notes.md, без секретов.
## 1. Каркас
- [x] `pyproject.toml`, пакет `gpu_rent`, MIT
- [x] config / state / Typer: doctor, dry-run, status, open, up, stop, destroy, ssh, logs, tunnel, hold, seed-*, push, pull-output, resize-data, flavors
- [x] Windows: `gpu-rent.bat` / `gpu-rent.ps1`; Unix: `gpu-rent.sh`; также `python -m gpu_rent`
- [x] [setup.md](setup.md) — квота, сервисный пользователь, RC, Civitai
## 2. OpenStack-клиент
- [x] Token через openstacksdk (`authorize`), inventory flavors/квота/volume type
- [x] Сеть find-or-create, SG, FIP, volumes, server, unshelve
- [x] Preemptible tag 2.72, BDM boot+data, `delete_on_termination=false`
- [x] Flavor fallback по `FLAVOR_PREFERENCE` (ранжирование + выбор на `up`)
- [x] `doctor`: Keystone, квота, flavor, диск, Civitai `.red`, манифесты
- [x] Тесты с моками / без облака
## 3. Сессия без туннеля
- [x] `up` / `stop` / `status` / reconcile (compute+диски+SSH+bootstrap SwarmUI)
- [x] `status`: диск used/free (SSH), TTL preempt 24 ч, killer/hold; ₽/час — «смотри панель»
- [x] Второй `up` не создаёт второй GPU
- [x] `resize-data` вверх
- [x] Генерация `<repo>/.gpu-rent/id_ed25519` + keypair при первом `up`
- [x] `seed-models` на живом диске (идемпотентно, SHA256)
- [x] `push` / `push-models`: `Models/`, `Wildcards/`, `CustomWorkflows/`
- [x] `pull-output` и `PULL_OUTPUT` на `stop` / повторный `up`
- [x] `seed-extensions` + `systemctl restart swarmui`
- [x] `destroy` только с флагом
## 4. Bootstrap SwarmUI + idle-killer
- [x] Идемпотентный first-boot, маркер FS (`/mnt/swarm_data/.gpu-rent-ready`)
- [x] Bind-mounts data volume → `/opt/swarmui`, systemd `swarmui` (auth SwarmUI ещё на spike)
- [x] Clone `extensions.yaml` в Extensions / DLNodes до старта UI
- [x] Autocomplete: danbooru.csv + Settings.fds; на каждом up — GitHub sha
- [x] Civitai seed по манифесту; без токена — дефолт SwarmUI
- [x] systemd idle-killer + application credential; льгота `IDLE_GRACE_MINUTES=45`; hold-файл; очередь/loading = busy; затем `IDLE_MINUTES=30` пустой очереди; вооружение после seed/start (качалка UI = hold)
- [x] Один snapshot `gpu-rent-boot-ok` после первого backend Idle; следующие create — из snapshot если есть
- [x] `gpu-rent hold` / `hold --clear` по SSH
- [x] `ready` по HTTP, затем backend Idle
## 5. Туннель
- [x] `gpu-rent tunnel` → 17801; **Ctrl+C / Ctrl+D** вызывают `stop` (диски остаются)
- [x] `gpu-rent open` / `tunnel --open`
- [x] EXPIRED → unshelve + reconnect, пока туннель жив
- [x] Сниппет MCP в stdout
## 6. UX
- [x] Живой список flavors (`gpu-rent flavors` / dry-run / up), `--no-spot`, печать фоллбека
- [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
- Debug API на `127.0.0.1:17821` (`gpu-rent debug` / sidecar на `up`/`tunnel`); Assistent session / chat-eval
- `civitai-dataset``datasets/civitai/search.jsonl` → FTS push на `up` / `seed-personas`
- `seed-personas`, `capture wanted`, `logs --unit swarm|ollama|killer|cloud-init`
- Balance notify (`SELECTEL_API_TOKEN` + watchdog)
Spike в §0 по-прежнему нужно закрыть на живом GPU.
## Вне скоупа v1
- `generate` в CLI, S3 как источник моделей
- Автоправка Cursor `mcp.json`
- Несколько GPU, публичный URL, Terraform как основной путь
- Tailscale (туннеля достаточно; к сети с телефона не подключались)