README.md 13.1 KB
Newer Older
Neelay Shah's avatar
Neelay Shah committed
1
<!--
Neelay Shah's avatar
Neelay Shah committed
2
SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
Neelay Shah's avatar
Neelay Shah committed
3
SPDX-License-Identifier: Apache-2.0
4
5
6
7
8
9
10
11
12
13
14
15

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Neelay Shah's avatar
Neelay Shah committed
16
-->
17

18
![Dynamo banner](./docs/images/frontpage-banner.png)
Neelay Shah's avatar
Neelay Shah committed
19

20
21
[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
[![GitHub Release](https://img.shields.io/github/v/release/ai-dynamo/dynamo)](https://github.com/ai-dynamo/dynamo/releases/latest)
22
[![Discord](https://dcbadge.limes.pink/api/server/D92uqZRjCZ?style=flat)](https://discord.gg/D92uqZRjCZ)
23
[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/ai-dynamo/dynamo)
Meenakshi Sharma's avatar
Meenakshi Sharma committed
24

Harry Kim's avatar
Harry Kim committed
25
| **[Roadmap](https://github.com/ai-dynamo/dynamo/issues/762)** | **[Support matrix](https://github.com/ai-dynamo/dynamo/blob/main/docs/support_matrix.md)** | **[Documentation](https://docs.nvidia.com/dynamo/latest/index.html)** | **[Examples](https://github.com/ai-dynamo/dynamo/tree/main/examples)** | **[Prebuilt containers](https://catalog.ngc.nvidia.com/orgs/nvidia/teams/ai-dynamo/collections/ai-dynamo)** | **[Design Proposals](https://github.com/ai-dynamo/enhancements)** | **[Blogs](https://developer.nvidia.com/blog/tag/nvidia-dynamo)**
26

Anish's avatar
Anish committed
27
# NVIDIA Dynamo
28

Anish's avatar
Anish committed
29
High-throughput, low-latency inference framework designed for serving generative AI and reasoning models in multi-node distributed environments.
30

31
32
## Latest News

33
- [08/05] Deploy `openai/gpt-oss-120b` with disaggregated serving on NVIDIA Blackwell GPUs using Dynamo [➡️ link](./components/backends/trtllm/gpt-oss.md)
34

Anish's avatar
Anish committed
35
## The Era of Multi-GPU, Multi-Node
36

Anish's avatar
Anish committed
37
38
39
<p align="center">
  <img src="./docs/images/frontpage-gpu-vertical.png" alt="Multi Node Multi-GPU topology" width="600" />
</p>
40

Anish's avatar
Anish committed
41
Large language models are quickly outgrowing the memory and compute budget of any single GPU. Tensor-parallelism solves the capacity problem by spreading each layer across many GPUs—and sometimes many servers—but it creates a new one: how do you coordinate those shards, route requests, and share KV cache fast enough to feel like one accelerator? This orchestration gap is exactly what NVIDIA Dynamo is built to close.
42

Anish's avatar
Anish committed
43
Dynamo is designed to be inference engine agnostic (supports TRT-LLM, vLLM, SGLang or others) and captures LLM-specific capabilities such as:
44

Neelay Shah's avatar
Neelay Shah committed
45
46
47
48
49
- **Disaggregated prefill & decode inference** – Maximizes GPU throughput and facilitates trade off between throughput and latency.
- **Dynamic GPU scheduling** – Optimizes performance based on fluctuating demand
- **LLM-aware request routing** – Eliminates unnecessary KV cache re-computation
- **Accelerated data transfer** – Reduces inference response time using NIXL.
- **KV cache offloading** – Leverages multiple memory hierarchies for higher system throughput
50

Anish's avatar
Anish committed
51
52
53
54
55
<p align="center">
  <img src="./docs/images/frontpage-architecture.png" alt="Dynamo architecture" width="600" />
</p>

## Framework Support Matrix
Neelay Shah's avatar
Neelay Shah committed
56

57
58
59
60
61
62
63
64
| Feature                                                                                           | vLLM | SGLang | TensorRT-LLM |
| ------------------------------------------------------------------------------------------------- | ---- | ------ | ------------ |
| [**Disaggregated Serving**](/docs/architecture/disagg_serving.md)                                 | ✅   | ✅     | ✅           |
| [**Conditional Disaggregation**](/docs/architecture/disagg_serving.md#conditional-disaggregation) | 🚧   | 🚧     | 🚧           |
| [**KV-Aware Routing**](/docs/architecture/kv_cache_routing.md)                                    | ✅   | ✅     | ✅           |
| [**Load Based Planner**](/docs/architecture/load_planner.md)                                      | 🚧   | 🚧     | 🚧           |
| [**SLA-Based Planner**](/docs/architecture/sla_planner.md)                                        | ✅   | ✅     | ✅           |
| [**KVBM**](/docs/architecture/kvbm_architecture.md)                                               | ✅   | 🚧     | ✅           |
65

Anish's avatar
Anish committed
66
To learn more about each framework and their capabilities, check out each framework's README!
67

Anish's avatar
Anish committed
68
69
70
- **[vLLM](components/backends/vllm/README.md)**
- **[SGLang](components/backends/sglang/README.md)**
- **[TensorRT-LLM](components/backends/trtllm/README.md)**
71

Anish's avatar
Anish committed
72
73
74
Built in Rust for performance and in Python for extensibility, Dynamo is fully open-source and driven by a transparent, OSS (Open Source Software) first development approach.

# Installation
75

Neelay Shah's avatar
Neelay Shah committed
76
The following examples require a few system level packages.
77
Recommended to use Ubuntu 24.04 with a x86_64 CPU. See [docs/support_matrix.md](docs/support_matrix.md)
78

Anish's avatar
Anish committed
79
80
81
## 1. Initial setup

The Dynamo team recommends the `uv` Python package manager, although any way works. Install uv:
82

Anish's avatar
Anish committed
83
84
85
```
curl -LsSf https://astral.sh/uv/install.sh | sh
```
86

Anish's avatar
Anish committed
87
88
89
### Install etcd and NATS (required)

To coordinate across a data center, Dynamo relies on etcd and NATS. To run Dynamo locally, these need to be available.
90

91
92
- [etcd](https://etcd.io/) can be run directly as `./etcd`.
- [nats](https://nats.io/) needs jetstream enabled: `nats-server -js`.
93

Anish's avatar
Anish committed
94
To quickly setup etcd & NATS, you can also run:
95

96
```
Anish's avatar
Anish committed
97
# At the root of the repository:
98
# Edit deploy/docker-compose.yml to comment out "runtime: nvidia" of the dcgm-exporter service if the nvidia container runtime isn't deployed or to be used.
Anish's avatar
Anish committed
99
docker compose -f deploy/docker-compose.yml up -d
100
101
```

Anish's avatar
Anish committed
102
## 2. Select an engine
103

Anish's avatar
Anish committed
104
We publish Python wheels specialized for each of our supported engines: vllm, sglang, trtllm, and llama.cpp. The examples that follow use SGLang; continue reading for other engines.
105

106
```
107
108
109
uv venv venv
source venv/bin/activate
uv pip install pip
110

111
# Choose one
Anish's avatar
Anish committed
112
uv pip install "ai-dynamo[sglang]"  #replace with [vllm], [trtllm], etc.
113
```
114

Anish's avatar
Anish committed
115
## 3. Run Dynamo
116
117
118
119

### Running an LLM API server

Dynamo provides a simple way to spin up a local set of inference components including:
120

Neelay Shah's avatar
Neelay Shah committed
121
122
123
- **OpenAI Compatible Frontend** – High performance OpenAI compatible http api server written in Rust.
- **Basic and Kv Aware Router** – Route and load balance traffic to a set of workers.
- **Workers** – Set of pre-configured LLM serving engines.
124
125

```
Graham King's avatar
Graham King committed
126
127
# Start an OpenAI compatible HTTP server, a pre-processor (prompt templating and tokenization) and a router.
# Pass the TLS certificate and key paths to use HTTPS instead of HTTP.
128
python -m dynamo.frontend --http-port 8000 [--tls-cert-path cert.pem] [--tls-key-path key.pem]
129

Anish's avatar
Anish committed
130
# Start the SGLang engine, connecting to NATS and etcd to receive requests. You can run several of these,
131
# both for the same model and for multiple models. The frontend node will discover them.
132
python -m dynamo.sglang --model deepseek-ai/DeepSeek-R1-Distill-Llama-8B
133
134
```

Neelay Shah's avatar
Neelay Shah committed
135
#### Send a Request
136

137
```bash
138
curl localhost:8000/v1/chat/completions   -H "Content-Type: application/json"   -d '{
Neelay Shah's avatar
Neelay Shah committed
139
140
141
142
143
144
145
146
147
148
    "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-8B",
    "messages": [
    {
        "role": "user",
        "content": "Hello, how are you?"
    }
    ],
    "stream":false,
    "max_tokens": 300
  }' | jq
149
```
150

151
152
Rerun with `curl -N` and change `stream` in the request to `true` to get the responses as soon as the engine issues them.

Anish's avatar
Anish committed
153
154
### Deploying Dynamo

155
- Follow the [Quickstart Guide](docs/kubernetes/README.md) to deploy on Kubernetes.
Anish's avatar
Anish committed
156
157
- Check out [Backends](components/backends) to deploy various workflow configurations (e.g. SGLang with router, vLLM with disaggregated serving, etc.)
- Run some [Examples](examples) to learn about building components in Dynamo and exploring various integrations.
158

159
160
161
162
### Benchmarking Dynamo

Dynamo provides comprehensive benchmarking tools to evaluate and optimize your deployments:

163
164
- **[Benchmarking Guide](docs/benchmarks/benchmarking.md)** – Compare deployment topologies (aggregated vs. disaggregated vs. vanilla vLLM) using GenAI-Perf
- **[Pre-Deployment Profiling](docs/benchmarks/pre_deployment_profiling.md)** – Optimize configurations before deployment to meet SLA requirements
165

Anish's avatar
Anish committed
166
# Engines
167

Anish's avatar
Anish committed
168
Dynamo is designed to be inference engine agnostic. To use any engine with Dynamo, NATS and etcd need to be installed, along with a Dynamo frontend (`python -m dynamo.frontend [--interactive]`).
169

Anish's avatar
Anish committed
170
## vLLM
171
172
173
174
175
176

```
uv pip install ai-dynamo[vllm]
```

Run the backend/worker like this:
177

178
179
180
181
```
python -m dynamo.vllm --help
```

Anish's avatar
Anish committed
182
vLLM attempts to allocate enough KV cache for the full context length at startup. If that does not fit in your available memory pass `--context-length <value>`.
183
184
185

To specify which GPUs to use set environment variable `CUDA_VISIBLE_DEVICES`.

Anish's avatar
Anish committed
186
## SGLang
187
188

```
189
190
191
# Install libnuma
apt install -y libnuma-dev

192
193
194
195
uv pip install ai-dynamo[sglang]
```

Run the backend/worker like this:
196

197
```
198
python -m dynamo.sglang --help
199
200
```

201
You can pass any sglang flags directly to this worker, see https://docs.sglang.ai/advanced_features/server_arguments.html . See there to use multiple GPUs.
202

Anish's avatar
Anish committed
203
## TensorRT-LLM
204

Anish's avatar
Anish committed
205
It is recommended to use [NGC PyTorch Container](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch) for running the TensorRT-LLM engine.
206
207
208

> [!Note]
> Ensure that you select a PyTorch container image version that matches the version of TensorRT-LLM you are using.
209
> For example, if you are using `tensorrt-llm==1.1.0rc5`, use the PyTorch container image version `25.06`.
210
211
212
213
214
> To find the correct PyTorch container version for your desired `tensorrt-llm` release, visit the [TensorRT-LLM Dockerfile.multi](https://github.com/NVIDIA/TensorRT-LLM/blob/main/docker/Dockerfile.multi) on GitHub. Switch to the branch that matches your `tensorrt-llm` version, and look for the `BASE_TAG` line to identify the recommended PyTorch container tag.

> [!Important]
> Launch container with the following additional settings `--shm-size=1g --ulimit memlock=-1`

Anish's avatar
Anish committed
215
### Install prerequisites
216

217
218
```
# Optional step: Only required for Blackwell and Grace Hopper
219
220
221
222
uv pip install torch==2.7.1 torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128

# Required until the trtllm version is bumped to include this pinned dependency itself
uv pip install "cuda-python>=12,<13"
223
224
225
226
227
228
229

sudo apt-get -y install libopenmpi-dev
```

> [!Tip]
> You can learn more about these prequisites and known issues with TensorRT-LLM pip based installation [here](https://nvidia.github.io/TensorRT-LLM/installation/linux.html).

Anish's avatar
Anish committed
230
### After installing the pre-requisites above, install Dynamo
231

232
```
233
uv pip install ai-dynamo[trtllm]
234
235
236
```

Run the backend/worker like this:
237

238
239
240
241
242
```
python -m dynamo.trtllm --help
```

To specify which GPUs to use set environment variable `CUDA_VISIBLE_DEVICES`.
243

Anish's avatar
Anish committed
244
# Developing Locally
245

Anish's avatar
Anish committed
246
## 1. Install libraries
247
248

**Ubuntu:**
249

250
251
252
```
sudo apt install -y build-essential libhwloc-dev libudev-dev pkg-config libclang-dev protobuf-compiler python3-dev cmake
```
253

254
**macOS:**
255

256
- [Homebrew](https://brew.sh/)
257

258
259
260
261
```
# if brew is not installed on your system, install it
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
262

263
- [Xcode](https://developer.apple.com/xcode/)
264

265
266
```
brew install cmake protobuf
267

268
269
270
271
## Check that Metal is accessible
xcrun -sdk macosx metal
```

272
If Metal is accessible, you should see an error like `metal: error: no input files`, which confirms it is installed correctly.
273

Anish's avatar
Anish committed
274
## 2. Install Rust
275

276
277
278
```
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
279
```
280

Anish's avatar
Anish committed
281
## 3. Create a Python virtual env:
282

283
284
285
Follow the instructions in [uv installation](https://docs.astral.sh/uv/#installation) guide to install uv if you don't have `uv` installed. Once uv is installed, create a virtual environment and activate it.

- Install uv
286

287
288
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
289
```
290
291

- Create a virtual environment
292

293
```bash
294
295
296
uv venv dynamo
source dynamo/bin/activate
```
297

Anish's avatar
Anish committed
298
## 4. Install build tools
299

300
301
302
```
uv pip install pip maturin
```
303

304
[Maturin](https://github.com/PyO3/maturin) is the Rust<->Python bindings build tool.
305

Anish's avatar
Anish committed
306
## 5. Build the Rust bindings
307

308
```
309
cd lib/bindings/python
310
311
312
maturin develop --uv
```

Anish's avatar
Anish committed
313
## 6. Install the wheel
314
315
316
317

```
cd $PROJECT_ROOT
uv pip install .
318
319
# For development, use
export PYTHONPATH="${PYTHONPATH}:$(pwd)/components/frontend/src:$(pwd)/components/planner/src:$(pwd)/components/backends/vllm/src:$(pwd)/components/backends/sglang/src:$(pwd)/components/backends/trtllm/src:$(pwd)/components/backends/llama_cpp/src:$(pwd)/components/backends/mocker/src"
320
321
```

322
323
> [!Note]
> Editable (`-e`) does not work because the `dynamo` package is split over multiple directories, one per backend.
324
325
326
327
328
329
330
331

You should now be able to run `python -m dynamo.frontend`.

Remember that nats and etcd must be running (see earlier).

Set the environment variable `DYN_LOG` to adjust the logging level; for example, `export DYN_LOG=debug`. It has the same syntax as `RUST_LOG`.

If you use vscode or cursor, we have a .devcontainer folder built on [Microsofts Extension](https://code.visualstudio.com/docs/devcontainers/containers). For instructions see the [ReadMe](.devcontainer/README.md) for more details.