Update idle time configuration and documentation
- Increased default values for IDLE_MINUTES from 30 to 60 and IDLE_GRACE_MINUTES from 45 to 90 across configuration files and documentation. - Updated related documentation to reflect the new default idle time settings, ensuring consistency in user guidance and system behavior.
This commit is contained in:
@@ -133,7 +133,7 @@ Killer молчит:
|
|||||||
|
|
||||||
Учётные данные на VM: application credential (или роль без `compute:create`), только delete/shelve. Файл не попадает в Output/Models. Истечение кредов = killer слеп; тогда спасает `gpu-rent status` с ноутбука.
|
Учётные данные на VM: application credential (или роль без `compute:create`), только delete/shelve. Файл не попадает в Output/Models. Истечение кредов = killer слеп; тогда спасает `gpu-rent status` с ноутбука.
|
||||||
|
|
||||||
Дефолты: `IDLE_MINUTES=30`, `IDLE_GRACE_MINUTES=45`.
|
Дефолты: `IDLE_MINUTES=60`, `IDLE_GRACE_MINUTES=90`.
|
||||||
|
|
||||||
## Watchdog туннеля (на ноутбуке)
|
## Watchdog туннеля (на ноутбуке)
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -200,8 +200,8 @@ FLAVOR_FALLBACK=true
|
|||||||
SCAN_POOLS=ru-6,ru-7
|
SCAN_POOLS=ru-6,ru-7
|
||||||
DEFAULT_SPOT=true
|
DEFAULT_SPOT=true
|
||||||
KEEP_FLOATING_IP=false
|
KEEP_FLOATING_IP=false
|
||||||
IDLE_MINUTES=30
|
IDLE_MINUTES=60
|
||||||
IDLE_GRACE_MINUTES=45
|
IDLE_GRACE_MINUTES=90
|
||||||
# LOCAL_WATCHDOG_GRACE_MINUTES=10
|
# LOCAL_WATCHDOG_GRACE_MINUTES=10
|
||||||
PULL_OUTPUT=false
|
PULL_OUTPUT=false
|
||||||
NOTIFY_READY=true
|
NOTIFY_READY=true
|
||||||
|
|||||||
+1
-1
@@ -87,7 +87,7 @@ ComfyUI в `dlbackend` качается всегда. Речь только о *
|
|||||||
8. Первый старт SwarmUI (папки чекпоинтов уже не пустые → установщик не предлагает свой SD; Extensions и Autocompletions уже на месте).
|
8. Первый старт SwarmUI (папки чекпоинтов уже не пустые → установщик не предлагает свой SD; Extensions и Autocompletions уже на месте).
|
||||||
9. Ждать backend Idle, затем вооружить idle-killer.
|
9. Ждать backend Idle, затем вооружить idle-killer.
|
||||||
|
|
||||||
Качание нескольких GB легко длиннее льготы 45 минут. Поэтому killer не живёт, пока не закончился seed.
|
Качание нескольких GB легко длиннее льготы 90 минут. Поэтому killer не живёт, пока не закончился seed.
|
||||||
|
|
||||||
Позже тот же код: `gpu-rent seed-models` — докачать новые строки манифеста на уже живой диск (идемпотентно).
|
Позже тот же код: `gpu-rent seed-models` — докачать новые строки манифеста на уже живой диск (идемпотентно).
|
||||||
|
|
||||||
|
|||||||
@@ -10,4 +10,4 @@
|
|||||||
- App cred с узкими access_rules на Selectel: код fail closed; на spike убедиться, что Keystone принимает rules.
|
- App cred с узкими access_rules на Selectel: код fail closed; на spike убедиться, что Keystone принимает rules.
|
||||||
- Snapshot attached boot после Idle: время; create from snapshot ок.
|
- Snapshot attached boot после Idle: время; create from snapshot ок.
|
||||||
|
|
||||||
Если 45 мин льготы мало на первый Comfy — подними `IDLE_GRACE_MINUTES`, не отключай killer.
|
Если 90 мин льготы мало на первый Comfy — подними `IDLE_GRACE_MINUTES`, не отключай killer.
|
||||||
|
|||||||
+1
-1
@@ -65,7 +65,7 @@
|
|||||||
- [x] Clone `extensions.yaml` в Extensions / DLNodes до старта UI
|
- [x] Clone `extensions.yaml` в Extensions / DLNodes до старта UI
|
||||||
- [x] Autocomplete: danbooru.csv + Settings.fds; на каждом up — GitHub sha
|
- [x] Autocomplete: danbooru.csv + Settings.fds; на каждом up — GitHub sha
|
||||||
- [x] Civitai seed по манифесту; без токена — дефолт SwarmUI
|
- [x] Civitai seed по манифесту; без токена — дефолт SwarmUI
|
||||||
- [x] systemd idle-killer + application credential; льгота 45 мин; hold-файл; очередь/loading = busy; затем 30 мин пустой очереди; вооружение после seed/start (качалка UI = hold)
|
- [x] systemd idle-killer + application credential; льгота 90 мин; hold-файл; очередь/loading = busy; затем 60 мин пустой очереди; вооружение после seed/start (качалка UI = hold)
|
||||||
- [x] Один snapshot `gpu-rent-boot-ok` после первого backend Idle; следующие create — из snapshot если есть
|
- [x] Один snapshot `gpu-rent-boot-ok` после первого backend Idle; следующие create — из snapshot если есть
|
||||||
- [x] `gpu-rent hold` / `hold --clear` по SSH
|
- [x] `gpu-rent hold` / `hold --clear` по SSH
|
||||||
- [x] `ready` по HTTP, затем backend Idle
|
- [x] `ready` по HTTP, затем backend Idle
|
||||||
|
|||||||
+1
-1
@@ -273,7 +273,7 @@ copy models.example.yaml models.yaml
|
|||||||
- **GPU** — пока жив compute.
|
- **GPU** — пока жив compute.
|
||||||
- **Data-диск** — тарифицируется **всегда** после создания.
|
- **Data-диск** — тарифицируется **всегда** после создания.
|
||||||
- Preemptible ~**24 ч** → `EXPIRED`; `tunnel` или `up` восстановят.
|
- Preemptible ~**24 ч** → `EXPIRED`; `tunnel` или `up` восстановят.
|
||||||
- Idle-killer: после льготы (~45 мин) + ~30 мин пустой очереди → delete compute.
|
- Idle-killer: после льготы (~90 мин) + ~60 мин пустой очереди → delete compute.
|
||||||
- Цены в OpenStack API нет — смотри панель Selectel.
|
- Цены в OpenStack API нет — смотри панель Selectel.
|
||||||
|
|
||||||
Дальше: чеклист живого прогона [spike-notes.md](spike-notes.md), справочник команд [cli.md](cli.md).
|
Дальше: чеклист живого прогона [spike-notes.md](spike-notes.md), справочник команд [cli.md](cli.md).
|
||||||
|
|||||||
+1
-1
@@ -120,7 +120,7 @@
|
|||||||
|
|
||||||
- Имя GPU-образа в пуле:
|
- Имя GPU-образа в пуле:
|
||||||
- Реальные flavor id (не в git):
|
- Реальные flavor id (не в git):
|
||||||
- Хватает ли `IDLE_GRACE_MINUTES=45`:
|
- Хватает ли `IDLE_GRACE_MINUTES=90`:
|
||||||
- Application credential с узкими access_rules: ок / ошибка (fail closed):
|
- Application credential с узкими access_rules: ок / ошибка (fail closed):
|
||||||
- Прочее:
|
- Прочее:
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -57,8 +57,8 @@ FLAVOR_FALLBACK=true
|
|||||||
SCAN_POOLS=ru-6,ru-7
|
SCAN_POOLS=ru-6,ru-7
|
||||||
DEFAULT_SPOT=true
|
DEFAULT_SPOT=true
|
||||||
KEEP_FLOATING_IP=false
|
KEEP_FLOATING_IP=false
|
||||||
IDLE_MINUTES=30
|
IDLE_MINUTES=60
|
||||||
IDLE_GRACE_MINUTES=45
|
IDLE_GRACE_MINUTES=90
|
||||||
# Optional local safety net (after: gpu-rent watchdog install)
|
# Optional local safety net (after: gpu-rent watchdog install)
|
||||||
# LOCAL_WATCHDOG_GRACE_MINUTES=10
|
# LOCAL_WATCHDOG_GRACE_MINUTES=10
|
||||||
PULL_OUTPUT=false
|
PULL_OUTPUT=false
|
||||||
|
|||||||
@@ -23,8 +23,8 @@
|
|||||||
# LLM_RUNTIME=none
|
# LLM_RUNTIME=none
|
||||||
# OLLAMA_LOCAL_PORT=17811
|
# OLLAMA_LOCAL_PORT=17811
|
||||||
# LLAMACPP_LOCAL_PORT=17812
|
# LLAMACPP_LOCAL_PORT=17812
|
||||||
# IDLE_MINUTES=30
|
# IDLE_MINUTES=60
|
||||||
# IDLE_GRACE_MINUTES=45
|
# IDLE_GRACE_MINUTES=90
|
||||||
# LOCAL_WATCHDOG_GRACE_MINUTES=10
|
# LOCAL_WATCHDOG_GRACE_MINUTES=10
|
||||||
# NOTIFY_READY=true
|
# NOTIFY_READY=true
|
||||||
# PULL_OUTPUT=false
|
# PULL_OUTPUT=false
|
||||||
|
|||||||
@@ -250,8 +250,8 @@ def load_config(*, require_auth: bool = True) -> Config:
|
|||||||
scan_pools=(os.environ.get("SCAN_POOLS") or "ru-6,ru-7").strip(),
|
scan_pools=(os.environ.get("SCAN_POOLS") or "ru-6,ru-7").strip(),
|
||||||
default_spot=_as_bool(os.environ.get("DEFAULT_SPOT"), True),
|
default_spot=_as_bool(os.environ.get("DEFAULT_SPOT"), True),
|
||||||
keep_floating_ip=_as_bool(os.environ.get("KEEP_FLOATING_IP"), False),
|
keep_floating_ip=_as_bool(os.environ.get("KEEP_FLOATING_IP"), False),
|
||||||
idle_minutes=_as_int(os.environ.get("IDLE_MINUTES"), 30),
|
idle_minutes=_as_int(os.environ.get("IDLE_MINUTES"), 60),
|
||||||
idle_grace_minutes=_as_int(os.environ.get("IDLE_GRACE_MINUTES"), 45),
|
idle_grace_minutes=_as_int(os.environ.get("IDLE_GRACE_MINUTES"), 90),
|
||||||
pull_output=_as_bool(os.environ.get("PULL_OUTPUT"), False),
|
pull_output=_as_bool(os.environ.get("PULL_OUTPUT"), False),
|
||||||
notify_ready=_as_bool(os.environ.get("NOTIFY_READY"), True),
|
notify_ready=_as_bool(os.environ.get("NOTIFY_READY"), True),
|
||||||
selectel_api_token=(os.environ.get("SELECTEL_API_TOKEN") or "").strip(),
|
selectel_api_token=(os.environ.get("SELECTEL_API_TOKEN") or "").strip(),
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ ARMED = DATA / ".gpu-rent-killer-armed"
|
|||||||
LOG = DATA / ".gpu-rent-killer.log"
|
LOG = DATA / ".gpu-rent-killer.log"
|
||||||
SERVER_ID_FILE = DATA / ".gpu-rent-server-id"
|
SERVER_ID_FILE = DATA / ".gpu-rent-server-id"
|
||||||
# After this many seconds of continuous Swarm unreachable → treat as idle (don't bill forever).
|
# After this many seconds of continuous Swarm unreachable → treat as idle (don't bill forever).
|
||||||
SWARM_UNREACHABLE_IDLE_SEC = 60 * 60
|
SWARM_UNREACHABLE_IDLE_SEC = 2 * 60 * 60
|
||||||
|
|
||||||
|
|
||||||
def log(msg: str) -> None:
|
def log(msg: str) -> None:
|
||||||
@@ -242,7 +242,7 @@ def main() -> int:
|
|||||||
|
|
||||||
now = time.time()
|
now = time.time()
|
||||||
grace_from = float(creds.get("grace_from") or 0)
|
grace_from = float(creds.get("grace_from") or 0)
|
||||||
grace_minutes = float(creds.get("grace_minutes") or 45)
|
grace_minutes = float(creds.get("grace_minutes") or 90)
|
||||||
if now < grace_from + grace_minutes * 60:
|
if now < grace_from + grace_minutes * 60:
|
||||||
left = int(grace_from + grace_minutes * 60 - now)
|
left = int(grace_from + grace_minutes * 60 - now)
|
||||||
log(f"grace {left}s left")
|
log(f"grace {left}s left")
|
||||||
@@ -269,7 +269,7 @@ def main() -> int:
|
|||||||
log(f"busy: {llm_detail}")
|
log(f"busy: {llm_detail}")
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
idle_minutes = float(creds.get("idle_minutes") or 30)
|
idle_minutes = float(creds.get("idle_minutes") or 60)
|
||||||
since = read_ts(IDLE_SINCE)
|
since = read_ts(IDLE_SINCE)
|
||||||
if since is None:
|
if since is None:
|
||||||
write_ts(IDLE_SINCE, now)
|
write_ts(IDLE_SINCE, now)
|
||||||
|
|||||||
Reference in New Issue
Block a user