Latest commit

History

1,740 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Dynamo banner

LicenseGitHub ReleaseDiscordAsk DeepWiki

| Roadmap | Support matrix | Documentation | Examples | Prebuilt containers | Design Proposals | Blogs

NVIDIA Dynamo

High-throughput, low-latency inference framework designed for serving generative AI and reasoning models in multi-node distributed environments.

Latest News

  • [08/05] Deploy openai/gpt-oss-120b with disaggregated serving on NVIDIA Blackwell GPUs using Dynamo ➡️ link

The Era of Multi-GPU, Multi-Node

Multi Node Multi-GPU topology

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.

Dynamo is designed to be inference engine agnostic (supports TRT-LLM, vLLM, SGLang or others) and captures LLM-specific capabilities such as:

  • 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

Dynamo architecture

Framework Support Matrix

FeaturevLLMSGLangTensorRT-LLM
Disaggregated Serving
Conditional Disaggregation🚧🚧🚧
KV-Aware Routing
Load Based Planner🚧🚧🚧
SLA-Based Planner
KVBM🚧

To learn more about each framework and their capabilities, check out each framework's README!

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

The following examples require a few system level packages. Recommended to use Ubuntu 24.04 with a x86_64 CPU. See docs/support_matrix.md

1. Initial setup

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

curl -LsSf https://astral.sh/uv/install.sh | sh

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.

  • etcd can be run directly as ./etcd.
  • nats needs jetstream enabled: nats-server -js.

To quickly setup etcd & NATS, you can also run:

# At the root of the repository:
# 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.
docker compose -f deploy/docker-compose.yml up -d

2. Select an engine

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.

uv venv venv
source venv/bin/activate
uv pip install pip
# Choose one
uv pip install "ai-dynamo[sglang]" #replace with [vllm], [trtllm], etc.

3. Run Dynamo

Running an LLM API server

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

  • 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.
# 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.
python -m dynamo.frontend --http-port 8000 [--tls-cert-path cert.pem] [--tls-key-path key.pem]
# Start the SGLang engine, connecting to NATS and etcd to receive requests. You can run several of these,
# both for the same model and for multiple models. The frontend node will discover them.
python -m dynamo.sglang.worker --model deepseek-ai/DeepSeek-R1-Distill-Llama-8B --skip-tokenizer-init

Send a Request

curl localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{ "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-8B", "messages": [ { "role": "user", "content": "Hello, how are you?" } ], "stream":false, "max_tokens": 300 }'| jq

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

Deploying Dynamo

  • Follow the Quickstart Guide to deploy on Kubernetes.
  • Check out Backends to deploy various workflow configurations (e.g. SGLang with router, vLLM with disaggregated serving, etc.)
  • Run some Examples to learn about building components in Dynamo and exploring various integrations.

Benchmarking Dynamo

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

  • Benchmarking Guide – Compare deployment topologies (aggregated vs. disaggregated vs. vanilla vLLM) using GenAI-Perf
  • Pre-Deployment Profiling – Optimize configurations before deployment to meet SLA requirements

Engines

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]).

vLLM

uv pip install ai-dynamo[vllm]

Run the backend/worker like this:

python -m dynamo.vllm --help

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

To specify which GPUs to use set environment variable CUDA_VISIBLE_DEVICES.

SGLang

# Install libnuma
apt install -y libnuma-dev
uv pip install ai-dynamo[sglang]

Run the backend/worker like this:

python -m dynamo.sglang.worker --help

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.

TensorRT-LLM

It is recommended to use NGC PyTorch Container for running the TensorRT-LLM engine.

Note

Ensure that you select a PyTorch container image version that matches the version of TensorRT-LLM you are using. For example, if you are using tensorrt-llm==1.1.0rc5, use the PyTorch container image version 25.06. To find the correct PyTorch container version for your desired tensorrt-llm release, visit the TensorRT-LLM 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

Install prerequisites

# Optional step: Only required for Blackwell and Grace Hopper
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"
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.

After installing the pre-requisites above, install Dynamo

uv pip install ai-dynamo[trtllm]

Run the backend/worker like this:

python -m dynamo.trtllm --help

To specify which GPUs to use set environment variable CUDA_VISIBLE_DEVICES.

Developing Locally

1. Install libraries

Ubuntu:

sudo apt install -y build-essential libhwloc-dev libudev-dev pkg-config libclang-dev protobuf-compiler python3-dev cmake

macOS:

# if brew is not installed on your system, install it
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install cmake protobuf
## Check that Metal is accessible
xcrun -sdk macosx metal

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

2. Install Rust

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env

3. Create a Python virtual env:

Follow the instructions in 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
curl -LsSf https://astral.sh/uv/install.sh | sh
  • Create a virtual environment
uv venv dynamo
source dynamo/bin/activate

4. Install build tools

uv pip install pip maturin

Maturin is the Rust<->Python bindings build tool.

5. Build the Rust bindings

cd lib/bindings/python
maturin develop --uv

6. Install the wheel

cd $PROJECT_ROOT
uv pip install .
# 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"

Note

Editable (-e) does not work because the dynamo package is split over multiple directories, one per backend.

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. For instructions see the ReadMe for more details.

About

A Datacenter Scale Distributed Inference Serving Framework

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

