deploy/: серверные скрипты и юниты в репозиторий + нумерация циклов в логе
evolve_forever.sh теперь пишет в лог явные маркеры конвейера: «ЦИКЛ #N стартует (лучший КПД за всё время: X%)» и «ЦИКЛ #N завершён — НЕ остановка, стартует #N+1». Раньше скрипты жили только на VM без версионирования. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
13
deploy/README.md
Normal file
13
deploy/README.md
Normal 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
28
deploy/evolve_forever.sh
Executable 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
|
||||
15
deploy/gausse-evolve.service
Normal file
15
deploy/gausse-evolve.service
Normal 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
|
||||
13
deploy/gausse-gpustat.service
Normal file
13
deploy/gausse-gpustat.service
Normal 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
13
deploy/gpustat_loop.sh
Executable 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
|
||||
Reference in New Issue
Block a user