Chapter 15. Launch a WideEP inference service with DP-aware routing


You can deploy large MoE models across multiple GPU nodes with external multi-port data-parallel (DP) mode so the Endpoint Picker can route requests to individual DP ranks for prefix-cache-aware scheduling. A single vllm serve command starts all local DP ranks, provides one serving port per DP rank, and uses the DP Supervisor admin port for Kubernetes probes. This path replaces custom shell wrappers for multi-rank WideEP deployments.

Important

Wide expert parallelism (WideEP) is a Developer Preview feature only. Developer Preview features are not supported by Red Hat in any way and are not functionally complete or production-ready. Do not use Developer Preview features for production or business-critical workloads. Developer Preview features provide early access to upcoming product features in advance of their possible inclusion in a Red Hat product offering, enabling customers to test functionality and provide feedback during the development process. These features might not have any documentation, are subject to change or removal at any time, and testing is limited. Red Hat might provide ways to submit feedback on Developer Preview features without an associated SLA.

Important

DP-aware load balancing is a Technology Preview feature only. Technology Preview features are not supported with Red Hat production service level agreements (SLAs) and might not be functionally complete. Red Hat does not recommend using them in production. These features provide early access to upcoming product features, enabling customers to test functionality and provide feedback during the development process.

For more information about the support scope of Red Hat Technology Preview features, see Technology Preview Features Support Scope.

Prerequisites

  • Distributed Inference with llm-d infrastructure is deployed on OpenShift Container Platform.
  • The Red Hat build of LeaderWorkerSet Operator is installed and a LeaderWorkerSetOperator CR is created. For more information, see LeaderWorkerSet Operator for Red Hat OpenShift.
  • A WideEP-capable MoE model is downloaded to a PVC or accessible through a model URI.
  • Remote Direct Memory Access (RDMA)-capable networking such as RoCE or InfiniBand is configured for expert parallelism communication.
  • Your cluster has sufficient GPU nodes for the WideEP topology. Each pod requests all GPUs on its node.

