[Bugfix][Spec Decode] Preserve draft buffers across level-2 sleep (#49774)
Signed-off-by: aoshen02 <aoshen02@users.noreply.github.com> Signed-off-by: vx120 <893600387@qq.com> Co-authored-by: aoshen02 <aoshen02@users.noreply.github.com> Co-authored-by: vx120 <893600387@qq.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> Co-authored-by: Roger Wang <hey@rogerw.io>
This commit is contained in:
co-authored by
aoshen02
vx120
Claude Opus 5
Roger Wang
parent
03a2d03367
commit
b09688a6e7
@@ -154,7 +154,7 @@ class Worker(WorkerBase):
|
||||
self.worker_sentinel = WorkerSentinel(worker=self)
|
||||
# Buffers saved before sleep
|
||||
self._sleep_saved_buffers: dict[str, torch.Tensor] = {}
|
||||
self._sleep_rebuild_draft_metadata_buffers = False
|
||||
self._sleep_saved_draft_buffers: dict[str, torch.Tensor] = {}
|
||||
|
||||
# Weight transfer engine is created in `load_model` once the model
|
||||
# is available, since the engine needs a reference to the model.
|
||||
@@ -200,10 +200,10 @@ class Worker(WorkerBase):
|
||||
name: buffer.cpu().clone() for name, buffer in model.named_buffers()
|
||||
}
|
||||
draft = self.get_draft_model()
|
||||
inner = getattr(draft, "model", None) if draft is not None else None
|
||||
self._sleep_rebuild_draft_metadata_buffers = inner is not None and hasattr(
|
||||
inner, "_build_fused_kv_buffers"
|
||||
)
|
||||
if draft is not None:
|
||||
self._sleep_saved_draft_buffers = {
|
||||
name: buffer.cpu().clone() for name, buffer in draft.named_buffers()
|
||||
}
|
||||
|
||||
self._get_sleep_mode_backend().suspend(level)
|
||||
|
||||
@@ -228,20 +228,21 @@ class Worker(WorkerBase):
|
||||
self._get_sleep_mode_backend().resume(tags)
|
||||
|
||||
# Restore the buffers after level 2 sleep
|
||||
if len(self._sleep_saved_buffers):
|
||||
wake_weights = tags is None or "weights" in tags
|
||||
if wake_weights and len(self._sleep_saved_buffers):
|
||||
model = self.model_runner.model
|
||||
for name, buffer in model.named_buffers():
|
||||
if name in self._sleep_saved_buffers:
|
||||
buffer.data.copy_(self._sleep_saved_buffers[name].data)
|
||||
self._sleep_saved_buffers = {}
|
||||
|
||||
if self._sleep_rebuild_draft_metadata_buffers:
|
||||
if wake_weights and len(self._sleep_saved_draft_buffers):
|
||||
draft = self.get_draft_model()
|
||||
if draft is not None:
|
||||
inner = getattr(draft, "model", None)
|
||||
if inner is not None and hasattr(inner, "_build_fused_kv_buffers"):
|
||||
inner._build_fused_kv_buffers()
|
||||
self._sleep_rebuild_draft_metadata_buffers = False
|
||||
for name, buffer in draft.named_buffers():
|
||||
if name in self._sleep_saved_draft_buffers:
|
||||
buffer.data.copy_(self._sleep_saved_draft_buffers[name].data)
|
||||
self._sleep_saved_draft_buffers = {}
|
||||
|
||||
if tags is None or "kv_cache" in tags:
|
||||
self.model_runner.post_kv_cache_wake_up()
|
||||
|
||||
Reference in New Issue
Block a user