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.
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.
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
LeaderWorkerSetOperatorCR 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
Determine the parallelism configuration for your model.
Calculate the values for the
.spec.parallelismfields 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 andtensor: 1givesdata: 32. -
dataLocal: The number of DP ranks per node, which must match the number of GPUs per node. For example,dataLocal: 8for nodes with 8 GPUs. -
expert: Set totrueto enable expert parallelism. -
tensor: Set to1when using expert parallelism as the primary distribution strategy.
The formula
data / dataLocaldetermines the number of pods. For example,data: 32withdataLocal: 8produces 4 pods.-
Create an
LLMInferenceServiceCR that uses external multi-port DP mode.Create a file called
wideep-inference-service.yamlwith 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: 120where:
-
--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 thespec.parallelism.datavalue. -
--data-parallel-size-local=8- Specifies the number of DP ranks per pod. Must match thespec.parallelism.dataLocalvalue and the number of GPUs per node. -
--data-parallel-supervisor-port=9256- Specifies the admin port for aggregated/healthand/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. Thedeepep_high_throughputbackend 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, usedeepep_low_latencyfor the decode stage.port: 9256in probe configurations- Targets the DP Supervisor admin port for all probes. Do not target per-rank serving ports.
-
failureThreshold: 60instartupProbe- Allows up to 600 seconds for model loading. Calculate this value asceiling(max_startup_seconds / periodSeconds). -
terminationGracePeriodSeconds: 120- Allows the DP Supervisor to forward SIGTERM to all child processes and wait for graceful drain.
-
Deploy the inference service:
$ oc apply -f wideep-inference-service.yamlMonitor 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 -wThe pod transitions through the following states:
-
Pending: Waiting for GPU node scheduling. -
ContainerCreating: Pulling the container image. -
Runningwith startup probe active: Model is loading. DP ranks initialize and the supervisor waits for all DP ranks to become healthy. -
Runningwith all probes passing: All DP ranks are ready and the supervisor is serving health on the admin port.
-
Verify that
terminationGracePeriodSecondsis 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_timeoutplus 5 seconds before force-killing remaining processes.NoteIf you created the
LLMInferenceServiceCR withoutterminationGracePeriodSeconds, 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 podsoutput:$ oc exec -n llm-inference <pod-name> -- \ curl -s http://localhost:9256/health -w "%{http_code}" -o /dev/nullA response of
200confirms 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
LLMInferenceServiceis ready:$ oc get llmisvc -n llm-inferenceExpected output:
NAME READY AGE deepseek-r1-wideep True 15mVerify that the service endpoints include the deployment pods:
$ oc get endpoints -n llm-inferenceThe output lists
Endpointsobjects 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 theInferencePool, not through Kubernetes Endpoints.
15.1. DP Supervisor health endpoints and probe configuration Copy linkLink copied to clipboard!
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.
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.
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 Copy linkLink copied to clipboard!
The DP Supervisor serves the following health endpoints on the supervisor admin port, which defaults to port 9256:
| Endpoint | HTTP status codes | Description |
|---|---|---|
|
| 200 or 503 |
Returns |
|
| 200 or 503 |
Functionally identical to |
|
| 200 or 503 |
Functionally identical to |
All three endpoints share the same internal readiness state. This is an intentional simplification for Technology Preview.
15.1.2. Supervisor internal probe parameters Copy linkLink copied to clipboard!
The DP Supervisor continuously probes each child DP rank process to determine health status. You can tune these parameters with vLLM CLI flags:
| CLI flag | Default | Description |
|---|---|---|
|
|
| Specifies the port where health endpoints are served. Kubernetes probes must target this port. |
|
|
| Specifies how often the supervisor polls each child DP rank for health status, in seconds. |
|
|
| Specifies the timeout for each child health check attempt, in seconds. |
|
|
| Specifies the number of consecutive failures before the supervisor marks a DP rank as unhealthy and initiates shutdown. |
15.1.3. Recommended Kubernetes probe configuration Copy linkLink copied to clipboard!
Configure Kubernetes probes to target the DP Supervisor admin port rather than per-rank serving ports. The following recommendations apply to WideEP deployments with external multi-port DP mode:
startupProbe-
Target
/readyzon the supervisor port. Use a generousfailureThresholdto accommodate model loading times, which can exceed 10 minutes for large MoE models. Calculate the threshold with the following formula:failureThreshold = ceiling(max_startup_seconds / periodSeconds). For example, a 10-minute startup withperiodSeconds: 10requiresfailureThreshold: 60. readinessProbe-
Target
/readyzon the supervisor port. Use shorter intervals after startup succeeds, because the model is already loaded and health checks respond quickly. livenessProbe-
Target
/healthon the supervisor port. Use a longer interval and higher failure threshold than the readiness probe to avoid unnecessary pod restarts from transient issues. terminationGracePeriodSeconds- Set to 60-120 seconds to allow the DP Supervisor to forward SIGTERM to all child DP rank processes and wait for graceful drain.
The following example shows the probe configuration within the spec.template section of an LLMInferenceService CR for a DeepSeek-R1 deployment on 8 GPUs per node with a 10-minute maximum startup time:
template:
containers:
- name: main
# ...
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:
-
port: 9256: Specifies the DP Supervisor admin port. This must match the value of--data-parallel-supervisor-port. -
failureThreshold: 60: Specifies the number of startup probe failures to tolerate. WithperiodSeconds: 10, this allows up to 600 seconds for model loading. -
terminationGracePeriodSeconds: 120: Specifies the time Kubernetes waits for the pod to shut down gracefully. This must be long enough for the DP Supervisor to forward SIGTERM to all child processes and wait for drain.
Do not configure probes to target per-rank serving ports such as 8000, 8001, or 8002. Kubernetes probes target a single port per container, and only the DP Supervisor admin port provides aggregated health status for all DP ranks.
15.1.4. SIGTERM shutdown behavior Copy linkLink copied to clipboard!
When the DP Supervisor receives a SIGTERM signal from Kubernetes:
-
The supervisor immediately sets its health status to not ready and returns
HTTP 503on all health endpoints. - The supervisor forwards SIGTERM to all child DP rank processes.
-
The supervisor waits for the configured
shutdown_timeoutplus 5 seconds for child processes to exit gracefully. - 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 Copy linkLink copied to clipboard!
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.
15.2. DP Supervisor CLI flags and configuration options Copy linkLink copied to clipboard!
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.
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.
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 Copy linkLink copied to clipboard!
The following flags are required to enable external multi-port DP mode with the DP Supervisor:
| Flag | Default | Description |
|---|---|---|
|
|
| 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. |
|
| None |
Specifies the total number of DP ranks across the cluster. Must be greater than 1 and divisible by |
|
| None | Specifies the number of DP ranks per pod. Must be 2 or greater. This value typically matches the number of GPUs per node. |
|
|
| 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 Copy linkLink copied to clipboard!
The following flags configure the DP Supervisor behavior and internal health probing:
| Flag | Default | Description |
|---|---|---|
|
|
|
Specifies the HTTP port where the DP Supervisor serves aggregated health endpoints: |
|
|
|
Specifies this node’s rank in the multi-node deployment. Used to infer the |
|
| Inferred |
Specifies the starting rank offset for DP ranks in this pod. If not set, the value is inferred from |
|
|
| Specifies the interval in seconds between the supervisor’s internal health probes to each child DP rank process. |
|
|
| 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. |
|
|
| 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. |
|
| None |
Specifies the file path to the SSL key file. Must be provided together with |
|
| None |
Specifies the file path to the SSL certificate file. Must be provided together with |
15.2.3. Validation rules Copy linkLink copied to clipboard!
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-lbis mutually exclusive with--data-parallel-external-lband--data-parallel-hybrid-lb. You cannot combine multiple DP modes. -
--data-parallel-size-localmust be 2 or greater. -
--data-parallel-sizemust be greater than 1. -
--data-parallel-sizemust be divisible by--data-parallel-size-local. -
--data-parallel-size-localcannot exceed--data-parallel-size. -
The supervisor port must not overlap with the range of child DP rank serving ports, which starts at
--portand spans--data-parallel-size-localconsecutive ports. -
--ssl-keyfileand--ssl-certfilemust be provided together. Specifying only one results in a validation error. -
--data-parallel-rankmust not be set manually. The DP Supervisor manages child DP rank values internally. -
--api-server-countmust be 1 or unset.
15.2.4. Incompatible options Copy linkLink copied to clipboard!
The following configurations are not supported with external multi-port DP mode:
-
gRPC transport: The
--grpcflag is not compatible with--data-parallel-multi-port-external-lb. -
UNIX domain sockets: The
--udsflag is not compatible with--data-parallel-multi-port-external-lb.
15.3. Known limitations for DP-aware load balancing Copy linkLink copied to clipboard!
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.
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.
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.
| Limitation | Description |
|---|---|
| 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 |
| 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 |
| UNIX domain socket incompatibility |
UNIX domain socket (UDS) configuration is not supported with external multi-port DP mode. The |
| Node-local supervisor scope |
Each DP Supervisor manages only the DP ranks within its own pod. Cross-node coordination is handled by the |