Support model-defined prefill input embedding width (#35002)

Co-authored-by: Lu Fang <30275821+houseroad@users.noreply.github.com>
This commit is contained in:
Lianmin Zheng
2026-08-16 15:08:19 -07:00
committed by GitHub
co-authored by Lu Fang
parent 5534380d46
commit e49557b8da
@@ -296,13 +296,19 @@ class PrefillCudaGraphRunner(BaseCudaGraphRunner):
self.mamba_track_enabled = self._is_mamba_track_enabled() self.mamba_track_enabled = self._is_mamba_track_enabled()
# --- buffers --------------------------------------------------- # --- buffers ---------------------------------------------------
# `hidden_size` here sizes only the multimodal `input_embeds` buffer,
# which `general_mm_embed_routine` copies the merged text+media
# embeddings into. A model whose merge happens above the embedding width
# (e.g. a residual-stream merge) writes a wider tensor than
# `config.hidden_size`, so let it declare that width.
input_embeds_hidden_size = self._input_embeds_hidden_size()
self.buffers: PrefillInputBuffers = PrefillInputBuffers.create( self.buffers: PrefillInputBuffers = PrefillInputBuffers.create(
device=self.device, device=self.device,
max_bs=self.max_bs, max_bs=self.max_bs,
max_num_tokens=self.max_num_tokens, max_num_tokens=self.max_num_tokens,
cache_loc_dtype=self._cache_loc_dtype(), cache_loc_dtype=self._cache_loc_dtype(),
is_multimodal=self.is_multimodal, is_multimodal=self.is_multimodal,
hidden_size=self.model_runner.model_config.hidden_size, hidden_size=input_embeds_hidden_size,
dtype=self.model_runner.dtype, dtype=self.model_runner.dtype,
enable_mamba_track=self.mamba_track_enabled, enable_mamba_track=self.mamba_track_enabled,
) )
@@ -316,7 +322,7 @@ class PrefillCudaGraphRunner(BaseCudaGraphRunner):
max_num_token=self.max_num_tokens, max_num_token=self.max_num_tokens,
cache_loc_dtype=self._cache_loc_dtype(), cache_loc_dtype=self._cache_loc_dtype(),
is_multimodal=self.is_multimodal, is_multimodal=self.is_multimodal,
hidden_size=self.model_runner.model_config.hidden_size, hidden_size=input_embeds_hidden_size,
embed_dtype=self.model_runner.dtype, embed_dtype=self.model_runner.dtype,
enable_mamba_track=self.mamba_track_enabled, enable_mamba_track=self.mamba_track_enabled,
enable_num_token_non_padded=enable_num_token_non_padded(), enable_num_token_non_padded=enable_num_token_non_padded(),
@@ -531,6 +537,25 @@ class PrefillCudaGraphRunner(BaseCudaGraphRunner):
def _cache_loc_dtype(self): def _cache_loc_dtype(self):
return torch.int64 if not is_npu() else torch.int32 return torch.int64 if not is_npu() else torch.int32
def _input_embeds_hidden_size(self) -> int:
"""Width of the `input_embeds` the model writes inside the graph.
Defaults to `config.hidden_size`; a model that merges multimodal
embeddings at a wider width declares it via `input_embeds_hidden_size`.
`getattr` with a default rather than an always-present field: the
property exists only on the handful of model classes whose merge width
differs, and adding it to every model in the registry to satisfy a
`None` check is not worth it. Same shape as the `hc_hidden_size`
opt-in already threaded through `base_runner` and
`decode_cuda_graph_runner`.
"""
return getattr(
self.model_runner.model,
"input_embeds_hidden_size",
self.model_runner.model_config.hidden_size,
)
def _next_token_logits_buffer(self, rows: int) -> Optional[torch.Tensor]: def _next_token_logits_buffer(self, rows: int) -> Optional[torch.Tensor]:
if not self.model_runner.pp_group.is_last_rank: if not self.model_runner.pp_group.is_last_rank:
return None return None