게시판SGF 기보로 학습하는 바둑 LLM 인공지능예제 소스

예제 소스

SGF 기보로 학습하는 바둑 LLM 인공지능 · 파일 169개

install_nightly_sqlite_train.sh

#!/bin/zsh
# 매일 00:00 KST 에 nightly_sqlite_train.py 를 돌리는 launchd 등록.
set -euo pipefail
ROOT="~/project"
LABEL="com.mariago.nightly-sqlite-train"
LA_DIR="$HOME/Library/LaunchAgents"
SUPPORT="$HOME/Library/Application Support/MariGO"
LOGS="$HOME/Library/Logs/MariGO"
GUI="gui/$(id -u)"
PY="$ROOT/.venv/bin/python"

mkdir -p "$LA_DIR" "$SUPPORT" "$LOGS" "$ROOT/logs/onpolicy"

WRAPPER="$SUPPORT/run-nightly-sqlite-train.sh"
cat >"$WRAPPER" <<EOF
#!/bin/zsh
set -euo pipefail
ROOT="$ROOT"
LOG="$LOGS/nightly-sqlite-train.log"
export PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
i=0
until [[ -x "\$ROOT/.venv/bin/python" ]]; do
  echo "\$(date '+%Y-%m-%d %H:%M:%S') waiting for \$ROOT" >>"\$LOG"
  i=\$((i + 1))
  if [[ \$i -ge 60 ]]; then
    echo "\$(date '+%Y-%m-%d %H:%M:%S') volume not mounted, give up" >>"\$LOG"
    exit 0
  fi
  sleep 30
done
cd "\$ROOT"
export PYTHONUNBUFFERED=1
export HF_HOME="\$ROOT/vlm_models"
export HF_HUB_CACHE="\$ROOT/vlm_models"
export TOKENIZERS_PARALLELISM=false
exec /usr/bin/caffeinate -s "\$ROOT/.venv/bin/python" scripts/nightly_sqlite_train.py >>"\$LOG" 2>&1
EOF
chmod +x "$WRAPPER"

PLIST="$LA_DIR/$LABEL.plist"
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>StartCalendarInterval</key>
  <dict>
    <key>Hour</key>
    <integer>0</integer>
    <key>Minute</key>
    <integer>0</integer>
  </dict>
  <key>RunAtLoad</key>
  <false/>
  <key>StandardOutPath</key>
  <string>${LOGS}/nightly-sqlite-train.stdout.log</string>
  <key>StandardErrorPath</key>
  <string>${LOGS}/nightly-sqlite-train.stderr.log</string>
</dict>
</plist>
EOF

# 오늘보다 앞선 날은 이미 수동 학습에 썼으므로 완료로 표시한다.
# 오늘(자정까지 쌓이는 날)은 비워 두어, 다음 00:00 에 그 하루만 학습한다.
"$PY" - <<'PY'
import json, sqlite3
from datetime import datetime, timedelta, timezone
from pathlib import Path
root = Path("~/project")
db = root / "logs/mariago_web_monitor/matches.sqlite"
state_path = root / "logs/onpolicy/nightly_state.json"
kst = timezone(timedelta(hours=9))
today = datetime.now(kst).date().isoformat()
expr = "date(replace(substr(finished_at,1,19),'T',' '), '+9 hours')"
con = sqlite3.connect(f"file:{db}?mode=ro", uri=True)
rows = con.execute(
    f"select distinct {expr} d from games where finished_at is not null and finished_at != '' and {expr} < ? order by d",
    (today,),
).fetchall()
con.close()
if state_path.exists():
    state = json.loads(state_path.read_text())
else:
    state = {"done": []}
have = {d.get("day") for d in state.get("done", [])}
now = datetime.now(kst).strftime("%Y-%m-%d %H:%M:%S")
for (day,) in rows:
    if day in have:
        continue
    state.setdefault("done", []).append({
        "day": day,
        "status": "seed",
        "at": now,
        "note": "자정 자동화 등록 전에 쌓인 날. 다음 00:00부터 새 하루만 학습",
    })
state_path.write_text(json.dumps(state, ensure_ascii=False, indent=2) + "\n")
print(state_path.read_text())
PY

launchctl bootout "$GUI" "$PLIST" 2>/dev/null || true
launchctl bootstrap "$GUI" "$PLIST"
launchctl enable "$GUI/$LABEL" 2>/dev/null || true
echo "installed $LABEL"
launchctl print "$GUI/$LABEL" | grep -E 'state =|path =|hour =|minute =|runs =' || true