#!/bin/bash # Start/stop serve/openai_server.py as one process group, so stopping it also reaps the # engine's helper processes (otherwise they outlive the frontend and keep the GPUs). # # serve/server.sh start [openai_server.py args...] # serve/server.sh stop set -euo pipefail ROOT=$(cd "$(dirname "$0")/.." && pwd) PIDFILE="$ROOT/serve/server.pgid" LOG="${LOG:-$ROOT/serve.log}" case "${1:-}" in start) shift [ -s "$PIDFILE" ] && kill -0 -- "-$(cat "$PIDFILE")" 2>/dev/null && { echo "already running (pgid $(cat "$PIDFILE"))" >&2; exit 1; } [ -f "$ROOT/env.sh" ] && source "$ROOT/env.sh" # optional local environment (venv, DEEPINFER_* vars) : "${DEEPINFER_HF_MODEL_DIR:?set DEEPINFER_HF_MODEL_DIR to the local checkpoint directory}" export CUDA_VISIBLE_DEVICES="${CUDA_VISIBLE_DEVICES:-0,1,2,3}" setsid python -u "$ROOT/serve/openai_server.py" --model "$DEEPINFER_HF_MODEL_DIR" \ --served-model-name deepseek-ai/DeepSeek-V4.1-Flash-1017 "$@" > "$LOG" 2>&1 < /dev/null & echo $! > "$PIDFILE" port=8888 prev= for a in "$@"; do [[ "$prev" == --port ]] && port=$a; prev=$a; done until curl -fs "localhost:$port/health" >/dev/null 2>&1; do kill -0 "$(cat "$PIDFILE")" 2>/dev/null || { echo "server died; see $LOG" >&2; exit 1; } sleep 3 done echo "ready (pgid $(cat "$PIDFILE"), log $LOG)" ;; stop) [ -s "$PIDFILE" ] || { echo "not running"; exit 0; } pgid=$(cat "$PIDFILE") kill -TERM -- "-$pgid" 2>/dev/null || true for _ in $(seq 30); do kill -0 -- "-$pgid" 2>/dev/null || break; sleep 1; done kill -KILL -- "-$pgid" 2>/dev/null || true rm -f "$PIDFILE" echo "stopped" ;; *) echo "usage: $0 start|stop" >&2; exit 2 ;; esac