예제 소스
바둑 on-policy 학습: 대국 로그를 KataGo 라벨로 바꾸기 · 파일 169개
install_mariago_ensemble.sh
#!/usr/bin/env bash
# 앙상블 프록시(여러 모델 제안 → 판정자 선택)를 launchd 로 켜고 끈다. VLM(:9319)은 건드리지 않는다.
#
# ./scripts/install_mariago_ensemble.sh on # 프록시 :9318 기동 + 브리지를 프록시로 전환
# ./scripts/install_mariago_ensemble.sh off # 브리지를 VLM :9319 직결로 되돌리고 프록시 중지
# ./scripts/install_mariago_ensemble.sh status
#
# 제안 모델·판정자 변경:
# MARIAGO_ENSEMBLE_ARGS="--proposer r5=127.0.0.1:9319 --proposer r4=127.0.0.1:9329 --judge katago" \
# ./scripts/install_mariago_ensemble.sh on
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
GUI="gui/$(id -u)"
LABEL="com.mariago.ensemble-proxy"
LA_DIR="$HOME/Library/LaunchAgents"
PLIST="$LA_DIR/$LABEL.plist"
SUPPORT="$HOME/Library/Application Support/MariGO"
LOGS="$HOME/Library/Logs/MariGO"
WRAPPER="$SUPPORT/run-ensemble-proxy.sh"
PORT_FILE="$ROOT/config/mariago_move_port"
PY="$ROOT/.venv/bin/python"
PROXY_PORT=9318
ARGS="${MARIAGO_ENSEMBLE_ARGS:---proposer r5=127.0.0.1:9319 --judge katago}"
restart_bridge() {
# 워치독(external-probe / tunnel-watchdog)이 30초 안에 새 포트 설정으로 다시 띄운다.
pkill -f 'scripts/mariago_ws_bridge.py' 2>/dev/null || true
echo "bridge 재시작 요청 (워치독이 재기동)"
}
cmd="${1:-status}"
case "$cmd" in
on)
mkdir -p "$LA_DIR" "$SUPPORT" "$LOGS" "$ROOT/config" "$ROOT/logs/ensemble"
cat >"$WRAPPER" <<EOF
#!/bin/zsh
set -euo pipefail
cd "$ROOT"
export PYTHONUNBUFFERED=1
export HF_HOME="$ROOT/vlm_models"
export PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
exec "$PY" scripts/mariago_ensemble_proxy.py --listen-port $PROXY_PORT $ARGS >>"$LOGS/run-ensemble-proxy.log" 2>&1
EOF
chmod +x "$WRAPPER"
cat >"$PLIST" <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key><string>$LABEL</string>
<key>ProgramArguments</key>
<array><string>/bin/zsh</string><string>$WRAPPER</string></array>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>
<key>ThrottleInterval</key><integer>15</integer>
<key>StandardOutPath</key><string>$LOGS/ensemble-proxy.stdout.log</string>
<key>StandardErrorPath</key><string>$LOGS/ensemble-proxy.stderr.log</string>
</dict>
</plist>
EOF
launchctl bootout "$GUI" "$PLIST" 2>/dev/null || true
launchctl bootstrap "$GUI" "$PLIST"
echo "proxy args: $ARGS"
for _ in $(seq 1 60); do
lsof -nP -iTCP:$PROXY_PORT -sTCP:LISTEN >/dev/null 2>&1 && break
sleep 1
done
if ! lsof -nP -iTCP:$PROXY_PORT -sTCP:LISTEN >/dev/null 2>&1; then
echo "프록시가 :$PROXY_PORT 에서 뜨지 않음 — 브리지 전환 안 함. 로그: $LOGS/run-ensemble-proxy.log" >&2
exit 1
fi
echo "$PROXY_PORT" >"$PORT_FILE"
restart_bridge
echo "앙상블 ON — 웹 → 브리지 → 프록시 :$PROXY_PORT"
;;
off)
rm -f "$PORT_FILE"
restart_bridge
launchctl bootout "$GUI" "$PLIST" 2>/dev/null || true
echo "앙상블 OFF — 웹 → 브리지 → VLM :9319"
;;
status)
echo "bridge target: $(cat "$PORT_FILE" 2>/dev/null || echo 9319)"
launchctl print "$GUI/$LABEL" 2>/dev/null | grep -E 'state =|pid =' || echo "$LABEL: not loaded"
lsof -nP -iTCP:$PROXY_PORT,9319,9320 -sTCP:LISTEN 2>/dev/null || true
tail -n 3 "$ROOT/logs/ensemble/decisions.jsonl" 2>/dev/null || true
;;
*)
echo "usage: $0 on|off|status" >&2
exit 2
;;
esac