213 lines
6.0 KiB
Bash
Executable File
213 lines
6.0 KiB
Bash
Executable File
#!/bin/bash
|
|
# Convenience script to launch both vLLM server and Gradio demo for Qwen3-Omni
|
|
#
|
|
# Usage:
|
|
# ./run_gradio_demo.sh [OPTIONS]
|
|
#
|
|
# Example:
|
|
# ./run_gradio_demo.sh --model Qwen/Qwen3-Omni-30B-A3B-Instruct --server-port 8091 --gradio-port 7861
|
|
|
|
set -e
|
|
|
|
# Default values
|
|
MODEL="Qwen/Qwen3-Omni-30B-A3B-Instruct"
|
|
SERVER_PORT=8091
|
|
GRADIO_PORT=7861
|
|
DEPLOY_CONFIG=""
|
|
SERVER_HOST="0.0.0.0"
|
|
GRADIO_IP="127.0.0.1"
|
|
GRADIO_SHARE=false
|
|
|
|
# Parse command line arguments
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--model)
|
|
MODEL="$2"
|
|
shift 2
|
|
;;
|
|
--server-port)
|
|
SERVER_PORT="$2"
|
|
shift 2
|
|
;;
|
|
--gradio-port)
|
|
GRADIO_PORT="$2"
|
|
shift 2
|
|
;;
|
|
--deploy-config)
|
|
DEPLOY_CONFIG="$2"
|
|
shift 2
|
|
;;
|
|
--server-host)
|
|
SERVER_HOST="$2"
|
|
shift 2
|
|
;;
|
|
--gradio-ip)
|
|
GRADIO_IP="$2"
|
|
shift 2
|
|
;;
|
|
--share)
|
|
GRADIO_SHARE=true
|
|
shift
|
|
;;
|
|
--help)
|
|
echo "Usage: $0 [OPTIONS]"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " --model MODEL Model name/path (default: Qwen/Qwen3-Omni-30B-A3B-Instruct)"
|
|
echo " --server-port PORT Port for vLLM server (default: 8091)"
|
|
echo " --gradio-port PORT Port for Gradio demo (default: 7861)"
|
|
echo " --deploy-config PATH Path to custom deploy config YAML file (optional)"
|
|
echo " --server-host HOST Host for vLLM server (default: 0.0.0.0)"
|
|
echo " --gradio-ip IP IP for Gradio demo (default: 127.0.0.1)"
|
|
echo " --share Share Gradio demo publicly"
|
|
echo " --help Show this help message"
|
|
echo ""
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1"
|
|
echo "Use --help for usage information"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Get the directory where this script is located
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
API_BASE="http://localhost:${SERVER_PORT}/v1"
|
|
HEALTH_URL="http://localhost:${SERVER_PORT}/health"
|
|
|
|
echo "=========================================="
|
|
echo "Starting vLLM-Omni Gradio Demo"
|
|
echo "=========================================="
|
|
echo "Model: $MODEL"
|
|
echo "Server: http://${SERVER_HOST}:${SERVER_PORT}"
|
|
echo "Gradio: http://${GRADIO_IP}:${GRADIO_PORT}"
|
|
echo "=========================================="
|
|
|
|
# Build vLLM server command
|
|
SERVER_CMD=("vllm" "serve" "$MODEL" "--omni" "--port" "$SERVER_PORT" "--host" "$SERVER_HOST")
|
|
if [ -n "$DEPLOY_CONFIG" ]; then
|
|
SERVER_CMD+=("--deploy-config" "$DEPLOY_CONFIG")
|
|
fi
|
|
|
|
# Function to cleanup on exit
|
|
cleanup() {
|
|
echo ""
|
|
echo "Shutting down..."
|
|
if [ -n "$SERVER_PID" ]; then
|
|
echo "Stopping vLLM server (PID: $SERVER_PID)..."
|
|
kill "$SERVER_PID" 2>/dev/null || true
|
|
wait "$SERVER_PID" 2>/dev/null || true
|
|
fi
|
|
if [ -n "$GRADIO_PID" ]; then
|
|
echo "Stopping Gradio demo (PID: $GRADIO_PID)..."
|
|
kill "$GRADIO_PID" 2>/dev/null || true
|
|
wait "$GRADIO_PID" 2>/dev/null || true
|
|
fi
|
|
echo "Cleanup complete"
|
|
exit 0
|
|
}
|
|
|
|
# Set up signal handlers
|
|
trap cleanup SIGINT SIGTERM
|
|
|
|
# Start vLLM server with output shown in real-time and saved to log
|
|
echo ""
|
|
echo "Starting vLLM server..."
|
|
LOG_FILE="/tmp/vllm_server_${SERVER_PORT}.log"
|
|
"${SERVER_CMD[@]}" 2>&1 | tee "$LOG_FILE" &
|
|
SERVER_PID=$!
|
|
|
|
# Start a background process to monitor the log for startup completion
|
|
STARTUP_COMPLETE=false
|
|
TAIL_PID=""
|
|
|
|
# Function to cleanup tail process
|
|
cleanup_tail() {
|
|
if [ -n "$TAIL_PID" ]; then
|
|
kill "$TAIL_PID" 2>/dev/null || true
|
|
wait "$TAIL_PID" 2>/dev/null || true
|
|
fi
|
|
}
|
|
|
|
# Wait for server to be ready by checking log output
|
|
echo ""
|
|
echo "Waiting for vLLM server to be ready (checking for 'Application startup complete' message)..."
|
|
echo ""
|
|
|
|
# Monitor log file for startup completion message
|
|
MAX_WAIT=300 # 5 minutes timeout as fallback
|
|
ELAPSED=0
|
|
|
|
# Use a temporary file to track startup completion
|
|
STARTUP_FLAG="/tmp/vllm_startup_flag_${SERVER_PORT}.tmp"
|
|
rm -f "$STARTUP_FLAG"
|
|
|
|
# Start monitoring in background
|
|
(
|
|
tail -f "$LOG_FILE" 2>/dev/null | grep -m 1 "Application startup complete" > /dev/null && touch "$STARTUP_FLAG"
|
|
) &
|
|
TAIL_PID=$!
|
|
|
|
while [ $ELAPSED -lt $MAX_WAIT ]; do
|
|
# Check if startup flag file exists (startup complete)
|
|
if [ -f "$STARTUP_FLAG" ]; then
|
|
cleanup_tail
|
|
echo ""
|
|
echo "✓ vLLM server is ready!"
|
|
STARTUP_COMPLETE=true
|
|
break
|
|
fi
|
|
|
|
# Check if server process is still running
|
|
if ! kill -0 "$SERVER_PID" 2>/dev/null; then
|
|
cleanup_tail
|
|
echo ""
|
|
echo "Error: vLLM server failed to start (process terminated)"
|
|
wait "$SERVER_PID" 2>/dev/null || true
|
|
exit 1
|
|
fi
|
|
|
|
sleep 1
|
|
ELAPSED=$((ELAPSED + 1))
|
|
done
|
|
|
|
cleanup_tail
|
|
rm -f "$STARTUP_FLAG"
|
|
|
|
if [ "$STARTUP_COMPLETE" != "true" ]; then
|
|
echo ""
|
|
echo "Error: vLLM server did not complete startup within ${MAX_WAIT} seconds"
|
|
kill "$SERVER_PID" 2>/dev/null || true
|
|
exit 1
|
|
fi
|
|
|
|
# Start Gradio demo
|
|
echo ""
|
|
echo "Starting Gradio demo..."
|
|
cd "$SCRIPT_DIR"
|
|
GRADIO_CMD=("python" "gradio_demo.py" "--model" "$MODEL" "--api-base" "$API_BASE" "--ip" "$GRADIO_IP" "--port" "$GRADIO_PORT")
|
|
if [ "$GRADIO_SHARE" = true ]; then
|
|
GRADIO_CMD+=("--share")
|
|
fi
|
|
|
|
"${GRADIO_CMD[@]}" > /tmp/gradio_demo.log 2>&1 &
|
|
GRADIO_PID=$!
|
|
|
|
echo ""
|
|
echo "=========================================="
|
|
echo "Both services are running!"
|
|
echo "=========================================="
|
|
echo "vLLM Server: http://${SERVER_HOST}:${SERVER_PORT}"
|
|
echo "Gradio Demo: http://${GRADIO_IP}:${GRADIO_PORT}"
|
|
echo ""
|
|
echo "Press Ctrl+C to stop both services"
|
|
echo "=========================================="
|
|
echo ""
|
|
|
|
# Wait for either process to exit
|
|
wait $SERVER_PID $GRADIO_PID || true
|
|
|
|
cleanup
|