#!/bin/bash # SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 set -e trap 'echo Cleaning up...; kill 0' EXIT SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" source "$SCRIPT_DIR/../../../common/gpu_utils.sh" # build_trtllm_override_args_with_mem source "$SCRIPT_DIR/../../../common/launch_utils.sh" # print_launch_banner, wait_any_exit # Environment variables with defaults export DYNAMO_HOME=${DYNAMO_HOME:-"/workspace"} export MODEL_PATH=${MODEL_PATH:-"Qwen/Qwen3-0.6B"} export SERVED_MODEL_NAME=${SERVED_MODEL_NAME:-"Qwen/Qwen3-0.6B"} export AGG_ENGINE_ARGS=${AGG_ENGINE_ARGS:-"$DYNAMO_HOME/examples/backends/trtllm/engine_configs/qwen3/agg.yaml"} export MODALITY=${MODALITY:-"text"} # If you want to use multimodal, set MODALITY to "multimodal" #export MODALITY=${MODALITY:-"multimodal"} ENABLE_OTEL=false USE_UNIFIED=false EXTRA_ARGS=() while [[ $# -gt 0 ]]; do case $1 in --enable-otel) ENABLE_OTEL=true shift ;; --unified) USE_UNIFIED=true shift ;; -h|--help) echo "Usage: $0 [OPTIONS]" echo "Options:" echo " --enable-otel Enable OpenTelemetry tracing" echo " --unified Use unified_main entry point (Worker)" echo " -h, --help Show this help message" echo "" echo "Any additional options are passed through to dynamo.trtllm." exit 0 ;; *) EXTRA_ARGS+=("$1") shift ;; esac done TRTLLM_OVERRIDE_ARGS=() if [ "$ENABLE_OTEL" = true ]; then export DYN_LOGGING_JSONL=true export OTEL_EXPORT_ENABLED=1 export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=${OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:-http://localhost:4317} OTEL_JSON="{\"return_perf_metrics\": true, \"otlp_traces_endpoint\": \"${OTEL_EXPORTER_OTLP_TRACES_ENDPOINT}\"}" # Merge GPU mem config with OTEL config OVERRIDE_JSON=$(build_trtllm_override_args_with_mem --merge-with-json "$OTEL_JSON") else # Just GPU mem config (if any) OVERRIDE_JSON=$(build_trtllm_override_args_with_mem) fi # Add --override-engine-args if we have JSON if [[ -n "$OVERRIDE_JSON" ]]; then TRTLLM_OVERRIDE_ARGS=(--override-engine-args "$OVERRIDE_JSON") fi HTTP_PORT="${DYN_HTTP_PORT:-8000}" print_launch_banner "Launching Aggregated Serving" "$MODEL_PATH" "$HTTP_PORT" # run frontend # dynamo.frontend accepts either --http-port flag or DYN_HTTP_PORT env var (defaults to 8000) OTEL_SERVICE_NAME=dynamo-frontend \ python3 -m dynamo.frontend & # run worker # Additional command line args can be passed WORKER_MODULE="dynamo.trtllm" if [ "$USE_UNIFIED" = true ]; then WORKER_MODULE="dynamo.trtllm.unified_main" fi OTEL_SERVICE_NAME=dynamo-worker \ python3 -m "$WORKER_MODULE" \ --model-path "$MODEL_PATH" \ --served-model-name "$SERVED_MODEL_NAME" \ --modality "$MODALITY" \ --extra-engine-args "$AGG_ENGINE_ARGS" \ "${TRTLLM_OVERRIDE_ARGS[@]}" \ "${EXTRA_ARGS[@]}" & # Exit on first worker failure; kill 0 in the EXIT trap tears down the rest wait_any_exit