Procedure

  1. Determine the parallelism configuration for your model.

    Calculate the values for the .spec.parallelism fields based on your cluster topology:

    • data: The total number of DP ranks across the cluster, calculated as (nodes * GPUs_per_node) / tensor. For example, 4 nodes with 8 GPUs each and tensor: 1 gives data: 32.
    • dataLocal: The number of DP ranks per node, which must match the number of GPUs per node. For example, dataLocal: 8 for nodes with 8 GPUs.
    • expert: Set to true to enable expert parallelism.
    • tensor: Set to 1 when using expert parallelism as the primary distribution strategy.

    The formula data / dataLocal determines the number of pods. For example, data: 32 with dataLocal: 8 produces 4 pods.

  2. Create an LLMInferenceService CR that uses external multi-port DP mode.

    Create a file called wideep-inference-service.yaml with the following content:

    apiVersion: serving.kserve.io/v1alpha2
    kind: LLMInferenceService
    metadata:
      name: deepseek-r1-wideep
      namespace: llm-inference
    spec:
      model:
        uri: pvc://model-storage
        name: deepseek-ai/DeepSeek-R1-0528
      replicas: 1
      parallelism:
        data: 32
        dataLocal: 8
        expert: true
        tensor: 1
      router: # Uses default routing settings
        scheduler: {}
        route: {}
        gateway: {}
      template:
        containers:
        - name: main
          args:
            - --data-parallel-multi-port-external-lb
            - --data-parallel-size=32
            - --data-parallel-size-local=8
            - --data-parallel-supervisor-port=9256
            - --port=8000
            - --all2all-backend=deepep_high_throughput
          resources:
            limits:
              cpu: "32"
              memory: 256Gi
              nvidia.com/gpu: "8"
            requests:
              cpu: "16"
              memory: 128Gi
              nvidia.com/gpu: "8"
          startupProbe:
            httpGet:
              path: /readyz
              port: 9256
              scheme: HTTP
            periodSeconds: 10
            failureThreshold: 60
            timeoutSeconds: 5
          readinessProbe:
            httpGet:
              path: /readyz
              port: 9256
              scheme: HTTP
            periodSeconds: 5
            failureThreshold: 3
            timeoutSeconds: 5
          livenessProbe:
            httpGet:
              path: /health
              port: 9256
              scheme: HTTP
            periodSeconds: 15
            failureThreshold: 5
            timeoutSeconds: 5
        terminationGracePeriodSeconds: 120

    where:

    • --data-parallel-multi-port-external-lb - Enables external multi-port DP mode. Each local DP rank gets its own serving port so the Endpoint Picker can route to individual ranks. The DP Supervisor starts the local rank processes and aggregates their health on the admin port.
    • --data-parallel-size=32 - Specifies the total number of DP ranks across the cluster. Must match the spec.parallelism.data value.
    • --data-parallel-size-local=8 - Specifies the number of DP ranks per pod. Must match the spec.parallelism.dataLocal value and the number of GPUs per node.
    • --data-parallel-supervisor-port=9256 - Specifies the admin port for aggregated /health and /readyz. Point all Kubernetes probes at this port, not at per-rank serving ports.
    • --port=8000 - Specifies the base serving port for inference traffic. Each DP rank listens on a sequential port: 8000, 8001, 8002, through 8007 for 8 local ranks. The Endpoint Picker targets these ports when scheduling requests.
    • --all2all-backend=deepep_high_throughput - Specifies the all-to-all communication backend for expert parallelism. The deepep_high_throughput backend is optimized for batch processing throughput and requires RDMA-capable networking such as RoCE or InfiniBand. For disaggregated deployments that separate prefill and decode stages, use deepep_low_latency for the decode stage.

      port: 9256 in probe configurations
      Targets the DP Supervisor admin port for all probes. Do not target per-rank serving ports.
    • failureThreshold: 60 in startupProbe - Allows up to 600 seconds for model loading. Calculate this value as ceiling(max_startup_seconds / periodSeconds).
    • terminationGracePeriodSeconds: 120 - Allows the DP Supervisor to forward SIGTERM to all child processes and wait for graceful drain.
  3. Deploy the inference service:

    $ oc apply -f wideep-inference-service.yaml
  4. Monitor the startup progress.

    Large MoE models can take 7-10 minutes or more to load. Check the pod status during startup:

    $ oc get pods -n llm-inference -w

    The pod transitions through the following states:

    • Pending: Waiting for GPU node scheduling.
    • ContainerCreating: Pulling the container image.
    • Running with startup probe active: Model is loading. DP ranks initialize and the supervisor waits for all DP ranks to become healthy.
    • Running with all probes passing: All DP ranks are ready and the supervisor is serving health on the admin port.
  5. Verify that terminationGracePeriodSeconds is set for coordinated shutdown.

    The DP Supervisor requires enough time to forward SIGTERM to all child DP rank processes and wait for graceful drain. The recommended range is 60-120 seconds. The supervisor waits for the configured shutdown_timeout plus 5 seconds before force-killing remaining processes.

    Note

    If you created the LLMInferenceService CR without terminationGracePeriodSeconds, patch the CR to add the specification:

    $ oc patch llmisvc deepseek-r1-wideep -n llm-inference --type=merge \
      -p '{"spec":{"template":{"terminationGracePeriodSeconds":120}}}'

Verification

  • Verify that all DP ranks are ready by querying the supervisor health endpoint on one of the pods from the oc get pods output:

    $ oc exec -n llm-inference <pod-name> -- \
      curl -s http://localhost:9256/health -w "%{http_code}" -o /dev/null

    A response of 200 confirms that all DP ranks on that pod are healthy. For a WideEP deployment with multiple pods, repeat this check for each pod to confirm that all nodes are ready.

  • Verify that the LLMInferenceService is ready:

    $ oc get llmisvc -n llm-inference

    Expected output:

    NAME                  READY   AGE
    deepseek-r1-wideep    True    15m
  • Verify that the service endpoints include the deployment pods:

    $ oc get endpoints -n llm-inference

    The output lists Endpoints objects by service name. Verify that the endpoints for the workload service include pod addresses, confirming that the service is routing traffic to the deployment pods. Per-rank serving ports are exposed inside each pod and are discovered by the Endpoint Picker through the InferencePool, not through Kubernetes Endpoints.

