[perf] avoid hidden states d2h when return_hidden_states=false (#25155)
This commit is contained in:
@@ -3044,7 +3044,10 @@ class Scheduler(
|
|||||||
batch_result.copy_done = self.device_module.Event()
|
batch_result.copy_done = self.device_module.Event()
|
||||||
if batch_result.delay_sample_func is None:
|
if batch_result.delay_sample_func is None:
|
||||||
self.future_map.store_to_map(future_indices, batch_result)
|
self.future_map.store_to_map(future_indices, batch_result)
|
||||||
batch_result.copy_to_cpu(return_logprob=batch.return_logprob)
|
batch_result.copy_to_cpu(
|
||||||
|
return_logprob=batch.return_logprob,
|
||||||
|
return_hidden_states=batch.return_hidden_states,
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
batch_result.future_indices = future_indices
|
batch_result.future_indices = future_indices
|
||||||
|
|
||||||
@@ -3149,7 +3152,10 @@ class Scheduler(
|
|||||||
_batch_result = batch_result.delay_sample_func()
|
_batch_result = batch_result.delay_sample_func()
|
||||||
assert _batch_result is batch_result
|
assert _batch_result is batch_result
|
||||||
self.future_map.store_to_map(batch_result.future_indices, batch_result)
|
self.future_map.store_to_map(batch_result.future_indices, batch_result)
|
||||||
batch_result.copy_to_cpu(return_logprob=self.cur_batch.return_logprob)
|
batch_result.copy_to_cpu(
|
||||||
|
return_logprob=self.cur_batch.return_logprob,
|
||||||
|
return_hidden_states=self.cur_batch.return_hidden_states,
|
||||||
|
)
|
||||||
|
|
||||||
# Release the closure and large GPU tensors that are no longer needed.
|
# Release the closure and large GPU tensors that are no longer needed.
|
||||||
# The delay_sample_func closure captures forward_batch (which holds
|
# The delay_sample_func closure captures forward_batch (which holds
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ class GenerationBatchResult:
|
|||||||
fpm_start_event: Optional[torch.cuda.Event] = None
|
fpm_start_event: Optional[torch.cuda.Event] = None
|
||||||
fpm_end_event: Optional[torch.cuda.Event] = None
|
fpm_end_event: Optional[torch.cuda.Event] = None
|
||||||
|
|
||||||
def copy_to_cpu(self, return_logprob: bool):
|
def copy_to_cpu(self, return_logprob: bool, return_hidden_states: bool = True):
|
||||||
"""Copy tensors to CPU in overlap scheduling.
|
"""Copy tensors to CPU in overlap scheduling.
|
||||||
Only the tensors which are needed for processing results are copied,
|
Only the tensors which are needed for processing results are copied,
|
||||||
e.g., next_token_ids, logits outputs
|
e.g., next_token_ids, logits outputs
|
||||||
@@ -88,7 +88,7 @@ class GenerationBatchResult:
|
|||||||
v.to("cpu", non_blocking=True) if torch.is_tensor(v) else v
|
v.to("cpu", non_blocking=True) if torch.is_tensor(v) else v
|
||||||
for v in self.logits_output.next_token_token_ids_logprobs_val
|
for v in self.logits_output.next_token_token_ids_logprobs_val
|
||||||
]
|
]
|
||||||
if self.logits_output.hidden_states is not None:
|
if return_hidden_states and self.logits_output.hidden_states is not None:
|
||||||
self.logits_output.hidden_states = self.logits_output.hidden_states.to(
|
self.logits_output.hidden_states = self.logits_output.hidden_states.to(
|
||||||
"cpu", non_blocking=True
|
"cpu", non_blocking=True
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user