Pin scheduler metadata before asynchronous H2D copies (#35944)
Co-authored-by: weireweire <20922698+weireweire@users.noreply.github.com>
This commit is contained in:
@@ -302,8 +302,13 @@ def alloc_for_extend(
|
|||||||
]
|
]
|
||||||
|
|
||||||
# Create tensors for allocation
|
# Create tensors for allocation
|
||||||
prefix_lens_cpu = torch.tensor(batch.prefix_lens, dtype=torch.int64)
|
pin_memory = is_pin_memory_available(batch.device)
|
||||||
extend_lens_cpu = torch.tensor(batch.extend_lens, dtype=torch.int64)
|
prefix_lens_cpu = torch.tensor(
|
||||||
|
batch.prefix_lens, dtype=torch.int64, pin_memory=pin_memory
|
||||||
|
)
|
||||||
|
extend_lens_cpu = torch.tensor(
|
||||||
|
batch.extend_lens, dtype=torch.int64, pin_memory=pin_memory
|
||||||
|
)
|
||||||
prefix_lens_device = prefix_lens_cpu.to(batch.device, non_blocking=True)
|
prefix_lens_device = prefix_lens_cpu.to(batch.device, non_blocking=True)
|
||||||
extend_lens_device = extend_lens_cpu.to(batch.device, non_blocking=True)
|
extend_lens_device = extend_lens_cpu.to(batch.device, non_blocking=True)
|
||||||
|
|
||||||
@@ -311,7 +316,9 @@ def alloc_for_extend(
|
|||||||
req_pool_indices = alloc_req_slots(
|
req_pool_indices = alloc_req_slots(
|
||||||
batch.req_to_token_pool, batch.reqs, batch.tree_cache
|
batch.req_to_token_pool, batch.reqs, batch.tree_cache
|
||||||
)
|
)
|
||||||
req_pool_indices_cpu = torch.tensor(req_pool_indices, dtype=torch.int64)
|
req_pool_indices_cpu = torch.tensor(
|
||||||
|
req_pool_indices, dtype=torch.int64, pin_memory=pin_memory
|
||||||
|
)
|
||||||
req_pool_indices_device = req_pool_indices_cpu.to(batch.device, non_blocking=True)
|
req_pool_indices_device = req_pool_indices_cpu.to(batch.device, non_blocking=True)
|
||||||
|
|
||||||
# Allocate KV cache (throws exception on failure)
|
# Allocate KV cache (throws exception on failure)
|
||||||
|
|||||||
@@ -707,12 +707,15 @@ class ForwardBatch(ForwardBatchDeepSeekMHAMixin):
|
|||||||
|
|
||||||
self.original_global_num_tokens_cpu = batch.global_num_tokens
|
self.original_global_num_tokens_cpu = batch.global_num_tokens
|
||||||
self.global_num_tokens_cpu = global_num_tokens
|
self.global_num_tokens_cpu = global_num_tokens
|
||||||
|
pin_memory = is_pin_memory_available(device)
|
||||||
self.global_num_tokens_gpu = torch.tensor(
|
self.global_num_tokens_gpu = torch.tensor(
|
||||||
global_num_tokens, dtype=torch.int64
|
global_num_tokens, dtype=torch.int64, pin_memory=pin_memory
|
||||||
).to(device, non_blocking=True)
|
).to(device, non_blocking=True)
|
||||||
self.global_num_tokens_for_logprob_cpu = global_num_tokens_for_logprob
|
self.global_num_tokens_for_logprob_cpu = global_num_tokens_for_logprob
|
||||||
self.global_num_tokens_for_logprob_gpu = torch.tensor(
|
self.global_num_tokens_for_logprob_gpu = torch.tensor(
|
||||||
global_num_tokens_for_logprob, dtype=torch.int64
|
global_num_tokens_for_logprob,
|
||||||
|
dtype=torch.int64,
|
||||||
|
pin_memory=pin_memory,
|
||||||
).to(device, non_blocking=True)
|
).to(device, non_blocking=True)
|
||||||
self.can_run_decode_cuda_graph = batch.can_run_decode_cuda_graph
|
self.can_run_decode_cuda_graph = batch.can_run_decode_cuda_graph
|
||||||
|
|
||||||
@@ -850,9 +853,11 @@ class ForwardBatch(ForwardBatchDeepSeekMHAMixin):
|
|||||||
|
|
||||||
num_tokens = len(batch.input_ids) if batch.input_ids is not None else 0
|
num_tokens = len(batch.input_ids) if batch.input_ids is not None else 0
|
||||||
if enable_num_token_non_padded():
|
if enable_num_token_non_padded():
|
||||||
ret.num_token_non_padded = torch.tensor(num_tokens, dtype=torch.int32).to(
|
ret.num_token_non_padded = torch.tensor(
|
||||||
device, non_blocking=True
|
num_tokens,
|
||||||
)
|
dtype=torch.int32,
|
||||||
|
pin_memory=is_pin_memory_available(device),
|
||||||
|
).to(device, non_blocking=True)
|
||||||
ret.num_token_non_padded_cpu = num_tokens
|
ret.num_token_non_padded_cpu = num_tokens
|
||||||
|
|
||||||
ret.init_mlp_sync_metadata(batch, device)
|
ret.init_mlp_sync_metadata(batch, device)
|
||||||
@@ -890,11 +895,12 @@ class ForwardBatch(ForwardBatchDeepSeekMHAMixin):
|
|||||||
if isinstance(extend_seq_lens, list):
|
if isinstance(extend_seq_lens, list):
|
||||||
# Main path: H2D from host lists; populate *_cpu mirrors.
|
# Main path: H2D from host lists; populate *_cpu mirrors.
|
||||||
assert isinstance(extend_prefix_lens, list)
|
assert isinstance(extend_prefix_lens, list)
|
||||||
|
pin_memory = is_pin_memory_available(device)
|
||||||
ret.extend_seq_lens = torch.tensor(
|
ret.extend_seq_lens = torch.tensor(
|
||||||
extend_seq_lens, dtype=torch.int32
|
extend_seq_lens, dtype=torch.int32, pin_memory=pin_memory
|
||||||
).to(device, non_blocking=True)
|
).to(device, non_blocking=True)
|
||||||
ret.extend_prefix_lens = torch.tensor(
|
ret.extend_prefix_lens = torch.tensor(
|
||||||
extend_prefix_lens, dtype=torch.int32
|
extend_prefix_lens, dtype=torch.int32, pin_memory=pin_memory
|
||||||
).to(device, non_blocking=True)
|
).to(device, non_blocking=True)
|
||||||
ret.extend_prefix_lens_cpu = extend_prefix_lens
|
ret.extend_prefix_lens_cpu = extend_prefix_lens
|
||||||
ret.extend_seq_lens_cpu = extend_seq_lens
|
ret.extend_seq_lens_cpu = extend_seq_lens
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ from sglang.srt.speculative.spec_info import (
|
|||||||
spec_scale_global_num_tokens,
|
spec_scale_global_num_tokens,
|
||||||
)
|
)
|
||||||
from sglang.srt.speculative.spec_utils import draft_tp_context
|
from sglang.srt.speculative.spec_utils import draft_tp_context
|
||||||
|
from sglang.srt.utils.common import is_pin_memory_available
|
||||||
from sglang.srt.utils.invariants import Bucket, Invariant, NotNaN, expect
|
from sglang.srt.utils.invariants import Bucket, Invariant, NotNaN, expect
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@@ -55,7 +56,11 @@ def _make_num_token_non_padded(
|
|||||||
) -> Optional[torch.Tensor]:
|
) -> Optional[torch.Tensor]:
|
||||||
if not enable_num_token_non_padded():
|
if not enable_num_token_non_padded():
|
||||||
return None
|
return None
|
||||||
return torch.tensor(num_tokens, dtype=torch.int32).to(device, non_blocking=True)
|
return torch.tensor(
|
||||||
|
num_tokens,
|
||||||
|
dtype=torch.int32,
|
||||||
|
pin_memory=is_pin_memory_available(device),
|
||||||
|
).to(device, non_blocking=True)
|
||||||
|
|
||||||
|
|
||||||
class DraftBlockResult(msgspec.Struct, frozen=True):
|
class DraftBlockResult(msgspec.Struct, frozen=True):
|
||||||
@@ -467,16 +472,16 @@ class DraftBlockProposer:
|
|||||||
device = self.draft_model_runner.device
|
device = self.draft_model_runner.device
|
||||||
forward_batch.original_global_num_tokens_cpu = batch.global_num_tokens
|
forward_batch.original_global_num_tokens_cpu = batch.global_num_tokens
|
||||||
num_tokens = forward_batch.input_ids.numel()
|
num_tokens = forward_batch.input_ids.numel()
|
||||||
if enable_num_token_non_padded():
|
num_token_non_padded = _make_num_token_non_padded(num_tokens, device)
|
||||||
forward_batch.num_token_non_padded = torch.tensor(
|
if num_token_non_padded is not None:
|
||||||
num_tokens, dtype=torch.int32, device=device
|
forward_batch.num_token_non_padded = num_token_non_padded
|
||||||
)
|
|
||||||
forward_batch.num_token_non_padded_cpu = num_tokens
|
forward_batch.num_token_non_padded_cpu = num_tokens
|
||||||
forward_batch.global_num_tokens_cpu = gnt
|
forward_batch.global_num_tokens_cpu = gnt
|
||||||
forward_batch.global_num_tokens_for_logprob_cpu = gnt_logprob
|
forward_batch.global_num_tokens_for_logprob_cpu = gnt_logprob
|
||||||
forward_batch.global_num_tokens_gpu = torch.tensor(gnt, dtype=torch.int64).to(
|
pin_memory = is_pin_memory_available(device)
|
||||||
device, non_blocking=True
|
forward_batch.global_num_tokens_gpu = torch.tensor(
|
||||||
)
|
gnt, dtype=torch.int64, pin_memory=pin_memory
|
||||||
|
).to(device, non_blocking=True)
|
||||||
forward_batch.global_num_tokens_for_logprob_gpu = torch.tensor(
|
forward_batch.global_num_tokens_for_logprob_gpu = torch.tensor(
|
||||||
gnt_logprob, dtype=torch.int64
|
gnt_logprob, dtype=torch.int64, pin_memory=pin_memory
|
||||||
).to(device, non_blocking=True)
|
).to(device, non_blocking=True)
|
||||||
|
|||||||
@@ -74,7 +74,12 @@ from sglang.srt.speculative.spec_utils import (
|
|||||||
draft_tp_context,
|
draft_tp_context,
|
||||||
prepare_mamba_track_for_verify,
|
prepare_mamba_track_for_verify,
|
||||||
)
|
)
|
||||||
from sglang.srt.utils import get_available_gpu_memory, is_cuda, is_npu
|
from sglang.srt.utils import (
|
||||||
|
get_available_gpu_memory,
|
||||||
|
is_cuda,
|
||||||
|
is_npu,
|
||||||
|
is_pin_memory_available,
|
||||||
|
)
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -477,10 +482,13 @@ class DSparkWorkerV2(BaseSpecWorker):
|
|||||||
# Must inject before prefill returns: the scheduler may update radix
|
# Must inject before prefill returns: the scheduler may update radix
|
||||||
# afterward, invalidating out_cache_loc.
|
# afterward, invalidating out_cache_loc.
|
||||||
device = next_token_ids.device
|
device = next_token_ids.device
|
||||||
ctx_lens = torch.tensor(batch.extend_lens, dtype=torch.int32, device=device)
|
pin_memory = is_pin_memory_available(device)
|
||||||
|
ctx_lens = torch.tensor(
|
||||||
|
batch.extend_lens, dtype=torch.int32, pin_memory=pin_memory
|
||||||
|
).to(device, non_blocking=True)
|
||||||
draft_seq_lens = torch.tensor(
|
draft_seq_lens = torch.tensor(
|
||||||
batch.prefix_lens, dtype=torch.int32, device=device
|
batch.prefix_lens, dtype=torch.int32, pin_memory=pin_memory
|
||||||
)
|
).to(device, non_blocking=True)
|
||||||
positions, _ = compute_position(
|
positions, _ = compute_position(
|
||||||
self.model_runner.prefill_attention_backend_str,
|
self.model_runner.prefill_attention_backend_str,
|
||||||
draft_seq_lens,
|
draft_seq_lens,
|
||||||
|
|||||||
Reference in New Issue
Block a user