diff --git a/deploy/README.md b/deploy/README.md new file mode 100644 index 0000000..9913a6e --- /dev/null +++ b/deploy/README.md @@ -0,0 +1,13 @@ +# Развёртывание на сервере (VM 106, 192.168.20.47) + +Автономная работа — три systemd-сервиса (все enabled, переживают ребут): + +| Сервис | Что делает | +|---|---| +| `gausse-evolve` | вечный цикл эволюции на GPU (`evolve_forever.sh`), `Restart=always`, `TimeoutStopSec=180` (дать дописать очередь в базу при остановке) | +| `gausse-gpustat` | пишет `results/gpustat.json` каждые 5с — карточка GPU на дашборде | +| Docker `web` | дашборд :8000 (наружу: https://gausse.jze9.ru через nginx LXC 102 + certbot) | + +Обновление кода: `git pull && pip install -e . (в .venv) && docker compose build web && docker compose up -d web && sudo systemctl restart gausse-evolve`. +Остановка сервиса безопасна: главный процесс по SIGTERM дописывает всю очередь +оценённых прогонов в базу перед выходом («сохраняем всё»). diff --git a/deploy/evolve_forever.sh b/deploy/evolve_forever.sh new file mode 100755 index 0000000..2538a7f --- /dev/null +++ b/deploy/evolve_forever.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# Вечная эволюция на GPU: бесконечный конвейер циклов. Каждый цикл — свежая +# случайная популяция («революция» против застревания в локальном оптимуме), +# всё пишется в одну базу, дашборд показывает лучший за всё время. +# Развёртывание: см. deploy/README.md; systemd-юнит: gausse-evolve.service. +cd /home/user/gausse +source .venv/bin/activate +LOG=results/gausse.sqlite3.log +cycle=1 +while true; do + best=$(python3 - <<'PY' +import sqlite3 +try: + c = sqlite3.connect("results/gausse.sqlite3") + row = c.execute("select max(efficiency) from runs where feasible=1").fetchone() + print(f"{row[0]*100:.2f}%" if row and row[0] is not None else "пока нет") +except Exception: + print("пока нет") +PY +) + echo "$(date -Is) ═════ ЦИКЛ #$cycle стартует (конвейер бесконечный; лучший КПД за всё время: $best) ═════" >> "$LOG" + python3 -c "from pathlib import Path +from gausse.optim.evolutionary import run_evolution +run_evolution(Path('results/gausse.sqlite3'), n_generations=60, population_size=4000, seed=None, polish=True, use_gpu=True)" + echo "$(date -Is) ═════ ЦИКЛ #$cycle завершён — это НЕ остановка: через 3с стартует цикл #$((cycle+1)) со свежей случайной популяцией ═════" >> "$LOG" + cycle=$((cycle+1)) + sleep 3 +done diff --git a/deploy/gausse-evolve.service b/deploy/gausse-evolve.service new file mode 100644 index 0000000..b543ff4 --- /dev/null +++ b/deploy/gausse-evolve.service @@ -0,0 +1,15 @@ +[Unit] +Description=gausse continuous evolution (autonomous, runs for years) +After=network-online.target docker.service + +[Service] +Type=simple +User=user +WorkingDirectory=/home/user/gausse +ExecStart=/bin/bash /home/user/gausse/evolve_forever.sh +Restart=always +RestartSec=15 +TimeoutStopSec=180 + +[Install] +WantedBy=multi-user.target diff --git a/deploy/gausse-gpustat.service b/deploy/gausse-gpustat.service new file mode 100644 index 0000000..9065933 --- /dev/null +++ b/deploy/gausse-gpustat.service @@ -0,0 +1,13 @@ +[Unit] +Description=gausse GPU stat writer for dashboard +After=gausse-evolve.service + +[Service] +Type=simple +User=user +ExecStart=/bin/bash /home/user/gausse/gpustat_loop.sh +Restart=always +RestartSec=10 + +[Install] +WantedBy=multi-user.target diff --git a/deploy/gpustat_loop.sh b/deploy/gpustat_loop.sh new file mode 100755 index 0000000..9ab7d76 --- /dev/null +++ b/deploy/gpustat_loop.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# Пишет загрузку GPU в results/gpustat.json для веб-морды (раз в 5с) +cd /home/user/gausse +while true; do + line=$(nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total,power.draw,temperature.gpu --format=csv,noheader,nounits 2>/dev/null) + if [ -n "$line" ]; then + IFS=", " read -r util mem memtot pw temp <<< "$line" + printf '{"ts": %s, "util_pct": %s, "mem_used_mib": %s, "mem_total_mib": %s, "power_w": %s, "temp_c": %s}\n' \ + "$(date +%s)" "$util" "$mem" "$memtot" "$pw" "$temp" > results/gpustat.json.tmp + mv results/gpustat.json.tmp results/gpustat.json + fi + sleep 5 +done