97 lines
3.3 KiB
Python
97 lines
3.3 KiB
Python
from dataclasses import dataclass, field
|
|
|
|
from vllm.v1.core.sched.output import CachedRequestData, NewRequestData, SchedulerOutput
|
|
from vllm.v1.request import Request
|
|
|
|
from vllm_omni.engine import AdditionalInformationPayload
|
|
|
|
|
|
@dataclass
|
|
class OmniNewRequestData(NewRequestData):
|
|
"""New request data for omni models with embeddings support.
|
|
|
|
Extends NewRequestData to include additional information for direct
|
|
transfer between pipeline stages.
|
|
|
|
Note: prompt_embeds is inherited from NewRequestData
|
|
(torch.Tensor | None).
|
|
|
|
Args:
|
|
external_req_id: Optional external request ID for tracking
|
|
additional_information: Optional serialized additional information
|
|
dictionary containing tensors or lists
|
|
"""
|
|
|
|
external_req_id: str | None = None
|
|
additional_information: AdditionalInformationPayload | None = None
|
|
|
|
@classmethod
|
|
def from_request(
|
|
cls,
|
|
request: Request,
|
|
block_ids: tuple[list[int], ...],
|
|
prefill_token_ids: list[int] | None = None,
|
|
) -> "OmniNewRequestData":
|
|
"""Create OmniNewRequestData from a Request object.
|
|
|
|
Args:
|
|
request: Request object to convert
|
|
block_ids: Tuple of block ID lists for KV cache allocation
|
|
prefill_token_ids: Optional prefill token IDs for v2 model runner
|
|
|
|
Returns:
|
|
OmniNewRequestData instance with data from the request
|
|
"""
|
|
return cls(
|
|
req_id=request.request_id,
|
|
external_req_id=getattr(request, "external_req_id", None),
|
|
prompt_token_ids=request.prompt_token_ids,
|
|
mm_features=request.mm_features,
|
|
sampling_params=request.sampling_params,
|
|
pooling_params=request.pooling_params,
|
|
block_ids=block_ids,
|
|
num_computed_tokens=request.num_computed_tokens,
|
|
lora_request=request.lora_request,
|
|
prompt_embeds=getattr(request, "prompt_embeds", None),
|
|
prompt_is_token_ids=getattr(request, "prompt_is_token_ids", None),
|
|
prefill_token_ids=prefill_token_ids,
|
|
additional_information=getattr(request, "additional_information", None),
|
|
)
|
|
|
|
|
|
@dataclass
|
|
class OmniCachedRequestData(CachedRequestData):
|
|
"""Cached request data for omni models with embeddings support.
|
|
|
|
Args:
|
|
prompt_token_ids: Mapping from request ID to list of prompt token IDs
|
|
"""
|
|
|
|
prompt_token_ids: dict[str, list[int]]
|
|
additional_information: dict[str, dict | None]
|
|
|
|
|
|
@dataclass
|
|
class OmniChunkRecvHandle:
|
|
"""Minimal identifier carried from scheduler to runner for chunk-recv
|
|
registration.
|
|
|
|
The runner's ``register_chunk_recv`` only consumes ``request_id`` and
|
|
``external_req_id`` from each pending request, so we ship just those
|
|
two fields instead of the full Request object. Concrete typing
|
|
keeps msgspec serialization deterministic across IPC (default,
|
|
PD-disagg, multi-node executor variants) and avoids the
|
|
``list[Any]`` fallback path.
|
|
"""
|
|
|
|
request_id: str
|
|
external_req_id: str | None = None
|
|
|
|
|
|
@dataclass
|
|
class OmniSchedulerOutput(SchedulerOutput):
|
|
"""Scheduler output with omni-specific transfer metadata."""
|
|
|
|
finished_requests_needing_kv_transfer: dict[str, dict] = field(default_factory=dict)
|
|
pending_input_registrations: list[OmniChunkRecvHandle] = field(default_factory=list)
|