Optimize uvicorn startup command (#25041)
This commit is contained in:
@@ -146,7 +146,6 @@ from sglang.srt.managers.multi_tokenizer_mixin import (
|
|||||||
MultiTokenizerRouter,
|
MultiTokenizerRouter,
|
||||||
TokenizerWorker,
|
TokenizerWorker,
|
||||||
get_main_process_id,
|
get_main_process_id,
|
||||||
monkey_patch_uvicorn_multiprocessing,
|
|
||||||
read_from_shared_memory,
|
read_from_shared_memory,
|
||||||
write_data_for_multi_tokenizer,
|
write_data_for_multi_tokenizer,
|
||||||
)
|
)
|
||||||
@@ -2282,7 +2281,6 @@ def _setup_and_run_http_server(
|
|||||||
"level": "INFO",
|
"level": "INFO",
|
||||||
"propagate": False,
|
"propagate": False,
|
||||||
}
|
}
|
||||||
monkey_patch_uvicorn_multiprocessing()
|
|
||||||
|
|
||||||
if server_args.enable_ssl_refresh:
|
if server_args.enable_ssl_refresh:
|
||||||
logger.warning(
|
logger.warning(
|
||||||
@@ -2298,6 +2296,7 @@ def _setup_and_run_http_server(
|
|||||||
root_path=server_args.fastapi_root_path,
|
root_path=server_args.fastapi_root_path,
|
||||||
log_level=server_args.log_level_http or server_args.log_level,
|
log_level=server_args.log_level_http or server_args.log_level,
|
||||||
timeout_keep_alive=envs.SGLANG_TIMEOUT_KEEP_ALIVE.get(),
|
timeout_keep_alive=envs.SGLANG_TIMEOUT_KEEP_ALIVE.get(),
|
||||||
|
timeout_worker_healthcheck=envs.SGLANG_UVICORN_WORKER_HEALTHCHECK_TIMEOUT.get(),
|
||||||
loop="uvloop",
|
loop="uvloop",
|
||||||
workers=server_args.tokenizer_worker_num,
|
workers=server_args.tokenizer_worker_num,
|
||||||
ssl_keyfile=server_args.ssl_keyfile,
|
ssl_keyfile=server_args.ssl_keyfile,
|
||||||
|
|||||||
@@ -519,6 +519,9 @@ class Envs:
|
|||||||
|
|
||||||
# HTTP Server
|
# HTTP Server
|
||||||
SGLANG_TIMEOUT_KEEP_ALIVE = EnvInt(5)
|
SGLANG_TIMEOUT_KEEP_ALIVE = EnvInt(5)
|
||||||
|
# Uvicorn multiprocess supervisor pings each worker on this interval; default 5s is
|
||||||
|
# too short when many workers cold-start and load tokenizers in parallel.
|
||||||
|
SGLANG_UVICORN_WORKER_HEALTHCHECK_TIMEOUT = EnvInt(10)
|
||||||
|
|
||||||
# HTTP/2 Server
|
# HTTP/2 Server
|
||||||
SGLANG_GRANIAN_PARENT_PID = EnvInt(None)
|
SGLANG_GRANIAN_PARENT_PID = EnvInt(None)
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ import os
|
|||||||
import pickle
|
import pickle
|
||||||
import sys
|
import sys
|
||||||
import threading
|
import threading
|
||||||
from functools import partialmethod
|
|
||||||
from multiprocessing import shared_memory
|
from multiprocessing import shared_memory
|
||||||
from typing import TYPE_CHECKING, Any, Dict, Optional, Union
|
from typing import TYPE_CHECKING, Any, Dict, Optional, Union
|
||||||
|
|
||||||
@@ -591,20 +590,6 @@ def write_data_for_multi_tokenizer(
|
|||||||
return args_shm
|
return args_shm
|
||||||
|
|
||||||
|
|
||||||
def monkey_patch_uvicorn_multiprocessing(timeout: float = 10):
|
|
||||||
"""Monkey patch uvicorn multiprocessing is_alive timeout"""
|
|
||||||
# from default 5s -> 10s
|
|
||||||
try:
|
|
||||||
from uvicorn.supervisors.multiprocess import Process
|
|
||||||
|
|
||||||
Process.is_alive = partialmethod(Process.is_alive, timeout=timeout)
|
|
||||||
|
|
||||||
except ImportError:
|
|
||||||
logger.warning(
|
|
||||||
"uvicorn.supervisors.multiprocess not found, skipping monkey patch"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class SenderWrapper:
|
class SenderWrapper:
|
||||||
def __init__(self, port_args: PortArgs, send_to_scheduler: zmq.Socket):
|
def __init__(self, port_args: PortArgs, send_to_scheduler: zmq.Socket):
|
||||||
self.port_args = port_args
|
self.port_args = port_args
|
||||||
|
|||||||
Reference in New Issue
Block a user