diff --git a/docs/architecture.md b/docs/architecture.md index 81e1405..48201f8 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -133,7 +133,7 @@ Killer молчит: Учётные данные на VM: application credential (или роль без `compute:create`), только delete/shelve. Файл не попадает в Output/Models. Истечение кредов = killer слеп; тогда спасает `gpu-rent status` с ноутбука. -Дефолты: `IDLE_MINUTES=60`, `IDLE_GRACE_MINUTES=90`. +Дефолты: `IDLE_MINUTES=30`, `IDLE_GRACE_MINUTES=45`. ## Watchdog туннеля (на ноутбуке) diff --git a/docs/cli.md b/docs/cli.md index e269476..292b19b 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -201,8 +201,8 @@ FLAVOR_FALLBACK=true SCAN_POOLS=ru-6,ru-7 DEFAULT_SPOT=true KEEP_FLOATING_IP=false -IDLE_MINUTES=60 -IDLE_GRACE_MINUTES=90 +IDLE_MINUTES=30 +IDLE_GRACE_MINUTES=45 # LOCAL_WATCHDOG_GRACE_MINUTES=10 PULL_OUTPUT=false NOTIFY_READY=true diff --git a/docs/models.md b/docs/models.md index 973085d..49e5a25 100644 --- a/docs/models.md +++ b/docs/models.md @@ -87,7 +87,7 @@ ComfyUI в `dlbackend` качается всегда. Речь только о * 8. Первый старт SwarmUI (папки чекпоинтов уже не пустые → установщик не предлагает свой SD; Extensions и Autocompletions уже на месте). 9. Ждать backend Idle, затем вооружить idle-killer. -Качание нескольких GB легко длиннее льготы 90 минут. Поэтому killer не живёт, пока не закончился seed. +Качание нескольких GB легко длиннее льготы 45 минут. Поэтому killer не живёт, пока не закончился seed. Позже тот же код: `gpu-rent seed-models` — докачать новые строки манифеста на уже живой диск (идемпотентно). diff --git a/docs/open-questions.md b/docs/open-questions.md index 16825ea..5737e52 100644 --- a/docs/open-questions.md +++ b/docs/open-questions.md @@ -10,4 +10,4 @@ - App cred с узкими access_rules на Selectel: код fail closed; на spike убедиться, что Keystone принимает rules. - Snapshot attached boot после Idle: время; create from snapshot ок. -Если 90 мин льготы мало на первый Comfy — подними `IDLE_GRACE_MINUTES`, не отключай killer. +Если 45 мин льготы мало на первый Comfy — подними `IDLE_GRACE_MINUTES`, не отключай killer. diff --git a/docs/setup.md b/docs/setup.md index 7aacbbf..413ab8a 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -273,7 +273,7 @@ copy models.example.yaml models.yaml - **GPU** — пока жив compute. - **Data-диск** — тарифицируется **всегда** после создания. - Preemptible ~**24 ч** → `EXPIRED`; `tunnel` или `up` восстановят. -- Idle-killer: после льготы (~90 мин) + ~60 мин пустой очереди → delete compute. +- Idle-killer: после льготы (~45 мин) + ~30 мин пустой очереди → delete compute. - Цены в OpenStack API нет — смотри панель Selectel. Дальше: чеклист живого прогона [spike-notes.md](spike-notes.md), справочник команд [cli.md](cli.md). diff --git a/env.example b/env.example index 4e38adf..c17ec3d 100644 --- a/env.example +++ b/env.example @@ -72,8 +72,8 @@ FLAVOR_FALLBACK=true SCAN_POOLS=ru-6,ru-7 DEFAULT_SPOT=true KEEP_FLOATING_IP=false -IDLE_MINUTES=60 -IDLE_GRACE_MINUTES=90 +IDLE_MINUTES=30 +IDLE_GRACE_MINUTES=45 # Optional local safety net (after: gpu-rent watchdog install) # LOCAL_WATCHDOG_GRACE_MINUTES=10 PULL_OUTPUT=false diff --git a/gpu-rent.vars.example b/gpu-rent.vars.example index 8a1d8c2..38855b8 100644 --- a/gpu-rent.vars.example +++ b/gpu-rent.vars.example @@ -19,8 +19,8 @@ # SWARMUI_LOCAL_PORT=17801 # DATA_VOLUME_SIZE_GB=100 # ENABLE_SWARMUI=true -# IDLE_MINUTES=60 -# IDLE_GRACE_MINUTES=90 +# IDLE_MINUTES=30 +# IDLE_GRACE_MINUTES=45 # NOTIFY_READY=true # UP_STOP_ON_FAIL=true # при падении up гасить GPU (default); false / --keep-on-fail # Prefer auto /32 (leave unset). Spike/WARP only: diff --git a/src/gpu_rent/config.py b/src/gpu_rent/config.py index 53ee397..3e9610d 100644 --- a/src/gpu_rent/config.py +++ b/src/gpu_rent/config.py @@ -255,8 +255,8 @@ def load_config(*, require_auth: bool = True) -> Config: scan_pools=(os.environ.get("SCAN_POOLS") or "ru-6,ru-7").strip(), default_spot=_as_bool(os.environ.get("DEFAULT_SPOT"), True), keep_floating_ip=_as_bool(os.environ.get("KEEP_FLOATING_IP"), False), - idle_minutes=_as_int(os.environ.get("IDLE_MINUTES"), 60), - idle_grace_minutes=_as_int(os.environ.get("IDLE_GRACE_MINUTES"), 90), + idle_minutes=_as_int(os.environ.get("IDLE_MINUTES"), 30), + idle_grace_minutes=_as_int(os.environ.get("IDLE_GRACE_MINUTES"), 45), pull_output=_as_bool(os.environ.get("PULL_OUTPUT"), False), notify_ready=_as_bool(os.environ.get("NOTIFY_READY"), True), # Default on: failed up must not leave a billing GPU running. diff --git a/src/gpu_rent/remote/idle_killer.py b/src/gpu_rent/remote/idle_killer.py index 5fbf92c..c31fad6 100644 --- a/src/gpu_rent/remote/idle_killer.py +++ b/src/gpu_rent/remote/idle_killer.py @@ -242,7 +242,7 @@ def main() -> int: now = time.time() grace_from = float(creds.get("grace_from") or 0) - grace_minutes = float(creds.get("grace_minutes") or 90) + grace_minutes = float(creds.get("grace_minutes") or 45) if now < grace_from + grace_minutes * 60: left = int(grace_from + grace_minutes * 60 - now) log(f"grace {left}s left") @@ -269,7 +269,7 @@ def main() -> int: log(f"busy: {llm_detail}") return 0 - idle_minutes = float(creds.get("idle_minutes") or 60) + idle_minutes = float(creds.get("idle_minutes") or 30) since = read_ts(IDLE_SINCE) if since is None: write_ts(IDLE_SINCE, now)