Feat/support rerank (#6058)
This commit is contained in:
@@ -481,7 +481,7 @@ class TokenizedGenerateReqInput:
|
||||
@dataclass
|
||||
class EmbeddingReqInput:
|
||||
# The input prompt. It can be a single prompt or a batch of prompts.
|
||||
text: Optional[Union[List[str], str]] = None
|
||||
text: Optional[Union[List[List[str]], List[str], str]] = None
|
||||
# The image input. It can be an image instance, file name, URL, or base64 encoded string.
|
||||
# Can be formatted as:
|
||||
# - Single image for a single request
|
||||
@@ -505,6 +505,8 @@ class EmbeddingReqInput:
|
||||
log_metrics: bool = True
|
||||
# The modalities of the image data [image, multi-images, video]
|
||||
modalities: Optional[List[str]] = None
|
||||
# For cross-encoder requests
|
||||
is_cross_encoder_request: bool = False
|
||||
|
||||
def contains_mm_input(self) -> bool:
|
||||
return has_valid_data(self.image_data) or has_valid_data(self.audio_data)
|
||||
@@ -564,6 +566,16 @@ class EmbeddingReqInput:
|
||||
return self.rid
|
||||
|
||||
def __getitem__(self, i):
|
||||
if self.is_cross_encoder_request:
|
||||
return EmbeddingReqInput(
|
||||
text=[self.text[i]] if self.text is not None else None,
|
||||
input_ids=None,
|
||||
image_data=None,
|
||||
sampling_params=self.sampling_params[i],
|
||||
rid=self.rid[i],
|
||||
is_cross_encoder_request=True,
|
||||
)
|
||||
|
||||
return EmbeddingReqInput(
|
||||
text=self.text[i] if self.text is not None else None,
|
||||
input_ids=self.input_ids[i] if self.input_ids is not None else None,
|
||||
@@ -583,6 +595,8 @@ class TokenizedEmbeddingReqInput:
|
||||
input_ids: List[int]
|
||||
# The image inputs
|
||||
image_inputs: dict
|
||||
# The token type ids
|
||||
token_type_ids: List[int]
|
||||
# Dummy sampling params for compatibility
|
||||
sampling_params: SamplingParams
|
||||
|
||||
@@ -847,6 +861,12 @@ class SetInternalStateReq:
|
||||
server_args: Dict[str, Any]
|
||||
|
||||
|
||||
@dataclass
|
||||
class V1RerankReqInput:
|
||||
query: str
|
||||
documents: List[str]
|
||||
|
||||
|
||||
@dataclass
|
||||
class SetInternalStateReqOutput:
|
||||
updated: bool
|
||||
|
||||
@@ -445,6 +445,7 @@ class Req:
|
||||
origin_input_ids_unpadded: Optional[Tuple[int]] = None,
|
||||
lora_path: Optional[str] = None,
|
||||
input_embeds: Optional[List[List[float]]] = None,
|
||||
token_type_ids: List[int] = None,
|
||||
session_id: Optional[str] = None,
|
||||
custom_logit_processor: Optional[str] = None,
|
||||
return_hidden_states: bool = False,
|
||||
@@ -470,6 +471,9 @@ class Req:
|
||||
self.session_id = session_id
|
||||
self.input_embeds = input_embeds
|
||||
|
||||
# for corss-endoder model
|
||||
self.token_type_ids = token_type_ids
|
||||
|
||||
# Sampling info
|
||||
if isinstance(sampling_params.custom_params, dict):
|
||||
sampling_params = copy.copy(sampling_params)
|
||||
@@ -841,6 +845,7 @@ class ScheduleBatch(ScheduleBatchDisaggregationDecodeMixin):
|
||||
# Batched arguments to model runner
|
||||
input_ids: torch.Tensor = None # shape: [b], int64
|
||||
input_embeds: torch.Tensor = None # shape: [b, hidden_size], float32
|
||||
token_type_ids: torch.Tensor = None # shape: [b], int64
|
||||
req_pool_indices: torch.Tensor = None # shape: [b], int64
|
||||
seq_lens: torch.Tensor = None # shape: [b], int64
|
||||
# The output locations of the KV cache
|
||||
@@ -1142,6 +1147,10 @@ class ScheduleBatch(ScheduleBatchDisaggregationDecodeMixin):
|
||||
prefix_lens = [len(r.prefix_indices) for r in reqs]
|
||||
extend_lens = [r.extend_input_len for r in reqs]
|
||||
|
||||
token_type_ids = [
|
||||
r.token_type_ids for r in reqs if r.token_type_ids is not None
|
||||
]
|
||||
|
||||
req_pool_indices_tensor = torch.tensor(req_pool_indices, dtype=torch.int64).to(
|
||||
self.device, non_blocking=True
|
||||
)
|
||||
@@ -1154,6 +1163,13 @@ class ScheduleBatch(ScheduleBatchDisaggregationDecodeMixin):
|
||||
prefix_lens_tensor = torch.tensor(
|
||||
prefix_lens, dtype=torch.int64, device=self.device
|
||||
)
|
||||
|
||||
token_type_ids_tensor = None
|
||||
if len(token_type_ids) > 0:
|
||||
token_type_ids_tensor = torch.tensor(
|
||||
sum(token_type_ids, []), dtype=torch.int64
|
||||
).to(self.device, non_blocking=True)
|
||||
|
||||
extend_lens_tensor = seq_lens_tensor - prefix_lens_tensor
|
||||
|
||||
# Copy prefix and do some basic check
|
||||
@@ -1269,6 +1285,7 @@ class ScheduleBatch(ScheduleBatchDisaggregationDecodeMixin):
|
||||
self.device, non_blocking=True
|
||||
)
|
||||
self.multimodal_inputs = multimodal_inputs
|
||||
self.token_type_ids = token_type_ids_tensor
|
||||
self.seq_lens_sum = sum(seq_lens)
|
||||
|
||||
if self.return_logprob:
|
||||
@@ -1714,6 +1731,7 @@ class ScheduleBatch(ScheduleBatchDisaggregationDecodeMixin):
|
||||
lora_paths=[req.lora_path for req in self.reqs],
|
||||
sampling_info=self.sampling_info,
|
||||
input_embeds=self.input_embeds,
|
||||
token_type_ids=self.token_type_ids,
|
||||
spec_algorithm=self.spec_algorithm,
|
||||
spec_info=self.spec_info,
|
||||
capture_hidden_mode=(
|
||||
@@ -1807,6 +1825,9 @@ class ModelWorkerBatch:
|
||||
# The input Embeds
|
||||
input_embeds: Optional[torch.tensor] = None
|
||||
|
||||
# For corss-encoder model
|
||||
token_type_ids: Optional[torch.Tensor] = None
|
||||
|
||||
# Speculative decoding
|
||||
spec_algorithm: SpeculativeAlgorithm = None
|
||||
spec_info: Optional[Union[EagleVerifyInput, EagleDraftInput]] = None
|
||||
|
||||
@@ -1150,6 +1150,7 @@ class Scheduler(
|
||||
recv_req.input_text,
|
||||
recv_req.input_ids,
|
||||
recv_req.sampling_params,
|
||||
token_type_ids=recv_req.token_type_ids,
|
||||
)
|
||||
req.tokenizer = self.tokenizer
|
||||
|
||||
|
||||
@@ -459,6 +459,10 @@ class TokenizerManager:
|
||||
# Tokenize
|
||||
input_embeds = None
|
||||
input_text = obj.text
|
||||
token_type_ids = None
|
||||
is_cross_encoder_request = (
|
||||
isinstance(obj, EmbeddingReqInput) and obj.is_cross_encoder_request
|
||||
)
|
||||
if obj.input_embeds is not None:
|
||||
if not self.server_args.disable_radix_cache:
|
||||
raise ValueError(
|
||||
@@ -477,7 +481,14 @@ class TokenizerManager:
|
||||
"accept text prompts. Please provide input_ids or re-initialize "
|
||||
"the engine with skip_tokenizer_init=False."
|
||||
)
|
||||
input_ids = self.tokenizer.encode(input_text)
|
||||
encoded = self.tokenizer(
|
||||
input_text, return_token_type_ids=is_cross_encoder_request
|
||||
)
|
||||
|
||||
input_ids = encoded["input_ids"]
|
||||
if is_cross_encoder_request:
|
||||
input_ids = encoded["input_ids"][0]
|
||||
token_type_ids = encoded.get("token_type_ids", [None])[0]
|
||||
|
||||
if self.mm_processor and obj.contains_mm_input():
|
||||
image_inputs = await self.mm_processor.process_mm_data_async(
|
||||
@@ -493,7 +504,7 @@ class TokenizerManager:
|
||||
|
||||
self._validate_token_len(obj, input_ids)
|
||||
return self._create_tokenized_object(
|
||||
obj, input_text, input_ids, input_embeds, image_inputs
|
||||
obj, input_text, input_ids, input_embeds, image_inputs, token_type_ids
|
||||
)
|
||||
|
||||
def _validate_token_len(
|
||||
@@ -532,6 +543,7 @@ class TokenizerManager:
|
||||
input_ids: List[int],
|
||||
input_embeds: Optional[Union[List[float], None]] = None,
|
||||
image_inputs: Optional[Dict] = None,
|
||||
token_type_ids: Optional[List[int]] = None,
|
||||
) -> Union[TokenizedGenerateReqInput, TokenizedEmbeddingReqInput]:
|
||||
"""Create a tokenized request object from common parameters."""
|
||||
|
||||
@@ -592,6 +604,7 @@ class TokenizerManager:
|
||||
input_text,
|
||||
input_ids,
|
||||
image_inputs,
|
||||
token_type_ids,
|
||||
sampling_params,
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user