Merge main into dev/vllm-align for vLLM 0.31 release
Signed-off-by: tzhouam <tzhouam@connect.ust.hk>
This commit is contained in:
commit
008fa25263
252 files changed
+27589
-1237
No files matched your search
@@ -301,6 +301,7 @@ class OrchestratorBase:
|
||||
_transfer_emitter: Any = None
|
||||
_prom_metrics: Any = None
|
||||
_stat_logger: OmniPrometheusStatLogger | None = None
|
||||
_transfer_release_tasks: set[asyncio.Task] = set()
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
@@ -348,6 +349,8 @@ class OrchestratorBase:
|
||||
self._pd_bootstrap_addr = pd_config.get("bootstrap_addr")
|
||||
self._pd_prefill_engine_id = pd_config.get("prefill_engine_id")
|
||||
self.request_states: dict[str, OrchestratorRequestState] = {}
|
||||
# Strong refs for in-flight releases; the loop only weak-refs tasks, so dropping these risks mid-flight GC.
|
||||
self._transfer_release_tasks: set[asyncio.Task] = set()
|
||||
self._init_metrics_state(
|
||||
stage_pools,
|
||||
running_counter,
|
||||
@@ -690,6 +693,36 @@ class OrchestratorBase:
|
||||
output_msg.finished = index == last_index_by_req[output_msg.request_id]
|
||||
return abort_outputs
|
||||
|
||||
def _release_stage_transfer_resources(self, request_ids: list[str]) -> None:
|
||||
"""Drop each stage's inter-stage transfer resources for finished requests.
|
||||
|
||||
This is the only point that knows every stage is done with the request,
|
||||
so it is the only safe place to reclaim segments a consumer never
|
||||
drained. Scheduled rather than awaited: reclaim is best-effort and must
|
||||
not add RPC latency to request teardown.
|
||||
"""
|
||||
if not request_ids:
|
||||
return
|
||||
|
||||
async def _run() -> None:
|
||||
results = await asyncio.gather(
|
||||
*(pool.release_request_resources(request_ids) for pool in self.stage_pools),
|
||||
return_exceptions=True,
|
||||
)
|
||||
for result in results:
|
||||
if isinstance(result, Exception):
|
||||
logger.warning("[Orchestrator] release transfer resources failed: %s", result)
|
||||
|
||||
try:
|
||||
task = asyncio.get_running_loop().create_task(_run())
|
||||
self._transfer_release_tasks.add(task)
|
||||
task.add_done_callback(self._transfer_release_tasks.discard)
|
||||
except RuntimeError:
|
||||
logger.warning(
|
||||
"[Orchestrator] no running event loop; skipped reclaim of transfer resources for %s",
|
||||
request_ids,
|
||||
)
|
||||
|
||||
def _release_request_bindings(self, request_ids: list[str]) -> None:
|
||||
"""Release all stage-local route bindings for the given request ids."""
|
||||
for pool in self.stage_pools:
|
||||
@@ -898,7 +931,7 @@ class OrchestratorBase:
|
||||
req_state is None
|
||||
or req_state.upstream_first_audio
|
||||
or req_state.pending_upstream_first_audio is not None
|
||||
or stage_id + 1 > req_state.final_stage_id
|
||||
or (stage_id if final_output else stage_id + 1) > req_state.final_stage_id
|
||||
):
|
||||
continue
|
||||
audio = mm.get("model_outputs")
|
||||
@@ -935,7 +968,7 @@ class OrchestratorBase:
|
||||
if pending is None or self.request_states.get(req_state.request_id) is not req_state:
|
||||
return
|
||||
source_stage, first_output = pending
|
||||
codec_stage = source_stage + 1
|
||||
codec_stage = source_stage if self.stage_pools[source_stage].final_output else source_stage + 1
|
||||
pool = self.stage_pools[codec_stage]
|
||||
replica_id = pool.get_bound_replica_id(req_state.request_id)
|
||||
if replica_id is None or req_state.request_id not in pool.output_processor.request_states:
|
||||
@@ -1645,6 +1678,7 @@ class OrchestratorBase:
|
||||
if abort:
|
||||
abort_outputs = await self._abort_request_ids(cleanup_ids)
|
||||
self._release_request_bindings(cleanup_ids)
|
||||
self._release_stage_transfer_resources(cleanup_ids)
|
||||
for request_id in cleanup_ids:
|
||||
self._pd_kv_params.pop(request_id, None)
|
||||
req_state = self.request_states.pop(request_id, None)
|
||||
|
||||
Reference in new issue
Block a user