README.md 8.87 KB
Newer Older
1
2
3
4
5
<!--
SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
SPDX-License-Identifier: Apache-2.0
-->

6
# Running SGLang with Dynamo
7

8
This directory contains an SGLang component for Dynamo and reference implementations for deploying Large Language Models (LLMs) in various configurations using SGLang. SGLang internally uses ZMQ to communicate between the ingress and the engine processes. For Dynamo, we leverage the runtime to communicate directly with the engine processes and handle ingress and pre/post processing on our end.
9

10
11
12
13
14
15
16
17
18
19
20
21
## Use the Latest Release

We recommend using the latest stable release of dynamo to avoid breaking changes:

[![GitHub Release](https://img.shields.io/github/v/release/ai-dynamo/dynamo)](https://github.com/ai-dynamo/dynamo/releases/latest)

You can find the latest release [here](https://github.com/ai-dynamo/dynamo/releases/latest) and check out the corresponding branch with:

```bash
git checkout $(git describe --tags $(git rev-list --tags --max-count=1))
```

22
---
23

24
25
26
27
28
29
## Table of Contents
- [Feature Support Matrix](#feature-support-matrix)
- [Quick Start](#quick-start)
- [Single Node Examples](#run-single-node-examples)
- [Multi-Node and Advanced Examples](#advanced-examples)
- [Deploy on SLURM or Kubernetes](#deployment)
30

31
## Feature Support Matrix
32

33
### Core Dynamo Features
34

35
36
| Feature | SGLang | Notes |
|---------|--------|-------|
37
38
39
| [**Disaggregated Serving**](../../../docs/architecture/disagg_serving.md) | ✅ |  |
| [**Conditional Disaggregation**](../../../docs/architecture/disagg_serving.md#conditional-disaggregation) | 🚧 | WIP [PR](https://github.com/sgl-project/sglang/pull/7730) |
| [**KV-Aware Routing**](../../../docs/architecture/kv_cache_routing.md) | ✅ |  |
40
| [**SLA-Based Planner**](../../../docs/architecture/sla_planner.md) | ✅ |  |
41
42
| [**Load Based Planner**](../../../docs/architecture/load_planner.md) | ❌ | Planned |
| [**KVBM**](../../../docs/architecture/kvbm_architecture.md) | ❌ | Planned |
43

44
45
### Large Scale P/D and WideEP Features

ishandhanani's avatar
ishandhanani committed
46
47
48
49
50
| Feature             | SGLang | Notes                                                        |
|---------------------|--------|--------------------------------------------------------------|
| **WideEP**          | ✅     | Full support on H100s/GB200                                  |
| **DP Rank Routing** | 🚧     | Direct routing supported. Dynamo KV router does not router to DP worker |
| **GB200 Support**   | ✅     |                                                              |
51
52


53
## SGLang Quick Start
54

55
Below we provide a guide that lets you run all of our common deployment patterns on a single node.
56
57
58

### Start NATS and ETCD in the background

59
Start using [Docker Compose](../../../deploy/docker-compose.yml)
60

61
```bash
62
docker compose -f deploy/docker-compose.yml up -d
63
64
```

65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
### Install `ai-dynamo[sglang]`

#### Install latest release
We suggest using uv to install the latest release of ai-dynamo[sglang]. You can install it with `curl -LsSf https://astral.sh/uv/install.sh | sh`

```bash
# create a virtual env
uv venv --python 3.12 --seed
# install the latest release
uv pip install "ai-dynamo[sglang]"
```

#### Installing editable version for development

<details>
<summary>Instructions</summary>

This requires having rust installed. We also recommend having a proper installation of the cuda toolkit as sglang requires `nvcc` to be available.

```bash
# create a virtual env
uv venv --python 3.12 --seed
# build dynamo runtime bindings
uv pip install maturin
cd $DYNAMO_HOME/lib/bindings/python
maturin develop --uv
cd $DYNAMO_HOME
uv pip install .
export PYTHONPATH="${PYTHONPATH}:$(pwd)/components/backends/sglang/src"
# install target sglang version (you can choose any version)
# we include the prerelease flag in order to install flashinfer rc versions
uv pip install --prerelease=allow sglang[all]==0.4.9.post6
```

</details>

#### Using prebuilt docker containers

<details>
<summary>Instructions</summary>
105
106

```bash
107
docker pull nvcr.io/nvidia/ai-dynamo/sglang-runtime:0.3.2
108
109
```

110
111
112
113
114
115
</details>

#### Building docker container from source

<details>
<summary>Instructions</summary>
116
117

```bash
118
119
120
121
122
./container/build.sh --framework sglang
# run container using prebuild wheel
./container/run.sh --framework sglang -it
# mount workspace for development
./container/run.sh --framework sglang --mount-workspace
123
124
```

125
126
</details>

127
## Run Single Node Examples
128

129
> [!IMPORTANT]
130
131
132
> Each example corresponds to a simple bash script that runs the OpenAI compatible server, processor, and optional router (written in Rust) and LLM engine (written in Python) in a single terminal. You can easily take each command and run them in separate terminals.
>
> Additionally - because we use sglang's argument parser, you can pass in any argument that sglang supports to the worker!
133

134
135

### Aggregated Serving
136
137

```bash
138
cd $DYNAMO_HOME/components/backends/sglang
139
./launch/agg.sh
140
```
141

142
### Aggregated Serving with KV Routing
143

144
145
146
> [!NOTE]
> Until sglang releases a version > v0.5.0rc0, you will have to install from source to use kv_routing. You can do this by running `git clone https://github.com/sgl-project/sglang.git && cd sglang && uv pip install -e "python[all]"`. We will update this section once sglang releases a newer version.

147
```bash
148
cd $DYNAMO_HOME/components/backends/sglang
149
./launch/agg_router.sh
150
151
```

152
### Disaggregated serving
153

154
<details>
155
<summary>Under the hood: SGLang Load Balancer vs Dynamo Discovery</summary>
156
157

SGLang uses a mini load balancer to route requests to handle disaggregated serving. The load balancer functions as follows:
158
159
160
161
162
163
164
165

1. The load balancer receives a request from the client
2. A random `(prefill, decode)` pair is selected from the pool of available workers
3. Request is sent to both `prefill` and `decode` workers via asyncio tasks
4. Internally disaggregation is done from prefill -> decode

Because Dynamo has a discovery mechanism, we do not use a load balancer. Instead, we first route to a random prefill worker, select a random decode worker, and then send the request to both. Internally, SGLang's bootstrap server (which is a part of the `tokenizer_manager`) is used in conjuction with NIXL to handle the kv transfer.

166
167
</details>

168
169
170
171
> [!IMPORTANT]
> Disaggregated serving in SGLang currently requires each worker to have the same tensor parallel size [unless you are using an MLA based model](https://github.com/sgl-project/sglang/pull/5922)

```bash
172
cd $DYNAMO_HOME/components/backends/sglang
173
./launch/disagg.sh
174
```
175

176
### Disaggregated Serving with Mixture-of-Experts (MoE) models and DP attention
177

178
You can use this configuration to test out disaggregated serving with dp attention and expert parallelism on a single node before scaling to the full DeepSeek-R1 model across multiple nodes.
179
180
181

```bash
# note this will require 4 GPUs
182
cd $DYNAMO_HOME/components/backends/sglang
183
./launch/disagg_dp_attn.sh
184
```
185

186
187
When using MoE models, you can also use the our implementation of the native SGLang endpoints to record expert distribution data. The `disagg_dp_attn.sh` script automatically sets up the SGLang HTTP server, the environment variable that controls the expert distribution recording directory, and sets up the expert distribution recording mode to `stat`. You can learn more about expert parallelism load balancing [here](docs/expert-distribution-eplb.md).

188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
### Testing the Deployment

Send a test request to verify your deployment:

```bash
curl localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-8B",
    "messages": [
    {
        "role": "user",
        "content": "Explain why Roger Federer is considered one of the greatest tennis players of all time"
    }
    ],
203
    "stream": true,
204
205
206
207
    "max_tokens": 30
  }'
```

208
209
## Request Migration

210
You can enable [request migration](../../../docs/architecture/request_migration.md) to handle worker failures gracefully. Use the `--migration-limit` flag to specify how many times a request can be migrated to another worker:
211
212
213
214
215

```bash
python3 -m dynamo.sglang ... --migration-limit=3
```

216
This allows a request to be migrated up to 3 times before failing. See the [Request Migration Architecture](../../../docs/architecture/request_migration.md) documentation for details on how this works.
217

218
219
220
221
## Advanced Examples

Below we provide a selected list of advanced examples. Please open up an issue if you'd like to see a specific example!

ishandhanani's avatar
ishandhanani committed
222
### Run a multi-node sized model
223
224
225
226
- **[Run a multi-node model](docs/multinode-examples.md)**

### Large scale P/D disaggregation with WideEP
- **[Run DeepSeek-R1 on 104+ H100s](docs/dsr1-wideep-h100.md)**
227
- **[Run DeepSeek-R1-FP8 on GB200s](docs/dsr1-wideep-gb200.md)**
228

229
230
231
### Hierarchical Cache (HiCache)
- **[Enable SGLang Hierarchical Cache (HiCache)](docs/sgl-hicache-example.md)**

232
233
## Deployment

234
We currently provide deployment examples for Kubernetes and SLURM.
235

236
## Kubernetes
237
- **[Deploying Dynamo with SGLang on Kubernetes](deploy/README.md)**
238

239
## SLURM
240
- **[Deploying Dynamo with SGLang on SLURM](slurm_jobs/README.md)**