Repository navigation
Conversation
vllm-router ends its startup wait at the first healthy worker and reads each worker's model only then; requests naming the model go only to the workers indexed at that moment until its next model refresh (240s on v0.2.1). The launcher started the router alongside the engines, so engines that came up later sat idle while sticky sessions pinned to the early ones (job 1498: 335 opening sessions on 2 of 16 servers). launch_router now waits for every worker's /health before exec'ing vllm-router, so its one-time discovery sees all of them. Covers the RL, SFT and inference templates in regular and P/D mode; llm-d is unchanged.
3 tasks done
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
vllm-router ends its startup wait as soon as one worker is healthy, and reads each worker's model only at that moment. Workers that aren't up yet are filed under the placeholder model
unknown, and requests that name the real model skip them until the router's periodic model refresh (every 5th health check, 240 s after startup on v0.2.1). The launcher started the router alongside the engines, so engines that came up later sat idle while sticky sessions pinned to the early ones.On a Qwen3.8-27B SWE run with 16 vLLM servers, the router came up with 2 of 16 servers healthy, and all 335 opening sessions of the step-0 eval landed on those 2. They filled their KV cache and preempted constantly, the concurrency controller throttled the whole pool, 296 of 500 eval rollouts failed (59.2%), and the first training step took 1 h 29 min. Two earlier smoke runs of the same config hit the same race, with 10 of 16 and 1 of 16 servers listed when the router started.
launch_routernow waits until every worker in the router's worker args answers/health, thenexecsvllm-router, so its one-time model discovery sees all of them.execkeeps the router as the background job, so a router crash still tears the job down, and a worker that never becomes healthy fails the launch after the same 4200 s timeout as before. This covers the RL, SFT and inference templates in regular and P/D mode; llm-d is unchanged. It also corrects the comment inclients.pythat said the router only serves once its workers are healthy.Companion router fix: PrimeIntellect-ai/router#57 (late workers join their model's pool on the next health check instead of the 5th). Once it's released, bump the
vllm-routerpin inpyproject.toml.Test plan
bash -non the rendered sbatch and on the innersrunlaunch script;tests/unit/orchestrator/test_clients.pypasses.srunbodies passbash -n, and the llm-d renders are byte-identical tomain.wait -n -pteardown fires on both a gate timeout and a router crash.In the relaunch, the gate logged
All 16 workers healthy after 592s, the router logged16 out of 16 unique hosts are healthywith 16Discovered modellines, and nothing was re-indexed later.