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