@@ -239,9 +239,9 @@ class DynamicInferenceContext(BaseInferenceContext):
239239 use_flashinfer_fused_rope (bool): If True, use flashinfer's fused rope implementation.
240240 If None, defaults to using flash-infer if available.
241241 metrics_writer (Optional['WandbModule']): Wandb module for writing metrics.
242- num_request_metadata (Optional[int] ): Number of metadata fields to track per request.
243- These represent metadata that is needed by the text generation controller,
244- and that must be kept in sync with active requests through update_requests .
242+ request_metadata_types (Optional[List[Tuple[str, torch.dtype, bool]]] ): A list of the
243+ per-request metadata types to track. Each entry is a tuple consisting of the string
244+ label, the target dtype, and whether to store the data on GPU .
245245 """
246246
247247 DEFAULT_MAX_TOKENS = 16384
@@ -270,7 +270,7 @@ def __init__(
270270 use_flashinfer_fused_rope : bool = False ,
271271 unified_memory_level : Optional [int ] = 1 ,
272272 metrics_writer : Optional ['WandbModule' ] = None ,
273- num_request_metadata : Optional [int ] = None ,
273+ request_metadata_types : Optional [List [ Tuple [ str , torch . dtype , bool ]] ] = None ,
274274 ):
275275 super ().__init__ (materialize_only_last_token_logits = materialize_only_last_token_logits )
276276
@@ -395,9 +395,9 @@ def __init__(
395395 )
396396
397397 # Track request metadata.
398- if num_request_metadata is None :
399- num_request_metadata = len ( DynamicInferenceRequest .get_metadata_labels () )
400- self .num_request_metadata = num_request_metadata
398+ if request_metadata_types is None :
399+ request_metadata_types = DynamicInferenceRequest .get_metadata_types ( )
400+ self .request_metadata_types = request_metadata_types
401401
402402 # Initialize context state.
403403 self .params_dtype = params_dtype
@@ -554,11 +554,14 @@ def allocate_all_tensors(self, *, is_init: bool) -> None:
554554 )
555555
556556 # Track request metadata.
557- self .request_metadata = torch .empty (
558- (self .max_total_requests , self .num_request_metadata ),
559- dtype = torch .float32 ,
560- device = torch .cuda .current_device (),
561- )
557+ self .request_metadata = {
558+ label : torch .empty (
559+ (self .max_total_requests ,),
560+ dtype = dtype ,
561+ device = torch .cuda .current_device () if on_gpu else torch .device ("cpu" ),
562+ )
563+ for label , dtype , on_gpu in self .request_metadata_types
564+ }
562565
563566 # Per-token state.
564567 self .token_to_input_ids = torch .full (
@@ -1170,7 +1173,10 @@ def reset(self) -> None:
11701173 self .request_last_kv_block_id .fill_ (- 1 )
11711174 self .request_last_kv_block_offset .fill_ (0 )
11721175 self .request_to_kv_block_ids .fill_ (- 1 )
1173- self .request_metadata .fill_ (0 )
1176+
1177+ # Reset request metadata.
1178+ for metadata_tensor in self .request_metadata .values ():
1179+ metadata_tensor .fill_ (0 )
11741180
11751181 # Reset token indexes.
11761182 self .token_to_input_ids .fill_ (0 )
@@ -1322,14 +1328,17 @@ def add_request(self, req: DynamicInferenceRequest, chunk_length: Optional[int]
13221328 raise TokenOverflowError (req .request_id )
13231329
13241330 self .request_ids [current_id ] = req .request_id
1331+
13251332 # Handle request metadata.
1326- metadata = req .tracked_metadata
13271333 assert (
1328- len (metadata ) == self .num_request_metadata
1329- ), "Request added to context with invalid metadata length"
1330- self .request_metadata [current_id ] = torch .tensor (
1331- metadata , dtype = torch .float32 , device = self .request_metadata .device
1332- )
1334+ req .get_metadata_types () == self .request_metadata_types
1335+ ), "Request added to context with invalid metadata types"
1336+ metadata = req .tracked_metadata
1337+ metadata_types = req .get_metadata_types ()
1338+ for m , m_type in zip (metadata , metadata_types ):
1339+ label , _ , _ = m_type
1340+ self .request_metadata [label ][current_id ] = m
1341+
13331342 # Handle length and block assignments.
13341343 self .request_query_lengths [current_id ] = chunk_length
13351344 self .request_output_lengths [current_id ] = (
@@ -1395,7 +1404,6 @@ def _move_book_keeping_tensors(self, src_idxs, dst_idxs, next_tokens):
13951404 self .request_kv_length_offsets [dst_idxs ] = self .request_kv_length_offsets [src_idxs ]
13961405 self .request_query_lengths [dst_idxs ] = self .request_query_lengths [src_idxs ]
13971406 self .request_output_lengths [dst_idxs ] = self .request_output_lengths [src_idxs ]
1398- self .request_metadata [dst_idxs ] = self .request_metadata [src_idxs ]
13991407 self .request_ids [dst_idxs ] = self .request_ids [src_idxs ]
14001408 next_tokens [dst_idxs ] = next_tokens [src_idxs ]
14011409
@@ -1404,6 +1412,9 @@ def _move_book_keeping_tensors(self, src_idxs, dst_idxs, next_tokens):
14041412 self .request_last_kv_block_id [dst_idxs ] = self .request_last_kv_block_id [src_idxs ]
14051413 self .request_last_kv_block_offset [dst_idxs ] = self .request_last_kv_block_offset [src_idxs ]
14061414
1415+ for metadata_tensor in self .request_metadata .values ():
1416+ metadata_tensor [dst_idxs ] = metadata_tensor [src_idxs ]
1417+
14071418 if self .is_hybrid_model :
14081419 self .mamba_metadata .request_to_mamba_state_idx [dst_idxs ] = (
14091420 self .mamba_metadata .request_to_mamba_state_idx [src_idxs ]
@@ -1416,14 +1427,16 @@ def _swap_book_keeping_tensors(self, src_idxs, dst_idxs, next_tokens):
14161427 tensor_swap (self .request_kv_length_offsets , src_idxs , dst_idxs )
14171428 tensor_swap (self .request_query_lengths , src_idxs , dst_idxs )
14181429 tensor_swap (self .request_output_lengths , src_idxs , dst_idxs )
1419- tensor_swap (self .request_metadata , src_idxs , dst_idxs )
14201430 tensor_swap (self .request_ids , src_idxs , dst_idxs )
14211431 tensor_swap (next_tokens , src_idxs , dst_idxs )
14221432 tensor_swap (self .request_to_kv_block_ids , src_idxs , dst_idxs )
14231433 tensor_swap (self .request_kv_block_counts , src_idxs , dst_idxs )
14241434 tensor_swap (self .request_last_kv_block_id , src_idxs , dst_idxs )
14251435 tensor_swap (self .request_last_kv_block_offset , src_idxs , dst_idxs )
14261436
1437+ for metadata_tensor in self .request_metadata .values ():
1438+ tensor_swap (metadata_tensor , src_idxs , dst_idxs )
1439+
14271440 if self .is_hybrid_model :
14281441 tensor_swap (self .mamba_metadata .request_to_mamba_state_idx , src_idxs , dst_idxs )
14291442
0 commit comments