You can configure Kubernetes probes to target the DP Supervisor admin port for WideEP deployments that use external multi-port DP mode. Inference traffic still uses the per-rank serving ports; probes use the admin port so Kubernetes can treat the multi-rank pod as a single readiness unit. The supervisor aggregates health status from all local DP rank processes and provides /health, /ready, and /readyz endpoints on a dedicated port. Configuring probes correctly prevents repeated pod restarts during model loading and enables graceful shutdown.

Important

Wide expert parallelism (WideEP) is a Developer Preview feature only. Developer Preview features are not supported by Red Hat in any way and are not functionally complete or production-ready. Do not use Developer Preview features for production or business-critical workloads. Developer Preview features provide early access to upcoming product features in advance of their possible inclusion in a Red Hat product offering, enabling customers to test functionality and provide feedback during the development process. These features might not have any documentation, are subject to change or removal at any time, and testing is limited. Red Hat might provide ways to submit feedback on Developer Preview features without an associated SLA.

Important

DP-aware load balancing is a Technology Preview feature only. Technology Preview features are not supported with Red Hat production service level agreements (SLAs) and might not be functionally complete. Red Hat does not recommend using them in production. These features provide early access to upcoming product features, enabling customers to test functionality and provide feedback during the development process.

For more information about the support scope of Red Hat Technology Preview features, see Technology Preview Features Support Scope.

15.1.1. Health endpoint reference

The DP Supervisor serves the following health endpoints on the supervisor admin port, which defaults to port 9256:

Table 15.1. DP Supervisor health endpoints
EndpointHTTP status codesDescription

/health

200 or 503

Returns HTTP 200 when all local DP ranks are healthy and the supervisor is not shutting down.Returns HTTP 503 when any rank is unhealthy or the supervisor has received a SIGTERM signal.

/ready

200 or 503

Functionally identical to /health. Returns HTTP 200 when all local DP ranks are healthy.

/readyz

200 or 503

Functionally identical to /health. Returns HTTP 200 when all local DP ranks are healthy.

Note

All three endpoints share the same internal readiness state. This is an intentional simplification for Technology Preview.

15.1.2. Supervisor internal probe parameters

The DP Supervisor continuously probes each child DP rank process to determine health status. You can tune these parameters with vLLM CLI flags:

Table 15.2. Supervisor internal probe parameters
CLI flagDefaultDescription

--data-parallel-supervisor-port

9256

Specifies the port where health endpoints are served. Kubernetes probes must target this port.

--dp-supervisor-probe-interval-s

5.0

Specifies how often the supervisor polls each child DP rank for health status, in seconds.

--dp-supervisor-probe-timeout-s

5.0

Specifies the timeout for each child health check attempt, in seconds.

--dp-supervisor-probe-failure-threshold

3

Specifies the number of consecutive failures before the supervisor marks a DP rank as unhealthy and initiates shutdown.

15.1.4. SIGTERM shutdown behavior

When the DP Supervisor receives a SIGTERM signal from Kubernetes:

  1. The supervisor immediately sets its health status to not ready and returns HTTP 503 on all health endpoints.
  2. The supervisor forwards SIGTERM to all child DP rank processes.
  3. The supervisor waits for the configured shutdown_timeout plus 5 seconds for child processes to exit gracefully.
  4. Any child processes that have not exited after the grace period are force-killed.

This coordinated shutdown prevents orphaned GPU processes and ensures that inference requests in flight can drain before the pod terminates. Set terminationGracePeriodSeconds in the pod spec to a value that accommodates the shutdown timeout plus 5 seconds.

15.1.5. Health model trade-offs

The all-or-nothing health model means that any single DP rank failure marks the entire pod as not ready. The Endpoint Picker (EPP) and Inference Gateway automatically retry requests to healthy pods.

