README.md 14.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

25
| **[Roadmap](https://github.com/ai-dynamo/dynamo/issues/2486)** | **[Support matrix](https://github.com/ai-dynamo/dynamo/blob/main/docs/reference/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
34
35
36
- [11/13] [Dynamo Office Hours Playlist](https://www.youtube.com/playlist?list=PL5B692fm6--tgryKu94h2Zb7jTFM3Go4X)
- [10/16] [How Baseten achieved 2x faster inference with NVIDIA Dynamo](https://www.baseten.co/blog/how-baseten-achieved-2x-faster-inference-with-nvidia-dynamo/#qwen3-coder-benchmarks-with-kv-routing)
- [10/13] [NVIDIA Blackwell Leads on New SemiAnalysis InferenceMax Benchmarks](https://developer.nvidia.com/blog/nvidia-blackwell-leads-on-new-semianalysis-inferencemax-benchmarks/)
- [09/09] [Dynamo + NVIDIA Blackwell Ultra Sets New MLPerf Inference Benchmark Record](https://blogs.nvidia.com/blog/mlperf-inference-blackwell-ultra/)
37
- [08/05] Deploy `openai/gpt-oss-120b` with disaggregated serving on NVIDIA Blackwell GPUs using Dynamo [➡️ link](./docs/backends/trtllm/gpt-oss.md)
38

Anish's avatar
Anish committed
39
## The Era of Multi-GPU, Multi-Node
40

Anish's avatar
Anish committed
41
42
43
<p align="center">
  <img src="./docs/images/frontpage-gpu-vertical.png" alt="Multi Node Multi-GPU topology" width="600" />
</p>
44

Anish's avatar
Anish committed
45
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.
46

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

Neelay Shah's avatar
Neelay Shah committed
49
50
51
52
53
- **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
54

Anish's avatar
Anish committed
55
56
57
58
59
<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
60

61
62
| Feature                                                                                           | vLLM | SGLang | TensorRT-LLM |
| ------------------------------------------------------------------------------------------------- | ---- | ------ | ------------ |
63
64
65
| [**Disaggregated Serving**](/docs/design_docs/disagg_serving.md)                                 | ✅   | ✅     | ✅           |
| [**Conditional Disaggregation**](/docs/design_docs/disagg_serving.md#conditional-disaggregation) | 🚧   | 🚧     | 🚧           |
| [**KV-Aware Routing**](/docs/router/kv_cache_routing.md)                                    | ✅   | ✅     | ✅           |
66
67
68
| [**Load Based Planner**](docs/planner/load_planner.md)                                      | 🚧   | 🚧     | 🚧           |
| [**SLA-Based Planner**](docs/planner/sla_planner.md)                                        | ✅   | ✅     | ✅           |
| [**KVBM**](docs/kvbm/kvbm_architecture.md)                                               | ✅   | 🚧     | ✅           |
69

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

72
73
74
- **[vLLM](docs/backends/vllm/README.md)**
- **[SGLang](docs/backends/sglang/README.md)**
- **[TensorRT-LLM](docs/backends/trtllm/README.md)**
75

Anish's avatar
Anish committed
76
77
78
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
79

Neelay Shah's avatar
Neelay Shah committed
80
The following examples require a few system level packages.
81
Recommended to use Ubuntu 24.04 with a x86_64 CPU. See [docs/reference/support-matrix.md](docs/reference/support-matrix.md)
82

Anish's avatar
Anish committed
83
84
85
## 1. Initial setup

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

Anish's avatar
Anish committed
87
88
89
```
curl -LsSf https://astral.sh/uv/install.sh | sh
```
90

91
92
93
94
95
96
97
98
### Install Python development headers

Backend engines require Python development headers for JIT compilation. Install them with:

```bash
sudo apt install python3-dev
```

99
### Install etcd (optional) and NATS (required)
Anish's avatar
Anish committed
100

101
To coordinate across a data center, Dynamo relies on etcd and NATS. These will be used in production. To run Dynamo locally etcd is optional.
102

103
104
- [etcd](https://etcd.io/) can be run directly as `./etcd`.
- [nats](https://nats.io/) needs jetstream enabled: `nats-server -js`.
105

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

108
```bash
Anish's avatar
Anish committed
109
110
# At the root of the repository:
docker compose -f deploy/docker-compose.yml up -d
111
112
```

113
114
115
To run locally without etcd, pass `--store-kv file` to both the frontend and workers. The directory used for key-value data can be configured via the `DYN_FILE_KV` environment variable (example: `export DYN_FILE_KV=/data/kv/dynamo`). Defaults to `$TMPDIR/dynamo_store_kv`.


Anish's avatar
Anish committed
116
## 2. Select an engine
117

118
We publish Python wheels specialized for each of our supported engines: vllm, sglang, and trtllm. The examples that follow use SGLang; continue reading for other engines.
119

120
```
121
122
123
uv venv venv
source venv/bin/activate
uv pip install pip
124

125
# Choose one
Anish's avatar
Anish committed
126
uv pip install "ai-dynamo[sglang]"  #replace with [vllm], [trtllm], etc.
127
```
128

Anish's avatar
Anish committed
129
## 3. Run Dynamo
130

131
132
133
134
135
136
137
138
139
140
### Sanity check (optional)

Before trying out Dynamo, you can verify your system configuration and dependencies:

```bash
./deploy/sanity_check.py
```

This is a quick check for system resources, development tools, LLM frameworks, and Dynamo components.

141
142
143
### Running an LLM API server

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

Neelay Shah's avatar
Neelay Shah committed
145
146
147
- **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.
148
149

```
Graham King's avatar
Graham King committed
150
151
# 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.
152
153
# Pass --store-kv to use the filesystem instead of etcd. The workers and frontend must share a disk.
python -m dynamo.frontend --http-port 8000 [--tls-cert-path cert.pem] [--tls-key-path key.pem] [--store-kv file]
154

Anish's avatar
Anish committed
155
# Start the SGLang engine, connecting to NATS and etcd to receive requests. You can run several of these,
156
# both for the same model and for multiple models. The frontend node will discover them.
157
158
# Pass --store-kv to use the filesystem instead of etcd. The workers and frontend must share a disk.
python -m dynamo.sglang --model deepseek-ai/DeepSeek-R1-Distill-Llama-8B [--store-kv file]
159
160
```

Neelay Shah's avatar
Neelay Shah committed
161
#### Send a Request
162

163
```bash
164
curl localhost:8000/v1/chat/completions   -H "Content-Type: application/json"   -d '{
Neelay Shah's avatar
Neelay Shah committed
165
166
167
168
169
170
171
172
173
174
    "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-8B",
    "messages": [
    {
        "role": "user",
        "content": "Hello, how are you?"
    }
    ],
    "stream":false,
    "max_tokens": 300
  }' | jq
175
```
176

177
178
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
179
180
### Deploying Dynamo

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

185
186
187
188
### Benchmarking Dynamo

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

189
- **[Benchmarking Guide](docs/benchmarks/benchmarking.md)** – Compare deployment topologies (aggregated vs. disaggregated vs. vanilla vLLM) using AIPerf
190
- **[SLA-Driven Dynamo Deployments](docs/planner/sla_planner_quickstart.md)** – Optimize your deployment to meet SLA requirements
191

Anish's avatar
Anish committed
192
# Engines
193

Anish's avatar
Anish committed
194
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]`).
195

Anish's avatar
Anish committed
196
## vLLM
197
198
199
200
201
202

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

Run the backend/worker like this:
203

204
205
206
207
```
python -m dynamo.vllm --help
```

Anish's avatar
Anish committed
208
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>`.
209
210
211

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

Anish's avatar
Anish committed
212
## SGLang
213
214

```
215
216
217
# Install libnuma
apt install -y libnuma-dev

218
219
220
221
uv pip install ai-dynamo[sglang]
```

Run the backend/worker like this:
222

223
```
224
python -m dynamo.sglang --help
225
226
```

227
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.
228

Anish's avatar
Anish committed
229
## TensorRT-LLM
230

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

> [!Note]
> Ensure that you select a PyTorch container image version that matches the version of TensorRT-LLM you are using.
235
> For example, if you are using `tensorrt-llm==1.1.0rc5`, use the PyTorch container image version `25.06`.
236
237
238
239
240
> 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
241
### Install prerequisites
242

243
244
```
# Optional step: Only required for Blackwell and Grace Hopper
245
246
247
248
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"
249
250
251
252
253
254
255

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
256
### After installing the pre-requisites above, install Dynamo
257

258
```
259
uv pip install ai-dynamo[trtllm]
260
261
262
```

Run the backend/worker like this:
263

264
265
266
267
268
```
python -m dynamo.trtllm --help
```

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

Anish's avatar
Anish committed
270
# Developing Locally
271

Anish's avatar
Anish committed
272
## 1. Install libraries
273
274

**Ubuntu:**
275

276
277
278
```
sudo apt install -y build-essential libhwloc-dev libudev-dev pkg-config libclang-dev protobuf-compiler python3-dev cmake
```
279

280
**macOS:**
281

282
- [Homebrew](https://brew.sh/)
283

284
285
286
287
```
# if brew is not installed on your system, install it
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
288

289
- [Xcode](https://developer.apple.com/xcode/)
290

291
292
```
brew install cmake protobuf
293

294
295
296
297
## Check that Metal is accessible
xcrun -sdk macosx metal
```

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

Anish's avatar
Anish committed
300
## 2. Install Rust
301

302
303
304
```
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
305
```
306

Anish's avatar
Anish committed
307
## 3. Create a Python virtual env:
308

309
310
311
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
312

313
314
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
315
```
316
317

- Create a virtual environment
318

319
```bash
320
321
322
uv venv dynamo
source dynamo/bin/activate
```
323

Anish's avatar
Anish committed
324
## 4. Install build tools
325

326
327
328
```
uv pip install pip maturin
```
329

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

Anish's avatar
Anish committed
332
## 5. Build the Rust bindings
333

334
```
335
cd lib/bindings/python
336
337
338
maturin develop --uv
```

Anish's avatar
Anish committed
339
## 6. Install the wheel
340
341
342

```
cd $PROJECT_ROOT
343
uv pip install -e .
344
345
346
347
```

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

348
Remember that nats and etcd must typically be running (see earlier).
349
350
351
352

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.