Skip to content
Closed
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
22 changes: 16 additions & 6 deletions examples/backends/vllm/launch/agg_multimodal_router.sh
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,14 @@ Env vars:
HTTP_PORT (default 8000)
BLOCK_SIZE (default 16)
MAX_MODEL_LEN (default 4096)
VLLM_SYSTEM_PORT_BASE (default 18081 — worker i uses port BASE + (i-1)*2)
KV_EVENTS_PORT_BASE (default 5557 — worker i uses port BASE + (i-1))
DYN_LOG (default info + mm_routing + scheduling debug)

DYN_SYSTEM_PORT{i} and DYN_VLLM_KV_EVENT_PORT{i}, when set, take precedence
over the *_BASE formulas above. The tests/serve harness exports them with a
unique value per deployment so concurrent runs on one host do not collide.

Routing test (run after the script reports "All services are ready"):
# Same image twice -> 2nd request should pin to same worker (high overlap_blocks)
IMG_A=http://images.cocodataset.org/val2017/000000039769.jpg
Expand Down Expand Up @@ -134,9 +139,15 @@ GPU_MEM_ARGS=$(build_vllm_gpu_mem_args)
# Phase 1: launch all workers in parallel.
# Under SINGLE_GPU=true, requires the KV-bytes cap (CI sets it via the
# requested_vllm_kv_cache_bytes marker) — otherwise vLLM's 0.9 default races.
WORKER_PORTS=()
KV_EVENTS_PORTS=()
for i in $(seq 1 "${NUM_WORKERS}"); do
WORKER_PORT=$((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2))
KV_EVENTS_PORT=$((KV_EVENTS_PORT_BASE + (i - 1)))
HARNESS_SYSTEM_VAR="DYN_SYSTEM_PORT${i}"
HARNESS_KV_VAR="DYN_VLLM_KV_EVENT_PORT${i}"
WORKER_PORT="${!HARNESS_SYSTEM_VAR:-$((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2))}"
KV_EVENTS_PORT="${!HARNESS_KV_VAR:-$((KV_EVENTS_PORT_BASE + (i - 1)))}"
WORKER_PORTS+=("${WORKER_PORT}")
KV_EVENTS_PORTS+=("${KV_EVENTS_PORT}")
if [[ "${SINGLE_GPU}" == "true" ]]; then GPU_ID=0; else GPU_ID=$((i - 1)); fi

KV_EVENTS_CONFIG="{\"enable_kv_cache_events\":true,\"publisher\":\"zmq\",\"topic\":\"kv-events\",\"endpoint\":\"tcp://*:${KV_EVENTS_PORT}\"}"
Expand All @@ -157,8 +168,7 @@ done

# Phase 2: wait for all workers to be ready.
for i in $(seq 1 "${NUM_WORKERS}"); do
WORKER_PORT=$((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2))
wait_ready "http://127.0.0.1:${WORKER_PORT}/health" "vLLM backend $i"
wait_ready "http://127.0.0.1:${WORKER_PORTS[i-1]}/health" "vLLM backend $i"
done

echo "=== Starting frontend (KV router, MM-aware exact routing) ==="
Expand All @@ -185,8 +195,8 @@ echo
echo "=== All services are ready ==="
echo "Frontend: http://127.0.0.1:${HTTP_PORT}"
for i in $(seq 1 "${NUM_WORKERS}"); do
echo "Worker $i health: http://127.0.0.1:$((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2))/health"
echo "Worker $i kv-events: tcp://*:$((KV_EVENTS_PORT_BASE + (i - 1)))"
echo "Worker $i health: http://127.0.0.1:${WORKER_PORTS[i-1]}/health"
echo "Worker $i kv-events: tcp://*:${KV_EVENTS_PORTS[i-1]}"
done
echo
echo "Architecture: Rust frontend (MM-aware KV router) -> ${NUM_WORKERS}x vLLM workers"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ ETCD_ENDPOINTS="${ETCD_ENDPOINTS:-http://127.0.0.1:2379}"

