From a69be2e866fbf86003e5b169d8ed066c87760c2d Mon Sep 17 00:00:00 2001 From: Kurkur <102506892+litmei@users.noreply.github.com> Date: Thu, 9 Apr 2026 11:45:36 +0800 Subject: [PATCH] [Feature] Support eagle3 for qwen3-vl (#22230) --- python/sglang/srt/models/qwen3_vl.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/python/sglang/srt/models/qwen3_vl.py b/python/sglang/srt/models/qwen3_vl.py index 7746b2445..d401ee7cd 100644 --- a/python/sglang/srt/models/qwen3_vl.py +++ b/python/sglang/srt/models/qwen3_vl.py @@ -1130,6 +1130,9 @@ class Qwen3VLForConditionalGeneration(nn.Module): self.num_deepstack_embeddings = len(self.deepstack_visual_indexes) self.use_deepstack = {Modality.IMAGE: True, Modality.VIDEO: True} + # For EAGLE3 support + self.capture_aux_hidden_states = False + def separate_deepstack_embeds(self, embedding): assert ( embedding.shape[-1] % (1 + self.num_deepstack_embeddings) == 0 @@ -1246,6 +1249,10 @@ class Qwen3VLForConditionalGeneration(nn.Module): pp_proxy_tensors=pp_proxy_tensors, ) + aux_hidden_states = None + if self.capture_aux_hidden_states: + hidden_states, aux_hidden_states = hidden_states + if self.pp_group.is_last_rank: if not get_embedding: return self.logits_processor( @@ -1253,6 +1260,7 @@ class Qwen3VLForConditionalGeneration(nn.Module): hidden_states, self.lm_head, forward_batch, + aux_hidden_states, ) else: return self.pooler(hidden_states, forward_batch) @@ -1344,5 +1352,21 @@ class Qwen3VLForConditionalGeneration(nn.Module): weight_loader = getattr(param, "weight_loader", default_weight_loader) weight_loader(param, loaded_weight) + def get_embed_and_head(self): + return self.model.embed_tokens.weight, self.lm_head.weight + + def set_eagle3_layers_to_capture(self, layer_ids: Optional[List[int]] = None): + self.capture_aux_hidden_states = True + self.model.capture_aux_hidden_states = True + if layer_ids is None: + num_layers = self.config.num_hidden_layers + self.model.layers_to_capture = [ + 2, + num_layers // 2, + num_layers - 3, + ] # Specific layers for EAGLE3 support + else: + self.model.layers_to_capture = [val + 1 for val in layer_ids] + EntryClass = Qwen3VLForConditionalGeneration