README.md 14.2 KB
Newer Older
Neelay Shah's avatar
Neelay Shah committed
1
<!--
2
SPDX-FileCopyrightText: Copyright (c) 2024-2026 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)** | **[Docs](https://docs.nvidia.com/dynamo/latest/index.html)** | **[Recipes](https://github.com/ai-dynamo/dynamo/tree/main/recipes)** | **[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
33
34
35
36
37
38
39
## Framework Support Matrix

| Feature                                                                                           | [vLLM](docs/backends/vllm/README.md) | [SGLang](docs/backends/sglang/README.md) | [TensorRT-LLM](docs/backends/trtllm/README.md) |
| ------------------------------------------------------------------------------------------------- | ---- | ------ | ------------ |
| [**Disaggregated Serving**](/docs/design_docs/disagg_serving.md)                                 | ✅   | ✅     | ✅           |
| [**KV-Aware Routing**](/docs/router/kv_cache_routing.md)                                    | ✅   | ✅     | ✅           |
| [**SLA-Based Planner**](docs/planner/sla_planner.md)                                        | ✅   | ✅     | ✅           |
| [**KVBM**](docs/kvbm/kvbm_architecture.md)                                               | ✅   | 🚧     | ✅           |

40
41
## Latest News

42
43
44
45
- [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/)
46
- [08/05] Deploy `openai/gpt-oss-120b` with disaggregated serving on NVIDIA Blackwell GPUs using Dynamo [➡️ link](./docs/backends/trtllm/gpt-oss.md)
47

Anish's avatar
Anish committed
48
## The Era of Multi-GPU, Multi-Node
49

Anish's avatar
Anish committed
50
51
52
<p align="center">
  <img src="./docs/images/frontpage-gpu-vertical.png" alt="Multi Node Multi-GPU topology" width="600" />
</p>
53

Anish's avatar
Anish committed
54
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.
55

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

Neelay Shah's avatar
Neelay Shah committed
58
59
60
61
62
- **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
63

Anish's avatar
Anish committed
64
65
66
67
68
69
70
<p align="center">
  <img src="./docs/images/frontpage-architecture.png" alt="Dynamo architecture" width="600" />
</p>

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
71

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

Anish's avatar
Anish committed
75
76
77
## 1. Initial setup

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

Anish's avatar
Anish committed
79
80
81
```
curl -LsSf https://astral.sh/uv/install.sh | sh
```
82

83
84
85
86
87
88
89
90
### Install Python development headers

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

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

91
### Install etcd (optional) and NATS (required)
Anish's avatar
Anish committed
92

93
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.
94

95
96
- [etcd](https://etcd.io/) can be run directly as `./etcd`.
- [nats](https://nats.io/) needs jetstream enabled: `nats-server -js`.
97

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

100
```bash
Anish's avatar
Anish committed
101
102
# At the root of the repository:
docker compose -f deploy/docker-compose.yml up -d
103
104
```

105
106
107
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
108
## 2. Select an engine
109

110
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.
111

112
```
113
114
115
uv venv venv
source venv/bin/activate
uv pip install pip
116

117
# Choose one
Anish's avatar
Anish committed
118
uv pip install "ai-dynamo[sglang]"  #replace with [vllm], [trtllm], etc.
119
```
120

Anish's avatar
Anish committed
121
## 3. Run Dynamo
122

123
124
125
126
127
128
129
130
131
132
### 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.

133
134
135
### Running an LLM API server

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

Neelay Shah's avatar
Neelay Shah committed
137
138
139
- **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.
140
141

```
Graham King's avatar
Graham King committed
142
143
# 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.
144
145
# 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]
146

Anish's avatar
Anish committed
147
# Start the SGLang engine, connecting to NATS and etcd to receive requests. You can run several of these,
148
# both for the same model and for multiple models. The frontend node will discover them.
149
150
# 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]
151
152
```

Neelay Shah's avatar
Neelay Shah committed
153
#### Send a Request
154

155
```bash
156
curl localhost:8000/v1/chat/completions   -H "Content-Type: application/json"   -d '{
Neelay Shah's avatar
Neelay Shah committed
157
158
159
160
161
162
163
164
165
166
    "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-8B",
    "messages": [
    {
        "role": "user",
        "content": "Hello, how are you?"
    }
    ],
    "stream":false,
    "max_tokens": 300
  }' | jq
167
```
168

169
170
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
171
172
### Deploying Dynamo

173
- Follow the [Quickstart Guide](docs/kubernetes/README.md) to deploy on Kubernetes.
174
- 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
175
- Run some [Examples](examples) to learn about building components in Dynamo and exploring various integrations.
176

177
178
179
180
### Benchmarking Dynamo

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

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

184
185
186
187
188
189
190
191
192
193
194
## Frontend OpenAPI specification

The OpenAI-compatible HTTP frontend exposes an OpenAPI 3 specification at `/openapi.json`.
To generate and persist the same specification without running the server (for example for CI, documentation, or NIM integration), run:

```bash
cargo run -p dynamo-llm --bin generate-frontend-openapi
```

This writes the current frontend spec to `docs/frontends/openapi.json` at the repository root.

Anish's avatar
Anish committed
195
# Engines
196

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

Anish's avatar
Anish committed
199
## vLLM
200
201
202
203
204
205

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

Run the backend/worker like this:
206

207
208
209
210
```
python -m dynamo.vllm --help
```

Anish's avatar
Anish committed
211
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>`.
212
213
214

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

Anish's avatar
Anish committed
215
## SGLang
216
217

```
218
219
220
# Install libnuma
apt install -y libnuma-dev

221
222
223
224
uv pip install ai-dynamo[sglang]
```

Run the backend/worker like this:
225

226
```
227
python -m dynamo.sglang --help
228
229
```

230
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.
231

Anish's avatar
Anish committed
232
## TensorRT-LLM
233

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

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

246
```
247
248
# Optional step: Only required for non-container installations. The PyTorch 25.10 container already includes PyTorch 2.9.0 with CUDA 13.0.
uv pip install torch==2.9.0 torchvision --index-url https://download.pytorch.org/whl/cu130
249
250

sudo apt-get -y install libopenmpi-dev
251
252
253

# Optional step: Only required for disaggregated serving
sudo apt-get -y install libzmq3-dev
254
255
256
257
258
```

> [!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
259
### After installing the pre-requisites above, install Dynamo
260

261
```
262
uv pip install ai-dynamo[trtllm]
263
264
265
```

Run the backend/worker like this:
266

267
268
269
270
271
```
python -m dynamo.trtllm --help
```

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

Anish's avatar
Anish committed
273
# Developing Locally
274

Anish's avatar
Anish committed
275
## 1. Install libraries
276
277

**Ubuntu:**
278

279
280
281
```
sudo apt install -y build-essential libhwloc-dev libudev-dev pkg-config libclang-dev protobuf-compiler python3-dev cmake
```
282

283
**macOS:**
284

285
- [Homebrew](https://brew.sh/)
286

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

292
- [Xcode](https://developer.apple.com/xcode/)
293

294
295
```
brew install cmake protobuf
296

297
298
299
300
## Check that Metal is accessible
xcrun -sdk macosx metal
```

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

Anish's avatar
Anish committed
303
## 2. Install Rust
304

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

Anish's avatar
Anish committed
310
## 3. Create a Python virtual env:
311

312
313
314
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
315

316
317
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
318
```
319
320

- Create a virtual environment
321

322
```bash
323
324
325
uv venv dynamo
source dynamo/bin/activate
```
326

Anish's avatar
Anish committed
327
## 4. Install build tools
328

329
330
331
```
uv pip install pip maturin
```
332

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

Anish's avatar
Anish committed
335
## 5. Build the Rust bindings
336

337
```
338
cd lib/bindings/python
339
340
341
maturin develop --uv
```

Anish's avatar
Anish committed
342
## 6. Install the wheel
343
344
345

```
cd $PROJECT_ROOT
346
uv pip install -e .
347
348
349
350
```

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

351
Remember that nats and etcd must typically be running (see earlier).
352
353
354
355

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.