VLLM_SYSTEM_PORT_BASE="${VLLM_SYSTEM_PORT_BASE:-18081}"
# Worker `i` publishes ZMQ KV events on `KV_EVENTS_PORT_BASE + (i - 1)`.
# Default differs from the Rust default script (5557) — kept distinct so
# the two variants can be co-run on the same host without colliding.
# Default differs from the Rust default script (5557), but both scripts share
# system-port base 18081; only DYN_SYSTEM_PORT{i} separates two co-run deployments.
KV_EVENTS_PORT_BASE="${KV_EVENTS_PORT_BASE:-29080}"

# ImageLoader cache size (number of images kept in-memory LRU)
Expand Down Expand Up @@ -113,8 +113,8 @@ echo "DYN_MM_IMAGE_CACHE_SIZE=${DYN_MM_IMAGE_CACHE_SIZE}"
echo "DYNAMO_MM_TRANSFER=${DYNAMO_MM_TRANSFER}"
echo "NATS_SERVER=${NATS_SERVER}"
echo "ETCD_ENDPOINTS=${ETCD_ENDPOINTS}"
echo "VLLM_SYSTEM_PORT_BASE=${VLLM_SYSTEM_PORT_BASE}"
echo "KV_EVENTS_PORT_BASE=${KV_EVENTS_PORT_BASE}"
echo "VLLM_SYSTEM_PORT_BASE=${VLLM_SYSTEM_PORT_BASE} (fallback; DYN_SYSTEM_PORT{i} wins)"
echo "KV_EVENTS_PORT_BASE=${KV_EVENTS_PORT_BASE} (fallback; DYN_VLLM_KV_EVENT_PORT{i} wins)"
echo

