Skip to content

Commit 1212436

Browse files
authored
feat: dynamo namespace isolation for backend component (#2475)
Signed-off-by: Biswa Panda <[email protected]>
1 parent dfa3599 commit 1212436

File tree

6 files changed

+14
-34
lines changed

6 files changed

+14
-34
lines changed

components/backends/mocker/src/dynamo/mocker/main.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# Usage: `python -m dynamo.mocker --model-path /data/models/Qwen3-0.6B-Q8_0.gguf --extra-engine-args args.json`
55

66
import argparse
7+
import os
78
from pathlib import Path
89

910
import uvloop
@@ -14,7 +15,8 @@
1415

1516
from . import __version__
1617

17-
DEFAULT_ENDPOINT = "dyn://dynamo.backend.generate"
18+
DYN_NAMESPACE = os.environ.get("DYN_NAMESPACE", "dynamo")
19+
DEFAULT_ENDPOINT = f"dyn://{DYN_NAMESPACE}.backend.generate"
1820

1921
configure_dynamo_logging()
2022

components/backends/sglang/src/dynamo/sglang/args.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ def parse_args(args: list[str]) -> Config:
115115
# Dynamo argument processing
116116
# If an endpoint is provided, validate and use it
117117
# otherwise fall back to default endpoints
118-
namespace = os.environ.get("DYNAMO_NAMESPACE", "dynamo")
118+
namespace = os.environ.get("DYN_NAMESPACE", "dynamo")
119119

120120
endpoint = parsed_args.endpoint
121121
if endpoint is None:

components/backends/sglang/src/dynamo/sglang/utils/clear_namespace.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import argparse
55
import asyncio
66
import logging
7+
import os
78

89
from dynamo.runtime import DistributedRuntime, EtcdKvCache, dynamo_worker
910
from dynamo.runtime.logging import configure_dynamo_logging
@@ -24,6 +25,11 @@ async def clear_namespace(runtime: DistributedRuntime, namespace: str):
2425

2526
if __name__ == "__main__":
2627
parser = argparse.ArgumentParser()
27-
parser.add_argument("--namespace", type=str, required=True)
28+
parser.add_argument(
29+
"--namespace", type=str, required=False, default=os.environ.get("DYN_NAMESPACE")
30+
)
2831
args = parser.parse_args()
32+
assert (
33+
args.namespace
34+
), "Missing namespace, either pass --namespace or set DYN_NAMESPACE"
2935
asyncio.run(clear_namespace(args.namespace))

components/backends/vllm/README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,6 @@ For complete Kubernetes deployment instructions, configurations, and troubleshoo
159159

160160
vLLM workers are configured through command-line arguments. Key parameters include:
161161

162-
- `--endpoint`: Dynamo endpoint in format `dyn://namespace.component.endpoint`
163162
- `--model`: Model to serve (e.g., `Qwen/Qwen3-0.6B`)
164163
- `--is-prefill-worker`: Enable prefill-only mode for disaggregated serving
165164
- `--metrics-endpoint-port`: Port for publishing KV metrics to Dynamo

components/backends/vllm/deploy/README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,6 @@ spec:
186186

187187
vLLM workers are configured through command-line arguments. Key parameters include:
188188

189-
- `--endpoint`: Dynamo endpoint in format `dyn://namespace.component.endpoint`
190189
- `--model`: Model to serve (e.g., `Qwen/Qwen3-0.6B`)
191190
- `--is-prefill-worker`: Enable prefill-only mode for disaggregated serving
192191
- `--metrics-endpoint-port`: Port for publishing KV metrics to Dynamo

components/backends/vllm/src/dynamo/vllm/args.py

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import logging
66
import os
7-
import sys
87
from typing import Optional
98

109
from vllm.config import KVTransferConfig
@@ -29,7 +28,6 @@
2928

3029
logger = logging.getLogger(__name__)
3130

32-
DEFAULT_ENDPOINT = "dyn://dynamo.backend.generate"
3331
DEFAULT_MODEL = "Qwen/Qwen3-0.6B"
3432

3533
VALID_CONNECTORS = {"nixl", "lmcache", "kvbm", "null", "none"}
@@ -72,12 +70,6 @@ def parse_args() -> Config:
7270
parser.add_argument(
7371
"--version", action="version", version=f"Dynamo Backend VLLM {__version__}"
7472
)
75-
parser.add_argument(
76-
"--endpoint",
77-
type=str,
78-
default=DEFAULT_ENDPOINT,
79-
help=f"Dynamo endpoint string in 'dyn://namespace.component.endpoint' format. Default: {DEFAULT_ENDPOINT}",
80-
)
8173
parser.add_argument(
8274
"--is-prefill-worker",
8375
action="store_true",
@@ -145,27 +137,9 @@ def parse_args() -> Config:
145137
# This becomes an `Option` on the Rust side
146138
config.served_model_name = None
147139

148-
namespace = os.environ.get("DYN_NAMESPACE", "dynamo")
149-
150-
if args.is_prefill_worker:
151-
args.endpoint = f"dyn://{namespace}.prefill.generate"
152-
else:
153-
# For decode workers, also use the provided namespace instead of hardcoded "dynamo"
154-
args.endpoint = f"dyn://{namespace}.backend.generate"
155-
156-
endpoint_str = args.endpoint.replace("dyn://", "", 1)
157-
endpoint_parts = endpoint_str.split(".")
158-
if len(endpoint_parts) != 3:
159-
logger.error(
160-
f"Invalid endpoint format: '{args.endpoint}'. Expected 'dyn://namespace.component.endpoint' or 'namespace.component.endpoint'."
161-
)
162-
sys.exit(1)
163-
164-
parsed_namespace, parsed_component_name, parsed_endpoint_name = endpoint_parts
165-
166-
config.namespace = parsed_namespace
167-
config.component = parsed_component_name
168-
config.endpoint = parsed_endpoint_name
140+
config.namespace = os.environ.get("DYN_NAMESPACE", "dynamo")
141+
config.component = "prefill" if args.is_prefill_worker else "backend"
142+
config.endpoint = "generate"
169143
config.engine_args = engine_args
170144
config.is_prefill_worker = args.is_prefill_worker
171145
config.migration_limit = args.migration_limit

0 commit comments

Comments
 (0)