This design has the following implications:

  • A transient GPU error on one DP rank causes all DP ranks on the node to restart, even if the other DP ranks are healthy.
  • Availability planning must account for the blast radius of a single DP rank failure across all GPUs on the node.
  • The readiness probe removes the pod from the Kubernetes Service endpoints immediately, which allows the EPP to route new requests to other pods while the failed pod restarts.

You can configure external multi-port DP mode and the DP Supervisor for WideEP deployments by using CLI flags with the vllm serve command. The following tables list the required and optional flags, validation rules, and incompatible options.

Important

Wide expert parallelism (WideEP) is a Developer Preview feature only. Developer Preview features are not supported by Red Hat in any way and are not functionally complete or production-ready. Do not use Developer Preview features for production or business-critical workloads. Developer Preview features provide early access to upcoming product features in advance of their possible inclusion in a Red Hat product offering, enabling customers to test functionality and provide feedback during the development process. These features might not have any documentation, are subject to change or removal at any time, and testing is limited. Red Hat might provide ways to submit feedback on Developer Preview features without an associated SLA.

Important

DP-aware load balancing is a Technology Preview feature only. Technology Preview features are not supported with Red Hat production service level agreements (SLAs) and might not be functionally complete. Red Hat does not recommend using them in production. These features provide early access to upcoming product features, enabling customers to test functionality and provide feedback during the development process.

For more information about the support scope of Red Hat Technology Preview features, see Technology Preview Features Support Scope.

15.2.1. Required flags

The following flags are required to enable external multi-port DP mode with the DP Supervisor:

Table 15.3. Required DP Supervisor CLI flags
FlagDefaultDescription

--data-parallel-multi-port-external-lb

false

Enables external multi-port DP mode. When set, each local DP rank receives its own serving port, and the DP Supervisor starts those ranks and exposes aggregated health endpoints on the supervisor admin port.

--data-parallel-size

None

Specifies the total number of DP ranks across the cluster. Must be greater than 1 and divisible by --data-parallel-size-local.

--data-parallel-size-local

None

Specifies the number of DP ranks per pod. Must be 2 or greater. This value typically matches the number of GPUs per node.

--port

8000

Specifies the base serving port. Each DP rank listens on a sequential port starting from this value: port, port+1, port+2, and so on.

15.2.2. Optional flags

The following flags configure the DP Supervisor behavior and internal health probing:

Table 15.4. Optional DP Supervisor CLI flags
FlagDefaultDescription

--data-parallel-supervisor-port

9256

Specifies the HTTP port where the DP Supervisor serves aggregated health endpoints: /health, /ready, and /readyz. Kubernetes probes must target this port.

--node-rank

0

Specifies this node’s rank in the multi-node deployment. Used to infer the --data-parallel-start-rank value when it is not set explicitly.

--data-parallel-start-rank

Inferred

Specifies the starting rank offset for DP ranks in this pod. If not set, the value is inferred from --node-rank multiplied by --data-parallel-size-local.

--dp-supervisor-probe-interval-s

5.0

Specifies the interval in seconds between the supervisor’s internal health probes to each child DP rank process.

--dp-supervisor-probe-timeout-s

5.0

Specifies the timeout in seconds for each child health probe attempt. If a probe does not respond within this duration, the attempt is treated as a connection error and retried.

--dp-supervisor-probe-failure-threshold

3

Specifies the number of consecutive connection error retries before a child health probe is declared failed. After this threshold is reached, the supervisor marks the DP rank as unhealthy and initiates shutdown.

--ssl-keyfile

None

Specifies the file path to the SSL key file. Must be provided together with --ssl-certfile.

--ssl-certfile

None

Specifies the file path to the SSL certificate file. Must be provided together with --ssl-keyfile.

15.2.3. Validation rules

The following constraints apply when --data-parallel-multi-port-external-lb is enabled. The DP Supervisor validates these constraints at startup. If any validation fails, the process exits with an error:

  • --data-parallel-multi-port-external-lb is mutually exclusive with --data-parallel-external-lb and --data-parallel-hybrid-lb. You cannot combine multiple DP modes.
  • --data-parallel-size-local must be 2 or greater.
  • --data-parallel-size must be greater than 1.
  • --data-parallel-size must be divisible by --data-parallel-size-local.
  • --data-parallel-size-local cannot exceed --data-parallel-size.
  • The supervisor port must not overlap with the range of child DP rank serving ports, which starts at --port and spans --data-parallel-size-local consecutive ports.
  • --ssl-keyfile and --ssl-certfile must be provided together. Specifying only one results in a validation error.
  • --data-parallel-rank must not be set manually. The DP Supervisor manages child DP rank values internally.
  • --api-server-count must be 1 or unset.