# Clear the trap inside the handler so `kill 0` (which sends SIGTERM to the
Expand Down Expand Up @@ -173,9 +173,17 @@ COMMON_ENV=(
# Phase 1: launch all workers in parallel.
# Under SINGLE_GPU=true, requires the KV-bytes cap (CI sets it via the
# requested_vllm_kv_cache_bytes marker) — otherwise vLLM's 0.9 default races.
# Ports are host-wide: prefer the harness-allocated DYN_SYSTEM_PORT{i} /
# DYN_VLLM_KV_EVENT_PORT{i}, so concurrent runs on one host cannot collide.
WORKER_PORTS=()
KV_EVENTS_PORTS=()
for i in $(seq 1 "${NUM_WORKERS}"); do
WORKER_PORT=$((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2))
KV_EVENTS_PORT=$((KV_EVENTS_PORT_BASE + i - 1))
HARNESS_SYSTEM_VAR="DYN_SYSTEM_PORT${i}"
HARNESS_KV_VAR="DYN_VLLM_KV_EVENT_PORT${i}"
WORKER_PORT="${!HARNESS_SYSTEM_VAR:-$((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2))}"
KV_EVENTS_PORT="${!HARNESS_KV_VAR:-$((KV_EVENTS_PORT_BASE + i - 1))}"
WORKER_PORTS+=("${WORKER_PORT}")
KV_EVENTS_PORTS+=("${KV_EVENTS_PORT}")

if [[ "${SINGLE_GPU}" == "true" ]]; then
GPU_ID=0
Expand All @@ -201,8 +209,7 @@ done

# Phase 2: wait for all workers to be ready.
for i in $(seq 1 "${NUM_WORKERS}"); do
WORKER_PORT=$((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2))
wait_ready "http://127.0.0.1:${WORKER_PORT}/health" "vLLM backend $i" 900
wait_ready "http://127.0.0.1:${WORKER_PORTS[i-1]}/health" "vLLM backend $i" 900
done

echo
Expand All @@ -221,7 +228,10 @@ FRONTEND_SYSTEM_PORT_BASE="${FRONTEND_SYSTEM_PORT_BASE:-9080}"

for f in $(seq 1 "${NUM_FRONTENDS}"); do
FE_HTTP_PORT=$((HTTP_PORT + f - 1))
FE_SYSTEM_PORT=$((FRONTEND_SYSTEM_PORT_BASE + f - 1))
# dynamo.frontend pops DYN_SYSTEM_PORT before building its runtime, so
# nothing binds this; it keeps a harness run off a worker's system port.
HARNESS_FE_SYSTEM_VAR="DYN_SYSTEM_PORT$((NUM_WORKERS + f))"
FE_SYSTEM_PORT="${!HARNESS_FE_SYSTEM_VAR:-$((FRONTEND_SYSTEM_PORT_BASE + f - 1))}"

# Enable replica sync when running multiple frontends.
SYNC_ARGS=""
Expand Down Expand Up @@ -271,7 +281,7 @@ for f in $(seq 1 "${NUM_FRONTENDS}"); do
echo "Frontend ${f}: http://127.0.0.1:$((HTTP_PORT + f - 1))"
done
for i in $(seq 1 "${NUM_WORKERS}"); do
echo "Worker $i: http://127.0.0.1:$((VLLM_SYSTEM_PORT_BASE + (i - 1) * 2))/health"
echo "Worker $i: http://127.0.0.1:${WORKER_PORTS[i-1]}/health"
done
echo
echo "Architecture: ${NUM_FRONTENDS}x Frontend (vLLM processor + KvRouter) -> ${NUM_WORKERS}x vLLM backend"
Expand Down
14 changes: 8 additions & 6 deletions examples/backends/vllm/launch/disagg_multimodal_epd.sh
Original file line number Diff line number Diff line change
Expand Up @@ -198,12 +198,14 @@ else
DECODE_GPU_MEM_ARGS="--gpu-memory-utilization $DYN_DECODE_GPU_MEM"
fi

VLLM_NIXL_SIDE_CHANNEL_PORT_ENCODE=${VLLM_NIXL_SIDE_CHANNEL_PORT_ENCODE:-20097}
VLLM_NIXL_SIDE_CHANNEL_PORT_PREFILL=${VLLM_NIXL_SIDE_CHANNEL_PORT_PREFILL:-20098}
VLLM_NIXL_SIDE_CHANNEL_PORT_DECODE=${VLLM_NIXL_SIDE_CHANNEL_PORT_DECODE:-20099}
VLLM_ZMQ_PORT_ENCODE=${VLLM_ZMQ_PORT_ENCODE:-20080}
VLLM_ZMQ_PORT_PREFILL=${VLLM_ZMQ_PORT_PREFILL:-20081}
VLLM_ZMQ_PORT_DECODE=${VLLM_ZMQ_PORT_DECODE:-20082}
# NIXL side-channel and ZMQ ports are host-wide: prefer the harness-allocated
# DYN_* values, so concurrent runs on one host cannot collide.
VLLM_NIXL_SIDE_CHANNEL_PORT_ENCODE=${VLLM_NIXL_SIDE_CHANNEL_PORT_ENCODE:-${DYN_VLLM_NIXL_SIDE_CHANNEL_PORT1:-20097}}
VLLM_NIXL_SIDE_CHANNEL_PORT_PREFILL=${VLLM_NIXL_SIDE_CHANNEL_PORT_PREFILL:-${DYN_VLLM_NIXL_SIDE_CHANNEL_PORT2:-20098}}
VLLM_NIXL_SIDE_CHANNEL_PORT_DECODE=${VLLM_NIXL_SIDE_CHANNEL_PORT_DECODE:-${DYN_VLLM_NIXL_SIDE_CHANNEL_PORT3:-20099}}
VLLM_ZMQ_PORT_ENCODE=${VLLM_ZMQ_PORT_ENCODE:-${DYN_VLLM_KV_EVENT_PORT1:-20080}}
VLLM_ZMQ_PORT_PREFILL=${VLLM_ZMQ_PORT_PREFILL:-${DYN_VLLM_KV_EVENT_PORT2:-20081}}
VLLM_ZMQ_PORT_DECODE=${VLLM_ZMQ_PORT_DECODE:-${DYN_VLLM_KV_EVENT_PORT3:-20082}}

# Start encode worker.
#
Expand Down
15 changes: 11 additions & 4 deletions examples/backends/vllm/launch/disagg_multimodal_p_d.sh
Original file line number Diff line number Diff line change
Expand Up @@ -100,9 +100,16 @@ else
DECODE_GPU_MEM_ARGS="--gpu-memory-utilization $DYN_DECODE_GPU_MEM"
fi

# Host-wide ports: prefer the harness-allocated DYN_* values. The literal
# fallbacks 20081/20082 are also disagg_multimodal_epd.sh's, so both collide.
VLLM_NIXL_SIDE_CHANNEL_PORT_PREFILL="${DYN_VLLM_NIXL_SIDE_CHANNEL_PORT1:-20098}"
VLLM_NIXL_SIDE_CHANNEL_PORT_DECODE="${DYN_VLLM_NIXL_SIDE_CHANNEL_PORT2:-20099}"
VLLM_ZMQ_PORT_PREFILL="${DYN_VLLM_KV_EVENT_PORT1:-20081}"
VLLM_ZMQ_PORT_DECODE="${DYN_VLLM_KV_EVENT_PORT2:-20082}"

# Start prefill worker (handles image loading internally, no --route-to-encoder)
echo "Starting prefill worker on GPU $DYN_PREFILL_WORKER_GPU (${PREFILL_GPU_MEM_ARGS})..."
VLLM_NIXL_SIDE_CHANNEL_PORT=20098 \
VLLM_NIXL_SIDE_CHANNEL_PORT=$VLLM_NIXL_SIDE_CHANNEL_PORT_PREFILL \
DYN_SYSTEM_PORT=${DYN_SYSTEM_PORT1:-${DYN_SYSTEM_PORT:-8081}} \
CUDA_VISIBLE_DEVICES=$DYN_PREFILL_WORKER_GPU \
python -m "$WORKER_MODULE" \
Expand All @@ -113,11 +120,11 @@ python -m "$WORKER_MODULE" \
$EXTRA_ARGS \
$PD_EXTRA_ARGS \
--kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both"}' \
--kv-events-config '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:20081"}' &
--kv-events-config "{\"publisher\":\"zmq\",\"topic\":\"kv-events\",\"endpoint\":\"tcp://*:${VLLM_ZMQ_PORT_PREFILL}\"}" &

