Spaces:
Running on Zero
Running on Zero
| # Start vLLM server for Qwen3-4B-Thinking-2507 rewriter | |
| # Usage: | |
| # bash start_server.sh # standalone (full GPU) | |
| # bash start_server.sh --gpu 0 --low-footprint | |
| # # share GPU with backbone (~12GB) | |
| # bash start_server.sh --gpu 0 --gpu-util 0.2 --enforce-eager --max-model-len 2048 | |
| set -e | |
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | |
| cd "$SCRIPT_DIR" | |
| # Defaults from config | |
| MODEL="./Qwen3-4B-Thinking-2507" | |
| PORT=8000 | |
| HOST="0.0.0.0" | |
| TP_SIZE=1 | |
| MAX_MODEL_LEN=8192 | |
| GPU_UTIL=0.9 | |
| QUANTIZATION="" | |
| GPU_ID="0" | |
| ENFORCE_EAGER="" | |
| # Parse args | |
| while [[ $# -gt 0 ]]; do | |
| case $1 in | |
| --model) MODEL="$2"; shift 2;; | |
| --port) PORT="$2"; shift 2;; | |
| --tp) TP_SIZE="$2"; shift 2;; | |
| --quantization) QUANTIZATION="--quantization $2"; shift 2;; | |
| --gpu) GPU_ID="$2"; shift 2;; | |
| --max-model-len) MAX_MODEL_LEN="$2"; shift 2;; | |
| --gpu-util) GPU_UTIL="$2"; shift 2;; | |
| --enforce-eager) ENFORCE_EAGER="--enforce-eager"; shift 1;; | |
| # Convenience preset for sharing a GPU with the 8-GPU backbone: | |
| # ~12GB ceiling, eager mode (no CUDA-graph capture, less stream contention), | |
| # smaller KV cache. Backbone on the same GPU sees ~10-15% slowdown. | |
| --low-footprint) | |
| # Bigger ceiling so thinking + rewrite both fit. KV cache grows | |
| # with max-model-len, but at gpu_util=0.18 on an 80GB card we | |
| # still stay well under the 8-GPU backbone's headroom. | |
| GPU_UTIL="0.18" | |
| MAX_MODEL_LEN="8192" | |
| ENFORCE_EAGER="--enforce-eager" | |
| shift 1;; | |
| *) echo "Unknown arg: $1"; exit 1;; | |
| esac | |
| done | |
| export CUDA_VISIBLE_DEVICES="$GPU_ID" | |
| echo "=========================================" | |
| echo " Starting vLLM Server" | |
| echo " Model: $MODEL" | |
| echo " Port: $PORT" | |
| echo " GPU: $GPU_ID (TP=$TP_SIZE)" | |
| echo " Max Model Len: $MAX_MODEL_LEN" | |
| echo " GPU Util: $GPU_UTIL" | |
| echo " Eager: ${ENFORCE_EAGER:-no}" | |
| echo " Quantization: ${QUANTIZATION:-none}" | |
| echo "=========================================" | |
| # Check if port is already in use | |
| if lsof -i :"$PORT" >/dev/null 2>&1; then | |
| echo "[WARN] Port $PORT is already in use. Stop existing server first." | |
| echo " Run: bash stop_server.sh" | |
| exit 1 | |
| fi | |
| # Start server in background | |
| nohup python -m vllm.entrypoints.openai.api_server \ | |
| --model "$MODEL" \ | |
| --host "$HOST" \ | |
| --port "$PORT" \ | |
| --tensor-parallel-size "$TP_SIZE" \ | |
| --max-model-len "$MAX_MODEL_LEN" \ | |
| --gpu-memory-utilization "$GPU_UTIL" \ | |
| --trust-remote-code \ | |
| --reasoning-parser qwen3 \ | |
| $ENFORCE_EAGER \ | |
| $QUANTIZATION \ | |
| > "$SCRIPT_DIR/server.log" 2>&1 & | |
| SERVER_PID=$! | |
| echo "$SERVER_PID" > "$SCRIPT_DIR/server.pid" | |
| echo "[INFO] Server PID: $SERVER_PID" | |
| echo "[INFO] Log file: $SCRIPT_DIR/server.log" | |
| # Wait for server to be ready | |
| echo "[INFO] Waiting for server to be ready..." | |
| for i in $(seq 1 120); do | |
| if curl -s "http://localhost:$PORT/v1/models" >/dev/null 2>&1; then | |
| echo "[INFO] Server is ready! (took ${i}s)" | |
| echo "[INFO] API endpoint: http://localhost:$PORT/v1/chat/completions" | |
| exit 0 | |
| fi | |
| sleep 1 | |
| done | |
| echo "[ERROR] Server failed to start within 120s. Check server.log" | |
| exit 1 | |