1,740 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Dynamo banner

LicenseGitHub ReleaseDiscordAsk DeepWiki

| Roadmap | Support matrix | Documentation | Examples | Prebuilt containers | Design Proposals | Blogs

NVIDIA Dynamo

High-throughput, low-latency inference framework designed for serving generative AI and reasoning models in multi-node distributed environments.

Latest News

  • [08/05] Deploy openai/gpt-oss-120b with disaggregated serving on NVIDIA Blackwell GPUs using Dynamo ➡️ link

The Era of Multi-GPU, Multi-Node

Multi Node Multi-GPU topology

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.

Dynamo is designed to be inference engine agnostic (supports TRT-LLM, vLLM, SGLang or others) and captures LLM-specific capabilities such as:

  • 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

Dynamo architecture

Framework Support Matrix

FeaturevLLMSGLangTensorRT-LLM
Disaggregated Serving
Conditional Disaggregation🚧🚧🚧
KV-Aware Routing
Load Based Planner🚧🚧🚧
SLA-Based Planner
KVBM🚧

To learn more about each framework and their capabilities, check out each framework's README!

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

The following examples require a few system level packages. Recommended to use Ubuntu 24.04 with a x86_64 CPU. See docs/support_matrix.md

1. Initial setup

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

curl -LsSf https://astral.sh/uv/install.sh | sh

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.

  • etcd can be run directly as ./etcd.
  • nats needs jetstream enabled: nats-server -js.

To quickly setup etcd & NATS, you can also run:

# At the root of the repository:
# 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.
docker compose -f deploy/docker-compose.yml up -d

2. Select an engine

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.

uv venv venv
source venv/bin/activate
uv pip install pip
# Choose one
uv pip install "ai-dynamo[sglang]" #replace with [vllm], [trtllm], etc.

3. Run Dynamo

Running an LLM API server

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

  • 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.
# 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.
python -m dynamo.frontend --http-port 8000 [--tls-cert-path cert.pem] [--tls-key-path key.pem]
# Start the SGLang engine, connecting to NATS and etcd to receive requests. You can run several of these,
# both for the same model and for multiple models. The frontend node will discover them.
python -m dynamo.sglang.worker --model deepseek-ai/DeepSeek-R1-Distill-Llama-8B --skip-tokenizer-init

Send a Request

curl localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{ "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-8B", "messages": [ { "role": "user", "content": "Hello, how are you?" } ], "stream":false, "max_tokens": 300 }'| jq

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

Deploying Dynamo

  • Follow the Quickstart Guide to deploy on Kubernetes.
  • Check out Backends to deploy various workflow configurations (e.g. SGLang with router, vLLM with disaggregated serving, etc.)
  • Run some Examples to learn about building components in Dynamo and exploring various integrations.

Benchmarking Dynamo

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

  • Benchmarking Guide – Compare deployment topologies (aggregated vs. disaggregated vs. vanilla vLLM) using GenAI-Perf
  • Pre-Deployment Profiling – Optimize configurations before deployment to meet SLA requirements

Engines

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]).

vLLM

uv pip install ai-dynamo[vllm]

Run the backend/worker like this:

python -m dynamo.vllm --help

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

To specify which GPUs to use set environment variable CUDA_VISIBLE_DEVICES.

SGLang

# Install libnuma
apt install -y libnuma-dev
uv pip install ai-dynamo[sglang]

Run the backend/worker like this:

python -m dynamo.sglang.worker --help

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.

TensorRT-LLM

It is recommended to use NGC PyTorch Container for running the TensorRT-LLM engine.

Note

Ensure that you select a PyTorch container image version that matches the version of TensorRT-LLM you are using. For example, if you are using tensorrt-llm==1.1.0rc5, use the PyTorch container image version 25.06. To find the correct PyTorch container version for your desired tensorrt-llm release, visit the TensorRT-LLM 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

Install prerequisites

# Optional step: Only required for Blackwell and Grace Hopper
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"
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.

After installing the pre-requisites above, install Dynamo

uv pip install ai-dynamo[trtllm]

Run the backend/worker like this:

python -m dynamo.trtllm --help

To specify which GPUs to use set environment variable CUDA_VISIBLE_DEVICES.

Developing Locally

1. Install libraries

Ubuntu:

sudo apt install -y build-essential libhwloc-dev libudev-dev pkg-config libclang-dev protobuf-compiler python3-dev cmake

macOS:

# if brew is not installed on your system, install it
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install cmake protobuf
## Check that Metal is accessible
xcrun -sdk macosx metal

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

2. Install Rust

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env

3. Create a Python virtual env:

Follow the instructions in 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
curl -LsSf https://astral.sh/uv/install.sh | sh
  • Create a virtual environment
uv venv dynamo
source dynamo/bin/activate

4. Install build tools

uv pip install pip maturin

Maturin is the Rust<->Python bindings build tool.

5. Build the Rust bindings

cd lib/bindings/python
maturin develop --uv

6. Install the wheel

cd $PROJECT_ROOT
uv pip install .
# 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"

Note

Editable (-e) does not work because the dynamo package is split over multiple directories, one per backend.

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. For instructions see the ReadMe for more details.

About

A Datacenter Scale Distributed Inference Serving Framework

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

