Skip to content

fix(vllm): OPS-8696 let the EPD encode worker report healthy - #15434

Merged
dmitry-tokarev-nv merged 1 commit into
mainfrom
dtokarev/vllm-epd-encode-health
Sep 30, 2026
Merged

dmitry-tokarev-nv merged 1 commit into
mainfrom
dtokarev/vllm-epd-encode-health

Conversation

@dmitry-tokarev-nv

@dmitry-tokarev-nv dmitry-tokarev-nv commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

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_decoding and
mm_epd_video_qwen3-vl-2b_mixed_frontend_decoding.

The encode worker serves generate without a health-check payload, so the runtime
registers no canary target for it. With canaries off, which is 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.

Deployments through the operator do not hit it. WorkerDefaults.GetBaseContainer in
deploy/operator/internal/dynamo/component_worker.go sets
DYN_SYSTEM_USE_ENDPOINT_HEALTH_STATUS=["generate"] for the worker, prefill and decode
component types. Encode workers are declared as componentType: worker, as in
recipes/qwen3-vl-32b-fp8/vllm/hetero_hardware_disagg/deploy.yaml. Readiness then follows
the generate endpoint, which turns ready on registration. This PR sets the same variable
for 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=3 to the epd and epd_video topologies. Main at
5e21f9c618 (2026-09-16), before #14751, passed the video test.

Validation

All runs used the CI vllm-runtime-test image for main 3f46e3d3c5 on one RTX 6000 Ada.
The patched runs mount only the changed launcher into that image.

Test Launcher Result
mm_epd_qwen3-vl-2b unpatched failed after 309 s, encode worker /health 503 throughout
mm_epd_video_qwen3-vl-2b_mixed_frontend_decoding unpatched failed at its 600 s timeout, encode worker /health 503 throughout
all three affected tests patched 3 passed, 184 s together

mm_epd_qwen3-vl-2b_b64_frontend_decoding uses the same epd topology as
mm_epd_qwen3-vl-2b. It was not run unpatched. The llava E/P/D profile does not poll
worker health, so it does not hit this. disagg_multimodal_e_pd.sh also starts an encode
worker, but the e_pd topology does not poll worker health either. Every other topology
that 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. A
green PR run is therefore no evidence for the fix. The GPU runs above are.

Not changed: xpu/disagg_multimodal_epd_xpu.sh starts its encode worker the same way, but
no XPU test polls its health, and no XPU hardware was available to run it.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Bug Fixes
    • The encode worker now uses the generate endpoint’s health status when determining readiness.

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>
@coderabbitai

coderabbitai Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

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 configuration

Configuration used: Repository: ai-dynamo/dynamo/.coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 731ee80b-a583-4726-93e5-1c69da25158f

📥 Commits

Reviewing files that changed from the base of the PR and between 8ad295a and e1ddf2d.

📒 Files selected for processing (1)
  • examples/backends/vllm/launch/disagg_multimodal_epd.sh

Included review availability: This review used your included allowance. Your plan provides up to 12 included reviews per hour; 11 remain after this review.


Walkthrough

The encode-worker launch sets DYN_SYSTEM_USE_ENDPOINT_HEALTH_STATUS to ["generate"] so readiness uses the generate endpoint health status.

Changes

Encode worker readiness

Layer / File(s) Summary
Configure endpoint health status
examples/backends/vllm/launch/disagg_multimodal_epd.sh
The encode-worker launch sets DYN_SYSTEM_USE_ENDPOINT_HEALTH_STATUS to ["generate"].

Priority: ⬆️ High

Estimated code review effort: 2 (Simple) | ~5 minutes

Severity of issue fixed: Medium

Merge Risk: ⚪ Minimal · up to e1ddf

The encode worker’s /health should report healthy after its generate endpoint registers, addressing the reported persistent 503. No concrete merge-blocking risk remains.

🚥 Pre-merge checks | ✅ 7
✅ Passed checks (7 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The description links the pull request to OPS-8696 and issue #15432. The linked issue matches the reported encode-worker health failure and the proposed fix.
Out of Scope Changes check ✅ Passed The change is limited to the vLLM EPD launcher and directly supports the stated objective. No unrelated changes are reported.
Linked Issues check ✅ Passed The directly linked issue [#15432] requires the vLLM E/P/D encode worker to report healthy so the video serve test can complete. The PR sets DYN_SYSTEM_USE_ENDPOINT_HEALTH_STATUS='["generate"]' for …
Out of Scope Changes check ✅ Passed The PR changes one vLLM E/P/D launcher and adds comments that explain the health-status fallback. These changes directly support [#15432]. No unrelated code or unrelated behavior is included. The unch…
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 1…
Title check ✅ Passed The title clearly identifies the vLLM fix and its purpose: allowing the EPD encode worker to report healthy. It is concise and specific.
Description check ✅ Passed The description explains the problem, implementation, affected tests, validation results, and linked issue. It omits the template headings and does not explicitly identify where reviewers should start…
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


Comment @coderabbitai help to get the list of available commands.

@JulienDarve JulienDarve left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:ship-it-parrot:

@dmitry-tokarev-nv
dmitry-tokarev-nv enabled auto-merge (squash) September 30, 2026 19:03
@dmitry-tokarev-nv
dmitry-tokarev-nv merged commit b85db41 into main Sep 30, 2026
121 checks passed
@dmitry-tokarev-nv
dmitry-tokarev-nv deleted the dtokarev/vllm-epd-encode-health branch September 30, 2026 19:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backend::vllm Relates to the vllm backend fix size/XS

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG]: vLLM E/P/D video serve test times out because the encode worker never reports healthy

2 participants