Skip to content

Commit 74d5fc7

Browse files
committed
Use reshape cache event for dump sync
1 parent d3fdeba commit 74d5fc7

2 files changed

Lines changed: 90 additions & 3 deletions

File tree

ucm/integration/vllm/device.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from abc import ABC, abstractmethod
1414
from dataclasses import dataclass
1515
from itertools import accumulate
16-
from typing import Dict, List, Optional, Tuple, Union
16+
from typing import Any, Dict, List, Optional, Tuple, Union
1717

1818
import torch
1919
from vllm.platforms import current_platform
@@ -26,12 +26,16 @@
2626
class Device(ABC):
2727
def __init__(self):
2828
self.events = {}
29+
self.borrowed_events = []
2930

3031
@abstractmethod
3132
def get_event_handle(self) -> int:
3233
"""Return event handle for stream sync. 0 means no event (use synchronize instead)."""
3334
pass
3435

36+
def get_event_handle_from_event(self, event: Any) -> int:
37+
return 0
38+
3539
@abstractmethod
3640
def synchronize(self):
3741
pass
@@ -114,11 +118,23 @@ def get_event_handle(self) -> int:
114118
logger.error(f"get cuda event handle failed. {e}")
115119
return 0
116120

121+
def get_event_handle_from_event(self, event: Any) -> int:
122+
try:
123+
handle = getattr(event, "cuda_event", None)
124+
if handle is None or int(handle) == 0:
125+
return 0
126+
self.borrowed_events.append(event)
127+
return int(handle)
128+
except Exception as e:
129+
logger.error(f"get cuda event handle from existing event failed. {e}")
130+
return 0
131+
117132
def synchronize(self):
118133
torch.cuda.current_stream().synchronize()
119134

120135
def destroy_event_handles(self):
121136
self.events.clear()
137+
self.borrowed_events.clear()
122138

123139
def destroy_event_handle(self, handle: int):
124140
self.events.pop(handle, None)
@@ -248,6 +264,22 @@ def get_event_handle(self) -> int:
248264
logger.error(f"get npu event handle failed. {e}")
249265
return 0
250266

267+
def get_event_handle_from_event(self, event: Any) -> int:
268+
try:
269+
handle = getattr(event, "npu_event", None)
270+
if handle is None:
271+
parameter = getattr(event, "_as_parameter_", None)
272+
if callable(parameter):
273+
parameter = parameter()
274+
handle = getattr(parameter, "value", None)
275+
if handle is None or int(handle) == 0:
276+
return 0
277+
self.borrowed_events.append(event)
278+
return int(handle)
279+
except Exception as e:
280+
logger.error(f"get npu event handle from existing event failed. {e}")
281+
return 0
282+
251283
def synchronize(self):
252284
torch.npu.current_stream().synchronize()
253285

@@ -260,6 +292,7 @@ def destroy_event_handles(self):
260292
except Exception as e:
261293
logger.error(f"destroy npu event failed. {e}")
262294
self.events.clear()
295+
self.borrowed_events.clear()
263296

264297
def destroy_event_handle(self, handle: int):
265298
import acl

ucm/integration/vllm/ucm_connector.py

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,7 @@ def __init__(
323323
self.tp_rank = self._vllm_config.parallel_config.rank
324324
self.block_size = self._vllm_config.cache_config.block_size
325325
self.is_mla = self._vllm_config.model_config.is_deepseek_mla
326+
self.use_mla = getattr(self._vllm_config.model_config, "use_mla", self.is_mla)
326327
self.num_layers = self._vllm_config.model_config.get_num_layers(
327328
self._vllm_config.parallel_config
328329
)
@@ -826,14 +827,67 @@ def start_load_kv(self, forward_context: "ForwardContext", **kwargs) -> None:
826827
def wait_for_layer_load(self, layer_name: str) -> None:
827828
pass
828829

829-
def _get_dump_event_handle(self) -> int:
830+
def _get_reshape_cache_event(
831+
self, layer_name: Optional[str], attn_metadata: Optional["AttentionMetadata"]
832+
) -> tuple[Optional[Any], str]:
833+
if attn_metadata is None:
834+
return None, "none"
835+
836+
if self.use_mla:
837+
if not layer_name:
838+
return None, "mla_missing_layer"
839+
try:
840+
layer_metadata = attn_metadata[layer_name]
841+
event = getattr(layer_metadata, "reshape_cache_event", None)
842+
if event is not None:
843+
return event, "mla_layer"
844+
except (KeyError, TypeError, AttributeError):
845+
pass
846+
return None, "mla_missing"
847+
848+
event = getattr(attn_metadata, "reshape_cache_event", None)
849+
if event is not None:
850+
return event, "direct"
851+
return None, "direct_missing"
852+
853+
def _get_dump_event_handle(
854+
self,
855+
layer_name: Optional[str] = None,
856+
attn_metadata: Optional["AttentionMetadata"] = None,
857+
) -> int:
830858
if not self.enable_event_sync:
831859
self.device.synchronize()
860+
logger.debug("dump event sync disabled; synchronized current stream.")
832861
return 0
833862

863+
reshape_cache_event, event_source = self._get_reshape_cache_event(
864+
layer_name, attn_metadata
865+
)
866+
event_handle = (
867+
self.device.get_event_handle_from_event(reshape_cache_event)
868+
if reshape_cache_event is not None
869+
else 0
870+
)
871+
if event_handle != 0:
872+
logger.debug(
873+
f"dump event handle from reshape_cache_event source={event_source}, "
874+
f"layer_name={layer_name}, handle={event_handle}."
875+
)
876+
return event_handle
877+
834878
event_handle = self.device.get_event_handle()
835879
if event_handle == 0:
836880
self.device.synchronize()
881+
logger.debug(
882+
f"dump event fallback synchronized current stream, "
883+
f"reshape_event_source={event_source}, layer_name={layer_name}."
884+
)
885+
else:
886+
logger.debug(
887+
f"dump event handle from current stream fallback, "
888+
f"reshape_event_source={event_source}, layer_name={layer_name}, "
889+
f"handle={event_handle}."
890+
)
837891
return event_handle
838892

839893
def save_kv_layer(
@@ -1140,7 +1194,7 @@ def save_kv_layer(
11401194
shard_indexs = [layer_id] * len(total_ucm_block_ids)
11411195
try:
11421196
layer_ptrs = np.ascontiguousarray(self.dump_total_ptrs[local_layer_id])
1143-
event_handle = self._get_dump_event_handle()
1197+
event_handle = self._get_dump_event_handle(layer_name, attn_metadata)
11441198
task = self.store.dump_data(
11451199
total_ucm_block_ids, shard_indexs, layer_ptrs, event_handle
11461200
)

0 commit comments

Comments
 (0)