1,740 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Dynamo banner

LicenseGitHub ReleaseDiscordAsk DeepWiki

| Roadmap | Support matrix | Documentation | Examples | Prebuilt containers | Design Proposals | Blogs

NVIDIA Dynamo

High-throughput, low-latency inference framework designed for serving generative AI and reasoning models in multi-node distributed environments.

Latest News

  • [08/05] Deploy openai/gpt-oss-120b with disaggregated serving on NVIDIA Blackwell GPUs using Dynamo ➡️ link

The Era of Multi-GPU, Multi-Node

Multi Node Multi-GPU topology

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.

Dynamo is designed to be inference engine agnostic (supports TRT-LLM, vLLM, SGLang or others) and captures LLM-specific capabilities such as:

  • 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

Dynamo architecture

Framework Support Matrix

FeaturevLLMSGLangTensorRT-LLM
Disaggregated Serving
Conditional Disaggregation🚧🚧🚧
KV-Aware Routing
Load Based Planner🚧🚧🚧
SLA-Based Planner
KVBM🚧

To learn more about each framework and their capabilities, check out each framework's README!

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

The following examples require a few system level packages. Recommended to use Ubuntu 24.04 with a x86_64 CPU. See docs/support_matrix.md

1. Initial setup

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

curl -LsSf https://astral.sh/uv/install.sh | sh

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.

  • etcd can be run directly as ./etcd.
  • nats needs jetstream enabled: nats-server -js.

To quickly setup etcd & NATS, you can also run:

# At the root of the repository:
# 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.
docker compose -f deploy/docker-compose.yml up -d

2. Select an engine

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.

uv venv venv
source venv/bin/activate
uv pip install pip
# Choose one
uv pip install "ai-dynamo[sglang]" #replace with [vllm], [trtllm], etc.

3. Run Dynamo

Running an LLM API server

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

  • 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.
# 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.
python -m dynamo.frontend --http-port 8000 [--tls-cert-path cert.pem] [--tls-key-path key.pem]
# Start the SGLang engine, connecting to NATS and etcd to receive requests. You can run several of these,
# both for the same model and for multiple models. The frontend node will discover them.
python -m dynamo.sglang.worker --model deepseek-ai/DeepSeek-R1-Distill-Llama-8B --skip-tokenizer-init

Send a Request

curl localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{ "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-8B", "messages": [ { "role": "user", "content": "Hello, how are you?" } ], "stream":false, "max_tokens": 300 }'| jq

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

Deploying Dynamo

  • Follow the Quickstart Guide to deploy on Kubernetes.
  • Check out Backends to deploy various workflow configurations (e.g. SGLang with router, vLLM with disaggregated serving, etc.)
  • Run some Examples to learn about building components in Dynamo and exploring various integrations.

Benchmarking Dynamo

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

  • Benchmarking Guide – Compare deployment topologies (aggregated vs. disaggregated vs. vanilla vLLM) using GenAI-Perf
  • Pre-Deployment Profiling – Optimize configurations before deployment to meet SLA requirements

Engines

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]).

vLLM

uv pip install ai-dynamo[vllm]

Run the backend/worker like this:

python -m dynamo.vllm --help

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

To specify which GPUs to use set environment variable CUDA_VISIBLE_DEVICES.

SGLang

# Install libnuma
apt install -y libnuma-dev
uv pip install ai-dynamo[sglang]

Run the backend/worker like this:

python -m dynamo.sglang.worker --help

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.

TensorRT-LLM

It is recommended to use NGC PyTorch Container for running the TensorRT-LLM engine.

Note

Ensure that you select a PyTorch container image version that matches the version of TensorRT-LLM you are using. For example, if you are using tensorrt-llm==1.1.0rc5, use the PyTorch container image version 25.06. To find the correct PyTorch container version for your desired tensorrt-llm release, visit the TensorRT-LLM 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

Install prerequisites

# Optional step: Only required for Blackwell and Grace Hopper
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"
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.

After installing the pre-requisites above, install Dynamo

uv pip install ai-dynamo[trtllm]

Run the backend/worker like this:

python -m dynamo.trtllm --help

To specify which GPUs to use set environment variable CUDA_VISIBLE_DEVICES.

Developing Locally

1. Install libraries

Ubuntu:

sudo apt install -y build-essential libhwloc-dev libudev-dev pkg-config libclang-dev protobuf-compiler python3-dev cmake

macOS:

# if brew is not installed on your system, install it
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install cmake protobuf
## Check that Metal is accessible
xcrun -sdk macosx metal

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

2. Install Rust

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env

3. Create a Python virtual env:

Follow the instructions in 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
curl -LsSf https://astral.sh/uv/install.sh | sh
  • Create a virtual environment
uv venv dynamo
source dynamo/bin/activate

4. Install build tools

uv pip install pip maturin

Maturin is the Rust<->Python bindings build tool.

5. Build the Rust bindings

cd lib/bindings/python
maturin develop --uv

6. Install the wheel

cd $PROJECT_ROOT
uv pip install .
# 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"

Note

Editable (-e) does not work because the dynamo package is split over multiple directories, one per backend.

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. For instructions see the ReadMe for more details.

About

A Datacenter Scale Distributed Inference Serving Framework

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

1,740 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Dynamo banner

LicenseGitHub ReleaseDiscordAsk DeepWiki

| Roadmap | Support matrix | Documentation | Examples | Prebuilt containers | Design Proposals | Blogs

NVIDIA Dynamo

High-throughput, low-latency inference framework designed for serving generative AI and reasoning models in multi-node distributed environments.

Latest News

  • [08/05] Deploy openai/gpt-oss-120b with disaggregated serving on NVIDIA Blackwell GPUs using Dynamo ➡️ link

The Era of Multi-GPU, Multi-Node

Multi Node Multi-GPU topology

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.

Dynamo is designed to be inference engine agnostic (supports TRT-LLM, vLLM, SGLang or others) and captures LLM-specific capabilities such as:

  • 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

Dynamo architecture

Framework Support Matrix

FeaturevLLMSGLangTensorRT-LLM
Disaggregated Serving
Conditional Disaggregation🚧🚧🚧
KV-Aware Routing
Load Based Planner🚧🚧🚧
SLA-Based Planner
KVBM🚧

To learn more about each framework and their capabilities, check out each framework's README!

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

The following examples require a few system level packages. Recommended to use Ubuntu 24.04 with a x86_64 CPU. See docs/support_matrix.md

1. Initial setup

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

curl -LsSf https://astral.sh/uv/install.sh | sh

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.

  • etcd can be run directly as ./etcd.
  • nats needs jetstream enabled: nats-server -js.

To quickly setup etcd & NATS, you can also run:

# At the root of the repository:
# 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.
docker compose -f deploy/docker-compose.yml up -d

2. Select an engine

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.

uv venv venv
source venv/bin/activate
uv pip install pip
# Choose one
uv pip install "ai-dynamo[sglang]" #replace with [vllm], [trtllm], etc.

3. Run Dynamo

Running an LLM API server

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

  • 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.
# 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.
python -m dynamo.frontend --http-port 8000 [--tls-cert-path cert.pem] [--tls-key-path key.pem]
# Start the SGLang engine, connecting to NATS and etcd to receive requests. You can run several of these,
# both for the same model and for multiple models. The frontend node will discover them.
python -m dynamo.sglang.worker --model deepseek-ai/DeepSeek-R1-Distill-Llama-8B --skip-tokenizer-init

Send a Request

curl localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{ "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-8B", "messages": [ { "role": "user", "content": "Hello, how are you?" } ], "stream":false, "max_tokens": 300 }'| jq

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

Deploying Dynamo

  • Follow the Quickstart Guide to deploy on Kubernetes.
  • Check out Backends to deploy various workflow configurations (e.g. SGLang with router, vLLM with disaggregated serving, etc.)
  • Run some Examples to learn about building components in Dynamo and exploring various integrations.

Benchmarking Dynamo

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

  • Benchmarking Guide – Compare deployment topologies (aggregated vs. disaggregated vs. vanilla vLLM) using GenAI-Perf
  • Pre-Deployment Profiling – Optimize configurations before deployment to meet SLA requirements

Engines

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]).

vLLM

uv pip install ai-dynamo[vllm]

Run the backend/worker like this:

python -m dynamo.vllm --help

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

To specify which GPUs to use set environment variable CUDA_VISIBLE_DEVICES.

SGLang

# Install libnuma
apt install -y libnuma-dev
uv pip install ai-dynamo[sglang]

Run the backend/worker like this:

python -m dynamo.sglang.worker --help

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.

TensorRT-LLM

It is recommended to use NGC PyTorch Container for running the TensorRT-LLM engine.

Note

Ensure that you select a PyTorch container image version that matches the version of TensorRT-LLM you are using. For example, if you are using tensorrt-llm==1.1.0rc5, use the PyTorch container image version 25.06. To find the correct PyTorch container version for your desired tensorrt-llm release, visit the TensorRT-LLM 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

Install prerequisites

# Optional step: Only required for Blackwell and Grace Hopper
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"
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.

After installing the pre-requisites above, install Dynamo

uv pip install ai-dynamo[trtllm]

Run the backend/worker like this:

python -m dynamo.trtllm --help

To specify which GPUs to use set environment variable CUDA_VISIBLE_DEVICES.

Developing Locally

1. Install libraries

Ubuntu:

sudo apt install -y build-essential libhwloc-dev libudev-dev pkg-config libclang-dev protobuf-compiler python3-dev cmake

macOS:

# if brew is not installed on your system, install it
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install cmake protobuf
## Check that Metal is accessible
xcrun -sdk macosx metal

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

2. Install Rust

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env

3. Create a Python virtual env:

Follow the instructions in 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
curl -LsSf https://astral.sh/uv/install.sh | sh
  • Create a virtual environment
uv venv dynamo
source dynamo/bin/activate

4. Install build tools

uv pip install pip maturin

Maturin is the Rust<->Python bindings build tool.

5. Build the Rust bindings

cd lib/bindings/python
maturin develop --uv

6. Install the wheel

cd $PROJECT_ROOT
uv pip install .
# 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"

Note

Editable (-e) does not work because the dynamo package is split over multiple directories, one per backend.

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. For instructions see the ReadMe for more details.

About

A Datacenter Scale Distributed Inference Serving Framework

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

1,740 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Dynamo banner

LicenseGitHub ReleaseDiscordAsk DeepWiki

| Roadmap | Support matrix | Documentation | Examples | Prebuilt containers | Design Proposals | Blogs

NVIDIA Dynamo

High-throughput, low-latency inference framework designed for serving generative AI and reasoning models in multi-node distributed environments.

Latest News

  • [08/05] Deploy openai/gpt-oss-120b with disaggregated serving on NVIDIA Blackwell GPUs using Dynamo ➡️ link

The Era of Multi-GPU, Multi-Node

Multi Node Multi-GPU topology

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.

Dynamo is designed to be inference engine agnostic (supports TRT-LLM, vLLM, SGLang or others) and captures LLM-specific capabilities such as:

  • 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

Dynamo architecture

Framework Support Matrix

FeaturevLLMSGLangTensorRT-LLM
Disaggregated Serving
Conditional Disaggregation🚧🚧🚧
KV-Aware Routing
Load Based Planner🚧🚧🚧
SLA-Based Planner
KVBM🚧

To learn more about each framework and their capabilities, check out each framework's README!

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

The following examples require a few system level packages. Recommended to use Ubuntu 24.04 with a x86_64 CPU. See docs/support_matrix.md

1. Initial setup

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

curl -LsSf https://astral.sh/uv/install.sh | sh

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.

  • etcd can be run directly as ./etcd.
  • nats needs jetstream enabled: nats-server -js.

To quickly setup etcd & NATS, you can also run:

# At the root of the repository:
# 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.
docker compose -f deploy/docker-compose.yml up -d

2. Select an engine

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.

uv venv venv
source venv/bin/activate
uv pip install pip
# Choose one
uv pip install "ai-dynamo[sglang]" #replace with [vllm], [trtllm], etc.

3. Run Dynamo

Running an LLM API server

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

  • 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.
# 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.
python -m dynamo.frontend --http-port 8000 [--tls-cert-path cert.pem] [--tls-key-path key.pem]
# Start the SGLang engine, connecting to NATS and etcd to receive requests. You can run several of these,
# both for the same model and for multiple models. The frontend node will discover them.
python -m dynamo.sglang.worker --model deepseek-ai/DeepSeek-R1-Distill-Llama-8B --skip-tokenizer-init

Send a Request

curl localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{ "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-8B", "messages": [ { "role": "user", "content": "Hello, how are you?" } ], "stream":false, "max_tokens": 300 }'| jq

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

Deploying Dynamo

  • Follow the Quickstart Guide to deploy on Kubernetes.
  • Check out Backends to deploy various workflow configurations (e.g. SGLang with router, vLLM with disaggregated serving, etc.)
  • Run some Examples to learn about building components in Dynamo and exploring various integrations.

Benchmarking Dynamo

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

  • Benchmarking Guide – Compare deployment topologies (aggregated vs. disaggregated vs. vanilla vLLM) using GenAI-Perf
  • Pre-Deployment Profiling – Optimize configurations before deployment to meet SLA requirements

Engines

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]).

vLLM

uv pip install ai-dynamo[vllm]

Run the backend/worker like this:

python -m dynamo.vllm --help

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

To specify which GPUs to use set environment variable CUDA_VISIBLE_DEVICES.

SGLang

# Install libnuma
apt install -y libnuma-dev
uv pip install ai-dynamo[sglang]

Run the backend/worker like this:

python -m dynamo.sglang.worker --help

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.

TensorRT-LLM

It is recommended to use NGC PyTorch Container for running the TensorRT-LLM engine.

Note

Ensure that you select a PyTorch container image version that matches the version of TensorRT-LLM you are using. For example, if you are using tensorrt-llm==1.1.0rc5, use the PyTorch container image version 25.06. To find the correct PyTorch container version for your desired tensorrt-llm release, visit the TensorRT-LLM 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

Install prerequisites

# Optional step: Only required for Blackwell and Grace Hopper
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"
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.

After installing the pre-requisites above, install Dynamo

uv pip install ai-dynamo[trtllm]

Run the backend/worker like this:

python -m dynamo.trtllm --help

To specify which GPUs to use set environment variable CUDA_VISIBLE_DEVICES.

Developing Locally

1. Install libraries

Ubuntu:

sudo apt install -y build-essential libhwloc-dev libudev-dev pkg-config libclang-dev protobuf-compiler python3-dev cmake

macOS:

# if brew is not installed on your system, install it
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install cmake protobuf
## Check that Metal is accessible
xcrun -sdk macosx metal

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

2. Install Rust

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env

3. Create a Python virtual env:

Follow the instructions in 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
curl -LsSf https://astral.sh/uv/install.sh | sh
  • Create a virtual environment
uv venv dynamo
source dynamo/bin/activate

4. Install build tools

uv pip install pip maturin

Maturin is the Rust<->Python bindings build tool.

5. Build the Rust bindings

cd lib/bindings/python
maturin develop --uv

6. Install the wheel

cd $PROJECT_ROOT
uv pip install .
# 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"

Note

Editable (-e) does not work because the dynamo package is split over multiple directories, one per backend.

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. For instructions see the ReadMe for more details.

About

A Datacenter Scale Distributed Inference Serving Framework

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

1,740 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Dynamo banner

LicenseGitHub ReleaseDiscordAsk DeepWiki

| Roadmap | Support matrix | Documentation | Examples | Prebuilt containers | Design Proposals | Blogs

NVIDIA Dynamo

High-throughput, low-latency inference framework designed for serving generative AI and reasoning models in multi-node distributed environments.

Latest News

  • [08/05] Deploy openai/gpt-oss-120b with disaggregated serving on NVIDIA Blackwell GPUs using Dynamo ➡️ link

The Era of Multi-GPU, Multi-Node

Multi Node Multi-GPU topology

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.

Dynamo is designed to be inference engine agnostic (supports TRT-LLM, vLLM, SGLang or others) and captures LLM-specific capabilities such as:

  • 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

Dynamo architecture

Framework Support Matrix

FeaturevLLMSGLangTensorRT-LLM
Disaggregated Serving
Conditional Disaggregation🚧🚧🚧
KV-Aware Routing
Load Based Planner🚧🚧🚧
SLA-Based Planner
KVBM🚧

To learn more about each framework and their capabilities, check out each framework's README!

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

The following examples require a few system level packages. Recommended to use Ubuntu 24.04 with a x86_64 CPU. See docs/support_matrix.md

1. Initial setup

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

curl -LsSf https://astral.sh/uv/install.sh | sh

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.

  • etcd can be run directly as ./etcd.
  • nats needs jetstream enabled: nats-server -js.

To quickly setup etcd & NATS, you can also run:

# At the root of the repository:
# 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.
docker compose -f deploy/docker-compose.yml up -d

2. Select an engine

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.

uv venv venv
source venv/bin/activate
uv pip install pip
# Choose one
uv pip install "ai-dynamo[sglang]" #replace with [vllm], [trtllm], etc.

3. Run Dynamo

Running an LLM API server

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

  • 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.
# 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.
python -m dynamo.frontend --http-port 8000 [--tls-cert-path cert.pem] [--tls-key-path key.pem]
# Start the SGLang engine, connecting to NATS and etcd to receive requests. You can run several of these,
# both for the same model and for multiple models. The frontend node will discover them.
python -m dynamo.sglang.worker --model deepseek-ai/DeepSeek-R1-Distill-Llama-8B --skip-tokenizer-init

Send a Request

curl localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{ "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-8B", "messages": [ { "role": "user", "content": "Hello, how are you?" } ], "stream":false, "max_tokens": 300 }'| jq

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

Deploying Dynamo

  • Follow the Quickstart Guide to deploy on Kubernetes.
  • Check out Backends to deploy various workflow configurations (e.g. SGLang with router, vLLM with disaggregated serving, etc.)
  • Run some Examples to learn about building components in Dynamo and exploring various integrations.

Benchmarking Dynamo

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

  • Benchmarking Guide – Compare deployment topologies (aggregated vs. disaggregated vs. vanilla vLLM) using GenAI-Perf
  • Pre-Deployment Profiling – Optimize configurations before deployment to meet SLA requirements

Engines

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]).

vLLM

uv pip install ai-dynamo[vllm]

Run the backend/worker like this:

python -m dynamo.vllm --help

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

To specify which GPUs to use set environment variable CUDA_VISIBLE_DEVICES.

SGLang

# Install libnuma
apt install -y libnuma-dev
uv pip install ai-dynamo[sglang]

Run the backend/worker like this:

python -m dynamo.sglang.worker --help

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.

TensorRT-LLM

It is recommended to use NGC PyTorch Container for running the TensorRT-LLM engine.

Note

Ensure that you select a PyTorch container image version that matches the version of TensorRT-LLM you are using. For example, if you are using tensorrt-llm==1.1.0rc5, use the PyTorch container image version 25.06. To find the correct PyTorch container version for your desired tensorrt-llm release, visit the TensorRT-LLM 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

Install prerequisites

# Optional step: Only required for Blackwell and Grace Hopper
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"
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.

After installing the pre-requisites above, install Dynamo

uv pip install ai-dynamo[trtllm]

Run the backend/worker like this:

python -m dynamo.trtllm --help

To specify which GPUs to use set environment variable CUDA_VISIBLE_DEVICES.

Developing Locally

1. Install libraries

Ubuntu:

sudo apt install -y build-essential libhwloc-dev libudev-dev pkg-config libclang-dev protobuf-compiler python3-dev cmake

macOS:

# if brew is not installed on your system, install it
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install cmake protobuf
## Check that Metal is accessible
xcrun -sdk macosx metal

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

2. Install Rust

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env

3. Create a Python virtual env:

Follow the instructions in 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
curl -LsSf https://astral.sh/uv/install.sh | sh
  • Create a virtual environment
uv venv dynamo
source dynamo/bin/activate

4. Install build tools

uv pip install pip maturin

Maturin is the Rust<->Python bindings build tool.

5. Build the Rust bindings

cd lib/bindings/python
maturin develop --uv

6. Install the wheel

cd $PROJECT_ROOT
uv pip install .
# 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"

Note

Editable (-e) does not work because the dynamo package is split over multiple directories, one per backend.

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. For instructions see the ReadMe for more details.

About

A Datacenter Scale Distributed Inference Serving Framework

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

1,740 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Dynamo banner

LicenseGitHub ReleaseDiscordAsk DeepWiki

| Roadmap | Support matrix | Documentation | Examples | Prebuilt containers | Design Proposals | Blogs

NVIDIA Dynamo

High-throughput, low-latency inference framework designed for serving generative AI and reasoning models in multi-node distributed environments.

Latest News

  • [08/05] Deploy openai/gpt-oss-120b with disaggregated serving on NVIDIA Blackwell GPUs using Dynamo ➡️ link

The Era of Multi-GPU, Multi-Node

Multi Node Multi-GPU topology

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.

Dynamo is designed to be inference engine agnostic (supports TRT-LLM, vLLM, SGLang or others) and captures LLM-specific capabilities such as:

  • 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

Dynamo architecture

Framework Support Matrix

FeaturevLLMSGLangTensorRT-LLM
Disaggregated Serving
Conditional Disaggregation🚧🚧🚧
KV-Aware Routing
Load Based Planner🚧🚧🚧
SLA-Based Planner
KVBM🚧

To learn more about each framework and their capabilities, check out each framework's README!

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

The following examples require a few system level packages. Recommended to use Ubuntu 24.04 with a x86_64 CPU. See docs/support_matrix.md

1. Initial setup

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

curl -LsSf https://astral.sh/uv/install.sh | sh

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.

  • etcd can be run directly as ./etcd.
  • nats needs jetstream enabled: nats-server -js.

To quickly setup etcd & NATS, you can also run:

# At the root of the repository:
# 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.
docker compose -f deploy/docker-compose.yml up -d

2. Select an engine

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.

uv venv venv
source venv/bin/activate
uv pip install pip
# Choose one
uv pip install "ai-dynamo[sglang]" #replace with [vllm], [trtllm], etc.

3. Run Dynamo

Running an LLM API server

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

  • 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.
# 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.
python -m dynamo.frontend --http-port 8000 [--tls-cert-path cert.pem] [--tls-key-path key.pem]
# Start the SGLang engine, connecting to NATS and etcd to receive requests. You can run several of these,
# both for the same model and for multiple models. The frontend node will discover them.
python -m dynamo.sglang.worker --model deepseek-ai/DeepSeek-R1-Distill-Llama-8B --skip-tokenizer-init

Send a Request

curl localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{ "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-8B", "messages": [ { "role": "user", "content": "Hello, how are you?" } ], "stream":false, "max_tokens": 300 }'| jq

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

Deploying Dynamo

  • Follow the Quickstart Guide to deploy on Kubernetes.
  • Check out Backends to deploy various workflow configurations (e.g. SGLang with router, vLLM with disaggregated serving, etc.)
  • Run some Examples to learn about building components in Dynamo and exploring various integrations.

Benchmarking Dynamo

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

  • Benchmarking Guide – Compare deployment topologies (aggregated vs. disaggregated vs. vanilla vLLM) using GenAI-Perf
  • Pre-Deployment Profiling – Optimize configurations before deployment to meet SLA requirements

Engines

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]).

vLLM

uv pip install ai-dynamo[vllm]

Run the backend/worker like this:

python -m dynamo.vllm --help

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

To specify which GPUs to use set environment variable CUDA_VISIBLE_DEVICES.

SGLang

# Install libnuma
apt install -y libnuma-dev
uv pip install ai-dynamo[sglang]

Run the backend/worker like this:

python -m dynamo.sglang.worker --help

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.

TensorRT-LLM

It is recommended to use NGC PyTorch Container for running the TensorRT-LLM engine.

Note

Ensure that you select a PyTorch container image version that matches the version of TensorRT-LLM you are using. For example, if you are using tensorrt-llm==1.1.0rc5, use the PyTorch container image version 25.06. To find the correct PyTorch container version for your desired tensorrt-llm release, visit the TensorRT-LLM 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

Install prerequisites

# Optional step: Only required for Blackwell and Grace Hopper
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"
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.

After installing the pre-requisites above, install Dynamo

uv pip install ai-dynamo[trtllm]

Run the backend/worker like this:

python -m dynamo.trtllm --help

To specify which GPUs to use set environment variable CUDA_VISIBLE_DEVICES.

Developing Locally

1. Install libraries

Ubuntu:

sudo apt install -y build-essential libhwloc-dev libudev-dev pkg-config libclang-dev protobuf-compiler python3-dev cmake

macOS:

# if brew is not installed on your system, install it
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install cmake protobuf
## Check that Metal is accessible
xcrun -sdk macosx metal

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

2. Install Rust

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env

3. Create a Python virtual env:

Follow the instructions in 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
curl -LsSf https://astral.sh/uv/install.sh | sh
  • Create a virtual environment
uv venv dynamo
source dynamo/bin/activate

4. Install build tools

uv pip install pip maturin

Maturin is the Rust<->Python bindings build tool.

5. Build the Rust bindings

cd lib/bindings/python
maturin develop --uv

6. Install the wheel

cd $PROJECT_ROOT
uv pip install .
# 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"

Note

Editable (-e) does not work because the dynamo package is split over multiple directories, one per backend.

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. For instructions see the ReadMe for more details.

About

A Datacenter Scale Distributed Inference Serving Framework

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

1,740 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Dynamo banner

LicenseGitHub ReleaseDiscordAsk DeepWiki

| Roadmap | Support matrix | Documentation | Examples | Prebuilt containers | Design Proposals | Blogs

NVIDIA Dynamo

High-throughput, low-latency inference framework designed for serving generative AI and reasoning models in multi-node distributed environments.

Latest News

  • [08/05] Deploy openai/gpt-oss-120b with disaggregated serving on NVIDIA Blackwell GPUs using Dynamo ➡️ link

The Era of Multi-GPU, Multi-Node

Multi Node Multi-GPU topology

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.

Dynamo is designed to be inference engine agnostic (supports TRT-LLM, vLLM, SGLang or others) and captures LLM-specific capabilities such as:

  • 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

Dynamo architecture

Framework Support Matrix

FeaturevLLMSGLangTensorRT-LLM
Disaggregated Serving
Conditional Disaggregation🚧🚧🚧
KV-Aware Routing
Load Based Planner🚧🚧🚧
SLA-Based Planner
KVBM🚧

To learn more about each framework and their capabilities, check out each framework's README!

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

The following examples require a few system level packages. Recommended to use Ubuntu 24.04 with a x86_64 CPU. See docs/support_matrix.md

1. Initial setup

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

curl -LsSf https://astral.sh/uv/install.sh | sh

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.

  • etcd can be run directly as ./etcd.
  • nats needs jetstream enabled: nats-server -js.

To quickly setup etcd & NATS, you can also run:

# At the root of the repository:
# 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.
docker compose -f deploy/docker-compose.yml up -d

2. Select an engine

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.

uv venv venv
source venv/bin/activate
uv pip install pip
# Choose one
uv pip install "ai-dynamo[sglang]" #replace with [vllm], [trtllm], etc.

3. Run Dynamo

Running an LLM API server

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

  • 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.
# 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.
python -m dynamo.frontend --http-port 8000 [--tls-cert-path cert.pem] [--tls-key-path key.pem]
# Start the SGLang engine, connecting to NATS and etcd to receive requests. You can run several of these,
# both for the same model and for multiple models. The frontend node will discover them.
python -m dynamo.sglang.worker --model deepseek-ai/DeepSeek-R1-Distill-Llama-8B --skip-tokenizer-init

Send a Request

curl localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{ "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-8B", "messages": [ { "role": "user", "content": "Hello, how are you?" } ], "stream":false, "max_tokens": 300 }'| jq

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

Deploying Dynamo

  • Follow the Quickstart Guide to deploy on Kubernetes.
  • Check out Backends to deploy various workflow configurations (e.g. SGLang with router, vLLM with disaggregated serving, etc.)
  • Run some Examples to learn about building components in Dynamo and exploring various integrations.

Benchmarking Dynamo

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

  • Benchmarking Guide – Compare deployment topologies (aggregated vs. disaggregated vs. vanilla vLLM) using GenAI-Perf
  • Pre-Deployment Profiling – Optimize configurations before deployment to meet SLA requirements

Engines

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]).

vLLM

uv pip install ai-dynamo[vllm]

Run the backend/worker like this:

python -m dynamo.vllm --help

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

To specify which GPUs to use set environment variable CUDA_VISIBLE_DEVICES.

SGLang

# Install libnuma
apt install -y libnuma-dev
uv pip install ai-dynamo[sglang]

Run the backend/worker like this:

python -m dynamo.sglang.worker --help

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.

TensorRT-LLM

It is recommended to use NGC PyTorch Container for running the TensorRT-LLM engine.

Note

Ensure that you select a PyTorch container image version that matches the version of TensorRT-LLM you are using. For example, if you are using tensorrt-llm==1.1.0rc5, use the PyTorch container image version 25.06. To find the correct PyTorch container version for your desired tensorrt-llm release, visit the TensorRT-LLM 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

Install prerequisites

# Optional step: Only required for Blackwell and Grace Hopper
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"
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.

After installing the pre-requisites above, install Dynamo

uv pip install ai-dynamo[trtllm]

Run the backend/worker like this:

python -m dynamo.trtllm --help

To specify which GPUs to use set environment variable CUDA_VISIBLE_DEVICES.

Developing Locally

1. Install libraries

Ubuntu:

sudo apt install -y build-essential libhwloc-dev libudev-dev pkg-config libclang-dev protobuf-compiler python3-dev cmake

macOS:

# if brew is not installed on your system, install it
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install cmake protobuf
## Check that Metal is accessible
xcrun -sdk macosx metal

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

2. Install Rust

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env

3. Create a Python virtual env:

Follow the instructions in 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
curl -LsSf https://astral.sh/uv/install.sh | sh
  • Create a virtual environment
uv venv dynamo
source dynamo/bin/activate

4. Install build tools

uv pip install pip maturin

Maturin is the Rust<->Python bindings build tool.

5. Build the Rust bindings

cd lib/bindings/python
maturin develop --uv

6. Install the wheel

cd $PROJECT_ROOT
uv pip install .
# 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"

Note

Editable (-e) does not work because the dynamo package is split over multiple directories, one per backend.

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. For instructions see the ReadMe for more details.

About

A Datacenter Scale Distributed Inference Serving Framework

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages