mirror of
https://github.com/kvcache-ai/sglang.git
synced 2026-07-13 10:56:58 +00:00
Co-authored-by: AdityaVKochar <adityavardhankochar@gmail.com> Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com> Co-authored-by: adhyan-jain <adhyanjain2006@gmail.com> Co-authored-by: Adhyan Jain <71976554+adhyan-jain@users.noreply.github.com> Co-authored-by: Maitri-shah29 <maitrirajivshah@gmail.com> Co-authored-by: Adarsh Shirawalmath <114558126+adarshxs@users.noreply.github.com> Co-authored-by: Maitri Shah <shah29maitri@gmail.com> Co-authored-by: Aditya Vardhan Kochar <80113212+AdityaVKochar@users.noreply.github.com> Co-authored-by: Rishit Shivam <164783543+pokymono@users.noreply.github.com> Co-authored-by: Rishitshivam <164783543+Rishitshivam@users.noreply.github.com> Co-authored-by: IshhanKheria <ishhankheria06@gmail.com> Co-authored-by: Ishita Joshi <ishitata.joshi@gmail.com> Co-authored-by: Richard Chen <104477092+Richardczl98@users.noreply.github.com> Co-authored-by: longGGGGGG <553746008@qq.com> Co-authored-by: Richard <richardchen@radixark.ai> Co-authored-by: Nakul Sinha <nakul.new4socials@gmail.com> Co-authored-by: Divyam Agrawal <ludicrouslytrue@gmail.com> Co-authored-by: Richardczl98 <Zhenlinc@stanford.edu> Co-authored-by: Krishang Zinzuwadia <krishangzinzuwadia@gmail.com> Co-authored-by: nimeshas <nimesha.s106@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Jignas Paturu <86356085+JignasP@users.noreply.github.com> Co-authored-by: zijiexia <37504505+zijiexia@users.noreply.github.com>
84 lines
3.5 KiB
Plaintext
84 lines
3.5 KiB
Plaintext
---
|
||
title: "EPD Disaggregation"
|
||
metatags:
|
||
description: "SGLang EPD disaggregation: separate encoder, prefill, decode stages for VLM inference. Independent scaling, load balancing, three-tier architecture."
|
||
---
|
||
## Why and What is EPD Disaggregation?
|
||
|
||
In modern Vision-Language Model (VLM) inference, request execution naturally decomposes into three distinct stages: Encoder, Prefill, and Decode.
|
||
The Encoder stage performs vision preprocessing and ViT-based image encoding, which is highly compute-intensive but only required during request initialization. The Prefill stage processes the full multimodal input sequence to initialize the language model’s Key-Value (KV) cache, while the Decode stage is dominated by memory bandwidth and KV cache access for autoregressive token generation.
|
||
|
||
Existing deployments typically colocate these stages within a unified execution engine, or at best apply Prefill–Decode (PD) disaggregation. However, such designs still tightly couple vision encoding with language prefill, leading to inefficient resource utilization, limited scalability for image-heavy workloads, and suboptimal scheduling under load.
|
||
|
||
To address these challenges, we introduce Encoder–Prefill–Decode (EPD) Disaggregation in SGLang. EPD further separates vision encoding from language processing, enabling independent horizontal scaling of encoder servers, improved load balancing for multimodal requests, and seamless integration with existing PD disaggregation to form a fully decoupled three-tier inference architecture.
|
||
|
||
### Usage
|
||
|
||
You can launch a language-only model using `--language-only`, or an encoder-only model using `--encoder-only`.
|
||
When launching a language-only model, you must additionally specify the encoder service endpoints via `--encoder-urls`.
|
||
|
||
We support multiple encoder transfer backends, including zmq_to_scheduler, zmq_to_tokenizer, and mooncake (the default is zmq_to_scheduler). The backend can be selected using `--encoder-transfer-backend`.
|
||
|
||
#### Qwen VL
|
||
|
||
- EP Disaggregation
|
||
|
||
```bash Command
|
||
# encoder 0
|
||
python -m sglang.launch_server \
|
||
--model-path Qwen/Qwen3-VL-8B-Instruct \
|
||
--encoder-only \
|
||
--encoder-transfer-backend zmq_to_scheduler \
|
||
--port 30000
|
||
# encoder 1
|
||
python -m sglang.launch_server \
|
||
--model-path Qwen/Qwen3-VL-8B-Instruct \
|
||
--encoder-only \
|
||
--encoder-transfer-backend zmq_to_scheduler \
|
||
--port 30001
|
||
# language-only server
|
||
python -m sglang.launch_server \
|
||
--model-path Qwen/Qwen3-VL-8B-Instruct \
|
||
--language-only \
|
||
--encoder-urls http://127.0.0.1:30000 http://127.0.0.1:30001 \
|
||
--encoder-transfer-backend zmq_to_scheduler \
|
||
--port 30002
|
||
```
|
||
|
||
- EPD Disaggregation
|
||
|
||
```bash Command
|
||
# encoder 0
|
||
python -m sglang.launch_server \
|
||
--model-path Qwen/Qwen3-VL-8B-Instruct \
|
||
--encoder-only \
|
||
--encoder-transfer-backend zmq_to_scheduler \
|
||
--port 30000
|
||
# encoder 1
|
||
python -m sglang.launch_server \
|
||
--model-path Qwen/Qwen3-VL-8B-Instruct \
|
||
--encoder-only \
|
||
--encoder-transfer-backend zmq_to_scheduler \
|
||
--port 30001
|
||
# prefill 0
|
||
python -m sglang.launch_server \
|
||
--model-path Qwen/Qwen3-VL-8B-Instruct \
|
||
--disaggregation-mode prefill \
|
||
--language-only \
|
||
--encoder-urls http://127.0.0.1:30000 http://127.0.0.1:30001 \
|
||
--encoder-transfer-backend zmq_to_scheduler \
|
||
--port 30002
|
||
# decode 0
|
||
python -m sglang.launch_server \
|
||
--model-path Qwen/Qwen3-VL-8B-Instruct \
|
||
--disaggregation-mode decode \
|
||
--port 30003
|
||
# router
|
||
python -m sglang_router.launch_router \
|
||
--pd-disaggregation \
|
||
--prefill http://$PREFILL_HOST:30002 \
|
||
--decode http://$DECODE_HOST:30003 \
|
||
--port 8000
|
||
|
||
```
|