deploy/: серверные скрипты и юниты в репозиторий + нумерация циклов в логе

evolve_forever.sh теперь пишет в лог явные маркеры конвейера: «ЦИКЛ #N
стартует (лучший КПД за всё время: X%)» и «ЦИКЛ #N завершён — НЕ остановка,
стартует #N+1». Раньше скрипты жили только на VM без версионирования.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
jze9
2026-07-08 04:21:07 +05:00
parent e6b877bab7
commit 2af292e094
5 changed files with 82 additions and 0 deletions

13
deploy/README.md Normal file
View File

@@ -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 дописывает всю очередь
оценённых прогонов в базу перед выходом («сохраняем всё»).

28
deploy/evolve_forever.sh Executable file
View File

@@ -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

View File

@@ -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

View File

@@ -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

13
deploy/gpustat_loop.sh Executable file
View File

@@ -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