2024-10-10 17:44:41 -07:00
|
|
|
import sys
|
|
|
|
|
import subprocess
|
2024-12-08 11:16:34 -08:00
|
|
|
import argparse
|
|
|
|
|
|
|
|
|
|
from src.commons.globals import logger
|
|
|
|
|
from src.commons.utils import (
|
|
|
|
|
get_version,
|
|
|
|
|
wait_for_health_check,
|
|
|
|
|
check_lsof,
|
|
|
|
|
install_lsof,
|
2024-12-08 15:43:19 -08:00
|
|
|
find_processes_by_port,
|
|
|
|
|
kill_processes,
|
2024-10-10 17:44:41 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
2024-10-24 19:21:47 -07:00
|
|
|
def start_server(port=51000):
|
2024-12-08 11:16:34 -08:00
|
|
|
"""Start the Uvicorn server."""
|
|
|
|
|
|
|
|
|
|
logger.info("Starting model server - loading some awesomeness, please wait...")
|
2024-10-30 17:54:51 -07:00
|
|
|
|
2024-10-10 17:44:41 -07:00
|
|
|
process = subprocess.Popen(
|
2024-10-23 14:32:40 -07:00
|
|
|
[
|
|
|
|
|
"python",
|
|
|
|
|
"-m",
|
|
|
|
|
"uvicorn",
|
2024-12-08 15:43:19 -08:00
|
|
|
"src.main:app",
|
2024-10-23 14:32:40 -07:00
|
|
|
"--host",
|
|
|
|
|
"0.0.0.0",
|
|
|
|
|
"--port",
|
2024-12-08 11:16:34 -08:00
|
|
|
str(port),
|
2024-10-23 14:32:40 -07:00
|
|
|
],
|
2024-10-10 17:44:41 -07:00
|
|
|
start_new_session=True,
|
|
|
|
|
bufsize=1,
|
|
|
|
|
universal_newlines=True,
|
2024-12-08 11:16:34 -08:00
|
|
|
stdout=subprocess.PIPE,
|
|
|
|
|
stderr=subprocess.PIPE,
|
2024-10-10 17:44:41 -07:00
|
|
|
)
|
|
|
|
|
|
2024-10-24 19:21:47 -07:00
|
|
|
if wait_for_health_check(f"http://0.0.0.0:{port}/healthz"):
|
2024-12-08 11:16:34 -08:00
|
|
|
logger.info(f"Model server started successfully with PID {process.pid}.")
|
2024-10-10 17:44:41 -07:00
|
|
|
else:
|
2024-12-08 11:16:34 -08:00
|
|
|
logger.error("Model server failed to start in time, shutting it down.")
|
2024-10-10 17:44:41 -07:00
|
|
|
process.terminate()
|
|
|
|
|
|
|
|
|
|
|
2024-10-24 19:21:47 -07:00
|
|
|
def stop_server(port=51000, wait=True, timeout=10):
|
2024-12-08 11:16:34 -08:00
|
|
|
"""Stop the Uvicorn server."""
|
|
|
|
|
if check_lsof():
|
|
|
|
|
logger.info("`lsof` is already installed.")
|
|
|
|
|
else:
|
|
|
|
|
logger.info("`lsof` not found, attempting to install...")
|
|
|
|
|
if install_lsof():
|
|
|
|
|
logger.info("`lsof` installed successfully.")
|
|
|
|
|
else:
|
|
|
|
|
logger.error("Failed to install `lsof`.")
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
logger.info(f"Stopping processes on port {port}...")
|
2024-12-08 15:43:19 -08:00
|
|
|
port_processes = find_processes_by_port(port)
|
2024-12-08 11:16:34 -08:00
|
|
|
if port_processes is None:
|
|
|
|
|
logger.info(f"No processes found listening on port {port}.")
|
|
|
|
|
else:
|
|
|
|
|
if len(port_processes):
|
2024-12-08 15:43:19 -08:00
|
|
|
process_killed = kill_processes(port_processes, wait, timeout)
|
2024-12-08 11:16:34 -08:00
|
|
|
if not process_killed:
|
|
|
|
|
logger.error(f"Unable to kill all processes on {port}")
|
2024-12-08 15:43:19 -08:00
|
|
|
else:
|
|
|
|
|
logger.info(f"All processes on port {port} have been killed.")
|
2024-12-08 11:16:34 -08:00
|
|
|
else:
|
|
|
|
|
logger.error(f"Unable to find processes on {port}")
|
2024-10-10 17:44:41 -07:00
|
|
|
|
|
|
|
|
|
2024-10-24 19:21:47 -07:00
|
|
|
def restart_server(port=51000):
|
2024-10-10 17:44:41 -07:00
|
|
|
"""Restart the Uvicorn server."""
|
2024-10-24 19:21:47 -07:00
|
|
|
stop_server(port)
|
|
|
|
|
start_server(port)
|
2024-12-08 11:16:34 -08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
"""
|
|
|
|
|
Start, stop, or restart the Uvicorn server based on command-line arguments.
|
|
|
|
|
"""
|
|
|
|
|
parser = argparse.ArgumentParser(description="Manage the Uvicorn server.")
|
|
|
|
|
parser.add_argument(
|
|
|
|
|
"action",
|
|
|
|
|
choices=["start", "stop", "restart"],
|
|
|
|
|
default="start",
|
|
|
|
|
nargs="?",
|
|
|
|
|
help="Action to perform on the server (default: start).",
|
|
|
|
|
)
|
|
|
|
|
parser.add_argument(
|
|
|
|
|
"--port",
|
|
|
|
|
type=int,
|
|
|
|
|
default=51000,
|
|
|
|
|
help="Port number for the server (default: 51000).",
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
|
|
|
|
logger.info(f"Model server version: {get_version()}")
|
|
|
|
|
|
|
|
|
|
if args.action == "start":
|
|
|
|
|
start_server(args.port)
|
|
|
|
|
elif args.action == "stop":
|
|
|
|
|
stop_server(args.port)
|
|
|
|
|
elif args.action == "restart":
|
|
|
|
|
restart_server(args.port)
|
|
|
|
|
else:
|
|
|
|
|
logger.error(f"Unknown action: {args.action}")
|
|
|
|
|
sys.exit(1)
|