Repository navigation
fix(vllm): OPS-8696 let the EPD encode worker report healthy - #15434
Conversation
The vLLM E/P/D launcher's encode worker never reported healthy on its system port. Three post-merge serve tests poll every worker's /health, so they waited out their timeout: mm_epd_qwen3-vl-2b, mm_epd_qwen3-vl-2b_b64_frontend_decoding and mm_epd_video_qwen3-vl-2b_mixed_frontend_decoding (#15432). The encode worker serves `generate` without a health-check payload, so the runtime registers no canary target for it. With canaries off, the default, SystemHealth::get_health_status then falls back to the process-wide status. That status starts NotReady and the vLLM worker never sets it, so /health answers 503 forever. The runtime test ready_endpoint_without_a_registered_target_still_reports_unhealthy documents this fallback. The operator avoids it by setting DYN_SYSTEM_USE_ENDPOINT_HEALTH_STATUS=["generate"] on every worker, so readiness follows the endpoint, which turns ready on registration. The launcher now sets the same variable for the encode worker. The tests started polling the encode worker in #14751, which added health_check_worker_count=3 to the epd and epd_video topologies. Validation, on the CI vllm-runtime-test image for main 3f46e3d with only the launcher swapped, on one RTX 6000 Ada: - Unpatched: mm_epd_qwen3-vl-2b failed after 309 s, and mm_epd_video_qwen3-vl-2b_mixed_frontend_decoding failed at its 600 s timeout. The encode worker's /health answered 503 throughout. - Patched: all three affected tests passed, in 184 s together. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Dmitry Tokarev <dtokarev@nvidia.com>
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository: ai-dynamo/dynamo/.coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: 📒 Files selected for processing (1)
Included review availability: This review used your included allowance. Your plan provides up to 12 included reviews per hour; 11 remain after this review. WalkthroughThe encode-worker launch sets ChangesEncode worker readiness
Priority: ⬆️ High Estimated code review effort: 2 (Simple) | ~5 minutes Severity of issue fixed: Medium Merge Risk: ⚪ Minimal · up to The encode worker’s 🚥 Pre-merge checks | ✅ 7✅ Passed checks (7 passed)
Comment |
Linear: OPS-8696
Fixes #15432.
Summary
The vLLM E/P/D launcher's encode worker never reports healthy on its system port. Three
post-merge serve tests poll every worker's
/health, so they wait out their timeout:mm_epd_qwen3-vl-2b,mm_epd_qwen3-vl-2b_b64_frontend_decodingandmm_epd_video_qwen3-vl-2b_mixed_frontend_decoding.The encode worker serves
generatewithout a health-check payload, so the runtimeregisters no canary target for it. With canaries off, which is the default,
SystemHealth::get_health_statusthen falls back to the process-wide status. That statusstarts
NotReady, and the vLLM worker never sets it, so/healthanswers 503 forever. Theruntime test
ready_endpoint_without_a_registered_target_still_reports_unhealthydocuments this fallback.
Deployments through the operator do not hit it.
WorkerDefaults.GetBaseContainerindeploy/operator/internal/dynamo/component_worker.gosetsDYN_SYSTEM_USE_ENDPOINT_HEALTH_STATUS=["generate"]for the worker, prefill and decodecomponent types. Encode workers are declared as
componentType: worker, as inrecipes/qwen3-vl-32b-fp8/vllm/hetero_hardware_disagg/deploy.yaml. Readiness then followsthe
generateendpoint, which turns ready on registration. This PR sets the same variablefor the encode worker in
examples/backends/vllm/launch/disagg_multimodal_epd.sh.The tests started polling the encode worker in #14751, which added
health_check_worker_count=3to theepdandepd_videotopologies. Main at5e21f9c618(2026-09-16), before #14751, passed the video test.Validation
All runs used the CI
vllm-runtime-testimage for main3f46e3d3c5on one RTX 6000 Ada.The patched runs mount only the changed launcher into that image.
mm_epd_qwen3-vl-2b/health503 throughoutmm_epd_video_qwen3-vl-2b_mixed_frontend_decoding/health503 throughoutmm_epd_qwen3-vl-2b_b64_frontend_decodinguses the sameepdtopology asmm_epd_qwen3-vl-2b. It was not run unpatched. The llava E/P/D profile does not pollworker health, so it does not hit this.
disagg_multimodal_e_pd.shalso starts an encodeworker, but the
e_pdtopology does not poll worker health either. Every other topologythat polls worker health polls only workers that register a health-check payload.
PR CI does not exercise this change: all three affected tests are marked
post_merge. Agreen PR run is therefore no evidence for the fix. The GPU runs above are.
Not changed:
xpu/disagg_multimodal_epd_xpu.shstarts its encode worker the same way, butno XPU test polls its health, and no XPU hardware was available to run it.
🤖 Generated with Claude Code
Summary by CodeRabbit