15.2.4. Incompatible options

The following configurations are not supported with external multi-port DP mode:

  • gRPC transport: The --grpc flag is not compatible with --data-parallel-multi-port-external-lb.
  • UNIX domain sockets: The --uds flag is not compatible with --data-parallel-multi-port-external-lb.

DP-aware load balancing for WideEP deployments has the following known limitations in this Technology Preview. Review these limitations before deploying WideEP inference services with the DP Supervisor to plan for availability, scaling, and transport constraints.

Important

Wide expert parallelism (WideEP) is a Developer Preview feature only. Developer Preview features are not supported by Red Hat in any way and are not functionally complete or production-ready. Do not use Developer Preview features for production or business-critical workloads. Developer Preview features provide early access to upcoming product features in advance of their possible inclusion in a Red Hat product offering, enabling customers to test functionality and provide feedback during the development process. These features might not have any documentation, are subject to change or removal at any time, and testing is limited. Red Hat might provide ways to submit feedback on Developer Preview features without an associated SLA.

Important

DP-aware load balancing is a Technology Preview feature only. Technology Preview features are not supported with Red Hat production service level agreements (SLAs) and might not be functionally complete. Red Hat does not recommend using them in production. These features provide early access to upcoming product features, enabling customers to test functionality and provide feedback during the development process.

For more information about the support scope of Red Hat Technology Preview features, see Technology Preview Features Support Scope.

Table 15.5. Known limitations for DP-aware load balancing
LimitationDescription

All-or-nothing health model

If any single DP rank fails or becomes unhealthy, the DP Supervisor shuts down the entire pod. A single GPU error or DP rank crash takes down all DP ranks on the node, requiring a full pod restart. The supervisor cannot mark individual DP ranks as unhealthy while keeping others active.

No partial-rank degradation

The DP Supervisor cannot continue serving inference requests with fewer DP ranks if one fails. All DP ranks must be healthy for the pod to accept requests. Plan availability around the blast radius of a single DP rank failure across all GPUs on the node.

No elastic EP scaling

You cannot dynamically add or remove DP ranks at runtime. The DP Supervisor launches a fixed number of DP ranks at startup based on the --data-parallel-size-local flag. To scale capacity, deploy new pods rather than adding DP ranks to existing pods.

Synchronous forward pass requirement

All DP ranks must synchronize forward passes for all models in DP mode, including dummy passes on idle DP ranks. MoE models have additional synchronization requirements for expert-parallel collectives. Uneven request distribution across DP ranks does not reduce per-GPU compute cost.

gRPC transport incompatibility

The external multi-port DP mode does not support gRPC transport. Only HTTP and HTTPS transport are supported for DP Supervisor deployments. The --grpc flag cannot be combined with --data-parallel-multi-port-external-lb.

UNIX domain socket incompatibility

UNIX domain socket (UDS) configuration is not supported with external multi-port DP mode. The --uds flag cannot be combined with --data-parallel-multi-port-external-lb.

Node-local supervisor scope

Each DP Supervisor manages only the DP ranks within its own pod. Cross-node coordination is handled by the LLMInferenceService controller and the LeaderWorkerSet Operator, not by the supervisor.

Red Hat logoGithubRedditYoutubeTwitter

Learn

Try, buy, & sell

Communities

About Red Hat

We deliver hardened solutions that make it easier for enterprises to work across platforms and environments, from the core datacenter to the network edge.

Making open source more inclusive

Red Hat is committed to replacing problematic language in our code, documentation, and web properties. For more details, see the Red Hat Blog.

About Red Hat Documentation

Legal Notice

Theme

© 2026 Red Hat
Back to top