@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / 188c68798e
Fork 0

A high-throughput and memory-efficient inference and serving engine for LLMs

[KVConnector][MoRIIO] Allow overriding the advertised host IP (#45488)

Signed-off-by: Kourosh Hakhamaneshi <kourosh@anyscale.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

kourosh hakhamaneshi committed Jun 16, 2026 at 10:18 UTC 188c68798e26c89f4cdb30eaa79dfb96bf8b11f1
3 files changed +30 -4
tests/v1/kv_connector/unit/test_moriio_connector.py
+12
@@ -23,6 +23,7 @@ from vllm.distributed.kv_transfer.kv_connector.v1.moriio.moriio_common import (
23 MoRIIOAgentMetadata,
24 MoRIIOConnectorMetadata,
25 MoRIIOConstants,
26 + resolve_host_ip,
27 zmq_ctx,
28 )
29 from vllm.distributed.kv_transfer.kv_connector.v1.moriio.moriio_connector import (
@@ -568,3 +569,14 @@ def test_moriio_handshake_returns_metadata(mock_parallel_groups):
569 assert isinstance(metadata, MoRIIOAgentMetadata), (
570 "Decoded metadata is not MoRIIOAgentMetadata"
571 )
572 +
573 +
574 +def test_resolve_host_ip_prefers_extra_config():
575 + """An explicit ``host_ip`` in kv_connector_extra_config overrides get_ip()
576 + (so an external router can advertise a routable/internal address); an
577 + absent or empty value falls back to get_ip()."""
578 + assert resolve_host_ip({"host_ip": "10.0.0.7"}) == "10.0.0.7"
579 +
580 + fallback = get_ip()
581 + assert resolve_host_ip({}) == fallback
582 + assert resolve_host_ip({"host_ip": ""}) == fallback
vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py
+13 -1
@@ -177,6 +177,18 @@ def get_port_offset(dp_rank: int, tp_rank: int, tp_size: int = 1) -> int:
177 return (dp_rank) * tp_size + tp_rank
178
179
180 +def resolve_host_ip(extra_config: dict) -> str:
181 + """The IP this MoRIIO process advertises for KV transfer.
182 +
183 + Honors an explicit ``host_ip`` in ``kv_connector_extra_config`` before
184 + falling back to ``get_ip()``. An external router/orchestrator can set it to
185 + the node's routable address; this is required under frameworks (e.g. Ray)
186 + where ``get_ip()`` resolves to an unroutable public IP and ``VLLM_HOST_IP``
187 + cannot be propagated to the worker processes that bind the transfer engine.
188 + """
189 + return extra_config.get("host_ip") or get_ip()
190 +
191 +
192 _DEPRECATED_ENV_VARS: dict[str, str] = {
193 "VLLM_MORIIO_CONNECTOR_READ_MODE": "read_mode",
194 "VLLM_MORIIO_QP_PER_TRANSFER": "qp_per_transfer",
@@ -276,7 +288,7 @@ class MoRIIOConfig:
288 )
289
290 return cls(
279 - local_ip=get_ip(),
291 + local_ip=resolve_host_ip(extra_config),
292 local_kv_port=get_open_port(),
293 proxy_ip=extra_config["proxy_ip"],
294 local_ping_port=get_open_port(),
vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py
+5 -3
@@ -39,6 +39,7 @@ from vllm.distributed.kv_transfer.kv_connector.v1.moriio.moriio_common import (
39 get_port_offset,
40 get_role,
41 parse_moriio_zmq_address,
42 + resolve_host_ip,
43 set_role,
44 zmq_ctx,
45 )
@@ -54,7 +55,6 @@ from vllm.distributed.parallel_state import (
55 from vllm.forward_context import ForwardContext
56 from vllm.logger import init_logger
57 from vllm.utils.network_utils import (
57 - get_ip,
58 make_zmq_path,
59 make_zmq_socket,
60 )
@@ -105,7 +105,7 @@ class MoRIIOConnector(KVConnectorBase_V1):
105 self._set_port_defaults(vllm_config)
106
107 self.engine_id = (
108 - str(get_ip())
108 + str(resolve_host_ip(self.kv_transfer_config.kv_connector_extra_config))
109 + ":"
110 + str(self.kv_transfer_config.kv_connector_extra_config["handshake_port"])
111 )
@@ -256,7 +256,9 @@ class MoRIIOConnectorScheduler:
256 self.block_size = vllm_config.cache_config.block_size
257 self.engine_id: EngineId = engine_id
258 self.mode = get_moriio_mode(self.kv_transfer_config)
259 - self.host_ip = get_ip()
259 + self.host_ip = resolve_host_ip(
260 + self.kv_transfer_config.kv_connector_extra_config
261 + )
262 self.handshake_port = self.kv_transfer_config.kv_connector_extra_config[
263 "handshake_port"
264 ]