Skip to content

feat: add plain Service baseline without Gateway or routing proxy#1663

Open
WenjiaoYue wants to merge 1 commit into
llm-d:mainfrom
WenjiaoYue:fix/plain-service-baseline
Open

feat: add plain Service baseline without Gateway or routing proxy#1663
WenjiaoYue wants to merge 1 commit into
llm-d:mainfrom
WenjiaoYue:fix/plain-service-baseline

Conversation

@WenjiaoYue

Copy link
Copy Markdown
Contributor

Summary

Add a plain Kubernetes Service baseline for ModelService benchmarks through the new gateway.className: none mode.

This provides a direct benchmark path:

benchmark harness -> ClusterIP Service -> decode vLLM

The mode does not deploy or include the following components in the request path:

  • Kubernetes Gateway
  • HTTPRoute
  • EPP
  • Envoy
  • llm-d router
  • ModelService routing proxy

Fixes #1650.

Changes

  • Add none as a supported Gateway class.
  • Render a benchmark-managed ClusterIP Service selecting ModelService decode pods.
  • Disable the ModelService per-pod routing proxy in direct mode.
  • Make vLLM listen directly on routing.servicePort.
  • Retarget custom decode commands from $VLLM_METRICS_PORT to $VLLM_INFERENCE_PORT.
  • Skip Gateway API CRDs, inference extension CRDs, Gateway provider, router, and HTTPRoute deployment.
  • Add direct Service endpoint discovery for:
    • standup smoketests
    • inference tests
    • benchmark runs
    • standalone smoketest workflows
  • Clean up the direct Service during teardown.
  • Reject incompatible direct-mode configurations:
    • P/D disaggregation with prefill replicas
    • shared HTTPRoute mode
    • configurations without a decode replica
  • Update CLI help and documentation.

Usage

gateway:
  className: none

Signed-off-by: WenjiaoYue <wenjiao.yue@intel.com>
Copilot AI review requested due to automatic review settings July 23, 2026 01:37

Copilot AI 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.

Pull request overview

Adds a new gateway.className: none “direct Service” baseline lane for ModelService benchmarking, allowing the harness to hit decode vLLM through a plain ClusterIP Service with no Gateway/API resources and no routing proxy in the request path.

Changes:

  • Adds none as a supported gateway class and normalizes direct mode by disabling the per-pod routing proxy and retargeting vLLM custom commands to $VLLM_INFERENCE_PORT.
  • Renders/applies a benchmark-managed *-direct ClusterIP Service and updates endpoint discovery (smoketests, inference tests, benchmark runs) to use it.
  • Skips router/gateway deployment and gateway prerequisites (Gateway API CRDs/provider/HTTPRoute/infra chart) when in direct mode, plus updates docs/CLI help and adds tests.

Reviewed changes

Copilot reviewed 23 out of 23 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
tests/test_direct_service_mode.py Adds unit/integration-style coverage for direct mode normalization, constraints, rendering, and endpoint discovery.
README.md Updates CLI help text to document --gateway-class none behavior.
llmdbenchmark/utilities/endpoint.py Adds find_direct_modelservice_endpoint() for discovering the plain Service endpoint.
llmdbenchmark/teardown/steps/step_03_delete_resources.py Expands teardown pattern matching to include -direct resources.
llmdbenchmark/standup/steps/step_11_inference_test.py Uses direct Service endpoint discovery for gateway.className=none.
llmdbenchmark/standup/steps/step_10_smoketest.py Uses direct Service endpoint discovery for gateway.className=none.
llmdbenchmark/standup/steps/step_09_deploy_modelservice.py Applies the direct Service manifest and skips router-related waits/labeling in direct mode.
llmdbenchmark/standup/steps/step_08_deploy_router.py Skips router deployment step entirely for direct mode.
llmdbenchmark/standup/steps/step_02_admin_prerequisites.py Skips Gateway API/extension/provider prerequisites for direct mode.
llmdbenchmark/smoketests/base.py Adds direct Service endpoint discovery for smoketests.
llmdbenchmark/run/steps/step_03_detect_endpoint.py Adds direct Service endpoint discovery for benchmark runs.
llmdbenchmark/parser/render_plans.py Adds none gateway class support, direct-mode normalization, and direct-mode constraint validation.
llmdbenchmark/parser/README.md Documents gateway.className: none behavior and intent.
llmdbenchmark/interface/standup.py Updates CLI help to include none as a supported gateway class.
llmdbenchmark/interface/run.py Updates CLI help to include none as a supported gateway class.
llmdbenchmark/interface/plan.py Updates CLI help to include none as a supported gateway class.
llmdbenchmark/interface/experiment.py Updates CLI help to include none as a supported gateway class.
docs/standup.md Documents the new none gateway class lane and constraints.
config/templates/values/defaults.yaml Documents gateway.className: none in defaults commentary.
config/templates/jinja/13a_modelservice-direct-service.yaml.j2 Adds a new template rendering the plain ClusterIP Service for direct mode.
config/templates/jinja/11_infra.yaml.j2 Skips infra rendering for direct mode (and epponly).
config/templates/jinja/10_helmfile-main.yaml.j2 Skips infra/router releases and repo in direct mode; adjusts ms needs: accordingly.
config/templates/jinja/08_httproute.yaml.j2 Skips HTTPRoute rendering in direct mode.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

kind: Service
metadata:
name: {{ model_id_label }}-direct
namespace: {{ namespace.name }}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

@WenjiaoYue is this change intended?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add a plain Service (no-gateway) baseline lane for benchmarks

3 participants