From ebbb2d55ace74b7066bca0ff8f333012bb8c4299 Mon Sep 17 00:00:00 2001 From: Jee Jee Li Date: Thu, 18 Jun 2026 08:34:15 +0800 Subject: [PATCH] [CI/Build][Bugfix] Fix SD LoRA (#45941) Signed-off-by: Jee Jee Li --- vllm/v1/worker/gpu/spec_decode/eagle/utils.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/vllm/v1/worker/gpu/spec_decode/eagle/utils.py b/vllm/v1/worker/gpu/spec_decode/eagle/utils.py index c292c2b6cb4..ed441b380f0 100644 --- a/vllm/v1/worker/gpu/spec_decode/eagle/utils.py +++ b/vllm/v1/worker/gpu/spec_decode/eagle/utils.py @@ -5,6 +5,7 @@ import torch.nn as nn from vllm.config import VllmConfig from vllm.distributed.parallel_state import get_pp_group +from vllm.lora.layers.base import BaseLayerWithLoRA from vllm.model_executor.model_loader import get_model @@ -48,6 +49,13 @@ def load_eagle_model(target_model: nn.Module, vllm_config: VllmConfig) -> nn.Mod target_embed = getattr(target_inner, "embed_tokens", None) or getattr( target_inner, "embedding", None ) + # If the target's embedding is LoRA-wrapped, share the underlying base + # layer. The draft is not part of the LoRA adapter; sharing the wrapper + # would make the draft run the LoRA embedding kernel with the target's + # punica metadata (sized for the target's token count), causing an + # out-of-bounds GPU access during multi-step draft decode. + if isinstance(target_embed, BaseLayerWithLoRA): + target_embed = target_embed.base_layer draft_embed = getattr(draft_inner, "embed_tokens", None) if target_embed is not None and _should_share( eagle_model, "has_own_embed_tokens", draft_embed, target_embed