diff --git a/python/sglang/multimodal_gen/registry.py b/python/sglang/multimodal_gen/registry.py index 7529cd345..493e519bc 100644 --- a/python/sglang/multimodal_gen/registry.py +++ b/python/sglang/multimodal_gen/registry.py @@ -349,7 +349,10 @@ def _get_config_info( model_id = matched_model_names[0] return _CONFIG_REGISTRY.get(model_id) else: - raise RuntimeError(f"No model info found for model path: {model_path}") + raise RuntimeError( + f"No model info found for model path: {model_path}. " + f"Please check the model path or specify the model_id explicitly." + ) # --- Part 3: Main Resolver --- diff --git a/python/sglang/multimodal_gen/runtime/server_args.py b/python/sglang/multimodal_gen/runtime/server_args.py index f5b60be57..4fc3e2964 100644 --- a/python/sglang/multimodal_gen/runtime/server_args.py +++ b/python/sglang/multimodal_gen/runtime/server_args.py @@ -202,6 +202,9 @@ class ServerArgs: scheduler_port: int = 5555 + # Strict port mode: fail if requested port is unavailable instead of auto-selecting + strict_ports: bool = False + output_path: str | None = "outputs/" input_save_path: str | None = "inputs/uploads" @@ -384,17 +387,35 @@ class ServerArgs: ) def _adjust_network_ports(self): - self.port = self.settle_port(self.port) - initial_scheduler_port = self.scheduler_port + ( - random.randint(0, 100) if self.scheduler_port == 5555 else 0 - ) - self.scheduler_port = self.settle_port(initial_scheduler_port) - initial_master_port = ( - self.master_port - if self.master_port is not None - else (30005 + random.randint(0, 100)) - ) - self.master_port = self.settle_port(initial_master_port, 37) + if self.strict_ports: + # Strict mode: fail if port is unavailable + if not is_port_available(self.port): + raise RuntimeError( + f"Port {self.port} is unavailable and --strict-ports is enabled. " + f"Either use a different port or remove --strict-ports to allow auto-selection." + ) + if not is_port_available(self.scheduler_port): + raise RuntimeError( + f"Scheduler port {self.scheduler_port} is unavailable and --strict-ports is enabled. " + f"Either use a different port or remove --strict-ports to allow auto-selection." + ) + if self.master_port is not None and not is_port_available(self.master_port): + raise RuntimeError( + f"Master port {self.master_port} is unavailable and --strict-ports is enabled. " + f"Either use a different port or remove --strict-ports to allow auto-selection." + ) + else: + self.port = self.settle_port(self.port) + initial_scheduler_port = self.scheduler_port + ( + random.randint(0, 100) if self.scheduler_port == 5555 else 0 + ) + self.scheduler_port = self.settle_port(initial_scheduler_port) + initial_master_port = ( + self.master_port + if self.master_port is not None + else (30005 + random.randint(0, 100)) + ) + self.master_port = self.settle_port(initial_master_port, 37) def _adjust_parallelism(self): if self.tp_size is None: @@ -778,6 +799,12 @@ class ServerArgs: default=ServerArgs.port, help="Port for the HTTP API server.", ) + parser.add_argument( + "--strict-ports", + action=StoreBoolean, + default=ServerArgs.strict_ports, + help="If enabled, fail when requested ports are unavailable instead of auto-selecting.", + ) parser.add_argument( "--webui", action=StoreBoolean,