diff --git a/python/sglang/srt/entrypoints/http_server.py b/python/sglang/srt/entrypoints/http_server.py index 73f00d170..80081fc57 100644 --- a/python/sglang/srt/entrypoints/http_server.py +++ b/python/sglang/srt/entrypoints/http_server.py @@ -146,7 +146,6 @@ from sglang.srt.managers.multi_tokenizer_mixin import ( MultiTokenizerRouter, TokenizerWorker, get_main_process_id, - monkey_patch_uvicorn_multiprocessing, read_from_shared_memory, write_data_for_multi_tokenizer, ) @@ -2282,7 +2281,6 @@ def _setup_and_run_http_server( "level": "INFO", "propagate": False, } - monkey_patch_uvicorn_multiprocessing() if server_args.enable_ssl_refresh: logger.warning( @@ -2298,6 +2296,7 @@ def _setup_and_run_http_server( root_path=server_args.fastapi_root_path, log_level=server_args.log_level_http or server_args.log_level, timeout_keep_alive=envs.SGLANG_TIMEOUT_KEEP_ALIVE.get(), + timeout_worker_healthcheck=envs.SGLANG_UVICORN_WORKER_HEALTHCHECK_TIMEOUT.get(), loop="uvloop", workers=server_args.tokenizer_worker_num, ssl_keyfile=server_args.ssl_keyfile, diff --git a/python/sglang/srt/environ.py b/python/sglang/srt/environ.py index 2675fcda1..57edcdd80 100644 --- a/python/sglang/srt/environ.py +++ b/python/sglang/srt/environ.py @@ -519,6 +519,9 @@ class Envs: # HTTP Server 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 SGLANG_GRANIAN_PARENT_PID = EnvInt(None) diff --git a/python/sglang/srt/managers/multi_tokenizer_mixin.py b/python/sglang/srt/managers/multi_tokenizer_mixin.py index a6bb630d2..658acc01c 100644 --- a/python/sglang/srt/managers/multi_tokenizer_mixin.py +++ b/python/sglang/srt/managers/multi_tokenizer_mixin.py @@ -26,7 +26,6 @@ import os import pickle import sys import threading -from functools import partialmethod from multiprocessing import shared_memory from typing import TYPE_CHECKING, Any, Dict, Optional, Union @@ -591,20 +590,6 @@ def write_data_for_multi_tokenizer( 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: def __init__(self, port_args: PortArgs, send_to_scheduler: zmq.Socket): self.port_args = port_args