# Start decode worker
echo "Starting decode worker on GPU $DYN_DECODE_WORKER_GPU (${DECODE_GPU_MEM_ARGS})..."
VLLM_NIXL_SIDE_CHANNEL_PORT=20099 \
VLLM_NIXL_SIDE_CHANNEL_PORT=$VLLM_NIXL_SIDE_CHANNEL_PORT_DECODE \
DYN_SYSTEM_PORT=${DYN_SYSTEM_PORT2:-8082} \
CUDA_VISIBLE_DEVICES=$DYN_DECODE_WORKER_GPU \
python -m "$WORKER_MODULE" \
Expand All @@ -129,7 +136,7 @@ python -m "$WORKER_MODULE" \
$EXTRA_ARGS \
$PD_EXTRA_ARGS \
--kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both"}' \
--kv-events-config '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:20082"}' &
--kv-events-config "{\"publisher\":\"zmq\",\"topic\":\"kv-events\",\"endpoint\":\"tcp://*:${VLLM_ZMQ_PORT_DECODE}\"}" &

echo "=================================================="
echo "All components started. Waiting for initialization..."
Expand Down
19 changes: 11 additions & 8 deletions tests/serve/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -226,14 +226,17 @@ def _prepare_deployment(
# Unique ZMQ port for vLLM KV event publishing (avoids xdist collisions).
if ports.kv_event_port:
merged_env["DYN_VLLM_KV_EVENT_PORT"] = str(ports.kv_event_port)
# For multi-worker scripts (xpu_2 router tests), allocate separate
# KV event ports for each worker to avoid ZMQ bind collisions.
if len(dynamic_system_ports) >= 2:
kv_port1 = ports.kv_event_port
kv_port2 = allocate_port(ports.kv_event_port + 1)
extra_allocated_ports.append(kv_port2)
merged_env["DYN_VLLM_KV_EVENT_PORT1"] = str(kv_port1)
merged_env["DYN_VLLM_KV_EVENT_PORT2"] = str(kv_port2)
# Worker `i` binds DYN_VLLM_KV_EVENT_PORT{i}. The launch scripts read

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@keivenchang can you check this. I think you originally did this port work.

# only the indexed name, so worker 1 needs one even in a one-worker
# deployment; workers 2..N get freshly allocated ports so concurrent
# runs on the same host cannot collide on ZMQ.
merged_env["DYN_VLLM_KV_EVENT_PORT1"] = str(ports.kv_event_port)
next_start = ports.kv_event_port + 1
for idx in range(2, len(dynamic_system_ports) + 1):
kv_port = allocate_port(next_start)
extra_allocated_ports.append(kv_port)
merged_env[f"DYN_VLLM_KV_EVENT_PORT{idx}"] = str(kv_port)
next_start = kv_port + 1

# Per-worker NIXL side-channel ports (avoids xdist collisions on 20097).
for idx, port in enumerate(ports.nixl_side_channel_ports, start=1):
Expand Down
10 changes: 10 additions & 0 deletions tests/serve/multimodal_profiles/vllm.py
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,8 @@
# Post_merge MM-routing coverage for the Qwen3-VL family — the
# smaller Qwen3.5-0.8B (`agg_router` below) is the pre_merge gater.
"agg_router": TopologyConfig(
health_check_workers=True,
health_check_worker_count=2,
marks=[pytest.mark.post_merge],
timeout_s=400,
profiled_vram_gib=13.0,
Expand All @@ -220,6 +222,8 @@
# SINGLE_GPU=true packs both workers onto GPU 0 to match the
# single-GPU CI environment.
"agg_router_chat_processor": TopologyConfig(
health_check_workers=True,
health_check_worker_count=2,
marks=[pytest.mark.post_merge],
timeout_s=400,
profiled_vram_gib=13.0,
Expand Down Expand Up @@ -265,6 +269,8 @@
],
),
"epd": TopologyConfig(
health_check_workers=True,
health_check_worker_count=3,
marks=[pytest.mark.post_merge],
timeout_s=300,
single_gpu=True,
Expand Down Expand Up @@ -320,6 +326,8 @@
],
),
"p_d": TopologyConfig(
health_check_workers=True,
health_check_worker_count=2,
marks=[pytest.mark.post_merge],
timeout_s=300,
single_gpu=True,
Expand Down Expand Up @@ -421,6 +429,8 @@
# hit-rate ceiling (N-1)/N. Filler 120 → ~6 blocks → ceiling ≈0.83;
# threshold 0.7 fires on real degradation, tolerates variance.
"agg_router": TopologyConfig(
health_check_workers=True,
health_check_worker_count=2,
marks=[pytest.mark.pre_merge],
timeout_s=400,
profiled_vram_gib=8.0,
Expand Down
109 changes: 109 additions & 0 deletions tests/serve/test_kv_event_port_export.py

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file feels like slop tests to me. Do we need these tests? Are we actually testing a Dynamo feature?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These tests exercise the tests/serve/common.py harness contract: exporting the indexed KV-event variables consumed by the updated launch scripts and cleaning up ports allocated for workers 2..N. Whether this focused harness coverage belongs in this PR or should be replaced/removed needs the port-work owner’s decision, so I am leaving its scope unchanged.

Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

"""Per-worker DYN_VLLM_KV_EVENT_PORT export in ``_prepare_deployment``.

ZMQ KV-event ports are host-wide. A launch script that binds one for every
worker needs one harness-allocated port per worker, or two deployments
scheduled concurrently on the same host bind the same port and one loses.
"""

from pathlib import Path
from typing import Any

import pytest

from tests.serve.common import _cleanup_prepared_deployment, _prepare_deployment
from tests.utils.constants import DynamoPortRange
from tests.utils.engine_process import EngineConfig
from tests.utils.port_utils import ServicePorts, reserved_ports

pytestmark = [pytest.mark.unit, pytest.mark.pre_merge, pytest.mark.gpu_0]


class _FakeNode:
def get_closest_marker(self, name: str) -> None:
return None


class _FakeRequest:
"""Stands in for the pytest ``request`` fixture.

``_prepare_deployment`` only reaches into ``request.node.get_closest_marker``
to read the KV-cache-budget markers; returning ``None`` selects the
no-marker path.
"""

node = _FakeNode()


def _config(directory: str) -> EngineConfig:
return EngineConfig(
name="kv-event-port-export",
directory=directory,
script_name="agg_multimodal_router.sh",
model="test-model",
marks=[],
request_payloads=[],
)


def _prepared_env(ports: ServicePorts, directory: str) -> tuple[dict, int]:
prep = _prepare_deployment(
_config(directory), _FakeRequest(), ports=ports, extra_env=None
)
try:
return dict(prep.merged_env), len(prep.extra_allocated_ports)
finally:
_cleanup_prepared_deployment(prep)


@pytest.fixture(autouse=True)
def _no_xdist_stagger(monkeypatch: Any) -> None:
# _prepare_deployment sleeps 15s per xdist worker index to spread vLLM
# startup; this test never starts an engine, so skip the wait.
monkeypatch.delenv("PYTEST_XDIST_WORKER", raising=False)


def _service_ports(system: list, frontend: int, kv_event: int) -> ServicePorts:
return ServicePorts(
frontend_port=frontend,
system_ports=system,
kv_event_port=kv_event,
nixl_side_channel_ports=[],
)


def test_three_workers_each_get_a_distinct_kv_event_port(tmp_path: Path) -> None:
with reserved_ports(5, DynamoPortRange.SERVE.value) as pool:
frontend, kv_event, *system = pool
env, extra_count = _prepared_env(
_service_ports(system, frontend, kv_event), str(tmp_path)
)

exported = [env.get(f"DYN_VLLM_KV_EVENT_PORT{i}") for i in (1, 2, 3)]
assert all(
p is not None for p in exported
), f"every declared worker needs its own KV-event port, got {exported}"
assert len(set(exported)) == 3, f"KV-event ports must not repeat: {exported}"

# Worker 1 reuses the port the fixture already allocated; workers 2 and 3
# are freshly allocated and must be handed to cleanup so they are released.
assert exported[0] == str(kv_event)
assert extra_count == 2

system_ports = {env[f"DYN_SYSTEM_PORT{i}"] for i in (1, 2, 3)}
assert system_ports.isdisjoint(exported)


def test_one_worker_still_gets_the_numbered_kv_event_port(tmp_path: Path) -> None:
# The launch scripts read only DYN_VLLM_KV_EVENT_PORT{i}, so a one-worker
# deployment without PORT1 silently falls back to the script's literal.
with reserved_ports(3, DynamoPortRange.SERVE.value) as pool:
frontend, kv_event, system = pool
env, extra_count = _prepared_env(
_service_ports([system], frontend, kv_event), str(tmp_path)
)

assert env["DYN_VLLM_KV_EVENT_PORT1"] == str(kv_event)
assert extra_count == 0
6 changes: 3 additions & 3 deletions tests/serve/test_vllm.py
Original file line number Diff line number Diff line change
Expand Up @@ -843,7 +843,7 @@ def vllm_config_test(request):

@pytest.mark.vllm
@pytest.mark.e2e
@pytest.mark.parametrize("num_system_ports", [2], indirect=True)
@pytest.mark.parametrize("num_system_ports", [3], indirect=True)
Comment thread
coderabbitai[bot] marked this conversation as resolved.
def test_serve_deployment(
vllm_config_test,
request,
Expand All @@ -857,8 +857,8 @@ def test_serve_deployment(
Test dynamo serve deployments with different graph configurations.
"""
assert (
num_system_ports >= 2
), "serve tests require at least SYSTEM_PORT1 + SYSTEM_PORT2"
num_system_ports >= 3
), "serve tests require at least SYSTEM_PORT1 + SYSTEM_PORT2 + SYSTEM_PORT3"
config = dataclasses.replace(
vllm_config_test, frontend_port=dynamo_dynamic_ports.frontend_port
)
Expand Down
Loading
Loading