vLLM Prefill-Decode Disaggregation with MORI-IO

vLLM Prefill-Decode Disaggregation with MORI-IO

vLLM has introduced Prefill-Decode (PD) disaggregation for single-node deployments, enabling a 2.5x increase in goodput on an 8-GPU AMD Instinct MI300X node. By separating the compute-bound prefill phase from the memory-bandwidth-bound decode phase, vLLM eliminates the Inter-Token Latency (ITL) spikes that typically occur when these workloads compete for the same GPU resources.

The Bottleneck of Collocated Serving

In standard monolithic deployments, prefill and decode workloads share the same GPU resources and scheduler. Because prefill processes entire prompts in parallel using large GEMMs, it is compute-bound and takes significantly longer than a single decode step. When a prefill request enters a batch, it blocks all ongoing decode streams, causing unpredictable spikes in Inter-Token Latency (ITL).

Single-Node PD Disaggregation Architecture

Contrary to the common assumption that disaggregation requires multi-node clusters, vLLM implements this architecture within a single 8-GPU node. The system shifts to a microservice architecture consisting of three components:

  • Prefill Instance: Processes input prompts and produces the KV cache (e.g., using GPUs 0–3).
  • Decode Instance: Generates output tokens using the transferred KV cache (e.g., using GPUs 4–7).
  • Proxy Server: Acts as the entry point, routing requests first to the prefill instance and then to the decode instance.

To facilitate the transfer of gigabytes of KV cache data between these instances, vLLM utilizes MORI-IO, an RDMA-based KV cache connector built on the open-source MORI (Modular RDMA Interface) framework.

KV Cache Transfer Modes: Read vs. Write

MORI-IO supports two distinct transfer modes, configured via the VLLM_MORIIO_CONNECTOR_READ_MODE environment variable:

Read Mode (VLLM_MORIIO_CONNECTOR_READ_MODE=1)

In Read Mode, the proxy dispatches requests serially. It waits for the prefill instance to complete and return remote_block_ids before forwarding the request to the decode instance. The decode instance then pulls the KV cache from the prefill instance's memory via RDMA.

Write Mode (Default)

In Write Mode, the proxy dispatches requests to both the prefill and decode instances concurrently. As the prefill instance computes each layer, it pushes the KV data directly into the decode instance's pre-allocated memory via RDMA WRITE. This eliminates the proxy serialization overhead and allows the decode queue wait to overlap with prefill computation.

Property Read Mode Write Mode
RDMA Direction Decode pulls from prefill Prefill pushes to decode
Proxy Dispatch Serial (await prefill $\rightarrow$ dispatch decode) Concurrent (prefill and decode in parallel)
Block ID Relay Required via proxy Not required
KV Cleanup Decode notifies prefill to free blocks Prefill tracks write completion

Performance Results and Goodput

Using the Qwen3-235B-A22B-FP8 model on an 8-GPU MI300X node (2000-token prompts, 1000-token outputs), vLLM measured performance using goodput—the maximum request rate where requests satisfy both Time to First Token (TTFT) < 1s and ITL < 50ms.

Key Findings

  • 2.5x Goodput Increase: Write mode achieved 73/100 requests meeting SLOs at a rate of 8 req/s, compared to only 26/100 for standard TP8 serving.
  • Elimination of ITL Spikes: Disaggregated modes entirely eliminated ITL violations, as the decode engine is isolated from compute-intensive prefill jobs.
  • TTFT Trade-off: Disaggregation increases TTFT due to the added RDMA transfer and proxy overhead. Write mode provides better TTFT than Read mode because it eliminates proxy serialization.

Deployment and Configuration

Deploying PD disaggregation requires configuring the kv-transfer-config in vLLM. Both instances must specify the MoRIIOConnector and their respective roles (kv_producer for prefill and kv_consumer for decode).

Port Requirements

  • proxy_ping_port: ZMQ endpoint for instance registration with the proxy.
  • http_port: vLLM HTTP server port for inference requests.
  • handshake_port: One-time metadata exchange for KV cache layout.
  • notify_port: Per-request synchronization signaling when KV blocks are ready.

Summary of Use Cases

Situation Recommendation
ITL p99 exceeds SLO under production load Disaggregate
TTFT is the primary binding constraint Standard serving
High concurrency with long prompts Disaggregate
Low request rates with short prompts Standard serving

Sources