[Feature] DP supervisor using rust frontend (#47076)

Signed-off-by: yewentao256 <zhyanwentao@126.com>

Wentao Ye committed Jun 30, 2026 at 14:34 UTC 3a9784b82ca59133c47c16a4ce77858eae9a9a02
2 files changed +60 -3
tests/entrypoints/openai/test_dp_supervisor.py
+43
@@ -176,6 +176,49 @@ def test_build_multi_port_external_lb_child_args_sets_external_rank_server():
176 assert child_args.api_server_count == 1
177
178
179 +def test_run_vllm_dp_server_uses_python_server_by_default(monkeypatch):
180 + calls: list[str] = []
181 +
182 + monkeypatch.setattr(dp_sup.os, "setpgrp", lambda: None)
183 + monkeypatch.setattr(dp_sup, "set_process_title", lambda *_args: None)
184 + monkeypatch.setattr(dp_sup, "decorate_logs", lambda *_args: None)
185 + monkeypatch.setattr(dp_sup.envs, "VLLM_RUST_FRONTEND_PATH", None, raising=False)
186 + monkeypatch.setattr(
187 + dp_sup, "_run_python_vllm_dp_server", lambda _args: calls.append("python")
188 + )
189 + monkeypatch.setattr(
190 + dp_sup, "_run_rust_vllm_dp_server", lambda _args: calls.append("rust")
191 + )
192 +
193 + dp_sup._run_vllm_dp_server(_make_unit_args(data_parallel_rank=4))
194 +
195 + assert calls == ["python"]
196 +
197 +
198 +def test_run_vllm_dp_server_uses_rust_frontend_when_enabled(monkeypatch):
199 + calls: list[str] = []
200 +
201 + monkeypatch.setattr(dp_sup.os, "setpgrp", lambda: None)
202 + monkeypatch.setattr(dp_sup, "set_process_title", lambda *_args: None)
203 + monkeypatch.setattr(dp_sup, "decorate_logs", lambda *_args: None)
204 + monkeypatch.setattr(
205 + dp_sup.envs,
206 + "VLLM_RUST_FRONTEND_PATH",
207 + "/tmp/vllm-rs",
208 + raising=False,
209 + )
210 + monkeypatch.setattr(
211 + dp_sup, "_run_python_vllm_dp_server", lambda _args: calls.append("python")
212 + )
213 + monkeypatch.setattr(
214 + dp_sup, "_run_rust_vllm_dp_server", lambda _args: calls.append("rust")
215 + )
216 +
217 + dp_sup._run_vllm_dp_server(_make_unit_args(data_parallel_rank=4))
218 +
219 + assert calls == ["rust"]
220 +
221 +
222 def test_validate_multi_port_external_lb_args_allows_ssl():
223 args = _make_unit_args(
224 ssl_keyfile="/tmp/server.key",
vllm/entrypoints/openai/dp_supervisor.py
+17 -3
@@ -22,6 +22,7 @@ import uvicorn
22 import uvloop
23 from fastapi import FastAPI, Response
24
25 +import vllm.envs as envs
26 from vllm.logger import init_logger
27 from vllm.utils.system_utils import (
28 decorate_logs,
@@ -233,12 +234,22 @@ def _build_dp_supervisor_app(supervisor: DPSupervisor) -> FastAPI:
234 return app
235
236
237 +def _run_python_vllm_dp_server(child_args: argparse.Namespace) -> None:
238 + from vllm.entrypoints.openai.api_server import run_server
239 +
240 + uvloop.run(run_server(child_args))
241 +
242 +
243 +def _run_rust_vllm_dp_server(child_args: argparse.Namespace) -> None:
244 + from vllm.entrypoints.cli.serve import run_multi_api_server
245 +
246 + run_multi_api_server(child_args)
247 +
248 +
249 def _run_vllm_dp_server(child_args: argparse.Namespace) -> None:
250 """
251 Entrypoint function for the vLLM DP Server.
252 """
240 - from vllm.entrypoints.openai.api_server import run_server
241 -
253 # Create a fresh process group for the vLLM DP Server,
254 # so that CTRL-C is propagated cleanly.
255 os.setpgrp()
@@ -246,7 +257,10 @@ def _run_vllm_dp_server(child_args: argparse.Namespace) -> None:
257 name = f"APIServer_DP{child_args.data_parallel_rank}"
258 set_process_title(name)
259 decorate_logs(name)
249 - uvloop.run(run_server(child_args))
260 + if envs.VLLM_RUST_FRONTEND_PATH:
261 + _run_rust_vllm_dp_server(child_args)
262 + else:
263 + _run_python_vllm_dp_server(child_args)
264
265
266 class DPSupervisor: