Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/codeowners/areas.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,7 @@ areas:
- lib/backend-common/examples/
- lib/sidecar/README.md
- lib/sidecar/common/
- lib/sidecar/openengine/
- lib/bindings/
- lib/bindings/c/
- lib/bindings/python/
Expand Down
1 change: 1 addition & 0 deletions CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,7 @@
/lib/llm/src/discovery/ @ai-dynamo/dynamo-runtime-codeowners
/lib/runtime/src/utils/ @ai-dynamo/dynamo-runtime-codeowners
/lib/runtime/src/config/ @ai-dynamo/dynamo-runtime-codeowners
/lib/sidecar/openengine/ @ai-dynamo/dynamo-runtime-codeowners
/examples/custom_backend/ @ai-dynamo/dynamo-runtime-codeowners
/lib/llm/src/local_model/ @ai-dynamo/dynamo-runtime-codeowners
/lib/runtime/src/compute/ @ai-dynamo/dynamo-runtime-codeowners
Expand Down
68 changes: 53 additions & 15 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ members = [
"lib/sidecar/vllm",
"lib/sidecar/sglang",
"lib/sidecar/trtllm",
"lib/sidecar/openengine",
"lib/bindings/c",
"lib/bindings/python/codegen",
"deploy/inference-gateway/ext-proc",
Expand Down Expand Up @@ -83,6 +84,7 @@ velo = { version = "0.1.0" }
# External dependencies
aiconfigurator-core = { git = "https://github.com/ai-dynamo/aiconfigurator.git", rev = "ffbab15797d3a3f14c382e937c0ab0c1c5cbc530", package = "aiconfigurator-core" }
anyhow = { version = "1" }
async-openai = { version = "=0.34.0", default-features = false }
lru = { version = "0.16" }
async-nats = { version = "0.49.1", features = ["service"] }
async-stream = { version = "0.3" }
Expand Down
52 changes: 52 additions & 0 deletions examples/backends/trtllm/deploy/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
<!--
SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
SPDX-License-Identifier: Apache-2.0
-->

# TensorRT-LLM Kubernetes Deployment Configurations

This directory contains Kubernetes Custom Resource Definition (CRD) templates for deploying TensorRT-LLM inference graphs using the **DynamoGraphDeployment** resource.
Expand Down Expand Up @@ -68,6 +73,53 @@ TensorRT-LLM worker. This example uses the conservative engine configuration in
`experimental.checkpoint.enabled: true` and
`startupPolicy: WaitForCheckpoint`

### 8. **OpenEngine Sidecar Examples** (`v1beta1/openengine-*.yaml`)

The OpenEngine examples keep TRT-LLM in the GPU container and run
`dynamo-openengine-sidecar` as the CPU-only `main` container in the same pod.
Loopback OpenEngine gRPC connects the pair; TRT-LLM's HTTP listener remains
available and uses the same `LLM` instance.

- `openengine-agg.yaml`: aggregate text
- `openengine-disagg.yaml`: context-first 1P1D text and LoRA
- `openengine-multimodal-agg.yaml`: aggregate image/video
- `openengine-multimodal-disagg.yaml`: image/video context-first 1P1D
- `openengine-audio.yaml`: aggregate Phi-4 audio
- `openengine-lora.yaml`: aggregate lazy LoRA lifecycle

Replace both placeholder images with builds containing the sidecar and the
local TRT-LLM fork. The TRT-LLM image must also contain this repository's
`/workspace/examples/backends/trtllm/engine_configs` directory. Every engine is
started with the PyTorch backend and immutable OpenEngine schema release
`df3a9be24a2a36a4ff7a6d4fef9f1d7480ae210d`.

LoRA manifests expect a PVC named `trtllm-openengine-lora-cache`. For 1P1D it
must support `ReadWriteMany`, because context and generation are different pods
and both mount `/lora-cache`. Create it before the DGD, for example:

```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: trtllm-openengine-lora-cache
spec:
accessModes: [ReadWriteMany]
resources:
requests:
storage: 20Gi
```

OpenEngine workers publish model cards with no frontend media decoder. This is
the URL/data passthrough mode: ordered media stays encoded until TRT-LLM fetches
and decodes it. Do not add a frontend media decoder to these deployments;
decoded/RDMA media is intentionally rejected by the sidecar.

The Phi-4 audio manifest additionally expects a PVC named
`trtllm-openengine-phi4-model`. Populate its root with a raw git clone of
`microsoft/Phi-4-multimodal-instruct` before creating the DGD. The mounted
directory must contain the bundled `speech-lora/` subdirectory; TRT-LLM's
Phi-4-MM loader does not support the Hugging Face snapshot layout.

## CRD Structure

All templates use the **DynamoGraphDeployment** CRD:
Expand Down
97 changes: 97 additions & 0 deletions examples/backends/trtllm/deploy/v1beta1/openengine-agg.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# 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.

apiVersion: nvidia.com/v1beta1
kind: DynamoGraphDeployment
metadata:
name: trtllm-openengine-agg
spec:
backendFramework: trtllm
components:
- name: Frontend
podTemplate:
spec:
containers:
- args:
- python3 -m dynamo.frontend --router-mode round-robin --http-port 8000
command: [/bin/sh, -c]
env:
- name: DYN_NAMESPACE
value: dynamo
image: my-registry/dynamo-openengine-sidecar:my-tag
name: main
replicas: 1
type: frontend
- name: OpenEngineWorker
podTemplate:
spec:
containers:
- args:
- --openengine-endpoint
- http://127.0.0.1:50051
- --expected-engine
- tensorrt_llm
command: [dynamo-openengine-sidecar]
env:
- name: DYN_NAMESPACE
value: dynamo
- name: DYN_SYSTEM_PORT
value: "8081"
- name: DYN_LORA_ENABLED
value: "false"
image: my-registry/dynamo-openengine-sidecar:my-tag
name: main
resources:
limits:
cpu: "2"
memory: 4Gi
requests:
cpu: "1"
memory: 2Gi
- args:
- Qwen/Qwen3-0.6B
- --backend
- pytorch
- --host
- 127.0.0.1
- --port
- "8001"
- --config
- /workspace/examples/backends/trtllm/engine_configs/qwen3/agg.yaml
- --openengine-host
- 127.0.0.1
- --openengine-port
- "50051"
command: [trtllm-serve]
env:
- name: HF_HOME
value: /model-cache
- name: OPENENGINE_SCHEMA_RELEASE
value: df3a9be24a2a36a4ff7a6d4fef9f1d7480ae210d
image: my-registry/tensorrtllm-openengine:my-tag
name: engine
resources:
limits:
nvidia.com/gpu: "1"
requests:
nvidia.com/gpu: "1"
volumeMounts:
- mountPath: /model-cache
name: model-cache
volumes:
- emptyDir: {}
name: model-cache
replicas: 1
type: worker
Loading
Loading