[sgl]add pin_mem to remove cpu->gpu copy sync point (#19795)
Co-authored-by: Liangsheng Yin <hnyls2002@gmail.com> Co-authored-by: hnyls2002 <lsyincs@gmail.com>
This commit is contained in:
co-authored by
Liangsheng Yin
hnyls2002
parent
b7f7df7ee6
commit
73bf2c5bdc
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
from sglang.srt.dllm.config import DllmConfig
|
from sglang.srt.dllm.config import DllmConfig
|
||||||
from sglang.srt.model_executor.forward_batch_info import ForwardBatch
|
from sglang.srt.model_executor.forward_batch_info import ForwardBatch
|
||||||
from sglang.srt.utils.common import ceil_align
|
from sglang.srt.utils.common import ceil_align, is_pin_memory_available
|
||||||
|
|
||||||
# Copyright 2023-2024 SGLang Team
|
# Copyright 2023-2024 SGLang Team
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -1347,6 +1347,7 @@ class ScheduleBatch(ScheduleBatchDisaggregationDecodeMixin):
|
|||||||
return self.dllm_config is not None
|
return self.dllm_config is not None
|
||||||
|
|
||||||
def prepare_encoder_info_extend(self, input_ids: List[int], seq_lens: List[int]):
|
def prepare_encoder_info_extend(self, input_ids: List[int], seq_lens: List[int]):
|
||||||
|
_pin = is_pin_memory_available(self.device)
|
||||||
self.encoder_lens_cpu = []
|
self.encoder_lens_cpu = []
|
||||||
self.encoder_cached = []
|
self.encoder_cached = []
|
||||||
|
|
||||||
@@ -1363,9 +1364,9 @@ class ScheduleBatch(ScheduleBatchDisaggregationDecodeMixin):
|
|||||||
or len(req.prefix_indices) >= im.num_image_tokens
|
or len(req.prefix_indices) >= im.num_image_tokens
|
||||||
)
|
)
|
||||||
|
|
||||||
self.encoder_lens = torch.tensor(self.encoder_lens_cpu, dtype=torch.int64).to(
|
self.encoder_lens = torch.tensor(
|
||||||
self.device, non_blocking=True
|
self.encoder_lens_cpu, dtype=torch.int64, pin_memory=_pin
|
||||||
)
|
).to(self.device, non_blocking=True)
|
||||||
|
|
||||||
# Strip encoder infos
|
# Strip encoder infos
|
||||||
pt = 0
|
pt = 0
|
||||||
@@ -1394,10 +1395,10 @@ class ScheduleBatch(ScheduleBatchDisaggregationDecodeMixin):
|
|||||||
pt += req.extend_input_len
|
pt += req.extend_input_len
|
||||||
|
|
||||||
# Reassign
|
# Reassign
|
||||||
self.input_ids = torch.tensor(sum(input_ids, []), dtype=torch.int64).to(
|
self.input_ids = torch.tensor(
|
||||||
self.device, non_blocking=True
|
sum(input_ids, []), dtype=torch.int64, pin_memory=_pin
|
||||||
)
|
).to(self.device, non_blocking=True)
|
||||||
self.seq_lens = torch.tensor(seq_lens, dtype=torch.int64).to(
|
self.seq_lens = torch.tensor(seq_lens, dtype=torch.int64, pin_memory=_pin).to(
|
||||||
self.device, non_blocking=True
|
self.device, non_blocking=True
|
||||||
)
|
)
|
||||||
self.seq_lens_cpu = torch.tensor(seq_lens, dtype=torch.int64)
|
self.seq_lens_cpu = torch.tensor(seq_lens, dtype=torch.int64)
|
||||||
@@ -1449,7 +1450,7 @@ class ScheduleBatch(ScheduleBatchDisaggregationDecodeMixin):
|
|||||||
r.token_type_ids for r in reqs if r.token_type_ids is not None
|
r.token_type_ids for r in reqs if r.token_type_ids is not None
|
||||||
]
|
]
|
||||||
|
|
||||||
_pin = self.device != "cpu" and torch.cuda.is_available()
|
_pin = is_pin_memory_available(self.device)
|
||||||
input_ids_tensor = torch.tensor(
|
input_ids_tensor = torch.tensor(
|
||||||
list(chain.from_iterable(input_ids)), dtype=torch.int64, pin_memory=_pin
|
list(chain.from_iterable(input_ids)), dtype=torch.int64, pin_memory=_pin
|
||||||
).to(self.device, non_blocking=True)
|
).to(self.device, non_blocking=True)
|
||||||
@@ -2056,9 +2057,11 @@ class ScheduleBatch(ScheduleBatchDisaggregationDecodeMixin):
|
|||||||
# No need to filter
|
# No need to filter
|
||||||
return
|
return
|
||||||
|
|
||||||
keep_indices_device = torch.tensor(keep_indices, dtype=torch.int64).to(
|
keep_indices_device = torch.tensor(
|
||||||
self.device, non_blocking=True
|
keep_indices,
|
||||||
)
|
dtype=torch.int64,
|
||||||
|
pin_memory=is_pin_memory_available(self.device),
|
||||||
|
).to(self.device, non_blocking=True)
|
||||||
|
|
||||||
if self.model_config.is_encoder_decoder:
|
if self.model_config.is_encoder_decoder:
|
||||||
self.encoder_lens = self.encoder_lens[keep_indices_device]
|
self.encoder_lens = self.encoder_lens[keep_indices_device]
|
||||||
|
|||||||
@@ -609,8 +609,12 @@ def get_available_gpu_memory(
|
|||||||
return free_gpu_memory / (1 << 30)
|
return free_gpu_memory / (1 << 30)
|
||||||
|
|
||||||
|
|
||||||
def is_pin_memory_available() -> bool:
|
def is_pin_memory_available(device=None) -> bool:
|
||||||
return torch.cuda.is_available()
|
if not torch.cuda.is_available():
|
||||||
|
return False
|
||||||
|
if device is not None and str(device) == "cpu":
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
class LayerFn(Protocol):
|
class LayerFn(Protocol):
|
||||||
|
|||||||
Reference in New Issue
Block a user