[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: